
Существует несколько способов, как вывести поля формы в строку.
Например:
Обернуть поля формы в контейнер с классом 'container-inline'
Как его использовать, можно посмотреть тут.
Это самы простой и быстрый способ. Но зачастую - не совсем удобен. Почему?
Дело в том, что как правило у полей есть заголовок, описание, префиксы и суффиксы.
Вот как выглядит описание стиля для класса "container-inline":
.container-inline div, .container-inline label { display: inline; }
Абсолютно все элементы поля выводятся в строку.
Использовать функцию темизации
Тут есть вариант для шестого друпала.
Давайте попробуем сделать аналогичную функцию для 7 Друпала и заодно немного усовершенствуем ее.
Готовим основу формы.
$form['cont1']=array( '#type'=>'markup', '#title' => 'Укажите габаритные размеры', '#description' => 'Ширина и высота,мм', '#theme' => array('inline_fields'), '#fields_separator' => ' х ', //тут все по старому '#not_div'=>true, //еще один выдуманный элемент, расскажу о нем вконце статьи ); $form['cont1']['pole1']=array( '#type'=>'textfield', '#default_value' => '', '#maxlength' => 5, '#size' => 5, ); $form['cont1']['pole2']=array( '#type'=>'textfield', '#default_value' => '', '#maxlength' => 5, '#size' => 5, );
Объявление функции темизации в 7 Друпале отличается:
/** * Реализация hook_theme() */ function test_fieldinline_theme() {return array( 'inline_fields' => array( 'render element' => 'element', ), ); }
А теперь самое интересное - функция темизации в новом облике:
/** * theme функция вывода полей в один ряд */ function theme_inline_fields($variables) { $form = $variables['element']; $fields = array(); foreach ($form as $key => $element) { // ищем дочерние поля if (substr($key, 0, 1) != '#') { $size = empty($element['#size']) ? '' : ' size="'. $element['#size'] .'"'; // если при валидации в поле была допущена ошибка, функция добавит к элементу класс error _form_set_class($element, array()); if(isset($form['#not_div']) && $form['#not_div']) unset($element['#theme_wrappers']); $fields[] = '<div style="display:inline-block">'.drupal_render($element).'</div>'; } } $form['#children']=implode($form['#fields_separator'], $fields); return theme('form_element', array('element'=>$form)); }
Результат на скриншоте:
В чем же заключается усовершенствование?
- У нас появилась возможность работать с различными типами полей (radios, select - остальные не проверял).
- Поддерживается вложенность контейнеров.
Как и обещал, раскажу про новый параметр '#not_div'.
Вся ответственность за генерацию html-кода элемента формы возложена на функция drupal_render(). Когда она обрабатывает массив с элементом формы, она возвращает поле вместе с заголовком, описанием, суффиксом и т.д. И даже если мы не указываем эти параметры для элемента, он все равно будет обернут в "<div></div>". Так сказать - стандартная обертка полей. Что бы получить чистый код поля без обертки, удаляем из элемента свойство ['#theme_wrappers']. Так вот, параметр '#not_div' определяет: отключать стандартную обертку или нет.
И напоследок, приведу пример формы с более сложной структурой:
Демо можно посмотреть тут. Готовый рабочий пример большой формы прилагается.
Комментарии
rt9чт, 06/03/2014 - 23:08 #1
ваш снег меня чуть с ума не свел
Frantsuzzzпт, 07/03/2014 - 21:49 #2
)) У меня на работе еще Ёлка наряженная на столе стоит!
Добавить комментарий