Делаю многошаговую форму
есть свой модуль, который добавляет на сайт страничку с многошаговой формой (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(
1 => 'Step 1',
2 => 'Step 2',
3 => '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($row, 0, $str);
$string= truncate_utf8($row, 255, $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"> */
}
?>