Темизация expose фильтров

Для темизации фильтров используется шаблон views-exposed-form.tpl.php (лежит в /views/theme) и preprocess функция theme_preprocess_views_exposed_form().
Также возможны различные сочетания имен шаблона и функции:

  • views-exposed-form--DISPLAY_ID.tpl.php
  • views-exposed-form--DISPLAY_PLUGIN.tpl.php
  • views-exposed-form--VIEW_NAME--DISPLAY_PLUGIN.tpl.php
  • views-exposed-form--VIEW_NAME--DISPLAY_ID.tpl.php

и

  • phptemplate_preprocess_views_exposed_form__DISPLAY_ID
  • phptemplate_preprocess_views_exposed_form__DISPLAY_PLUGIN
  • phptemplate_preprocess_views_exposed_form__VIEW_NAME__DISPLAY_PLUGIN
  • phptemplate_preprocess_views_exposed_form__VIEW_NAME__DISPLAY_ID

VIEW_NAME - имя вида
DISPLAY_PLUGIN - как правило page или block
DISPLAY_ID - аналогично DISPLAY_PLUGIN, но с указанием номера отображения (page_1, page_2 и тд.)

Пример №1

Заменяем текcт на кнопке с Apply на Search

function phptemplate_preprocess_views_exposed_form(&$vars) {
 $vars['form']['submit']['#value'] = t('Search'); // заменяем текст
 unset($vars['form']['submit']['#printed']); // делаем так чтобы друпал заново сгенерировал html для нашего поля
 $vars['button'] = drupal_render($vars['form']['submit']); // генерируем html
}

Пример №2

Есть фильтр Node: Type в виде documents, надо заменить стандартный элемент <Any> на - Please select -

function phptemplate_preprocess_views_exposed_form(&$vars) {
 if ($vars['form']['#id'] == 'views-exposed-form-documents-page-1') { // только для определенной формы
    $vars['form']['type']['#options']['All'] = t('- Please select -');
    unset($vars['form']['type']['#printed']);
    $vars['widgets']['filter-type']->widget = drupal_render($vars['form']['type']);
 }
}

Пример №3

В шаблоне expose фильтров можно менять расположение фильтров путем вывода виджетов не в цикле, а независимо друг от друга
пример вывода виджета для категории:

<table class="views-exposed-widgets clear-block">
  <tr class="views-exposed-widget">
    <td class="label">
      <label for="<?php print $widgets['filter-tid']->id; ?>">
        <?php print $widgets['filter-tid']->label; ?>
      </label>
    </td>
    <td class="views-widget">
      <?php print $widgets['filter-tid']->widget; ?>
    </td>
  </tr>
  <tr class="views-exposed-widget button">
    <td class="label"></td>
    <td>
      <?php print $button ?>
    </td>
  </tr>
</table>

для того чтобы понять какой id у виджета (в примере выше это filter-tid) можно воспользоваться кодом

<?php drupal_set_message('<pre>'. print_r($widgets, 1) .'</pre>'); ?>

или если у вас установлен devel
<?php dpm($widgets); ?>

После изменений нужно сбрасывать кеш.

Заметьте во 2м примере, я использовал условие для изменения конкретной формы.
Вы можете пойти другим путем и создать функции специально для этой формы
phptemplate_preprocess_views_exposed_form_documents__page_1, но чтобы функция сработала, Вы также должны создать в папке с темой шаблон для этой формы views-exposed-form--documents--page_1.tpl.php

Комментарии

можно ли phptemplate_preprocess_views_exposed_form как-то перенести как-то из template.php в модуль, ps просто люблю менять темы и не хочется привязываться к ней

во, интересная штука, очень нужна как раз

а темизировать то как? местами менять фильтры цвета их изменять?

см. Пример №3

Отличный материал. Только вот как вывести виджеты фильтров в разных регионах? Например фильтр по типам нод в на главном регионе, а фильтр по терминам - в боковой и т.п. Ведь используя приём №3 как ни кастомизируй вывод - всё равно всё останется в одной форме в одном блоке. Вообще очень странно что эта тема практически не освещена ни в русском, ни в английском сообществах.

фильтры объединены в одну html форму, её нельзя разделить на несколько блоков.

вывел по третьему примеру каждый фильтр с новой строки... но они не работают. не фильтруется... видимо потому что . использую виевс хак - а там автосамбит???

можно как то решить вопрос для 2 виевс с применением автосамбита из модуля виевс_хак???

