В первой части статьи мы начали разговор о темизации 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)
