[решено] Динамическое формирование поля select модуля webform на основе выборки из базы данных (PHP)

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

Аватар пользователя Anton L. Safin Anton L. Safin 19 января 2009 в 12:53

Бился над задачей два дня. Вот, делюсь опытом - может кому-нибудь пригодиться. Можно сказать "спасибо" в комментариях Smile

Задача: необходимо, чтобы поле select модуля webform формировалось динамически на основе выборки из БД. Выборку формирует некая функция в файле template.php:

function get_emails_list($array=false) {
  $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 строки

function _webform_select_options($text, $flat = FALSE) {

наш код:

  if (strpos($text, '<?php') !== FALSE) {
      $text = drupal_eval($text);
  }

По хорошему бы совместить это дело с хаком с drupal.org - он добавляет новый параметр в "Управление доступом", позволяя указывать для различных групп, можно ли им использовать PHP-код в модуле Webform. Но пока лень Smile

Есть и еще один, наверное, более грамотный метод - создание отдельного .inc файла, как описано здесь: http://irolo.net/drupal_webform_and_dynamic_checkboxes. Однако врубаться в это дело пока просто нет времени. Вот если бы кто-нибудь помог с переводом...

Комментарии

Аватар пользователя andypost@drupal.org andypost@drupal.org 19 января 2009 в 21:06

На мой взгляд всё же проще внести небольшие изменения в select.inc и сохранить его отдельным файлом (например, myselect.inc), тогда при обновлении модуля ничего не потрется!

Аватар пользователя cosmos cosmos 18 февраля 2009 в 8:28

XT ТО Я НЕ ПОНИМАЮ, у меня все протсо вышло
я взял добавил поле типа markup в webform
выюрал формат ввода php код (поле выбор города из словаря готово)
и ввел туда

<label for="_city">Город</label>
<select name="submitted[_fieldset1][_city]" id="_city">
<?php
$v = taxonomy_get_tree(5);
foreach($v as $op) {
echo '<option>'.$op->name;
}

?>
</select>

ps единственный косяк значение выбранное не отправляется на мыло и не сохр в отчете

Аватар пользователя Anton L. Safin Anton L. Safin 8 июня 2009 в 13:43

"cosmos" wrote:
ps единственный косяк значение выбранное не отправляется на мыло и не сохр в отчете

А нафига нужно поле, которое не сохраняется в БД и не отправляется пользователю? Только показать какую-нибудь инфу... так это можно и без markup обойтись.

"cosmos" wrote:
ха пара трюков и наше поле отсылается и сохраняется

Так про эту "пару трюков" никто и не услышал. Неужто коммерческая тайна?

Аватар пользователя svip svip 24 сентября 2009 в 17:46

Ув. Автор подскажите как использовать функцию get_emails_list($array=false)

Делаю в опциях селекта


<?php
echo get_emails_list();
?>

ругается что такой функции нет.

Аватар пользователя Dark_kz Dark_kz 10 ноября 2015 в 11:46

На друпал.орге нашел inc файл, который добавляет список из таксономии
Распаковать в папку 'webform/components'. В компонентах формы появляется новый элемент vocabulary

Аватар пользователя Dark_kz Dark_kz 7 ноября 2009 в 9:43

К сожалению, на почту не приходит список выбранных элементов словаря (
lance.gliser it'd be very much appreciated if you stopped work on the vocabulary.inc component

Аватар пользователя Cvalya Cvalya 26 ноября 2009 в 18:51

А что нужно написать в элементе формы "селект" что бы выводился результат запроса к базе?
Я может не понял чего то элементарного, но уже несколько раз прочел сообщение)

Аватар пользователя hypnoser hypnoser 12 августа 2010 в 23:06

"Dark_kz" wrote:
К сожалению, на почту не приходит список выбранных элементов словаря (
lance.gliser it'd be very much appreciated if you stopped work on the vocabulary.inc component

Решение не найдено? а то очень нужно

Аватар пользователя vitg vitg 27 ноября 2010 в 21:01

"Cvalya" wrote:
А что нужно написать в элементе формы "селект" что бы выводился результат запроса к базе?
Я может не понял чего то элементарного, но уже несколько раз прочел сообщение)

Расскажите о решении, пожалуйста!