CMS Drupal

Есть 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, поэтому скрипт загружается только для данной страницы.

Комментарии

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

А возможно ли как-нибудь удалить (отключить) поле <Любой> вообще?

admin аватар

Давно это все было, поэтому в настройки HS залазить уже не хочется, поэтому первое что приходит в голову это воспользоваться все тем же JQuery, как и приведено в посте, а именно:

// Удаляем пустую строку из первого селекта
$('#hierarchical-select-'+hsid+'-wrapper').find("option[value='label_0']").remove();

Вот так же и удалить значение Любой из селекта.

это для шестерки? чет вставил в page.tpl.php - ничего не срабатывает

admin аватар

Для 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 селекта?

admin аватар

Судя по всему вам надо сначала добиться того, чтобы заработал яваскрипт, а потом уже будете методом проб и ошибок подбираться к нужному вам элементу. Вы либо сделайте как я в статье написал и выносите яваскрипт в отдельный файл, а потом его подключайте, либо если в шаблон страницы подставляете, то что-то типа:

$(function(){
$('#hierarchical-select-0-wrapper').find("option[value='label_0']").remove(); 
})

Под каким там 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 стала срабатывать, правда только при сброшенном фильтре, а если выбрать область, нажать поиск то поле уже не подменяется, но это можно решить как я писал выше прописать лейбл в настройках

первая пустая строка первого уровня (область) так и не удаляется :(

admin аватар

Глянул щас на сайт. Ну если вы отдельным файлом подключаете яваскрипт и запускаете его с помощью Drupal.behaviors.js, то тогда $(function(){ вам не нужна. Первой строкой вашего яваскрипта будет Drupal.behaviors.js = function(context) {

Если пустая строка не удаляется, то тогда попробуйте посмотреть что у вас получается в переменной hsid.

Drupal.behaviors.js = function(context) {
  for (var hsid in Drupal.settings.HierarchicalSelect.settings) {
    break;
  } 
  alert(hsid);
....

Совпадает ли вообще этот номер с номером вашего селекта #hierarchical-select-'+hsid+'-wrapper. Проблема здесь. Для верности можете еще использовать такую проверку:

alert($('#hierarchical-select-'+hsid+'-wrapper').size())

Если будет сообщать ноль, то значит что он нужный селект не может найти. Если будет 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 - выбираю донецкая область, донецк, поиск, выводятся результаты поиска автомобилей в донецке, хочу теперь искать все авто донецкой области, выбираю донецкая область, в дочернем там где город <любой>, нажимаю поиск, но при обновлении странички дочерний селект (город) обратно перебрасывается на донецк и соответственно выводит результаты по донецку.

если только нажать сброс, то можно искать по всей донецкой области, странно, чего так?

admin аватар

Давненько не игрался я с HS, поэтому тут вам так сходу и не скажу в чем может быть причина. Ковыряться надо.

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

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