Бился над задачей два дня. Вот, делюсь опытом - может кому-нибудь пригодиться. Можно сказать "спасибо" в комментариях
Задача: необходимо, чтобы поле select модуля webform формировалось динамически на основе выборки из БД. Выборку формирует некая функция в файле template.php:
$sql="SELECT
content_type_city.field_email_call_value,
term_data.name
FROM
term_node
INNER JOIN node ON (term_node.nid = node.nid)
INNER JOIN term_data ON (term_node.tid = term_data.tid)
INNER JOIN content_type_city ON (node.nid = content_type_city.vid)
WHERE
(node.`status` = '1')
GROUP BY
content_type_city.field_email_call_value,
term_data.name
ORDER BY node.sticky";
$result = db_query($sql);
while ($city_r = db_fetch_object($result)) {
$output.=$city_r->field_email_call_value.'|'.$city_r->name.chr(10);
}
return $output;
}
Т.е. функция возвращает список значений вида value|name, разделенных символом переноса строки. Теперь задача заставить webform понимать данные, возвращаемые этой функцией.
На drupal.org есть хак, позволяющий вставлять в поля webform код на PHP: http://drupal.org/node/297989. Вроде бы, все хорошо, но хак этот работает только для простых полей - вроде "значения по умолчанию". Происходит это потому, что хак изменяет функцию, работающую уже после того, как поле разбито на составляющие и отфильтровано - а в случае с e-mail это означает, кроме всего прочего, то, что будут обрезаны символы "<" и ">". В общем, нифига это не работает - и точка.
Методом проб и ошибок найдено место, куда можно вставить обработку PHP-кода. Итак, открываем файл modules\webform\components\select.inc и вставляем сразу после 415 строки
наш код:
$text = drupal_eval($text);
}
По хорошему бы совместить это дело с хаком с drupal.org - он добавляет новый параметр в "Управление доступом", позволяя указывать для различных групп, можно ли им использовать PHP-код в модуле Webform. Но пока лень
Есть и еще один, наверное, более грамотный метод - создание отдельного .inc файла, как описано здесь: http://irolo.net/drupal_webform_and_dynamic_checkboxes. Однако врубаться в это дело пока просто нет времени. Вот если бы кто-нибудь помог с переводом...
Комментарии
Спасибо, пригодится.
На мой взгляд всё же проще внести небольшие изменения в select.inc и сохранить его отдельным файлом (например, myselect.inc), тогда при обновлении модуля ничего не потрется!
По хорошему вроде бы любые изменения для любой формы можно сделать в реализации hook_form_alter...
далеко любые... некоторые формы теперь кешируются!
XT ТО Я НЕ ПОНИМАЮ, у меня все протсо вышло
я взял добавил поле типа markup в webform
выюрал формат ввода php код (поле выбор города из словаря готово)
и ввел туда
<select name="submitted[_fieldset1][_city]" id="_city">
<?php
$v = taxonomy_get_tree(5);
foreach($v as $op) {
echo '<option>'.$op->name;
}
?>
</select>
ps единственный косяк значение выбранное не отправляется на мыло и не сохр в отчете
надо закрывать «[options]», блин
и все атки как вы их сохраняете? я получаю вх в _ПОСТ, но сабмишн
ха пара трюков и наше поле отсылается и сохраняется
А можно уточнить что за пара трюков? зачем же так загадочно говорить
я например делал так
< select name=ContentType>
< ?php
$CT=glob('../content/*', GLOB_ONLYDIR);
for($i=1; $i< count($CT); $i++){
echo '< option value="'.$CT[$i].'">'.$CT[$i].'';
}
?>
< / select>
идею взял отсюда http://www.realcoding.net/article/view/4905
А нафига нужно поле, которое не сохраняется в БД и не отправляется пользователю? Только показать какую-нибудь инфу... так это можно и без markup обойтись.
Так про эту "пару трюков" никто и не услышал. Неужто коммерческая тайна?
Ув. Автор подскажите как использовать функцию get_emails_list($array=false)
Делаю в опциях селекта
<?php
echo get_emails_list();
?>
ругается что такой функции нет.
На друпал.орге нашел inc файл, который добавляет список из таксономии
Распаковать в папку 'webform/components'. В компонентах формы появляется новый элемент vocabulary
К сожалению, на почту не приходит список выбранных элементов словаря (
lance.gliser it'd be very much appreciated if you stopped work on the vocabulary.inc component
А что нужно написать в элементе формы "селект" что бы выводился результат запроса к базе?
Я может не понял чего то элементарного, но уже несколько раз прочел сообщение)
Сам разобрался!)
Спасибо за реализацию!!!
Решение не найдено? а то очень нужно
К сожалению решение найдено не было
Расскажите о решении, пожалуйста!
Тоже столкнулся с данной темой.. все еще не решили данный трабл?