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

Комментарии

> Вы явно что то недопонимаете.
Само собой. У меня не очень большой опыт работы с Друпалом :)

> Вы увидите в строке с каждым коммитом ссылку "snapshot", нажав на которую можете скачать архив с файлами модуля на любом этапе изменений.
Не знал, спасибо.

> Все, технически между описанными релизами разницы больше нет никакой.
Я правильно понимаю, что, в общем и целом, можно устанавливать дев-версии модулей (за исключением тех, в описании которых есть прямое указание не делать этого) и более-менее периодически их обновлять (скажем, с ...+11-dev на ...+12-dev)? И при этом я буду иметь такую же стабильность в работе сайта, как и при использовании только "рекомендованных" релизов?

В большинстве случаев - да. По крайней мере мои проекты я очень реккомендую использовать через дев-релизы.

С "откатами" только аккуратней. Если в каком-либо выпуске какого-либо модуля есть апдейты для базы, то вернувшись к более ранней версии, обратных изменения базы вы не получите. Лишь через полную переустановку модуля или "ручную" коррекцию. Это и к дев-релизам относится и к "зеленым", неважно.

Понятно.
Спасибо за уделенное время!

Незачто. Приходите еще.)

И снова здравствуйте. Надеюсь, я вам еще не надоел :)

Обнаружил, что в IE 8 (XP SP3) не показываются элементы "Показать только отличия" и "Убрать (x)" в таблице сравнения. IE выдает ошибку:

Message: Expected identifier, string or number
Line: 36
Char: 13
Code: 0
URI: .../sites/all/modules/node_compare/theme/compare-table.js

Имеет ли эта ошибка отношение к вашему модулю (или это что-то в самом Друпале неправильно работает)? Если да, то исправлена ли уже она в dev'е?

Это IE о слово class запнулся. Оно зарезервированное в JS. Остальные браузеры учитывают контекст, у IE же своя логика, как обычно. Поправил.

Спасибо!

Добрый день.
Снова я к вам с вопросом и предложением.
Вопрос: есть ли возможность применять форматтеры к заголовкам нод в блоке сравнения, например, обрезАть их до какого-то определенного количества символов? Если у одной ноды заголовок длиной в 2 слова, а у другой - в 22, то они не очень элегантно смотрятся вместе.
Предложение: сделать возможность создавать разные блоки сравнения для разных типов нод. Т.е., если на сайте в одном разделе сравниваются ноды одного типа, а в другом разделе - другого, то хорошо бы иметь два разных блока сравнения, чтобы выводить каждый в своем разделе.
Заранее благодарен за ответ.

На вопрос о форматтерах Вы себе сами ответить сможете, если откроете страницу настроек отображения полей для нужного типа нод. Модуль тут, как бы, не при делах.

За предложение, конечно, спасибо, но зачем это нужно совершенно не догнал.

> На вопрос о форматтерах Вы себе сами ответить сможете, если откроете страницу настроек отображения полей для нужного типа нод.
Я понимаю, что я могу настроить отображения _полей_, но как настроить отображение _заголовков_? Я не вижу способов применения форматтеров к заголовкам нод ни в блоке "Содержимое для сравнения", ни на странице "Таблица сравнения".

> зачем это нужно совершенно не догнал.
Ну, например, на сайте есть два раздела: "Частные объявления" и "Вакансии". В разделе объявлений я могу сравнивать несколько объявлений (поля - цена товара, состояние, уместность торга и т.п.), в разделе вакансий - несколько вакансий (поля - зарплата, требования, соцпакет, режим работы и т.п.). Но если я сначала отберу несколько товаров в разделе объявлений, а затем зайду в раздел вакансий, то у меня все равно будут отображаться объявления. Да, они будут убраны из списка, когда я выберу какую-то вакансию, но это несколько запутывает пользователя. А вот если бы были разные блоки сравнения, то можно было бы в каждом из этих разделов отбирать разные ноды.

Не видите, потому что их там нет. Field UI не предоставляет форматтеров для заголовка ноды. И модуль в этот процесс не вмешивается. Ибо лишнее для общих случаев: сравнивать товары, название которых не видно целиком - это живодерство над посетителем/покупателем. Для уникальных же потребностей уместнее использовать индивидуальные решения, а не готовые. Последнее справедливо и для Вашего предложения с огородом блоков. Мне оно совершенно не видится более удобным и понятным, относительно того, что есть сейчас.

пс Для кастрации заголовков могу посоветовать два простейших метода на выбор.
1. Использовать CSS.
2. Использовать JS. Например так (код можно вставить тупо в начало node_compare-comparison-page.tpl.php):

