Есть 2-х уровневый словарь Регионы. Первый уровень это федеральные округа, второй уровень это непосредственно сами регионы. Для прикрепления региона к материалу используется модуль Hierarchical select (HS). Для поиска материалов по региону используется фильтр модуля Views (Exposed filter). Для материала мне в принципе не нужно сохранять фед. округ, достаточно региона, поэтому изначально я в настройках поля выбрал опцию сохранения лишь самого последнего уровня из словаря регионов(Save only the deepest term). Вот такие, так сказать, начальные условия.
А теперь проблема. Хотя модули HS и Views достаточно хорошо друг с другом взаимодействуют, но в форме поиска (Exposed filter) у меня получился затык. С начала я в настройках поля регионов для фильтра поставил, что значение поля выбирается из последнего уровня(Force the user to choose a term from a deepest level). Поле сделал опциональным. И все вроде бы работает: в списке фед. округов присутствует значение "Любой" (Any), а при выборе округа подгружаются регионы. Но в списке регионов нет этого злосчастного пункта "Любой". Т.е. нельзя выполнить поиск по фед. округу, только по региону или по всем округам.
А заказчику надо чтобы и по округам можно было.
Пытался с помощью jQuery подцеплять значение Любой в select второго уровня(т.е. в регионы) с текущим значеним tid из первого select-а(с фед. округами). Но это не очень хорошая затея и я ее оставил и пошел другим путем. Изменил настройку поля регион для материала, поставив там переключатель Save term lineage, чтобы сохранялись не только регионы, но и округа. Для поля регионы в фильтре я выставил Allow the user to choose a term from any level, т.е. чтобы можно было выбрать термин словаря из любого уровня. При этих настройках в select-ах фильтра появились дополнительные опции в виде пустых строк. Если во втором select (для регионов) это значение еще можно было бы оставить и выбирать его для поиска по всем регионам одного округа, то для округов такое пустое значение явно лишнее, т.к. там кроме него есть отдельное значение "Любой". Пришлось написать свой скрипт:
Drupal.behaviors.js = function(context) { for (var hsid in Drupal.settings.HierarchicalSelect.settings) { break; } // Удаляем пустую строку из первого селекта $('#hierarchical-select-'+hsid+'-wrapper').find("option[value='label_0']").remove(); change_blank_text(); // При загрузке // При изменении первого селекта $('#hierarchical-select-'+hsid+'-wrapper').bind('change-hierarchical-select', function(hsid, updateType, settings) { change_blank_text(); }); } function change_blank_text(){ // Изменяем пустую строку во втором селекте blank_option = $('#edit-tid-hierarchical-select-selects-1').find("option[value='label_1']"); if (blank_option.size() != 0){ blank_option.text("<Любой>"); } }
Данный скрипт удаляет пустую строку из первого select и изменяет текст во втором select-е с пустого на "<Любой>". Все работает. Единственное замечание: у меня в форме поиска поле с регионами находится на первом месте, поэтому при поиске hsid я сразу же выхожу из цикла. Если же элемент в форме будет не на первом месте, то соответственно из цикла надо будет выходить в соответствии с порядковым номером.
Но нам этот скрипт нужен только на странице поиска, поэтому в своем модуле пишем нечто подобное:
function alex_module_init() { $path = drupal_get_path('module', 'alex_module'); if (substr($_GET['q'],0,11) == "search_rest") { drupal_add_js($path .'/js/js.js'); } }
У меня страница с формой писка имеет адрес search_rest, поэтому скрипт загружается только для данной страницы.
А возможно ли как-нибудь удалить (отключить) поле <Любой> вообще?
Давно это все было, поэтому в настройки HS залазить уже не хочется, поэтому первое что приходит в голову это воспользоваться все тем же JQuery, как и приведено в посте, а именно:
Вот так же и удалить значение Любой из селекта.
это для шестерки? чет вставил в page.tpl.php - ничего не срабатывает
Для 6-ки. Я так понимаю вопрос по поводу последнего коментария? О не срабатывании ява скрипта? А сам скрипт у вас правильно стартует?
$(function(){
....
сделал так, ничего не происходит
$(function(){
Drupal.behaviors.js = function(context) {
for (var hsid in Drupal.settings.HierarchicalSelect.settings) {
break;
}
// Удаляем пустую строку из первого селекта
$('#hierarchical-select-'+hsid+'-wrapper').find("option[value='label_0']").remove();
change_blank_text(); // При загрузке
// При изменении первого селекта
$('#hierarchical-select-'+hsid+'-wrapper').bind('change-hierarchical-select', function(hsid, updateType, settings) {
change_blank_text();
});
}
function change_blank_text(){
// Изменяем пустую строку во втором селекте
blank_option = $('#edit-tid-hierarchical-select-selects-1').find("option[value='label_1']");
if (blank_option.size() != 0){
blank_option.text("<Любой>");
}
}
}
там в конце еще закрывающую скобку
а может ли это быть от того что на странице 2 hs селекта?
Судя по всему вам надо сначала добиться того, чтобы заработал яваскрипт, а потом уже будете методом проб и ошибок подбираться к нужному вам элементу. Вы либо сделайте как я в статье написал и выносите яваскрипт в отдельный файл, а потом его подключайте, либо если в шаблон страницы подставляете, то что-то типа:
Под каким там id скрывается ваш селект вы уж сами посмотрите.
так id постоянно меняется, при каждом обновлении странички
я вот тут установил test.drupalworld.ru/search
подключил в page.tpl.php для всего сайта, а не отдельной странички - там в исходном коде
test.drupalworld.ru/themes/garland/js.js
у второго всплывающего селекта поменял id на edit-term-node-tid-depth-hierarchical-select-selects-1 в коде яваскрипта
не знаю почему, но почему то не работает
кстати в настройках hs раскрытого фильтра можно включить галочку Enable level labels (Level labels) и там во втором поле прописать необходимый лейбл option[value='label_1]
подключил на локалке test.drupalworld.ru/themes/garland/js.js возле $closure и function change_blank_text стала срабатывать, правда только при сброшенном фильтре, а если выбрать область, нажать поиск то поле уже не подменяется, но это можно решить как я писал выше прописать лейбл в настройках
первая пустая строка первого уровня (область) так и не удаляется :(
Глянул щас на сайт. Ну если вы отдельным файлом подключаете яваскрипт и запускаете его с помощью Drupal.behaviors.js, то тогда $(function(){ вам не нужна. Первой строкой вашего яваскрипта будет Drupal.behaviors.js = function(context) {
Если пустая строка не удаляется, то тогда попробуйте посмотреть что у вас получается в переменной hsid.
Совпадает ли вообще этот номер с номером вашего селекта #hierarchical-select-'+hsid+'-wrapper. Проблема здесь. Для верности можете еще использовать такую проверку:
Если будет сообщать ноль, то значит что он нужный селект не может найти. Если будет 1, а пустой элемент не будет удаляться, то тогда уже дальше надо думать.
сделал как вы сказали, убрал $(function(){
сразу заработало - в первом селекте убралась первая строка (область/город), во втором селекте конечно не сработало, дописал типа так и во втором селекте заработало
Drupal.behaviors.js = function(context) {
for (var hsid in Drupal.settings.HierarchicalSelect.settings) {
break;
}
// Удаляем пустую строку из первого селекта
$('#hierarchical-select-'+hsid+'-wrapper').find("option[value='label_0']").remove();
hsid++;
$('#hierarchical-select-'+hsid+'-wrapper').find("option[value='label_0']").remove();
change_blank_text(); // При загрузке
// При изменении первого селекта
$('#hierarchical-select-'+hsid+'-wrapper').bind('change-hierarchical-select', function(hsid, updateType, settings) {
change_blank_text();
});
}
function change_blank_text(){
// Изменяем пустую строку во втором селекте
blank_option = $('#edit-term-node-tid-depth-1-hierarchical-select-selects-1').find("option[value='label_1']");
if (blank_option.size() != 0){
blank_option.text("<Любой>");
}
blank_option = $('#edit-term-node-tid-depth-hierarchical-select-selects-1').find("option[value='label_1']");
if (blank_option.size() != 0){
blank_option.text("<Любой>");
}
}
вот test.drupalworld.ru/search
правда заметил глюк в hs - выбираю донецкая область, донецк, поиск, выводятся результаты поиска автомобилей в донецке, хочу теперь искать все авто донецкой области, выбираю донецкая область, в дочернем там где город <любой>, нажимаю поиск, но при обновлении странички дочерний селект (город) обратно перебрасывается на донецк и соответственно выводит результаты по донецку.
если только нажать сброс, то можно искать по всей донецкой области, странно, чего так?
Давненько не игрался я с HS, поэтому тут вам так сходу и не скажу в чем может быть причина. Ковыряться надо.
Отправить комментарий