Вы здесь

Как динамически добавлять/обновлять элементы выпадающего списка в форме webform?

0

Всем привет. Такой вопрос.

На сайте есть:

  1. Материалы типа "Мероприятия" с полями "дата начала" - "дата окончания", реализованные при помощи модуля Date
  2. Есть форма заявки на мероприятие, реализованная с помощью модуля webform
  3. В форме помимо всего прочего (имя, e-mail и т. д.) есть select с выбором конкретного мероприятия, на которое хотел бы записаться пользователь.

Пока я заполняю/изменяю значения select вручную. Но хотелось бы, чтобы в нем обновлялись/добавлялись названия мероприятий автоматически (динамически) по следующему принципу:

  1. Выбор должен быть только из еще не начавшихся мероприятий (дата начала "больше" текущей даты)
  2. При добавлении нового материала типа "Мероприятия" в select добавлялось бы новое значение, если оно удовлетворяет условию, описанному в пункте 1

Посматриваю в сторону Rules, но пока не особо разбираюсь в данном модуле (наверняка у него есть еще и доп. модули).

Подскажите, пожалуйста, куда "копать"? Или опишите алгоритм.

Заранее, спасибо.

Версия Drupal: 
7.x
Категория: 
Form API
Связанные проекты: 
Webform
Вопрос задан 03.02.2016 - 12:43

Ответы

-1

Всем спасибо! Особенно xandeadx, который показал, в какую сторону смотреть.

Я написал небольшой модуль, который решает вопрос. На код не ругайтесь - в API Drupal и PHP не профи. Учился по ходу дела.

<?php
function MYTHEME_form_alter(&$form, &$form_state, $form_id)
{   
    /*
        field_data_field_date_field_date_value - поле с датой начала мероприятия
        field_data_field_date_field_date_value2 - поле с датой окончания мероприятия
    */

    if ($form_id = 'ID формы')
    {
        //ЕСЛИ НУЖНА ПРОВЕРКА НА ТЕКУЩИЙ ЯЗЫК ПОЛЬЗОВАТЕЛЯ И ЯЗЫК НОДЫ
        //Узнаем язык текущего пользователя
        //global $user;
        //$user_language = $user->language;

        //Массив для нужных значений select-а
        $options = array();

        $result = db_query("
        SELECT DISTINCT node.nid AS nid, node.title AS node_title, node.language AS node_language, 
        field_data_field_date.field_date_value AS field_data_field_date_field_date_value, 
        field_data_field_date.field_date_value2 AS field_data_field_date_field_date_value2, 
        'node' AS field_data_field_date_node_entity_type
        FROM 
        {node} node
        LEFT JOIN {field_data_field_date} field_data_field_date ON node.nid = field_data_field_date.entity_id 
        AND (field_data_field_date.entity_type = 'node' AND field_data_field_date.deleted = '0')
        WHERE (( (node.status = '1') AND (node.type IN  ('article')) ))
        ORDER BY field_data_field_date_field_date_value ASC
        LIMIT 5000 OFFSET 0")->fetchAll();

        $date_now = strtotime(date('Y-m-d 00:00:00'));

        for ($i = 0; $i < count($result); $i++)
        {
            //ЕСЛИ НУЖНА ПРОВЕРКА НА ТЕКУЩИЙ ЯЗЫК ПОЛЬЗОВАТЕЛЯ И ЯЗЫК НОДЫ
            //Язык текущей ноды
            //$node_language = $result[$i]->node_language;

            $node_title = $result[$i]->node_title;
            //Получаем значение даты начала текущего мероприятия (timestamp)
            $field_date_start = strtotime($result[$i]->field_data_field_date_field_date_value);

            if ($field_date_start > $date_now) //&& $node_language = $user_language ДОБАВИТЬ В УСЛОВИЕ, ЕСЛИ НУЖНА ПРОВЕРКА НА ТЕКУЩИЙ ЯЗЫК ПОЛЬЗОВАТЕЛЯ И ЯЗЫК НОДЫ
            {
                //Преобразуем дату окончания в нужный формат для отображения в select
                $field_date_start = date("d\.m\.Y", $field_date_start);
                //Преобразуем дату окончания в нужный формат для отображения в select
                $field_date_end = date("d\.m\.Y", strtotime($result[$i]->field_data_field_date_field_date_value2));
                //Заполняем массив нужными значениями select-а
                $options[] = $field_date_start." - ".$field_date_end." ".$node_title;
            }
        }

        //Заменяем значения в select формы на нужные
        $form['submitted']['ID_СЕЛЕКТА']['#options'] = $options;
    }
}
Ответ дан 04.02.2016 - 17:22
1

в hook_form_alter наполняйте/изменяйте #options у селекта

Ответ дан 03.02.2016 - 12:54
Аватар пользователя xandeadx
xandeadx
1542

Спасибо, но тогда вопрос:
Как из hook_form_alter обратиться к значению определенного поля определенного типа материала? Причем, как я понимаю, нужно в цикле перебрать все существующие опубликованные материалы этого типа. Как такое сделать?

Комментарий оставлен 03.02.2016 - 14:05

Делаете запрос базу, получаете значения

Комментарий оставлен 03.02.2016 - 14:50

xandeadx, спасибо! Все получилось. Код выше написал

Комментарий оставлен 04.02.2016 - 17:26
0

Если бы формы были сделаны не с помощью webform, а с помощью entityform, то можно было бы использовать поле типа entityreference и вьюху в качестве списка для селекта. Вьюха, соответственно, с фильтром по дате

Ответ дан 03.02.2016 - 21:31

Спасибо, попробую. Я помню, что ставил Entityform на какой-то проект. Но чем-то он мне не понравился, вроде как глючил.

Комментарий оставлен 04.02.2016 - 10:44