//<script>     // Раскомментируйте тег, если будете вставлять в файл шаблона.
(function($) {
  $(document).ready(function() {
    var maxLength = 5; // Максимальное количество символов
                       // в заголовке.
    $('#comparison-table .compare-item').each(function() {
      var title = $(this).text();
      if (title.length > maxLength) {
        $(this).text(title.slice(0, maxLength) + '...');
      }
    });
  });
})(jQuery);
//</script>

> Мне оно совершенно не видится более удобным и понятным, относительно того, что есть сейчас.
ОК, без проблем. Я ведь просто предложил вариант, а если он вам не нравится, то это, конечно, ваше дело - реализовывать его или нет.

> два простейших метода на выбор
Спасибо!

И еще раз здравствуйте.
Обнаружил еще один баг в модуле. Попытаюсь объяснить, в чем он состоит.
Пусть вы сравниваете ноды по полю термина таксономии. В качестве форматтера этого поля используется "Простая иерархия" (Simple Hierarchy) из модуля Simple hierarchical select (SHS).
После выбора нод и нажатия на "Сравнить" получаем таблицу сравнения, в которой поле термина корректно отображается с помощью данного форматера. Но если уйти со страницы сравнения, а потом опять туда вернуться (или даже просто нажать Reload в браузере), то форматтер "слетает", и поле отображается "криво".
Я сравнил HTML двух копий страницы с таблицей сравнения - до и после нажатия на Reload - и отличие между ними в том, что на странице после Reload'а отсутствует строчка
@import url(".../sites/all/modules/shs/theme/shs.formatter.css?n8k4lv");
Честно говоря, я заметил этот баг уже давно, но думал, что он относится к SHS. Но вот только что наткнулся на аналогичную проблему при сравнении полей типа Field Collection с форматтером из Field Collection Tabs. Только в этом случае после Reload'а пропадают не только нужные CSS, но и JavaScript, относящиеся к Field Collection Tabs.
Так что, похоже, этот баг присутствует все-таки в вашем модуле.

Ага, спасибо за бдительность. Попозжа разберусь.

Приветствую.
А как правильно выводить только первую картинку товара, в случае, если их несколько?
Пока тупо скрываю через CSS, но это костыли.

Нашел баг: если в настройках отображения полей метка у поля скрыта, соответствующей ячейке таблицы сравнения присваивается класс "hidden", ячейка не отображается и строка смещается влево, таблица корежится (в одном столбце в разных строках отображается информация о разных товарах).
Думаю правильно бы было отображать пустую ячейку в этом случае.

Хотя в настройках есть замена содержимого пустой ячейки на " ", странно, что-то не отрабатывает.

Еще вопрос - можно ли выводить в сравнении поля уберкарта, например цену?

Добрый вечер.
Очень понравился Ваш модуль. Но вот обнаружилась проблемка.

При большом объеме типов материала и полей сравнения admin/config/content/node_compare
После сохранения пропадает из дисплея типа материала.

Чтобы снова появилось приходится удалять модуль и заного устанавливать.

Не подскажете как решить эту проблему?

Здравствуйте!
Модуль хороший. Как можно отблагодарить?
И еще хотелось бы чтобы в views (именно продуктах commerce) можно было использовать. Так не хочет это поле появляться. Пробовал через отношения, тоже не получается.

Привет.
Не планируется ли ввести разделение для сравнения товаров не по типам нод, а по словарям?

Не планируется.

Продолжаю искать вариант для сравнения разных товаров с разными полями.

Раз разделение по словарям не планируется, то создаю для каждого товара свой тип.
Ожидаю сравнение товаров в области одного конкретного типа, а отображение кнопок сравнения для всех. Однако кнопка "Добавить к сравнению" отображается только у товаров одного типа материала, видимо последнего добавленного.

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

Прошу подсказать в чем может быть проблема?

Кэш очистьте.

Разумеется. Как ни странно не помогает.
Меня интересует должно ли работать так как я того ожидаю.

Чтож видимо проблема в чем то другом.

Должно работать так, как заявлено.

Работает в dev-версии.

Однако если отметить два товара разного типа, то не обновляется (не меняет свое значение с "убрать из сравнения" на "добавить к сравнению") кнопка сравнения у предыдущего отличающегося по типу товара. Хотя появляется иконка обновления и аякс вроде пытается чето обновить.

После обновления страницы F5 все восстанавливается как и должно быть.

Ок, проверю.

Добавил поле загрузки изображений для товара, которое в ноде выводится в виде слайдера (плагин + модуль подключения плагина = новый форматтер в настройках отображения для типа материала).
Если в настройках Node Compare отметить для сравнения данное поле изображения, то в таблице сравнения в ячейке изображения отобразиться слайдер.

