Вполне типичная задача: мы делаем exposed фильтр в views для фильтрации всех материалов в которых поле возраст находиться в диапазоне значений "от"-"до". По-умолчанию у нас получится сделать этот фильтр в виде двух текстовых полей, которые пользователь должен заполнить руками, нажимая на кнопочки. А что если нам нужно сделать так, чтобы вместо текстовых полей этот фильтр отображался в виде селектов? К решению данной задачи мы и приступим. Задачу можно решить двумья разными способами:

через jQuery
через свою функцию в template php

Рассмотрим оба способа.

Замена textfield на select с использованием jQuery

Открываем файл с нашими javascript-ами и добавляем туда следующий код:

<code>$(document).ready(function(){<br />
// Формируем массив значений для select<br />
var options = '';<br />
for(var i=18;i&lt;50;i++) {<br />
options += ''+i+'';<br />
}</p>

$("#edit-field-age-value-min") .replaceWith('' +
options +
'');

$("#edit-field-age-value-max").replaceWith('' +
options +
'');

});

Здесь код сразу для 2-х селектов. Вместо #edit-field-age-value-min и #edit-field-age-value-max нужно подставить свои значения.
edit-field-age-value-min, field_age_value[min], edit-field-age-value-max, field_age_value[max] - тоже смотрим через firebug в наших еще не измененных текстовых полях и подставляем в код выше.
Все готово. Теперь при загрузке страницы, наш text input будет заменяться на select.

Плюсы: простота, можно не только на друпалом так издеваться, мало кода.
Минусы: не по фен-шую, изменение элементов происходит только после загрузки страницы, без java script не работает.

Замена textfield на select с использованием phptemplate_preprocess_views_exposed_form

Раз мы уже будем копаться в template.php, добавим туда еще пару фишек.
Идем в наш template.php и добавляем туда функцию вида views-exposed-form--DISPLAY_ID.tpl.php
DISPLAY_ID заменяем на id дисплея своего views (смотрим на странице редактирования вьюхи).
Допустим, у меня дисплей имеет название page_filters, тогда получается такая функция:

<p><br />
&lt;?php</p>
 
<p>function phptemplate_preprocess_views_exposed_form__page_filters(&amp;$vars) {<br />
// Для отладки. (Нужен модуль devel)<br />
//dsm($vars);<br />
// dsm($vars['form']);</p>
 
<p>// Заполняем поле "от" значениями 21,22 и превращаем его из текстового в селект<br />
$vars['form']['field_age_value']['min']['#type']='select';<br />
$vars['form']['field_age_value']['min']['#options']=array('21'=&gt;'21','22'=&gt;'22',);<br />
$vars['form']['field_age_value']['min']['#default_value'] = '21';<br />
$vars['form']['field_age_value']['min']['#value']='21';<br />
unset($vars['form']['field_age_value']['min']['#size']);</p>
 
<p>// Заменяем метки и делаем их "от" и "до"<br />
$vars['form']['field_age_value']['min']['#title'] = t('от');<br />
$vars['form']['field_age_value']['max']['#title'] = t('до');</p>
 
<p>// Применяем изменения и рендерим все наше творчество<br />
unset($vars['form']['field_age_value']['max']['#printed']);<br />
unset($vars['form']['field_age_value']['min']['#printed']);<br />
$vars['widgets']['filter-field_age_value']-&gt;widget = drupal_render($vars['form']['field_age_value']['min']) . drupal_render($vars['form']['field_age_value']['max']);</p>
 
<p>// Заодно поменяем текст кнопки "Найти"<br />
$vars['form']['submit']['#value'] = t('Search Girls'); // заменяем текст<br />
unset($vars['form']['submit']['#printed']); // делаем так чтобы друпал заново сгенерировал html для нашего поля<br />
$vars['button'] = drupal_render($vars['form']['submit']); // генерируем html</p>
 
<p>}</p>

Все вхождения field_age_value - заменяем на свое, filter-field_age_value - тоже заменяем на свое значение. Какие значения для этих полей будут у вас, можно посмотреть с помощью Devel. Просто установите devel, включите его, и расскомментируйте строчку dsm($vars); в начале функции.

Все, теперь готово. Поле "от" превратиться в select, а поле "до" останется текстовым полем ввода. Думаю, что по аналогии не составит никакого труда превратить второе тесктовое поле в список выбора. Осталось только написать строчку для формирования массива, чтобы не заполнять все значения таким образом: $vars['form']['field_age_value']['min']['#options']=array('21'=>'21','22'=>'22',); и приспособить код для своих потребностей.

Плюсы: более правильный подход, пользователю уже выдается "правильный" html, не требует javascript
Минусы: более сложный в реализации подход, требует больше времени на написание кода.

Комментарии

buy viagra british dragon http://viagrawithoutdoctorpres.net - viagra without a doctor prescription viagra online europe viagra without a doctor - viagra hong kong viagra pills online reply #4 on

cialis buy uk http://cialis-walmart.shop - cialis over the counter walmart canadian pharmacy cialis generic cialis at walmart - cialis side effects cialis vs cialis show posts compare cialis levitra cialis

Добавить комментарий