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

Комментарии

а чем на демо-сайте сделаны messages

js+css, разве есть еще варианты?)

и расположение горизонтальное нод в таблице Comparison table если бы можно было менять на вертикальное

А по диагонали не нужно?

нет не нужно -просто если сравнивать более 5 нод по 3 полям ,
то в хедере таблицы лучше распологать поля ,а не ноды
мне не сложно изменить вывод таблицы - я просто предложил такую возможность

Ок, если будут еще такие просьбы поступать, то сделаю, не вопрос.

А чем модуль flag не угоди???

Устраивает - пользуйся.

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

Что почему, Олег? )
Может так понятней: устраивает через флаги - пользуйся. флагами. )

т.е. показывается!!!!!!!!!!!!! все ок.

Ты пьян?

Увы не употребляю.

Подскажи как убрать двоеточие в таблице сравнения в заголовке Properties. В переводе - не хочет цепляться без двоеточия.

Как это не хочет, кэш почисти.

Да кэп. Будет сделано!

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

Кстати чекбокс по не выводу этого - Your recent comparisons: - не работает. Т.е. по дефолту все выводиться и без показать последние сравнения.

Все работает. Перелогинься, это из-за остаточной информации в сессии.

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

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

Обдумаю, приделаю в будущем.

Добрый день!

Установил ваш модуль, вроде как вес работает. ссылки вставились, блок отображается. Но при переходе по ссылке в самому сравнению, переходит на 404 страницу :(

Какая версия друпала, модуля, php?

Модуль: 7.x-1.5
Друпал: 7 какая точно семерка я хз если честно.
php: 5.3.3

И в догонку вопрос. Как и где можно шаманить над внешним видом сравнительной таблицы

И ссылку намыльте, где можно это все увидеть.

К сожалению ссылку предоставить не могу. так как все на дев серваке. :(

Заловил косяк. Возникает при отсутствии лимита на сравниваемые элементы. Сейчас поправлю и новый релиз заделаю.

Внешний вид таблицы правьте через CSS, там у всего есть свои классы.

отлично. Спасибо. И еще вопрос. У меня есть View там выводятся ноды в виде таблицы. При добавлении вашей ссылки "добавить в сравнение", она выводится в ячейку таблицы. Насколько я понимаю настраивать шаблон строки при использовании табличного вывода нельзя. Можно каким-то другим способом программно вывести эту ссылку?

Короче, в текущей версии модуля положение с "темизирующими" функциями следующее:

  • Ссылка "добавить в сравнение" выводиться через theme_node_compare_toggle_link() (файл theme.inc).
  • Содержимое блока с отложенным для сравнения формируется через theme_node_compare_block_content() (файл theme.inc).
  • На странице сравнения таблица выводится через theme_table().

Благодарю.

Я вас доканаю наверное скоро :) Еще вопрос. Включил в настройках отображения полей в нужном типе ноды режим сравнения, перенастроил поля, но они все равно выводятся как в default

Кэш сбрасывали?

Да.

Ок, попозже разберусь.

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

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

Чутка попозжа поправлю алгоритмы. Релизить не стану, качайте свежие дев-ки модуля.

А и вобще есть возможность через шаблон как-то редактировать страницу сравнения и блок ?

А планируется ли интегрировать сей лепый модуль с drupal commerce?

Интегрировать?)) Нет.

Добрый день, возможен ли вариант сравнения мультиполя которое формируеться таксономией? Проблема в том что лейблом выступает родитель, а сравнивать надо по дочерные термины.

Значит не возможен.

Спасибо за нужный модуль!
Один вопрос - не хочет работать с модулями типа Field Delimiter - например, чтобы не выводить в таблице сравнения все картинки из multiple values Image.

А вопрос то в чем?

Подробнее постараюсь описать - хочу выводить в таблице сравнения только одно изображение из поля, содержащего много изображений. Редактирую дисплей Compare mode, в поле "Изображение" пытаюсь ограничить кол-во выводимых значений (пробовал Field multiple limit и Field Delimiter) - выводит все равно столько изображений, сколько есть. Вопрос вот в чем - чтобы ограничить кол-во значений - нужно код править? Заранее спасибо =)

Все просто. Не нужно ничего править и дополнительных модулей.
Вставьте в template.php своей темы:

function НАЗВАНИЕ-ТЕМЫ_preprocess_field(&$vars) {
  $element = $vars['element'];
  // Если хотите применить только для определенного поля,
  // замените $element['#field_type'] == 'image' на
  // $element['#field_name'] == 'НАЗВАНИЕ_ПОЛЯ'.
  // Иначе, применяется ко всем image-полям
  // (только для режимов отличных от 'full' и 'teaser').
  if ($element['#field_type'] == 'image' && $element['#view_mode'] == '_custom_display' && count($element['#items']) > 1) {
    $vars['items'] = array($vars['items'][0]);
  }
}

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

Спасибо, попробую!

Добрый день.
Спасибо за отличный модуль!
Хочу сообщить о небольшой ошибке. Если какая-то нода была добавлена к сравнению, а после этого она была удалена с сайта, то ее заголовок все равно остается в блоке сравнения. Кроме того, после нажатия на "Сравнить выбранное" получаем сообщение "Страница не найдена".
Можете ли вы исправить эту ситуацию?
Спасибо.

Да, конечно, исправлю в ближайшее время. Этот сценарий я из виду упустил. Спасибо за отлов.

Здравствуйте.
Если я правильно понимаю, вы исправили данный баг (во всяком случае, частично) в коммите debc23f от 10 мая. Скажите, пожалуйста, а когда вы планируете сделать очередной релиз модуля (я не очень люблю ставить dev-версии на рабочие сайты)?
Спасибо.

Да, сделал более корректной обработку такой ситуации.

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

Короче, если Вам этот момент так важен, то могу зарелизить текущий код.)

> По поводу "не любви" могу сказать, что Вы из-за оной многое теряете.
Пожалуйста, не смейтесь, если я скажу глупость, но я предпочитаю не ставить девы по двум причинам.
Во-первых, как мне кажется, смена номера версии подразумевает более серьезное и внимательное отношение автора к релизу. Скажем, если при переходе от одной стабильной версии к другой необходимо внести какие-то изменения в БД, то это прописывается в файле *.install. А вот при смене одной дев-версии на другую, ИМХО, автор может случайно об этом "забыть" - а я получу кучу косяков.
Во-вторых, все стабильные версии хранятся на сервере Друпала, и если мне что-то не понравится в одной из них, я всегда могу скачать более старую и откатиться на нее. А дев существует только в одном варианте (во всяком случае, я не знаю, где искать другие), и если после апгрейда возникнут баги, то вернуться на предыдущий вариант дева уже не получится.
> Короче, если Вам этот момент так важен, то могу зарелизить текущий код.)
Ну, это вам решать. Кто я такой, чтобы указывать вам, что делать :)

Вы явно что то недопонимаете. Обьясню предельно просто. Есть git - система контроля изменений в файлах. Каждый коммит фиксирует некий момент этих изменений, снимок текущего состояния файлов проекта. Дев-релиз - это тот же снимок, создаваемый после каждого коммита. Если перейти в репозиторий пректа, то Вы увидите в строке с каждым коммитом ссылку "snapshot", нажав на которую можете скачать архив с файлами модуля на любом этапе изменений. Это касательно "отката".

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

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