Форма многоступенчатого узла Drupal Предотвратить сохранение Если не на последнем шаге - PullRequest
1 голос
/ 26 апреля 2011

Попытка изменить форму узла / добавления для определенного типа контента на многошаговую форму.

(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 ]

2 голосов
/ 26 апреля 2011

Попробуйте добавить отдельную кнопку отправки с собственным обработчиком отправки для функции «Следующий шаг».

$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
}
0 голосов
/ 26 апреля 2011

Для этого есть модуль, если вы действительно не хотите разрабатывать собственное решение, я рекомендую вам использовать модуль Multistep . Еще несколько подробностей об этом модуле (со страницы проекта):

Multistep добавляет многошаговую функциональность к формам редактирования типов контента. Это делается путем назначения номера шага каждой группе полей в типе контента и скрытия всех групп, которые не принадлежат текущему шагу. Затем пользователь может использовать различные кнопки отправки, которые будут перенаправлять на предыдущий, следующий или текущий шаг.

Модуль также предоставляет блок для каждого типа контента с меню различных групп в этой форме и индикатором выполнения. Это позволяет легко переходить к различным шагам по всей форме, не проходя один за другим, и отслеживать, как вы проходите через форму.

...