CMS Drupal

В одном из проектов я ввел словать с регионами и использовал этот словарь в двух типах материалов: "Место отдыха" и "Организация". Для ввода регионов я использовал модуль hierarchical_select (HS), т.к. регионы выбирались с привязкой к фед. округам. В этом модуле можно в настройках задать опцию - записывать ли регионы в таблицу term_node (т.е. воспринимать этот словарь как обычную таксономию с выводом материалов по ссылкам типа taxonomy/term/1) или же воспринимать этот словарь лишь как справочник, без записей в эту таблицу. Для типа материала "Место отдыха" мне надо было делать записи в term_node, а для "Организации" нет. Вот такая система.

Дальше я начал делать views и выводить материалы с фильтром по регионам. Для "Места отдыха" все работает прекрасно, т.к. в модуле hierarchical_select предусмотрен обработчик (handler) для фильтрации по терминам таксономии. Это видно хотя бы из того, что в папке modules лежит файлик hs_taxonomy_views_handler_filter_term_node_tid.inc, из названия которого все ясно. А вот файлика типа hs_taxonomy_views_handler_filter_content.inc нет. И как результат при добавлении фильтра по региону для типа материала "Организация" нет возможности выбрать нужную форму из модуля HS.
Для решения этой проблемы пришлось написать небольшой модуль. Точнее у меня уже был модуль для этого проекта (alex_module), поэтому я дописывал в него. Итак, для начала объявляем наш собственный обработчик, используя hook_views_handlers:

function alex_module_views_handlers() {
  $handlers = array();
  $handlers['handlers']['alex_module_handler_filter_region'] = array(
    'parent' => 'views_handler_filter_many_to_one',
    'file' => 'views_handlers/alex_module_handler_filter_region.inc',
  );
  return $handlers;
}

Затем пишем хук, в котором переопределям обработчик для поля, по которому будем фильтровать.

/**
* Implementation of hook_views_data_alter().
*/
function alex_module_views_data_alter(&$data) {
  //print_r($data);
  $data['node_data_field_profile_region']['field_profile_region_value']['filter']['handler'] = 'alex_module_handler_filter_region';
}

Название нужного поля можно найти по print_r($data). Только надо будет отключить яваскрипт на это время и не забываем жать на "Clear views cache" из admin/build/views/tools.

Дальше создаем файлик alex_module_handler_filter_region.inc. Как видно из вышеприведенного кода, у меня этот файл лежит в папке 'views_handlers'.

А теперь самое сложное и в тоже время самое легкое. Написать обработчик. Мое решение конечно далеко от идеала и в принципе не правильное, но работает, а значит имеет право на жизнь. Берем файл hs_taxonomy_views_handler_filter_term_node_tid.inc из модуля HS, о котором я уже упоминал. Копируем его в папку 'views_handlers' нашего модуля и вносим небольшие изменения.

Вместо:

class hs_taxonomy_views_handler_filter_term_node_tid extends views_handler_filter_term_node_tid {
 
  function init(&$view, $options) {
    parent::init($view, $options);
 
    // The following code should logically be wrapped in a
...

Пишем:

class alex_module_handler_filter_region extends views_handler_filter_many_to_one {
 
  function init(&$view, $options) {
    parent::init($view, $options);
 
    // XA
    $this->options['type'] = 'hierarchical_select';
    $this->options['vid'] = 1;
    //    XA
 
    // The following code should logically be wrapped in a
...

Остается только сказать что в строке $this->options['vid'] = 1, единица - это номер словаря с регионами.
Ах, да. Забыл сказать еще, что часть времени убил впустую. Когда тестировал, то включил два фильтра: один вот этот свой, а второй тоже фильтр по регионам, но из таксономии(который работает с HS без проблем). Первым был тот что из таксономии и в итоге он работал, а в моем select-е выходила надпись, что не влючен js и можно было выбрать только округ(регионы не подгружались). Выяснилось, что эти фильты конфликтовали друг с другом и, оставив только свой фильтр, все заработало.

Комментарии

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Спасибо за описание! Как раз столкнулся с такой же проблемой. Не могли бы вы подробнее описать настройки HS и самого словаря таксономии?

Создал словарь "Город", ни к одному типу материала он не привязан (правильно ли что не привязан?)
Написал модуль с типом материала "Вызов курьера", в котором добавил два поля с HS "Город отправки и город доставки". В полях таблицы храню значения tid терминов.
При создании ноды, в терминах к нему эти поля не цепляются. Как сделать чтобы цеплялись, как у вас в "Место отдыха" ?

Теперь дело дошло до подключения полей в Views. Хотел использовать готовые обработчики (хэндлеры) views (views\modules\taxonomy\views_handler_field_term_node_tid.inc), но они возвращают пустой результат.

Придется писать свой обработчик или как? Не могли бы выложить исходники своего модуля? Спасибо

admin аватар

Наверное, ключевое слово в ответе на ваш вопрос - это CCK. Я добавлял к типу материала "Место отдыха" поле "Регион" с помощью этого модуля. Тип поля: Content Taxonomy Fields. А уже в качестве Widget type: выбирал HS. Сначала вообще не понял фразу "Написал модуль с типом материала "Вызов курьера". Видимо это как раз потому, что вы без CCK делали. Так? Поэтому попробуйте поработать с данным модулем. У меня проблемы возникли именно на этапе с views. При чем, если позволить HS делать записи в таблицу term_node (поставить галку напротив "Save values additionally to the core taxonomy system (into the 'term_node' table)." ), то вообще ничего писать не надо. Все стандартными средствами пройдет: и привязка региона к типу материала и дальнейшая форма фильтра views.

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

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны 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]".