Node Compare: модуль для сравнения нод

Случилась давеча надобность реализовать функционал сравнения товаров-нод для одного из сайтов, использующих Light Shop в качестве "магазинного" модуля. Результатом стало сотворение модуля Node Compare. Воплощающего в себе достаточно легкое и гибкое решение для сравнение нод нужных типов.

Блок с нодами для сравнения на странице сайта.

Возможности/Особенности модуля

  • Сравниваются значения полей типа определенной ноды.
  • Присутствует возможность определять, какие поля можно сравнивать. Отдельно, для каждого типа ноды.
  • При добавлении к сравнению ноды типа, отличного от типов уже отложенных нод, предыдущие ноды удаляются из сравнения.
  • Операции добавления/удаления/очистки сравниваемых позиций происходять посредством AJAX-запросов.
  • Отключаемая опция: показывать историю последних сравнений. Если включено, то в блоке с выбранными для сравнения нодами, внизу, отображаются ссылки на последние сравнения текущего пользователя.
  • Отключаемая опция: лимит на количество для сравниваемых нод.

Установка

На странице доступных модулей Node Compare можно отыскать в группе "Content".

Модуль Node Compare на странице имеющихся на сайте модулей.

Настройка

Страница настроек модулей живет по адресу: admin/config/content/node_compare.
Или, говоря иначе, в разделе настройки контента (Home » Administration » Configuration » Content authoring).

Страница настроек модуля Node Compare.

Общие настройки

  • Показывать или нет ссылки на последние сравнения. Про это написано выше.
  • Установка лимита на количество сравниваемых нод. Если "0", то лимит отсутствует.
  • Желаемый текст для ссылок на добавление/удаление нод к/из сравнения.

Настройка типов нод и их полей

Тут все просто. Указываем для каждого типа поля, которые можно сравнивать. Если для типа не выбрано ни одного поля, то этот тип из сравнения будет исключен.

Включение блока

Функционал Node Compare начинает проявлять себя после включения соответствующего блока, создаваемого модулем. Специфических настроек у этого блока нет, посему нужно просто указать для оного нужный регион на странице управления блоками.

Блок модуля Node Compare на странице управления блоками.

Разрешения

На странице настроек доступа для пользовательских групп укажите, каким группам можно пользоваться функционалом сравнения (admin/people/permissions#module-node_compare).

Модуль Node Compare на странице настроек доступа.

Настройка расположения ссылки "добавить/удалить"

Настройка отображения ссылки для добавления/удаления нод для сравнения.

Ссылка данная реализована, как "псевдо-экстра-поле". Что позволяет отображать ее практически в любом месте ноды. Настраивается на странице управления отображением полей для отдельно взятого типа ноды (если включен Field Ui, конечно же). Если вы там эту ссылку не обнаружите, то надобно очистить кэш.

Настройка отображения полей в сравнительной таблице (опционально)

Compare Mode: режим для отображения полей ноды в сравнительной таблице.

Поля в сравнительной таблице выводятся согласно настройкам отображения полей в режиме "по-умолчанию" (Default). Возможно, вас такое положение дел не будет устраивать. Например, нужен другой порядок показа сравниваемых полей в таблице или вы хотите применить к значению сравниваемого поля какой-либо специфический форматтер. На этот случай в настройках отображения полей для каждого типа ноды теперь есть дополнительный "Режим сравнения" (Compare mode). Включайте его и настраивайте сравниваемые поля, аки душе вашей бессмертной угодно.

Интеграция с Views

Node Compare: интеграция с Views.

Dalay

Комментарии

Не может не помочь. Ищите, что не так делаете.

Еще раз все сделал, поместил до стилевые настройки, но пустой блок с заголовком все ровно появляется на некоторое время после загрузки страницы.

Для чистоты эксперимента, проверил в другом браузере, оказалось, что не работает только в Хроме, а в Firefox все хорошо.

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

Думаю, если времени у вас нет, может я на форум Drupal схожу за помощью? просто модуль ваш и через "голову" создателя не хочется идти искать решение.

Не, не странно. Просто класс empty динамически добавляется посредством js-сценария, для чего js-код должен загрузиться. Изначально, до загрузки соответствующего js, такого класса нет. Это было сделано для визуализации действий с блоком при динамическом изменении его содержимого. Не более того.

В целом же, отображение любого блока, пустого или в каком-либо другом состоянии, настраивается в соответствующем tpl-файле темы.

Понятно, в чем дело. С tpl-файлом знаком, сайт использует мою тему созданную специально для него.

Только не совсем понял, что именно там нужно прописать, чтобы все работало?

В tpl-файле я вывожу регионы, которые прописаны в info-файле, и в одном из регионов, я вывожу соответственно блок с сравнением вашего модуля. Что мне нужно настроить?

Я думаю, можно убрать заголовок блока, поставить none и просто как подгружать с динамическими данными заголовок, если empty класс отсутствует

Ну да, так и сделайте. Просто и сердито.

Пока другого решения нет, буду пробовать реализовать такой вариант, конечно только теперь нужно поискать как сделать это, так как с jquery я на "Вы", головой понимаю, что можно сделать, а технически пока не нет..)

