В первой части статьи мы начали разговор о темизации 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 нам нужно произвести следующие манипуляции
- Скопировать шаблон из папка theme модуля views и переименовать его добавии машинное имя представления (views-exposed-form--search_by_node.tpl.php)
- Через hook_form_alter добавить для нужной формы скрытый идентифкатор, который мы потом сможем обработать prerprocess
- В prerprocess функции сброить флаг #printed для нашей формы
- Применяем drupal_render и обязательно drupal_render_childre($form)