Многошаговая форма

Главные вкладки

Аватар пользователя dimashorokhov dimashorokhov 25 марта 2017 в 16:06

Делаю многошаговую форму
есть свой модуль, который добавляет на сайт страничку с многошаговой формой (2 шага у меня).
На первом шаге я создаю выбираю фильм на который буду делать обзор,
> но если фильма нет, то я ставлю галочку создать фильм и у меня с ajax подгружается форма создания фильма.
На втором шаге я заполняю поля обзора (заголовок обзора, оценка, описание).
По итогу создаётся нода (обзор) либо (обзор)+(фильм) - это если мы выбрали создать фильм вначале.
При создании обзора (когда выбираем фильм) пишет, что на скрине 1
При создании обзора (вместе с созданием фильма) пишет, что на скрине 2

<?php

function helper_menu() {
  
$items = array();

  

$items['test'] = array(
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('helper_test_form'),
    
'access arguments' => array('access content'),
  );

  return 

$items;
}

function 

_helper_get_term_list($vid) {
  
$terms taxonomy_get_tree($vid);
  foreach (
$terms as $data) {
    
$output[$data->tid] = $data->name;
  }
  return 
$output;
}

function 

_helper_get_node_list($type) { //type ='article'
  
$result db_query('SELECT title, nid FROM node n WHERE n.type = :type'
    array(
':type' => $type)) -> FetchAll();
  
$titles = array();
  foreach(
$result as $obj) {
    
$titles[$obj -> nid] = $obj -> title ;
  }
  return 
$titles;
}

function 

helper_test_form($form, &$form_state) {
  
$steps_info = array(
    
=> 'Step 1',
    
=> 'Step 2',
    
=> 'Finish step',
  );

  if (!isset(

$form_state['step'])) {
    
$form_state['step'] = 1;
    
$form_state['steps_values'] = array();
  }
  
$step $form_state['step'];
  
$values = &$form_state['values'];

  

drupal_set_title($steps_info[$step]);

  

$form['#tree'] = TRUE;

  

// Step 1
  
if ($step == 1) {
    
$form['switcher'] = array (
      
'#type' => 'checkbox',
      
'#title' => t('Create new film'),
      
'#ajax' => array(
      
'callback' => 'helper_ajax_callback',
      
'wrapper' => 'film_fields_wrapper'
      
),
      
'#return_value' => NEWFILM_CHECKBOX_ON 
    
);
    
  
$new_film false;
  if (isset(
$form_state['values']['switcher'])) {
    
$new_film = ($form_state['values']['switcher'] === NEWFILM_CHECKBOX_ON);
  }
  
  
$form['film_fields'] = array (
    
'#prefix' => '<div id="film_fields_wrapper">',
    
'#suffix' => '</div>'
  
);
  
  if (
$new_film) {
    
$form['film_fields']['title'] = array (
      
'#type' => 'textfield',
      
'#title' => t('Title'),
      
'#size' => 50,
      
'#required' => true
    
);
    
$form['film_fields']['about'] = array (
      
'#type' => 'textarea',
      
'#title' => t('About'),
      
'#rows' => 5,
      
'#required' => true
    
);
    
$form['film_fields']['producer'] = array (
      
'#type' => 'select',
      
'#options' => _helper_get_node_list(NODE_TYPE_AUTHOR),
      
'#title' => 'Producer'
    
);
    
$form['film_fields']['genre'] = array (
       
'#title' => 'Genre',
        
'#type' => 'select',
        
'#options' => _helper_get_term_list(TERM_GENRE)
    );
    
$form['film_fields']['year'] = array (
      
'#type' => 'textfield',
      
'#title' => t('Year'),
      
'#size' => 4,
      
'#required' => true
    
);
    
  }
  
  else {
    
$form['film_fields']['select'] = array (
      
'#type' => 'select',
      
'#options' => _helper_get_node_list(NODE_TYPE_FILM),
      
'#title' => 'Выберите фильм'
    
);
  }
  }

  

// Step 2
  
elseif ($step == 2) {
    
$form['film_fields']['title_review'] = array (
      
'#type' => 'textfield',
      
'#title' => t('Title'),
      
'#size' => 50
    
);
    
$form['film_fields']['description'] = array (
      
'#type' => 'textarea',
      
'#title' => t('Description'),
      
'#rows' => 5,
      
'#required' => true
    
);
    
$form['film_fields']['rate'] = array (
      
'#title' => t('Rate'),
      
'#type' => 'select',
      
'#options' => _helper_get_term_list(TERM_RATE),
      
'#required' => true
    
);
  }
  
  
// Buttons
  
$form['actions'] = array(
    
'#type' => 'actions',
  );

  if (

$step 1) {
    
$form['actions']['prev'] = array(
      
'#type' => 'submit',
      
'#value' => 'Prev',
      
'#submit' => array('helper_test_form_prev'),
      
'#limit_validation_errors' => array(),
    );
  }
  if (
$step count($steps_info)) {
    
$form['actions']['next'] = array(
      
'#type' => 'submit',
      
'#value' => 'Next',
      
'#submit' => array('helper_test_form_next'),
    );
  }
  else {
    
$form['actions']['submit'] = array(
      
'#type' => 'submit',
      
'#value' => 'Finish',
    );
  }

  return 

$form;
}

