Динамический список опций для webform

Многие используют на своих сайтах компонент webform для создания пользовательских опросников (какой то дурацкий перевод сделали для этого компонента, но что поделать, опросник, так опросник). Так вот, компонент достаточно мощный и удобный, но что, если необходимо сделать выбор элемента списка динамическим? Здесь нам поможет небольшой модуль, который мы напишем сами.

Возьмем для примера такую задачу: сделать список из заголовков материалов определенного типа.

Создаем новую директорию с именем webform_options в папке modules с двумя файлами внутри.

первый webform_options.info

  1. ; $Id$
  2. name = Webform options
  3. description = Preset options for webform field
  4. package = "AmiWeb.ru"
  5. core = 7.x
  6. version = 7.x-1.0

второй webform_options.module

  1. <?php
  2.  
  3. /**
  4.  * Reference: http://xebee.xebia.in/2011/06/14/drupal-webform-add-a-dynamic-select-option-list/
  5.  * The following piece of code is based on the blog post above written by Anubhav
  6.  */
  7.  
  8. function webform_options_webform_select_options_info() {
  9.   $items = array();
  10.   if (function_exists('_get_node_titles')) {
  11.     $items['node_titles'] = array(
  12.       'title' => t('Node titles'),
  13.       'options callback' => '_get_node_titles',
  14.     );
  15.   }
  16.   return $items;
  17. }
  18.  
  19. function _get_node_titles() {
  20.   $options = array();
  21.   $sql = "SELECT nid, title FROM {node}";
  22.    
  23.   $result = db_query($sql);
  24.   foreach ($result as $row) {
  25.     $options[$row->nid] = $row->title;
  26.   }
  27.   return $options;
  28. }

Данный код основан на коде из статьи аналогичного модуля под drupal 6.

Дальше запускаем модуль и добавляем поле «Элемент списка» (Select Options) в webform и в поле «Загрузить ранее созданный список настроек» выбираем наш список «Node Titles».

Правда в данном случае выводятся все ноды, для вывода нод определенного типа нужно заменить строку вот на такую

$sql = "SELECT nid, title FROM {node} WHERE type = '<content type machine name>'";

Где <content type machine name> — машинное имя типа контента.

Еще один пример с drupal.org, как создавать динамический список стран

  1. <?php
  2. /**
  3.  * Implements hook_webform_select_options_info().
  4.  */
  5. function yourmodule_webform_select_options_info() {
  6.   $items = array();
  7.   $items['countries'] = array(
  8.     'title' => t('Countries'),
  9.     'options callback' => 'webform_options_countries',
  10.   );
  11.   return $items;
  12. }
  13.  
  14. /**
  15.  * Webform options info callback.
  16.  */
  17. function webform_options_countries() {
  18.   $countries = array(
  19.     t('Europe') => array (
  20.       'nl' =>  t('The Netherlands'),
  21.       'be' =>  t('Belgium'),
  22.       'fr' =>  t('France'),
  23.     ),
  24.     t('Africa') => array (
  25.       'tu'  =>  t('Tunisia'),
  26.       'sa'  =>  t('South Africe'),
  27.     ),
  28.     t('Asia') => array (
  29.       'ru'  =>  t('Russia'),
  30.       'cn'  =>  t('China'),
  31.     ),
  32.     'key' => t('some country that is in no group'),
  33.   );
  34.   return $countries;
  35. }

А вот еще один полезный модуль для вас — webform_conditional позволяет создавать зависимые друг от друг поля на одной странице, отображая их с помощью ajax :-)

Теги: