Ребят, помогите: задача составить форму, в которой создаю ноду (тип review), но если стоит галка "создать movie", то подгружается ajax и я создаю фильм.
Проблема в том, что если я заполняю поля review при подтверждении он просит заполнить поля и movie. А если создаю фильм просит заполнить поля review
В чем проблема? может тут: $node->type = NODE_TYPE_FILM;
<?php
/* Пример веб-формы с AJAX. Если флажок снят, форма предлагает
* выбрать фильм из списка, если поставлен -- создать новый фильм.
* (недостающие поля дописать самостоятельно) */
define('NEWFILM_CHECKBOX_ON', 'on', TRUE);
define('NODE_TYPE_FILM', 'movie', TRUE); //Системное имя типа материала "Фильм" ("Произведение")
define('NODE_TYPE_AUTHOR', 'producer', TRUE); //Системное имя типа материала "Режиссёр" ("Автор")
define('TERM_GENRE', '2', TRUE);
define('TERM_RATE', '4', TRUE);
function
sample_forms_menu() {
/* Хук меню. Задаёт путь, по которому будет выводиться форма */
return array(
'create/review' => array (
'title' => t('Create Review'),
'page callback' => array('drupal_get_form'),
'page arguments' => array('sample_forms_create_form'),
'access callback' => TRUE
)
);
}
/* Получает список всех нод заданного типа в формате Id_Ноды => Заголовок_Ноды */
function _sample_forms_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
_sample_forms_get_term_list($vid) {
$terms = taxonomy_get_tree($vid);
foreach (
$terms as $data) {
$output[$data->tid] = $data->name;
}
return
$output;
}
/* Создаём Ajax-форму на Drupal. Это конструктор формы */
function sample_forms_create_form($form, &$form_state) {
/* переключатель "Выбор существующего фильма/Новый фильм" */
$form['#tree'] = TRUE;
$form['switcher'] = array (
'#type' => 'checkbox',
'#title' => t('Create new film'),
'#ajax' => array(
'callback' => 'sample_forms_ajax_callback',
'wrapper' => 'film_fields_wrapper' /* при исполнении ajax будет влиять на
элементы, помещенные во wrapper */
),
'#return_value' => NEWFILM_CHECKBOX_ON //возвращаемое значение, когда чекбокс поставлен
);
$new_film = false; // Флажок "Создавать новый фильм"
if (isset($form_state['values']['switcher'])) {
/* Если AJAX сработал, значение switcher-а установлено */
$new_film = ($form_state['values']['switcher'] === NEWFILM_CHECKBOX_ON);
}
/* Внутри этого элемента будут расположены другие элементы веб-формы.
* Они будут изменяться посредством AJAX при установке/снятии флажка 'swither' */
$form['film_fields'] = array (
/* prefix -- это то, что будет выводится непосредственно перед элементом или их группой */
'#prefix' => '<div id="film_fields_wrapper">',
/* suffix -- после элемента или группы */
'#suffix' => '</div>'
/* #prefix и #suffix нужны чтобы создать оборачивающий HTML-код (Wrapper) вокруг элемента (элементов) */
);
/* Когда чекбокс поставлен, добавляем поля формы для создания нового материала */
if ($new_film) {
$form['film_fields']['title'] = array (
'#type' => 'textfield',
'#title' => t('Title'),
'#size' => 50,
'#required' => true
);
$form['film_fields']['description'] = array (
'#type' => 'textarea',
'#title' => t('Description'),
'#rows' => 5,
'#required' => true
);
$form['film_fields']['producer'] = array (
'#type' => 'select',
'#options' => _sample_forms_get_node_list(NODE_TYPE_AUTHOR),
'#title' => 'Producer'
);
$form['film_fields']['genre'] = array (
'#title' => 'Genre',
'#type' => 'select',
'#options' => _sample_forms_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' => _sample_forms_get_node_list(NODE_TYPE_FILM),
'#title' => 'Выберите фильм'
);
$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' => _sample_forms_get_term_list(TERM_RATE),
'#required' => true
);
}
$form['submit'] = array (
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}
function
sample_forms_create_form_submit($form, &$form_state) {
global $user;
$node = new Stdclass();
/* Заполняем обязательные служебные поля ноды */
$node->type = NODE_TYPE_FILM;
$node->language = LANGUAGE_NONE; // не используем мультиязычность для нод
$node->uid = $user->uid; // автор, создавший ноду
node_object_prepare($node); // Устанавливает некоторые служебные поля по-умолчанию
$node->title = $form_state['values']['film_fields']['title']; // заполняем title ноды
/**/
$node->field_discription[LANGUAGE_NONE][0]['value'] = $form_state['values']['film_fields']['description'];
$node->field_producer[LANGUAGE_NONE][0]['nid'] = $form_state['values']['film_fields']['producer'];
$node->field_genre[LANGUAGE_NONE][0]['tid'] = $form_state['values']['film_fields']['genre'];
$node->field_year[LANGUAGE_NONE][0]['value'] = $form_state['values']['film_fields']['year'];
/**/
$node->field_rate[LANGUAGE_NONE][0]['tid'] = $form_state['values']['film_fields']['rate'];
/**/
$node->status = NODE_PUBLISHED; /* Флаг опубликованности ноды. Если хотим
* сделать черновик, надо использовать константу NODE_NOT_PUBLISHED */
$node = node_submit($node);
node_save($node);
drupal_set_message('Сохранено');
}
function
sample_forms_create_form_validate($form, &$form_state) {
if (!is_numeric($form_state['values']['film_fields']['year'])) {
form_set_error('year', t('Value in field "Year" is wrong.'));
};
}
function
sample_forms_ajax_callback($form, $form_state) {
/* возвращаем только изменившийся элемент, но не всю форму */
return $form['film_fields'];
/* При этом ядром будет создан HTML-код и затем отправлен клиенту как ответ на AJAX-запрос */
/* На клиенте этот HTML-код будет встроен внутрь <div id="film_fields_wrapper"> */
}
?>
Комментарии
https://api.drupal.org/api/drupal/developer%21topics%21forms_api_referen...
Вы, я так понимаю, в образовательных целях интересуетесь?