function 

helper_test_form_prev($form, &$form_state) {
  
$step = &$form_state['step'];
  
$form_state['rebuild'] = TRUE;

  

// Change step
  
$step--;

  

// Restore prev step values
  
$form_state['values'] = $form_state['steps_values'][$step];
}

function 

helper_test_form_next($form, &$form_state) {
  
$step = &$form_state['step'];
  
$form_state['rebuild'] = TRUE;

  

// Save current step values
  
$form_state['steps_values'][$step] = $form_state['values'];

  

// Change step
  
$step++;

  

// Restore next step values
  
$form_state['values'] = isset($form_state['steps_values'][$step]) ? $form_state['steps_values'][$step] : array();
}

function 

helper_test_form_submit($form, &$form_state) {
  
// // Merge steps values
   
$form_state['values'] += call_user_func_array('array_merge'$form_state['steps_values']);

  global 

$user;
  if (
$form_state['values']['switcher']) {
    
$film = new Stdclass();
    
$film->type NODE_TYPE_FILM;
    
$film->language LANGUAGE_NONE// не используем мультиязычность для нод
    
$film->uid $user->uid// автор, создавший ноду
    
node_object_prepare($film); // Устанавливает некоторые служебные поля по-умолчанию
    
$film->title $form_state['values']['film_fields']['title']; // заполняем title ноды
    /**/
    
$film->field_about[LANGUAGE_NONE][0]['value'] = $form_state['values']['film_fields']['about'];
    
$film->field_producer[LANGUAGE_NONE][0]['nid'] = $form_state['values']['film_fields']['producer'];
    
$film->field_genre[LANGUAGE_NONE][0]['tid'] = $form_state['values']['film_fields']['genre'];
    
$film->field_year[LANGUAGE_NONE][0]['value'] = $form_state['values']['film_fields']['year'];
    
$film->status NODE_PUBLISHED
    
$film node_submit($film);
    
node_save($film);
    
$film_nid $film -> nid;
  }

  else{
    

drupal_set_message('я в цикле');
    
$film_nid $form_state['values']['film_fields']['select'];
  }
  
$string;
  
$row=$form_state['values']['film_fields']['description'];
  if (empty(
$form_state['values']['film_fields']['title_review'])) {
    
$str=strpos($row".");
    
$row=substr($row0$str);
    
$stringtruncate_utf8($row255$wordsafe TRUE$add_ellipsis FALSE$min_wordsafe_length 1);
  }
  else {
    
$string=$form_state['values']['film_fields']['title_review'];
  }
  
$review = new Stdclass();
  
$review->type NODE_TYPE_REVIEW;
  
$review->language LANGUAGE_NONE;
  
$review->uid $user->uid
  
node_object_prepare($review);
  
$review->title $string;
  
$review->field_rate[LANGUAGE_NONE][0]['tid'] = $form_state['values']['film_fields']['rate'];
  
$review->field_discription[LANGUAGE_NONE][0]['value'] = $form_state['values']['film_fields']['description'];
  
$review->field_movie[LANGUAGE_NONE][0]['nid'] = $film_nid;
  
$review->status NODE_PUBLISHED;
  
$review node_submit($review);
  
node_save($review);
}

function 

helper_ajax_callback($form$form_state) {
  
/* возвращаем только изменившийся элемент, но не всю форму */
  
return $form['film_fields'];
  
/* При этом ядром будет создан HTML-код и затем отправлен клиенту как ответ на AJAX-запрос */
  /* На клиенте этот HTML-код будет встроен внутрь <div id="film_fields_wrapper"> */
}
?>
ВложениеРазмер
Иконка изображения скрин123.17 КБ
Иконка изображения скрин2157.64 КБ