Понадобилось сделать на сайте формочку, в который бы выводились запланированные администрацией клуба тренировки, а зарегистрированные пользователи могли выбрать из списка тренировку и оставить свою заявку на участие. Итак, приступим!
Скажу сразу, решения из коробки не нашлось. Но в реализации нет ничего хитрого для тех кто знает тонкости работы 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, этот список будет пополняться автоматически. Все!