Решил для изображения в таблице сравнения добавить отдельное поле cover, а затем скрыть его отображение на странице товара. Теперь в таблице сравнения поле с cover-картинкой не отображается.

На данный момент придумал только сделать поле cover видимым на странице товара, а саму страницу сформировать при помощи Panels, где уже и управлять видимостью нужных и не нужных элементов.

Прошу подсказать более элегантное решение или подумать на тему отображения в таблице скрытых в настройках "Manage Display" полей.

А что за странный урл /compare/me почему не просто /compare?

Каким образом можно изменить порядок полей в таблице сравнения?

Спасибо, эту настройку я проглядел.
А есть ли способ вывести только одно изображение из нескольких загруженных?

Нет возможности перевести кнопку Add to compare

Было бы удобно удалять товары из сравнения прямо в таблице сравнения. Добавьте крестик над столбцом товара.

А у Вас его там нет?

Его нет и у вас на демо-странице.

screenshot nb7demo

Когда всего два товара, то крестиков нет )

Естественно нету. Не понятно почему?

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

Подскажите не планируется ли расширение функционала в данном направлении и какие изменения нужны для того чтобы сделать это своими силами?

Возникла проблема. Есть сайт, на котором в свое время был установлен Node Compare и настроено сравнение одного из типов нод.
Сейчас возникла необходимость сравнивать другой тип нод. Я пошел в admin/config/content/node_compare и там выбрал поля для сравнения в этом типе нод. Но вот в настройках отображения этих нод псевдополе "Node Compare: ссылка добавления к сравнению" не появилось!
Более того, в порядке эксперимента я попробовал убрать поля для сравнения из первого типа нод, а затем добавить их снова. Псевдополе "Node Compare: ссылка добавления к сравнению" исчезло из его настроек, но так и не появилось.
Я что-то делаю не так? Я о чем-то забыл? Это баг? Это конфликт с каким-то из установленных за прошедшее время других модулей?
(Кэш чистил неоднократно)

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

Нет, дело не в кэшировании. Поэкспериментировав, я, кажется, понял в чем проблема: псевдополе "Node Compare: ссылка добавления к сравнению" может присутствовать одновременно только в одном типе нод!
Если, как я уже говорил, в настройках Node Compare добавить поля для сравнения в "новом" типе нод, то псевдополе в этом типе нод не появляется. Но если предварительно отключить Node Compare для "старого" типа нод, то после этого псевдополе нормально появляется в "новом" типе. И наоборот.
Это можно как-то исправить?

Не находите странным, что за 2 года жизни модуля на дру.орг ни у одного из его пользователей подобных проблем не возникало?

Все, дошло в чем дело. Вы наверное "стабильный" билд используете. Там, припоминаю, находил в реализации псевдо-полей какие-то косяки. В дев`е все это было исправлено + куча других правок по-мелочам. Все ее зарелизить руки не дойдут.

Эх, если бы вы написали этот ответ чуть раньше! А то я сейчас специально ставил эксперименты с абсолютно свежей копией Друпала, чтобы убедить вас в том, что в модуле все-таки есть баг :)
Да, действительно, с девом все работает нормально.
Это, конечно, дело ваше, но, может, и правда уже стоит сделать релиз? Все-таки, как вы верно заметили, два года прошло, да и с тех пор исправлено достаточно много багов (о некоторых из которых я сообщал здесь еще в прошлом году).

Доброго времени суток

Пользуюсь модулем вашим, большое спасибо, все удобно. Но есть одни момент, который если вы бы смогли поправить, то вообще все было бы идеально для меня по крайней мере.

Суть проблемы в работе модуля следующая (а может и не модуля):

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

Думал у меня так просто, но нет на странице с демо-версией у вас, это можно наблюдать так же

Что я делал:

1. Прописывал дополнительно css стили display:none
2. Менял очередность загрузки css, чтобы css стиль применить в блоку сравнения и к классу появляющемуся у него, когда он пустой, в первую очередь
3. Убирал заголовок совсем, но так как не красиво смотрится, и не понятно сразу получается

Что я делаю может не так и как можно эту задачу решить?

Заранее спасибо за ответ

Вставьте css-правила в тело самого документа, до начала body.

<head>
  ...

  <style type="text/css">
   #node-compare-block-content.empty {
    display: none;
  }
 </style>
</head>
<body>
  ...

Такой вариант тоже не помог, заголовок блока с сравнением материала если он пустой, все ровно появляется.

Вставлял ваш код в html.tpl.php, до начала body. Кэш чистил. Может как то еще можно попробовать сделать, чтобы блок сравнения не появлялся, если он пустой?