В одном из проектов я ввел словать с регионами и использовал этот словарь в двух типах материалов: "Место отдыха" и "Организация". Для ввода регионов я использовал модуль 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), но они возвращают пустой результат.
Придется писать свой обработчик или как? Не могли бы выложить исходники своего модуля? Спасибо
Наверное, ключевое слово в ответе на ваш вопрос - это 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.
Отправить комментарий