Как разместить два элемента в одной строке формы?

Главные вкладки

Аватар пользователя Strycker Strycker 31 мая 2013 в 19:47

Добрый вечер, коллеги!

Сразу прошу прощения за возможный сумбур. Весь день сегодня вожусь.

И так, задача стоит следующая. Нужно пользователю дать возможность выбрать у себя в профиле группу, в которую он хочет вступить и на какое время. Т.е. приблизительно так:
- группа 1 - месяц
- группа 2 - месяц
- группа 3 -
- группа 4 - полгода
....

Первая часть задачи замечательно решается встроенными средствами: создаём поле "Список - текст" с checkbox'ами, всё подписываем - получается красиво. Но как решить вопрос со сроком действия? Как рядом с каждым чекбоксом разместить ещё и listbox с несколькими вариантами выбора?
Я уж не говорю про то, что совсем уж красиво было бы сделать вывод listbox'а, только в том случае когда checkbox активен. (к слову специально для этого есть модуль Examples, в котором подробно объяснено как это сделать).

Что я сделал на текущий момент? я переопределил шаблон вывода формы редактирования профиля пользователя, сформировал нужную последовательность полей, а вот эту задачу решить не получается.

Буду рад любым комментариям по теме.

Комментарии

Аватар пользователя Strycker Strycker 3 июня 2013 в 9:24

Frantsuzzz wrote:
Тут посмотрите
http://xandeadx.ru/blog/drupal/65
http://frantsuzzz.com/content/vyvod-poley-formy-v-odnu-stroku-drupal-7

"Strycker" wrote:
вывод listbox'а, только в том случае когда checkbox активен

http://drupalace.ru/lesson/izmenenie-sostoyaniy-formy-v-drupal-7[/quote]

Спасибо большое! Изучу.

Аватар пользователя Strycker Strycker 3 июня 2013 в 15:13

с выводом listbox'а при активном checkbox'е я разобрался. Остался один вопрос с группами. Тут наверное надо пояснить. Я сделал группы одним полем в профиле пользователя, т.е. field_user_groups равен
gr1|Группа один
gr2|Группа два
gr3|Группа три
gr4|Группа четыре
gr5|Группа пять

виджет - чекбокс. Всё работает (сохраняется, выводится).
А вот как сделать срок вхождения в каждую группу в одном поле не сообразил, поэтому сделал так:
field_user_group1_validity
field_user_group2_validity
field_user_group3_validity
...

Есть понимание, что это не совсем "ровно", но как сделать лучше пока не понимаю. Собственно весь вопрос в том, как теперь вывести значение первого поля (чекбокс) рядом с соответствующим полем "Срок вхождения" типа листбокс?

В представленных примерах там поле + поле и по аналогии понятно, как делать. А тут получается поле1.значение + полеН - не совсем понятно.

Аватар пользователя Frantsuzzz Frantsuzzz 3 июня 2013 в 18:14

А у Вас группы вводятся вручную? И сколько их будет?

"Strycker" wrote:
Собственно весь вопрос в том, как теперь вывести значение первого поля (чекбокс) рядом с соответствующим полем "Срок вхождения" типа листбокс?

Плохо представляю картинку. Чекбокс по высоте - одна строка. Листбокс - прямоугольник на несколько строк высотой. Еще селект представляю, а вот листбокс нет.
При такой структуре, может просто CSS стилями выровнять.

Или для каждой группы делать два поля - галочка для категории и селект для срока.

Еще вариант - через hierarchical select. На первом уровне список категорий, на втором в каждой категории - список сроков подписки. Только там выбор не через чекбокс, а через селекты. Выглядеть будет тпримерно так. Пользователь выбирает в селекте категорию. Автоматически подгружается второй со сроками. Нажимает кнопку "добавить". Выбранная комбинация отображается под селектами, а пользователь может выбирать вторую категорию.

Аватар пользователя Strycker Strycker 4 июня 2013 в 9:35

Групп всего 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, спасибо большое за помощь!

Аватар пользователя Frantsuzzz Frantsuzzz 3 июня 2013 в 19:53

"Strycker" wrote:
Сейчас вроде всё работает: после сохранения профиля, админу сайта падает в мыло письмо, в котором перечислены группы, в которые хочет вступить пользователь и на какой срок

Тут Вы пропустили описание того, что происходит потом (после отправки письма).

Аватар пользователя Strycker Strycker 4 июня 2013 в 9:34

Frantsuzzz wrote:
Тут Вы пропустили описание того, что происходит потом (после отправки письма).

А тут всё просто: администратор сайта вручную добавляет пользователю роли, соответствующие группам в которые он желает войти.