Javascript

Поправляем модуль «Comment Notify»

Существует замечательный модуль, позволяющий подписываться на материалы сайта. По умолчанию он располагается под формой комментирования и всегда открыт, что делает форму слишком некомпактной.
модуль «Comment Notify»

Исправим форму подписки так, чтобы «Все комментарии» и «Ответы на мои комментарии» показывались в том случае, если отмечен чекбокс «Уведомлять меня о новых комментариях“, т.е. по умолчанию radio-кнопки будут не видны:
модуль «Comment Notify»

При отмеченном чекбоксе будут доступны варианты уведомлений:

В оригинальном js-файле модуля прописано всего лишь то, что при отмеченной radio-кнопке автоматически отмечается чекбокс, а нам этого недостаточно. Внесём свои поправки: всё нам нужно дописать, это небольшой кусок jQuery-кода.

Создадим в в директории с темой файл scripts.js с таким содержанием:

if (Drupal.jsEnabled) {
  $(document).ready(function() {
   $("#edit-notify-type-1-wrapper»).css(«display», «none“);
    $("#edit-notify-type-2-wrapper»).css(«display», «none“);
    $("#edit-notify“).click(function() {
    //$("#edit-notify“).attr('checked', false);
        if (this.checked) {
            $("#edit-notify-type-1-wrapper“).show();
            $("#edit-notify-type-2-wrapper“).show();
        }
        else {
            $("#edit-notify-type-1-wrapper“).hide();
            $("#edit-notify-type-2-wrapper»).hide();
        }
 
    });
  });
}

Подключим файл scripts.js в файле темы:

; Scripts
scripts[] = «scripts.js"

Работающий пример: используется на этом сайте
Конфликты с модулями: Ajax comments

P.S. Решение продублировано на drupal.org, в Issues модуля

 
 
04.06.2011 — 23:18

Комментарии (8)

Аватар пользователя Shift
04.06.2011 — 23:37
1
 
 

Сделал простым CSS — выстроил флоатом в одну строку. Чекбокс зависит от радиокнопки. Т.е. если юзер сразу щёлкает по ней, то чек автоматически активируется.

Спасибо за решение.

Аватар пользователя Stan
04.06.2011 — 23:44
2
 
 

Пожалуйста!

За идею спасибо xandeadx, предложено было здесь.

Аватар пользователя SergO
05.06.2011 — 12:35
4
 
 

Сэкономим пару сотен байт:

if (Drupal.jsEnabled) {
  $(function() {
    radios = $("#edit-notify-type-1-wrapper“).parent();
    $(radios).hide();
    $("#edit-notify»).click(function() {
      (this.checked) ?  radios.show() : radios.hide();
    });
  });
}

Аватар пользователя xandeadx
05.06.2011 — 12:36
2
 
 

$("#edit-notify»).click

состояние чекбоксов можно менять и с клавиатуры, правильней будет вешать на change

if (Drupal.jsEnabled)

в этой конструкции есть какой-то скрытый смысл?)

Аватар пользователя SergO
05.06.2011 — 12:42
2
 
 

Разработчики тоже смысла в переменной Drupal.jsEnabled не нашли и, поэтому, в семёрке убрали.

Аватар пользователя Stan
05.06.2011 — 12:46
3
 
 

состояние чекбоксов можно менять и с клавиатуры, правильней будет вешать на change

И по .click меняется с клавиатуры

Аватар пользователя annya
12.06.2011 — 18:58
2
 
 

У меня есть несколько замечаний.
1. Сейчас нотифайер комментарев по-умолчанию включен, и дочерние комменты, я не могу изменить(вернее могу, но нужно сначала снять, галку с «Уведомлять меня…», и потом опять поставить — нелогично). Нужно делать проверку изначально на то или «Уведомлять меня…» включен.
2. С ajax_comments конфликтует(скрипты ругаются) или просто не работает? Я модифицировала код, используя Drupal.behaviors, у меня заработало с последним релизом(ajax_comments-6.x-1.8)
3. radios = $('#edit-notify-type-1-wrapper').parent();
Не кошерно, зачем замусоривать глобальное пространство имен. У меня уже на автомате переменные иницилизируются через var
4. + я все операции делаю с jquery-объектами(через обертку $), например $(this), а не this — но это дело вкуса.

//для динамично подгружаемой едементов, используем Drupal.behaviors
Drupal.behaviors.mymodule = function(context) {
  //определяем wrapper для всего блока нотифайера
  var wrapperNotify = $('#edit-notify-wrapper', context).parent();
  //Проверка или был уже блок нотифайера обработан нами
  wrapperNotify.not('.mymodule-process').each(function () {
    var parentRadios = $(this).find('edit-notify');
    var wrapperChildRadios = $(this).find('#edit-notify-type-1-wrapper').parent();
 
    //проверяем если родительский чекбокс  «Уведомлять меня о новых комментариях"
    //не включеный, только тогда  прячем дочерние чекбоксы
    parentRadios.each(function() {
      (!$(this).is(':checked')) ? wrapperChildRadios.hide() : null;
    });
 
    parentRadios.change(function(value) {
      ($(this).is(':checked')) ?  wrapperChildRadios.show() : wrapperChildRadios.hide();
    });
    //добавляем клас, чтобы при загрузки динамичных элементов, уже обработоный
    //блок нотифайера опять не обрабатывался
    $(this).addClass('mymodule-process');
  });
}

Аватар пользователя andypost
14.06.2011 — 03:01
-1
 
 

Еще какой-то грабель на этом сайте — не сохраняется состоянии подписки для нод — каждый кар приходится выставлять заново, вероятно, сие грабли модуля…