Php Drupal 6多步骤表单:表单状态值在提交时为空
我无法从多步骤表单中获取要插入数据库的值。我得到的只是每个字段的空值 代码如下:Php Drupal 6多步骤表单:表单状态值在提交时为空,php,forms,drupal,Php,Forms,Drupal,我无法从多步骤表单中获取要插入数据库的值。我得到的只是每个字段的空值 代码如下: function multistep_profile_menu() { $items['multistep_profile'] = array( 'title' => t('Multistep Profile'), 'page callback' => 'drupal_get_form', 'page arguments' => array('multistep_profile'),
function multistep_profile_menu() {
$items['multistep_profile'] = array(
'title' => t('Multistep Profile'),
'page callback' => 'drupal_get_form',
'page arguments' => array('multistep_profile'),
'type' => MENU_NORMAL_ITEM,
'access arguments' => array('access content'),
);
return $items;
}
function multistep_profile(&$form_state) {
// $form_state['storage']['step'] keeps track of what page we're on.
if (!isset($form_state['storage']['step'])) {
$form_state['storage']['step'] = 1;
}
//stores form data and carries it between steps
$default_value = '';
if (isset($form_state['storage']['values'][$form_state['storage']['step']])) {
$default_value = $form_state['storage']['values'][$form_state['storage']['step']];
}
switch ($form_state['storage']['step']) {
// Step 1 of Form
case 1:
$form['step_one'] = array(
'#title' => t('Step 1'),
'#type' => 'fieldset',
'#description' => t('Just getting started.'),
);
// Full Name
$form['step_one']['full_name'] = array(
'#title' => t('Full Name'),
'#type' => 'textfield',
'#description' => t('Please enter your name.'),
'#required' => TRUE,
'#default_value' => isset($default_value['full_name']) ? $default_value['full_name'] : '',
);
// College/University/Organization
$form['step_one']['college'] = array(
'#type' => 'textfield',
'#title' => t('College/University/Organization'),
'#default_value' => isset($default_value['college']) ? $default_value['college'] : '',
);
// Academic Disciplines
$form['step_one']['academic'] = array(
'#type' => 'textfield',
'#title' => t('Academic Disciplines'),
'#default_value' => isset($default_value['academic']) ? $default_value['academic'] : '',
);
break;
// Step 2 of Form
case 2:
$form['step_two'] = array(
'#title' => t('Step 2'),
'#type' => 'fieldset',
'#description' => t('Almost done.'),
);
// Job Title
$form['step_two']['job_title'] = array(
'#title' => t('Job Title'),
'#type' => 'textfield',
'#description' => t('Please enter your job title.'),
'#default_value' => isset($default_value['job_title']) ? $default_value['job_title'] : '',
);
// Department
$form['step_two']['department'] = array(
'#type' => 'textfield',
'#title' => t('Department'),
'#default_value' => isset($default_value['department']) ? $default_value['department'] : '',
);
break;
// Step 3 of Form
case 3:
$form['step_three'] = array(
'#title' => t('Step 3'),
'#type' => 'fieldset',
'#description' => t('Almost done, part 3.')
);
// Q1
$form['step_three']['q1'] = array(
'#title' => t('Why do you want to develop a globally networked course?'),
'#type' => 'textarea',
'#description' => t(''),
);
break;
//Confirmation
case 4:
$form['thanks'] = array(
'#value' => '<p>'. t('Your Profile is complete.') .'</p>',
);
break;
}
//programmatically display buttons
if ($form_state['storage']['step'] > 1) {
$form['previous'] = array(
'#type' => 'submit',
'#value' => t('<< Previous'),
);
}
if ($form_state['storage']['step'] != 4) {
$form['next'] = array(
'#type' => 'submit',
'#value' => t('Continue >>'),
);
}
else {
$form['finish'] = array(
'#type' => 'submit',
'#value' => t('Finish'),
);
}
return $form;
}
function multistep_profile_submit($form, &$form_state) {
//Save the values for the current step into the storage array.
$form_state['storage']['values'][$form_state['storage']['step']] = $form_state['values'];
//Check the button that was clicked and change the step.
if ($form_state['clicked_button']['#id'] == 'edit-previous') {
$form_state['storage']['step']--;
}
elseif ($form_state['clicked_button']['#id'] == 'edit-next') {
$form_state['storage']['step']++;
}
elseif ($form_state['clicked_button']['#id'] == 'edit-finish') {
//You should store the values from the form in the database here.
dpm($form_state);
// INSERT into DB
$full_name = $form_state['values']['full_name'];
$college = $form_state['values']['college'];
$academic = $form_state['values']['academic'];
$job_title = $form_state['values']['job_title'];
$department = $form_state['values']['department'];
$q1 = $form_state['values']['q1'];
db_query("INSERT INTO {multistep_profile} (full_name, college, academic, job_title, department, q1, created) VALUES
('%s', '%s', '%s', '%s', '%s', '%s', %d)", $full_name, $college, $academic, $job_title, $department, $q1, time());
drupal_set_message(t('Your profile has been saved.'));
unset($form_state['storage']);
//Go to this page after completing the form.
//$form_state['redirect'] = 'node';
}
}
功能多步骤配置文件菜单(){
$items['multistep_profile']=数组(
'title'=>t('Multistep Profile'),
“页面回调”=>“drupal获取表单”,
“页面参数”=>array('multistep_profile'),
“键入”=>菜单项\u正常\u项,
“访问参数”=>数组(“访问内容”),
);
退回$items;
}
函数多步骤配置文件(&$form_state){
//$form_state['storage']['step']跟踪我们所处的页面。
如果(!isset($form_state['storage']['step'])){
$form_state['storage']['step']=1;
}
//存储表单数据并在各个步骤之间传送
$default_值=“”;
如果(isset($form_state['storage']['values'][$form_state['storage']['step']])){
$default_value=$form_state['storage']['values'][$form_state['storage']['step']];
}
开关($form_state['storage']['step'])){
//表格的第一步
案例1:
$form['step_one']=数组(
“#title”=>t(第1步),
“#类型”=>“字段集”,
“#description”=>t('刚刚开始'),
);
//全名
$form['step\u one']['full\u name']=array(
“#title”=>t(全名),
“#键入”=>“文本字段”,
“#description”=>t('请输入您的姓名'),
“#必需”=>正确,
“#default_value'=>isset($default_value['full_name'])?$default_value['full_name']:”,
);
//学院/大学/组织
$form['step_one']['college']=数组(
“#键入”=>“文本字段”,
“#title”=>t(“学院/大学/组织”),
“#default_value'=>isset($default_value['college'])?$default_value['college']:”,
);
//学科
$form['step_one']['academic']=数组(
“#键入”=>“文本字段”,
#title=>t(“学科”),
“#default_value'=>isset($default_value['academical'])?$default_value['academical']:”,
);
打破
//表格的第2步
案例2:
$form['step_two']=数组(
“#title”=>t(第2步),
“#类型”=>“字段集”,
“#description”=>t(‘差不多完成了’),
);
//职称
$form['step_two']['job_title']=array(
“#职务”=>t(“职务”),
“#键入”=>“文本字段”,
“#description”=>t('请输入您的职务'),
“#default_value'=>isset($default_value['job_title'])?$default_value['job_title']:”,
);
//系
$form['step_two']['department']=array(
“#键入”=>“文本字段”,
#title=>t(“部门”),
“#default_value'=>isset($default_value['department'])?$default_value['department']:”,
);
打破
//表格的第三步
案例3:
$form['step_three']=数组(
“#title”=>t(第3步),
“#类型”=>“字段集”,
“#description”=>t(‘差不多完成了,第三部分’)
);
//Q1
$form['step_three']['q1']=数组(
“#title”=>t(‘你为什么要开发一个全球网络课程?’),
“#键入”=>“文本区域”,
“#说明”=>t(“”),
);
打破
//确认书
案例4:
$form['Thank']=数组(
“#value'=>””.t(“您的配置文件已完成”)。”,
);
打破
}
//以编程方式显示按钮
如果($form_state['storage']['step']>1){
$form['previous']=数组(
“#键入”=>“提交”,
“#值”=>t(“>”),
);
}
否则{
$form['finish']=数组(
“#键入”=>“提交”,
“#值”=>t('Finish'),
);
}
返回$表格;
}
函数多步骤配置文件提交($form,&$form\u state){
//将当前步骤的值保存到存储阵列中。
$form_state['storage']['values'][$form_state['storage']['step']]=$form_state['values'];
//检查单击的按钮并更改步骤。
if($form_state['clicked_button']['#id']=='edit previous'){
$form_state['storage']['step']--;
}
elseif($form_state['clicked_button']['id']=='edit next'){
$form_state['storage']['step']++;
}
elseif($form_state['clicked_button']['id']=='edit finish'){
//您应该将表单中的值存储在这里的数据库中。
dpm($形式州);
//插入数据库
$full_name=$form_state['values']['full_name'];
$college=$form_state['values']['college'];
$academic=$form_state['values']['academic'];
$job_title=$form_state['values']['job_title'];
$department=$form_state['values']['department'];
$q1=$form_state['values']['q1'];
db_query(“插入{multistep_profile}(全名、学院、学术、职称、系、第一季度、已创建)值
('%s','%s','%s','%s','%s','%s','%s',%d)“,$full\u name,$college,$academic,$job\u title,$department,$q1,time());
drupal_set_消息(t(“您的配置文件已保存”);
未设置($form_state['storage']);
//填写表格后,请转到本页。
//$form_state['redirect']='node';
}
}
进入数据库的唯一值是“创建”日期时间戳
我运行了一个DPM来检查这些值是否在表单步骤之间进行了传递,而事实上,我就是不知道如何将它们插入到数据库中。有什么帮助吗?查看提交功能,您(正确地)将在不同步骤中收集的值存储在
$form\u state['storage']['values'][]
下。这与您发布的DPM输出相匹配,即值显示在$form\u state['storage']['values'][1].
,$form\u state['storage']['values'][2].
等下
但在最后的提交处理中,您尝试在$form\u state['values'][…]
下访问它们,就像这是一个单步表单一样。因为您的最后一步没有发布任何值,所以您在那里找不到任何内容
因此,看起来您只需要更改最终值收集逻辑,就可以从之前放置它们的存储(子)阵列中获取值:)
例如:
需要
$full_name = $form_state['storage']['values'][1]['full_name'];
其他值也是如此。只是一个猜测,但是这些值不是应该是$form_state['values']['step_two']['job_title']而不是$form_state['values']['job_title']吗?这会
$full_name = $form_state['storage']['values'][1]['full_name'];