Форма регистрации в мероприятии с помощью webform в Drupal 7

Опубликовано: 02.11.2017

Понадобилось сделать на сайте формочку, в который бы выводились запланированные администрацией клуба тренировки, а зарегистрированные пользователи могли выбрать из списка тренировку и оставить свою заявку на участие. Итак, приступим!

Скажу сразу, решения из коробки не нашлось. Но в реализации нет ничего хитрого для тех кто знает тонкости работы Webform, умеет делать модули и эксплуатировать хуки.

Устанавливаем модуль Webform. Создаем тип материала Тренировка, рабочее название training. И сразу создадим несколько материалов-тренировок. Я вместо заголовка поставил даты. Создаем форму, а вней создаем компонент формы Тренировка типа select. Теперь все внимание на опцию  Load a pre-built option list .

Идея собственно заключается в том, чтобы написать модуль, в котором мы сделаем свой собственный тип Training, который будет возвращать ноды типа training в это поле выбора.

Итак, создадим простейший модуль, в котором переопределим хук, отвечающий за вывод набора опций в  Load a pre-built option list

function mymodule_webform_select_options_info() {     $items = array();     if (function_exists('_mymodule_get_nodes')) {         $items['event-nodes'] = array(             'title' => t('Trainings'),             'options callback' => '_mymodule_get_nodes',         );     }     return $items; }

Эта функция добавит новый вид содержимого для поля выбора под названием Trainings. Теперь в этом же модуле нужно разместить функцию которая будет выполняться при выборе опции Training в  Load a pre-built option list .

function _mymodule_get_nodes() {     $query = db_select('node','n')             ->fields('n', array('nid', 'title'))             ->condition('type', 'training')             ->orderBy('title');     $items = array();     foreach ($query->execute() as $node) {         $items[$node->nid] = $node->title;     }     return $items; }

Эта функция находит все ноды типа training и отдает их список.

Теперь, если мы зайдем в редактирование компонента Training в нашей форме и откроем список  Load a pre-built option list , увидим нашу опцию Training.

Вы берем эту опцию и увидим как список Options наполнится датами из наших, созданных ранее, материалов.

В дальнейшем, при добавление новых материалов типа training, этот список будет пополняться автоматически. Все!