Если вы как то в модуле сможете это реализовать(чтобы блок пустой не показывался), то отпишитесь здесь об этом.

Благодарю за потраченное время

Зачем реализовывать в модуле то, что и так уже реализовано в самом движке? Я же Вам выше ссылку на оф. документацию давал. Не заметили?

Да, не обратил внимание, спасибо, сейчас буду изучать...

С новым годом!

Снова я к вам, 5 дней пытался разобраться как сделать, так и не смог, без знаний программирования не как видимо.

Задал вопрос на форуме, там еще больше запутали, но обычно кто то помогает обязательно, но пока жду, сказали: как вариант, переопределить theme_compare_block_content в своей теме и добавлять класс empty к нужному элементу (см. js) если нет нод для сравнения, чтобы стиль применялся сразу при загрузке страницы

Хотел спросить, можете ли вы конкретно написать то, что нужно написать и куда, чтобы все заработало?

И если это сложно и долго по времени реализовать, могли бы вы тогда это реализовать в модуле своем за оплату? если да, то сколько это примерно будет стоить?

Жесть, на что ушло пять дней?

Касаемо добавления класса - все ответы есть уже на первой странице выдачи гугла по запросу "drupal block add class". Например это.

Короче, научно-популярно:

1. Открываете файл template.php своей темы. Если такого файла нет, то создаете.

2.
a) Если в имеющемся template.php уже реализована функция НАЗВАНИЕ-ТЕМЫ_preprocess_block(&$variables), то добавляете внутрь нее:

if ($variables['block']->delta == 'node_compare_items') {
    $variables['classes_array'][] = 'empty';
  }
/
b) Если вышеобозначенной функции в template.php нет - вставляем оную (с соответствующим содержимым):
function НАЗВАНИЕ-ТЕМЫ_preprocess_block(&$variables) {
  if ($variables['block']->delta == 'node_compare_items') {
    $variables['classes_array'][] = 'empty';
  }
}

3. Сохраняем файл и очищаем кэш.

4. Цинично выставляем заказчику счет за пять дней потраченного времени(так как дни праздничные ценник однозначно двойной).

Ооо.. благодарю, за научно-популярный ответ..))

Сейчас зашел, и сразу 2 ответа с помощью, ваш и на форуме ответили, новогодние желания сбываются)

Не знаю насколько правильный ответ на форуме дали, но ваш уже сейчас буду реализовывать. Кстати вот этот предложили:

function my_theme_name_preprocess_block(&$variables) {
  if ($variables['block']->delta == 'node_compare_items' && empty($_SESSION['node_compare']['nids']) && empty($_SESSION['node_compare_history'])) {
    $variables['classes_array'][] = 'empty';
  }
}

"Мой" реализовывайте, дергать сессии - лишнее.

Да, конечно, ваш и использую, уже на тестовом аккаунте все проверил, все работает, круто, ура))

Подскажите, как очистить список истории в блоке?

$_SESSION['node_compare_history'] = '';

Доброго времени суток. Подскажите, планируете ли вы портировать модуль на Drupal 8?

Нет пока такой надобности.