Своя темизация views exsposed form в Drupal 7. Часть 2

Average: 3.5 (41 vote)

В первой части статьи мы начали разговор о темизации exsposed filter. Основной момент который мы вынесем с первой части, это то что нам нужно создать отдельный шаблон для exposed filters путем копирования шаблона views-exposed-form.tpl.php и переименование его в шаблон вида views-exposed-form--[название представления].tpl.php

Если мы откроем это шаблон, то увидем код в котором нигде не используется переменная $form. Что в приницпе не удивительно, так как в препроцессоре (template_preprocess_views_exposed_form) этого шаблона переменная $forms полностью рендериться в такие переменные как $widget, $sort_by, $items_per_page.

При попытке код шаблона заменить на такой стандартный вывод

<?php drupal_render_children($form) ?>

Мы ничего не увидем не смотря на то, что переменная $form нам доступна в шаблоне. Это происходит по рпичине того, что в функции template_preprocess_views_exposed_form происходт рендер переменной $form в другие переменные.

Как нам решить этот вопрос? Для начала обратим внимание на функцию drupal_render. Как видем рендер элемента формы прекращается есть существует или не пусто флаг '#printed' '#printed' у элемента. На это и построено наше решение, мы используем рекурсивную функцию и сбрасываем этот флаг '#printed' для элементов. 

Но в процессе разработки столкнулись с проблемой, как узнать что это наша exsposed форма и что именно для нее нуно сбрасывать перменные. Можно конечно не замарачиваться сбрасывать у всех exsposed form флаг '#printed', но мы же не ищем легких путей.

Поэтому через hook_form_alter в форму мы ввели дополнительный идентификатор. В общем смотрим код. Я думаю так станет более понятно.

/**
 * @param $form
 * @param $form_state
 * @param $form_id
 */
function corporate_form_alter(&$form, &$form_state, $form_id) {

  if($form_id == 'views_exposed_form' && in_array('views_exposed_form__search_by_node__page', $form['#theme'])) {
    $form['views_hidden_id'] = array(
     '#type'    => 'value',       // Добавляем скрытое поля по которому в preprocess сможем отследить искомую форму
     '#value'   => TRUE
   );
  }
}
/**
 * @param $vars
 *  @see template_preprocess_views_exposed_form
 */
function corporate_preprocess_views_exposed_form(&$vars) {
  $form = &$vars['form'];
  //views_hidden_id - этот дополнительный элемент,  который установили в hook_form_alter
  if(!empty($form['views_hidden_id']['#value'])) {
    corporate_reset_form_printed($form); // функция-помошник для сбрасывания флага printed
    dpm($form,__FUNCTION__);
  }
}

/**
 * helper function for reset form printed
 * @param $form
 */
function corporate_reset_form_printed(&$form) {
  foreach($form as $key => $element) {
     if(is_array($element)) {
       corporate_reset_form_printed($form[$key]);
     }
    if($key == '#printed') {
      unset($form[$key]);
    }
  }
}

Выводы:

Чтобы сделать свой шаблон формы для exsposed form нам нужно произвести следующие манипуляции

  1. Скопировать шаблон из папка theme модуля views и  переименовать его добавии машинное имя представления (views-exposed-form--search_by_node.tpl.php)
  2. Через hook_form_alter добавить для нужной формы скрытый идентифкатор, который мы потом сможем обработать prerprocess 
  3. В prerprocess функции сброить флаг #printed для нашей формы
  4.  Применяем drupal_render и обязательно drupal_render_childre($form)

Поделитесь статьей