Приветствую всех!
Знаю, что вопрос элементарный, но не смог найти помощи ни в гугле, ни в других источниках. Имею друпал 7, в нем создал модуль по вот этому посту http://www.drupal.ru/node/85705, там, где сообщение "Frantsuzzz в Втр, 20/11/2012 - 17:06".
<?php
function tlq_form($form, &$form_state) {
//будем менять эту группу полей
$form['group'] = array(
'#type' => 'fieldset',
'#title' => 'Укажите Ваш параметр',
'#prefix' => '<div id = "form-ajax-nodes">',
'#suffix' => '</div>',
'#required' => true,
);
// Если форма только что была создана, то выводим первый элемент.
// иначе забираем количество элементов.
$kol = empty($form_state['storage']['kol']) ? 1 : $form_state['storage']['kol'];
$form_state['storage']['kol'] = $kol;
for (
$i = 1; $i <=$kol; $i++) {
$form['group']['answer_'.$i] = array(
'#type' => 'textfield',
'#title' => 'Nodes from'.$i,
'#required' => true,
);
}
//кнопка добавляет елемент
$form['add'] = array(
'#type' => 'submit',
'#value' => t('Add'),
'#ajax' => array(
'callback' => 'form_ajax_form_load_nodes',
'wrapper' => 'form-ajax-nodes',
'method' => 'replace',
'effect' => 'fade',
),
);
//кнопка удаляет элемент
$form['del'] = array(
'#type' => 'submit',
'#value' => t('Del'),
// отменяем валидацию.
'#limit_validation_errors' => array(),
'#submit' => array('test_form_submit'),
'#ajax' => array(
'callback' => 'form_ajax_form_load_nodes',
'wrapper' => 'form-ajax-nodes',
'method' => 'replace',
'effect' => 'fade',
),
);
//основной обработчик
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Add answers'),
);
return
$form;
}
//ajax обработчик, возвращает группу полей
function form_ajax_form_load_nodes($form, &$form_state) {
return $form['group'];
}
//обработчик формы
function tlq_form_submit($form, &$form_state) {
//если нажали "добавить элемент"
if (isset($form['add']['#value']) && $form_state['triggering_element']['#value'] == $form['add']['#value'])
$form_state['storage']['kol']++;
//если нажали "удалить элемент"
if (isset($form['del']['#value']) && $form_state['triggering_element']['#value'] == $form['del']['#value'])
$form_state['storage']['kol']--;
// Если нажата кнопка Отправить,
if (isset($form['submit']['#value']) && $form_state['triggering_element']['#value'] == $form['submit']['#value']) {
// Показываем сообщение с введёнными данными.
$output ="";
for ($i = 1; $i <=$form_state['storage']['kol']; $i++){
$output .= $form_state['values']['answer_'.$i]."<br/>";
}
drupal_set_message($output);
$form_state['rebuild'] = FALSE;
return;
}
// Указываем, что форма должна быть построена заново.
$form_state['rebuild'] = TRUE;
}?>
Добавил вверх модуля функцию:
<?php
function tlq_menu() {
$items = array();
$items['tlq/form'] = array(
'title' => 'Заявка',
'page callback' => 'tlq_form',
'access arguments' => array('access content'),
'description' => 'Заявка',
'type' => MENU_CALLBACK,
/*
'#ajax' => array(
'callback' => 'tlq_myexecute',
'wrapper' => 'tlq_form',
),
*/
);
return $items;
}?>
Мой модуль называется tlq.
Открываю <сайт>/tlq/form - все отображается, но не работает - не добавляет поля, на кнопки вообще не нажать - они будто неактивны.
Если переменовать function tlq_form() в function tlq_my_form() и дописать вот так:
<?php
function test_form() {
return drupal_get_form(test_my_form);
}
?>
То, все отображается, но куча проблем с обработкой данных.
Как решить проблему с работой изначального примера? Почему у меня не добавляются поля и не работают кнопки?
Огромное спасибо за помощь.
Комментарии
Много времени прошло..., но все равно напишу.
Функция tlq_form возвращает массив, а функция, указанная в 'page callback' для страницы должна возвращать html.
Поэтому hook_menu должен быть примерно таким:
<?phpfunction tlq_menu() {
$items = array();
$items['tlq/form'] = array(
'title' => 'Заявка',
'page callback' => 'drupal_get_form',
'page arguments' => array('tlq_form'),
'access arguments' => array('access content'),
'description' => 'Заявка',
'type' => MENU_CALLBACK,
);
return $items;
}?>
И вот тут ошибка:
<?php
// отменяем валидацию.
'#limit_validation_errors' => array(),
'#submit' => array('TEST_form_submit'),
);?>
Надо указывать обработчик вашей формы.
Дальше не разбирался..