Может плохо искал, но нигде не нашел готового решения, хотя думаю, что тема довольно популярная. Итак, поставленная задача - это сделать форму поиска материалов с отбором по наличию прикрепленного к ноде файла (в частности фотографии). Форма поиска будет делаться на основе фильтра Views, а фото прикрепляется с помощью CCK. Пусть поле с фотографией называется "field_auto_photo".
Самый простой вариант - это выбрать в настройке фильтра поле field_auto_photo - list. Окончание list в данном случае важно, т.к. можно выбрать delta и не знать что дальше делать. (Именно так я и просидел часть времени :)). В результате в форме появляется select с тремя вариантами: Any, True и False. Наверняка, многим этого бывает достаточно, поэтому тема с checkbox-ом не всплыла. Но даже в данном варианте я бы подпилил этот select с помощью модуля, чтобы сделать нужный мне перевод:
<?php function my_module_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'views_exposed_form') { if ($form['field_auto_photo_list']) { $form['field_auto_photo_list']['#type'] = "select"; $form['field_auto_photo_list']['#options'] = array(All=>"Не важно",1=>"Да",0=>"Нет"); } } } ?>
А теперь непосредственно к теме статьи - сделаем фильтр с помощью checkbox-а. Может быть существует более простой вариант, но я не нашел, поэтому предлагаю то, что у меня сработало. Для этого необходимо установить дополнительный модуль computed_field. При помощи данного модуля добавляем к нашему материалу поле с типом Computed. Назовем его "field_auto_with_photo". В настройках, в поле Computed Code пишем код:
if ($node->field_auto_photo[0][fid]) { $node_field[0]['value'] = 1; } else { $node_field[0]['value'] = 0; }
Т.е. если к материалу прикреплен файл, то устанавливаем нашему полю значение 1 иначе 0. Тут же, в настройках устанавливаем Data Type: int, Data Length: 1, Default Value: 0, Not NULL: true.
Далее, уже в настройках фильтра выбираем наше новое поле auto_with_photo и ставим Operator: больше или равно. Полученную форму можно потестить, как работает (ставим 0 или 1), но только пока что без checkbox-а (вместо него обычное текстовое поле). Чтобы сделать checkbox пишем в свой модуль хук, который я уже использовал выше:
<?php function my_module_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'views_exposed_form') { if ($form['field_auto_photo_list']) { $form['field_auto_with_photo_value']['#type'] = "checkbox"; $form['field_auto_with_photo_value']['#title'] = t('Photo'); } } } ?>
Теперь должна появиться нужная нам форма. Если ставим галку, то выводятся материалы с фото, если галку не ставим, то выводятся все материалы.
Здравствуйте. Отличное решение, но есть один вопрос.
Если я ставлю условие if ($form['field_auto_photo_list']) {, то фильтр по-прежнему выводит текстовое поле.
Когда условие убираю, чекбокс появляется, но и на всех других разделах сайта тоже, хотя по-логике его там быть не должно. Будьте добры, подскажите как исправить или в какую сторону двигаться.
Похоже вам надо посмотреть переменную $form : print_r($form)
Такое ощущение, что у вас не определен элемент с именем 'field_auto_photo_list'. Может у вас как-то по-другому это называется.
Спасибо за ответ. Имя элемента я правильно написал field_autoforsale_avatar, все равно не работало.
Сначала извратился тем, что проверял на какой странице находимся, и заменял текстовое поле на чекбокс, но понимал, что это некрасиво. В итоге изменил вашу проверку на
if ($form['field_autoforsale_withphoto_value']) {
$form['field_autoforsale_withphoto_value']['#type'] = "checkbox";
$form['field_autoforsale_withphoto_value']['#title'] = t('filterwithphoto');
}
Так заработало:) но чекбокс выводится последним из всех фильтров, а мне бы хотелось вывести его в начале. В настройках представления этот фильтр стоит самым первым.
Еще один момент. Вывод фильтров я перекрываю. Создаю файл views-exposed-form--automarket--page.tpl.php
И там в нужной мне последовательности вывожу фильтры, оборачиваю в нужные блоки итд. В общем, красоту навожу.
В этом случае вывожу фильтр, как и все print $widgets['filter-field_autoforsale_withphoto_value']->widget; но ничего не выводится.
Не сталкивались с этим?
Не, так, наверное, ничего путного вам не скажу. Ответ у меня такой же будет как и предыдущий. :) Надо пробовать посмотреть весь массив $widgets и поискать в нем что-то похожее на то, что вам нужно. Просто я в свое время не переопределял вывод этого фильтра.
Нашел :) Выводится чекбокс строчкой print $widgets['checkboxes']->widget
Еще раз спасибо за материал и ответы.
добрый день, скажите, а как быть с Drupal 7?, в нем у меня нет типа "list"... есть только следующие поля:
field_photo:alt
field_photo:delta
field_photo:fid
field_photo:height
field_photo:title
field_photo:width
По правде сказать на 7-м Друпале ничего не делаю. Вообще может быть даже пропущу эту версию. Все делаю пока на 6-м, а там глядишь и 8-ка подоспеет.
Благодарю за ответ
Все оказалось еще проще:) drupal.ru/node/83748
здравствуйте пробывал вашем способом не чего не получилось может быть потому что у меня фото по умолчанию уже стояло или я не правильно что то делаю мучился выше описанным способом весь день толкого не чего не вышло решил более простым способом:
1выбрасываем модуль computed_field и удаляем дополнительное поле которое мы создали они нам не нужны
2 во вьюхе в фильтры добавляем поле с нашим изображением раскрываем его в настройках ставим "ложь" и в правом нижнем углу ставим галочку на "Необязательное поле" и сохраняем
3 пишем свой модуль
function НАЗВАНИЕ_МОУЛЯ_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'views_exposed_form') {
if ($form['field_НАЗВАНИЯ ПОЛЯ С ИЗОБР_list']) {
$form['field_НАЗВАНИЯ ПОЛЯ С ИЗОБР_list']['#type'] = "checkbox";
$form['field_НАЗВАНИЯ ПОЛЯ С ИЗОБР_list']['#title'] = t('Только с фото');
}
}
}
и все рабротает
Отправить комментарий