Нестандартная реализация генерации формы

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

Аватар пользователя beerman beerman 6 августа 2008 в 14:51

Задача создать базу объявлений.
Казалось бы ничего сложного, но мы не ищем простых путей, а поэтому задача из ряда нестандартных решений.

Дано:
Тип материала: board (один для всех объявлений)
Поля CCK все, какие возможны.

Словарь с иерархией
<?php

Термин 1
Подтермин 1-1
Подтермин 1-2
Термин 2
Подтермин 2-1
Подтермин 2-2
...

?>

При вызове страницы добавления объявления показываем список родителей
Реализация при помощи простой выборки из базы по vid'у и parent=0

Далее подключаем ajax и отлавливаем onchange. В соответствии с выбором при помощи ajax и внешнего php-скрипта во второе окно подгружаем "детей" родительского термина.
Тут проблем не возникает.

Интересное начинается дальше.
Очередная функция javascript'а отлавливает изменения и нажатия в "дочернем" окне таксономии и опять же другой внешний скрипт должен сгенерировать форму для заполнения.
На пример:
В первом окне выбрано"Термин 1", во втором - "Подтермин 1-1". Составляем форму из заголовка и текстового поля.
Если выбрано "Термин 2", "Подтермин 2-2" - в форму добавляется еще несколько полей.

Во внешних php-скриптах прописано
<?php
require_once('./includes/bootstrap.inc ');
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
global $user, $form;
?>

Вся форма генерируется правильно. НО! Никак не могу заставить работать кнопку "Отправить".
Вот несколько строк генерации формы (тип board):

<?php
$form['title'] = array(
'#type' => 'textfield',
'#title' => t('Head'),
'#maxlength' => 128,
'#required' => 1,
'#weight' => 2
);
$form['action'] = '/?q=node/add/board';
$form['form_id'] = Array(
'#type' => 'hidden',
'#value' => 'board_node_form',
'#id' => 'edit-board-node-form',
'#parents' => Array('0' => 'form_id'),
'#weight' => '0.014',
'#input' => 1,
'#name' => 'form_id',
'#sorted' => 1
);
$form['submit'] = Array(
'#type' => 'submit',
'#value' => t('Send'),
'#weight' => 45,
'#name' => 'op',
'#button_type' => 'submit',
'#submit' => 1
);
print drupal_render($form);
?>

Где грабли?

PS. Прошу помощи сообщества потому что волосы остались только в труднодоступных местах. А оттуда рвать больно.

Комментарии

Аватар пользователя olk olk 6 августа 2008 в 15:36

Тут был бы полезней HTML код после всех "генераций" но перед нажатием субмита , и еще вопрос обработчик на node/add/board стоит ?
т.е. если просто набрать этот путь объявление добавится ?

Аватар пользователя beerman beerman 6 августа 2008 в 18:12

пытаюсь перенести на хостинг, дабы показать о чем речь, но выдает такую ошибку при попытке инклуда во внешний скрипт:
<?php require_once('./includes/bootstrap.inc '); ?>
Warning: require_once(./includes/bootstrap.inc ) [function.require-once]: failed to open stream: No such file or directory in /home/drupal/data/www/form.yccyp.ru/makeselect.php on line 2

Fatal error: require_once() [function.require]: Failed opening required './includes/bootstrap.inc ' (include_path='.:/usr/local/share/pear') in /home/drupal/data/www/form.yccyp.ru/makeselect.php on line 2

makeselect.php в корне друпала

Аватар пользователя beerman beerman 7 августа 2008 в 3:37

вот жешь.... простой пробел после .inc, а сколько геммора...
вообщем вот то, что я хочу сделать: http://form.yccyp.ru/?q=node/1
первое окно с "родителями", второе с "детьми". форма одна и таже, только выводятся разные ее поля.
с кнопкой Send проблема

Аватар пользователя beerman beerman 7 августа 2008 в 6:10

а там есть возможность генерации формы?
что-то я такого не нашел там. и главный минус HS - невероятная "тяжесть".

Попробуйте в моем варианте выбрать "Подтермин 1-1", а потом "Подтермин 2-2"

Аватар пользователя olk olk 7 августа 2008 в 10:30

У вас там (если посмотреть фаербугом) "дочерняя - желтая" форма вынесена за тэг </form>, соответственно экшен по нажатию субмита на форме не отрабатывает (собственно это даже не форма получается а набор элементов input).

Аватар пользователя beerman beerman 7 августа 2008 в 10:51

в желтом все выведено через
<?php print drupal_render($form); ?>
ведь по сути эта функция должна мне сформировать , так?
почему не сформировала?

ЗЫ. а выше это от селектов. они тут не при чем

Аватар пользователя olk olk 7 августа 2008 в 11:25

Вообще то по логике , вы должны были бы создать точку входа для экшена (через хук меню) и вызвать фому через drupal_get_form
т.е. примерно так

<?php
function my_module_menu() {
  
$items = array();
  
$items['node/add/board'] = array(
    
'page callback' => 'drupal_get_form',
    
'page arguments' => array('my_module_form'),
    
'access arguments' => array(t('access content')),
    
'type' => MENU_CALLBACK,
  );
return 
$items;
}

function 

my_module_form() {
$form=array();
// тут определяем форму

return $form;
}
?>

Здесь же можно добавить валидацию и обработку субмита my_module_form_validate, my_module_form_submit

Аватар пользователя beerman beerman 7 августа 2008 в 11:57

сделал модулем. без темизации, но выводит уже что-то.
подскажите еще, как мне получить значение второго селекта в модуле или передать его туда?

Аватар пользователя olk olk 7 августа 2008 в 12:18

Ну или надо ваши селекты засунуть внутрь формы, тогда они по субмиту будут доступны
или запоминать значение выбора селекта в переменной сессии при изменении значения (через ajax) а при обработки формы их оттуда извлеч и почистить переменную,
ну или при построении вашей формы добавить hidden поле со значением из селекта и при субмите получить из него значение

Аватар пользователя beerman beerman 7 августа 2008 в 15:23

Йо! Генерирует как надо.
Осталось разобраться с тем как это все записать, потому как action=/node/add/board тупо выдает мне форму заполнения, а надо записать в базу