Drupal Multistep节点表单防止保存如果不是最后一步

时间:2011-04-26 03:10:09

标签: php drupal drupal-6 module

尝试将特定内容类型的节点/添加表单更改为多步骤表单。

(drupal6,cck dev 3x(多组))

我无法解决的问题是如何防止表单在第1步提交时实际创建节点并转换到第2步。

现在没有步骤2的可能性,但我无法弄清楚如何阻止保存。

我尝试了以下内容:

使用$ form [“#submit”] = array()然后添加我的[“#submit”]处理程序(这不起作用,它仍然被保存)

还尝试了空白返回,但仍会导致节点被保存。

* HOOK FORM ALTER */
  function armormod_form_alter(&$form, $form_state, $form_id) {
  //print_r($form);
  //print_r($form_state);
  //print_r($form_id);

  if($form_id = "seed_node_form") {

  //set the default step
  if(!isSet($form_state["storage"]["step"])) {
     $form_state["storage"]["step"] = 1;
  }

  // Add an after_build function to process when everything's complete.
  $form['#after_build'][] = 'armormod_after_build';
    /* clear the submit (this doesn't  work)
        Normally calls menu_node_form_submit and then upload_node_form_submit
    */
    //$form["#submit"] = array();
  $form["#submit"][] = "armormod_submit";
  $form["#validate"][] = "armormod_validate";

  }


  }

  function armormod_submit($form, &$form_state) {

if($form["form_id"]["#value"] == "seed_node_form") {
    if($form_state["storage"]["step"] < 2) {
        drupal_set_message("Form Step:".$form_state["storage"]["step"]);
        return;
    }
   } else {

    return $form;
   }

  }

  function armormod_validate($form, &$form_state) {

if($form["form_id"]["#value"] == "seed_node_form") {
    drupal_set_message(t("Validation Called"), "status");
    return;
} else {

    return $form;
}

  }

  /* AFTER BUILD LETS US MODIFY CCK FORM ELEMENTS */

  function armormod_after_build($form, &$form_state) {

  if($form["form_id"]["#value"] == "seed_node_form") {

    if($form_state["storage"]["step"] == 2) {
        drupal_set_message(t("Step 2 Build Called"), "status");
        $form["group_statistics"]["#access"] = 1;
        $form["buttons"]["submit"]["#value"] = "Save";

    } else {
        drupal_set_message(t("After Build Called"), "status");

        //hide statistics group
        $form["group_statistics"]["#access"] = false;
        $form["buttons"]["submit"]["#value"] = "Next Step";
        unset($form["buttons"]["preview"]);
        //print_r($form);
    }
} 
return $form;

}

2 个答案:

答案 0 :(得分:2)

尝试为“下一步”功能添加一个单独的提交按钮及其自己的提交处理程序。

$form['button']['next'] = array(
  '#type' => 'submit',
  '#value' => t('Next Step'),
  '#submit' => array('armormod_next_step_submit'),
);

function armormod_next_step_submit($form, &$form_state) {
  // Do your Next Step stuff here
}

答案 1 :(得分:0)

有一个模块,除非你真的想开发自己的解决方案,我建议你使用Multistep模块。有关此模块的更多详细信息(来自其项目页面):

  

Multistep为内容类型编辑表单添加了多步功能。它通过为内容类型中的每个字段组分配步骤编号并隐藏不属于当前步骤的所有组来完成此操作。然后,用户可以使用不同的提交按钮,这些按钮将重定向到上一步,下一步或当前步骤。

     

该模块还为每种内容类型提供一个块,其中包含该表单中不同组的菜单和进度条。这提供了一种简单的方法,可以跳转到整个表单中的不同步骤,而无需逐个进行,并通过表单跟踪您的进度。