Форма с ajax

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

Аватар пользователя dimashorokhov dimashorokhov 21 марта 2017 в 19:02

Ребят, помогите: задача составить форму, в которой создаю ноду (тип 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"> */
}

?>

Комментарии