Добрый вечер, коллеги!
Сразу прошу прощения за возможный сумбур. Весь день сегодня вожусь.
И так, задача стоит следующая. Нужно пользователю дать возможность выбрать у себя в профиле группу, в которую он хочет вступить и на какое время. Т.е. приблизительно так:
- группа 1 - месяц
- группа 2 - месяц
- группа 3 -
- группа 4 - полгода
....
Первая часть задачи замечательно решается встроенными средствами: создаём поле "Список - текст" с checkbox'ами, всё подписываем - получается красиво. Но как решить вопрос со сроком действия? Как рядом с каждым чекбоксом разместить ещё и listbox с несколькими вариантами выбора?
Я уж не говорю про то, что совсем уж красиво было бы сделать вывод listbox'а, только в том случае когда checkbox активен. (к слову специально для этого есть модуль Examples, в котором подробно объяснено как это сделать).
Что я сделал на текущий момент? я переопределил шаблон вывода формы редактирования профиля пользователя, сформировал нужную последовательность полей, а вот эту задачу решить не получается.
Буду рад любым комментариям по теме.
Комментарии
Тут посмотрите
http://xandeadx.ru/blog/drupal/65
http://frantsuzzz.com/content/vyvod-poley-formy-v-odnu-stroku-drupal-7
http://drupalace.ru/lesson/izmenenie-sostoyaniy-formy-v-drupal-7
с выводом listbox'а при активном checkbox'е я разобрался. Остался один вопрос с группами. Тут наверное надо пояснить. Я сделал группы одним полем в профиле пользователя, т.е. field_user_groups равен
gr1|Группа один
gr2|Группа два
gr3|Группа три
gr4|Группа четыре
gr5|Группа пять
виджет - чекбокс. Всё работает (сохраняется, выводится).
А вот как сделать срок вхождения в каждую группу в одном поле не сообразил, поэтому сделал так:
field_user_group1_validity
field_user_group2_validity
field_user_group3_validity
...
Есть понимание, что это не совсем "ровно", но как сделать лучше пока не понимаю. Собственно весь вопрос в том, как теперь вывести значение первого поля (чекбокс) рядом с соответствующим полем "Срок вхождения" типа листбокс?
В представленных примерах там поле + поле и по аналогии понятно, как делать. А тут получается поле1.значение + полеН - не совсем понятно.
А у Вас группы вводятся вручную? И сколько их будет?
Плохо представляю картинку. Чекбокс по высоте - одна строка. Листбокс - прямоугольник на несколько строк высотой. Еще селект представляю, а вот листбокс нет.
При такой структуре, может просто CSS стилями выровнять.
Или для каждой группы делать два поля - галочка для категории и селект для срока.
Еще вариант - через hierarchical select. На первом уровне список категорий, на втором в каждой категории - список сроков подписки. Только там выбор не через чекбокс, а через селекты. Выглядеть будет тпримерно так. Пользователь выбирает в селекте категорию. Автоматически подгружается второй со сроками. Нажимает кнопку "добавить". Выбранная комбинация отображается под селектами, а пользователь может выбирать вторую категорию.
Групп всего 12 штук, меняться будут не часто. У меня листбокс был, сейчас как раз переделал на селект. Выровнял как раз через стили.
Сделал так:
<?php
$form['field_user_groups']['und']['gr1']['#prefix'] = '<div class="container-inline">';
$form['field_user_gr1_validity']['#suffix'] = '</div>';
print drupal_render($form['field_user_groups']['und']['gr1']);
print drupal_render($form['field_user_gr1_validity']);
?>
Получилось не очень ровно, конечно, но главное для меня что чекбокс с селектом в одну строку. Теперь по-хорошему неплохо бы выровнять блоки: чекбокс по левому краю, а селект по правому. Или табличку сделать. Ну да с этим разберусь.
Сложность в другом. Это правда уже относительно темы этого поста получится оффтоп. Все эти пассы с полями в юзерпрофайле нужны для того, чтоб сделать своеобразный механизм "заказа" доступа в нужную группу. Сейчас вроде всё работает: после сохранения профиля, админу сайта падает в мыло письмо, в котором перечислены группы, в которые хочет вступить пользователь и на какой срок (всё это, понятно, реализовано через rules).
Теперь вся проблема в том, чтоб за неделю до окончания срока прислать пользователю письмо с напоминанием о том, что срок его участия подходит к концу. А в течение срока отображать в профиле сколько дней осталось до окончания членства в группе или до какой даты. При чём, по каждой группе срок надо хранить отдельно (собственно поэтому пришлось сделать 12 доп.полей в профиле - те самые селекты).
Я догадываюсь, что выбранный подход решения задачи не оптимален. Но на большее меня, боюсь, не хватит. Поэтому пока так. В идеале, конечно, надо написать модуль, который бы ещё и ко всему описанному функционалу, строил табличку с пользователями, с группами и сроками действия, с возможностью управления прям оттуда.
Но это не сейчас, для моего текущего уровня - слишком сложно.
Frantsuzzz, спасибо большое за помощь!
Тут Вы пропустили описание того, что происходит потом (после отправки письма).
А тут всё просто: администратор сайта вручную добавляет пользователю роли, соответствующие группам в которые он желает войти.