Задача создать базу объявлений.
Казалось бы ничего сложного, но мы не ищем простых путей, а поэтому задача из ряда нестандартных решений.
Дано:
Тип материала: 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. Прошу помощи сообщества потому что волосы остались только в труднодоступных местах. А оттуда рвать больно.
Комментарии
Тут был бы полезней HTML код после всех "генераций" но перед нажатием субмита , и еще вопрос обработчик на node/add/board стоит ?
т.е. если просто набрать этот путь объявление добавится ?
по node/add/board загружается вся форма
а ХТМЛ какой?
пытаюсь перенести на хостинг, дабы показать о чем речь, но выдает такую ошибку при попытке инклуда во внешний скрипт:
<?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 в корне друпала
вот жешь.... простой пробел после .inc, а сколько геммора...
вообщем вот то, что я хочу сделать: http://form.yccyp.ru/?q=node/1
первое окно с "родителями", второе с "детьми". форма одна и таже, только выводятся разные ее поля.
с кнопкой Send проблема
http://drupal.org/project/hierarchical_select чем не подошел? там для 5ки как раз это все реализовано в виде кастомного элемента.
а там есть возможность генерации формы?
что-то я такого не нашел там. и главный минус HS - невероятная "тяжесть".
Попробуйте в моем варианте выбрать "Подтермин 1-1", а потом "Подтермин 2-2"
У вас там (если посмотреть фаербугом) "дочерняя - желтая" форма вынесена за тэг </form>, соответственно экшен по нажатию субмита на форме не отрабатывает (собственно это даже не форма получается а набор элементов input).
в желтом все выведено через
<?php print drupal_render($form); ?>
ведь по сути эта функция должна мне сформировать , так?
почему не сформировала?
ЗЫ. а выше это от селектов. они тут не при чем
Вообще то по логике , вы должны были бы создать точку входа для экшена (через хук меню) и вызвать фому через 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
сделал модулем. без темизации, но выводит уже что-то.
подскажите еще, как мне получить значение второго селекта в модуле или передать его туда?
Ну или надо ваши селекты засунуть внутрь формы, тогда они по субмиту будут доступны
или запоминать значение выбора селекта в переменной сессии при изменении значения (через ajax) а при обработки формы их оттуда извлеч и почистить переменную,
ну или при построении вашей формы добавить hidden поле со значением из селекта и при субмите получить из него значение
Йо! Генерирует как надо.
Осталось разобраться с тем как это все записать, потому как action=/node/add/board тупо выдает мне форму заполнения, а надо записать в базу