CMS Drupal

Может плохо искал, но нигде не нашел готового решения, хотя думаю, что тема довольно популярная. Итак, поставленная задача - это сделать форму поиска материалов с отбором по наличию прикрепленного к ноде файла (в частности фотографии). Форма поиска будет делаться на основе фильтра 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']) {, то фильтр по-прежнему выводит текстовое поле.

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

admin аватар

Похоже вам надо посмотреть переменную $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; но ничего не выводится.

Не сталкивались с этим?

admin аватар

Не, так, наверное, ничего путного вам не скажу. Ответ у меня такой же будет как и предыдущий. :) Надо пробовать посмотреть весь массив $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

admin аватар

По правде сказать на 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('Только с фото');
}
}
}

и все рабротает

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".