Вывод полей формы в одну строку Друпал 7


77

Существует несколько способов, как вывести поля формы в строку. Например:

  • Обернуть поля формы в контейнер с классом 'container-inline'
  • Использовать  функцию темизации

В статье пойдет речь про второй способ для 7 Друпала. 

Существует несколько способов, как вывести поля формы в строку.

Например:

Обернуть поля формы в контейнер с классом '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[] = '
'.drupal_render($element).'
'; } } $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' определяет: отключать стандартную обертку или нет. 

И напоследок, приведу пример формы с более сложной структурой:

Готовый рабочий пример большой формы прилагается.

Вложение Size
test_fieldinline 1.99 КБ
Добавить комментарий
Может быть интересно
Модуль Migrate это фреймворк для миграции (импорта) данных в Drupal из любых источников.
1

В данной статье будет теория про механизм, который использует модуль migrate при импорте материалов в Друпал из различных источников.

2

В операционной системе Windows, как и в других операционных системах, интерактивные (набираемые с клавиатуры и сразу же выполняемые) команды выполняются с помощью так называемого командного интерпретатора, иначе называемого командным процессором или оболочкой командной строки (command shell).

3

Несколько способов как в twig объединить несколько строк в одну

3
Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.
2