спасибо!

не сталкивался с этим модулем

2 пример не получается... у меня 3 фильтра нужно у 3-го изменить текст Any на другой , пробую изменить хотя бы для всех фильтров делаю как у вас в примере, но там написано что это для определенного фильтра какого-то а вы добавляете название вьюхи и т.д.

Можно немножко поподробнее...

function phptemplate_preprocess_views_exposed_form(&$vars) {
 if ($vars['form']['#id'] == 'views-exposed-form-documents-page-1') { // если это условие не писать, то все формы будут изменены
drupal_set_message('<pre>'. print_r($vars['form'], 1) .'</pre>'); // это выведет массив формы чтобы знать как называются поля
    $vars['form']['type']['#options']['All'] = t('- Please select -');
    unset($vars['form']['type']['#printed']);
    $vars['widgets']['filter-type']->widget = drupal_render($vars['form']['type']);
 }
}

так а куда ID конкретного фильтра писать (ну как в примере 3).

views-exposed-form-documents-page-1 - это же у вас вьюха (имя) и страница (Page_1)

а для конкретного фильтра то как???

вместо $vars['form']['type'] нужное поле, чё непонятного то?

Камрады!!!
Помогите пожалуйста, бьюсь уже сутки. Необходимо темезировать exposed-form, не в template.php и не в своем модуле, а в самом файле views-exposed-form--test--page.tpl.php
А именно, есть поле field_mypole (это cck-select list)

<select name="field_mypole_value" class="form-select" id="edit-field-mypole-value"><option value="All">&lt;Any&gt;</option><option value="442">442</option><option value="443">443</option>

как в шаблоне прописать, чтобы по умолчанию выбирался (был активным) нужный мне атрибут из списка.
В шаблонах на созание ноды я юзаю $form['field_mypole']['value']['#value'] = '443';

а в экпозед фильтрах не могу найти нужный мне параметр из маиса $form

спс

а никак, в шаблоне поле уже отрендерено. чем tempate.php не угодил?

делаю мультисайтинг на трех сайтах, поэтому хотел оставить одинаковый темплейт.пхп, но да бог с ним, тоже пойдет. стал копать preprocess_views_exposed_form, но пока тоже самое, значение меняет а форма по прежнему не меняется.

Может быть подскажете какой атрибут курить нужно.

function newtheme_preprocess_views_exposed_form(&$vars, $hook) {
   switch($vars['form']['#id']){
      case 'views-exposed-form-test-page-1':        
           unset($vars['form']['field_myfield_value']['#processed']);
     unset($vars['form']['field_myfield_value']['#defaults_loaded']);
      unset($vars['form']['field_myfield_value']['#printed']);
      unset($vars['form']['field_myfield_value']['#options']);
         $vars['form']['field_myfield_value']['#multiple'] = false;
          $vars['form']['field_myfield_value']['#default_value'] = 443;
          $vars['form']['field_myfield_value']['#id'] = 443;
          $vars['form']['field_myfield_value']['#value'] = 443;
          $widget = $vars['widgets']['filter-field_myfield_value'];

      drupal_set_message(var_export($vars['form']['field_myfield_value'],true),'info');

}}

unset($vars['form']['field_myfield_value']['#printed']);
// тут изменения
$vars['widgets']['filter-field_myfield_value']->widget = drupal_render($vars['form']['field_myfield_value']);

Спасибо большое, подошло. Жаль что выводит по умолчанию все результаты, но это ничего.
Ещё раз. спс

Народ, первый пример что то не работает у меня. Код в template.php основной темы нужно помещать? Кэш все очистил, но слово Apply не хочет меняться.

А не проще ли установить better exposed filters и настроить. Напр. поменять название Apply на свое усмотрение...

и где там меняицо то?

>>А не проще ли установить better exposed filters и настроить. Напр. поменять название Apply на свое усмотрение...
При использовании модуля "better exposed filters", и рендеринга методом который здесь описан, создаваемый html-код не обрабатывается BEF-ом.
Пробовал менять вес модуля BEF, бесполезно.

>>и где там меняицо то?
Открываете настройки фильтра в вьюхе и там будет селект "Display exposed filter as:"

Хочется поменять в exposed фильтре SELECT на CHECKBOX
Подскажите плиз, возможно ли это сделать и как?

модуль есть на друпал орг поищите по запросу exposed фильтры и найдете то что нужно

ксти ответ на ваш вопрос постом выше