Написал модуль для сравнивания товаров.
Любой уважающий себя интернет магазин должен иметь
Работает так: в форме добавления в корзину есть ссылка "Добавить в корзину". Нажимаем - кладём товар в сравнение. Товары сортируются по типам продукта.
Два режима - показать все поля или только те, что отличаются.
Все добавленные товары храняться в сессиях.
Добавляет два отображения - один для нод (Отображение продукта), второй - для продуктов. В первом регулируем поля для сравнения, во втором - саммари товара, которая показывается в хидере таблицы сравнения.
Кому надо - разберётся
Также там есть блок, где отображаются собранные для сравнения товары.
Ловлю брызги вашей радости по таким адресам:
Баксы Z343692985355
Рубли R295921006731
Гривны U678885001815
Комментарии
На Жар-паре делал год назад, в принципе - ничего сложного.
Флаг + вьюс + дисплей вьюс-флиппед-тейбл + (если надо) 1 страничка JS для сокрытия одинаковых полей - и всё. Вот тут примерно то же самое: http://www.turbopxl.ru/drupal/sravnenie-tovarov-v-drupal-7 только без JS
Ожидал такого камента
Я писал модуль под себя, ставить довольно увесистый флаг + ещё там что то только ради этого не хотелось, так я сообразил модулёк
Я просто за универсальность решений: если можно сделать стандартными средствами, то не буду изобретать новые. Флаг (чем он увесистый-то?) отлично подходит для отметки "сравнить", вьюс - отлично подходит для вывода. Дополнительно нужен только flipped table - можно из views hacks поставить, можно самому темплейт написать. По сути, это тоже можно в модуль завернуть - в features. Да не, флаг можно на любую сущность навесить, да и во вьюзе к дисплею обратиться не проблема. Да там ничего особенного, добавляется чекбокс, функция бегает по строчкам, сравнивает что в td, прячет строчки, если все одинаково. Написал, так сказать, в лоб:
* Script to hide/show identical rows in view
*/
var hideShowCheckbox = '';
(function ($) {
//initialization
Drupal.behaviors.views_hide_rows = {
attach: function (context, settings) {
$('body').once(function () {
//add checkbox to hide/show rows
hideShowCheckbox = '<label><input class="hide-show-rows-checkbox" type="checkbox" />Показать только разницу</label>';
$("div.view--oven-comparision-page").prepend(hideShowCheckbox);
$("div.view---oven-comparision-page").prepend(hideShowCheckbox);
hideShowCheckbox = $("input.hide-show-rows-checkbox");
//bind checkbox click to update views table
hideShowCheckbox.click(hideShowTableRows);
});
}
};
/**
* Function hides/shows (depending on the checkbox) equal rows in $table
*/
function hideShowTableRows() {
$table = $(this).parents("div").find("div.view-content");
var toggled = $("input.hide-show-rows-checkbox").val();
if (toggled) {
//process rows
var value;
var equal;
$table.find("tr").each( function () {
equal = true;
$(this).find("td").each ( function (index) {
if (index) { //to skip comparision with itself
if (value != $(this).text()) {
equal = false;
return false; //we found the difference, exit .each() loop
}
} else {
value = $(this).text(); //save zero' element text to compare with others
}
});
if (equal) {
//we can hide this row
$(this).hide();
}
});
} else {
//showing rows
$table.find("tr").show();
}
}
}(jQuery));
И потом: в моём модуле можно сравнивать именно товары, т.е те, что сгруппированы в дисплее. ТО есть, добавили один товар (набор опций) в сравнение, переключили опции, добавили ещё один и тд. При этом в таблице сводные поля - с продукта и дисплея. Ежели сравнивать дисплеи товаров (в ссылке выше походу об этом), то это сильно половинчатое решение
graker: а тот JS что ты делал можно посмотреть?
У меня сейчас это сделано так: ссылка с GET запросом. Нажимаем, страница перегружается, если запрос есть, обходим циклом массим значений полей для каждого сравниваемого товара. Смотрим пересечения массивов через array_uintersect_assoc(). В её колбэк - функции делаются строчные слепки массива через serialize. Если строки совпадают - значит массивы идентичны, их отсекаем
Нашёл фидлю, которая делает почти то что надо http://jsfiddle.net/aLWVM/6
Пока в закладки, т.к. сравнивать нечего.
Пофиксил баги, убрал лишнее. Тестируем, не жуём вяло сопли
полезный ты модуль намутил, дядя Юра, надеюсь выйдет из sandbox
потестировал как альтернативу flag+views. крутил на свежеразвернутом Commerce Kickstart 2.x
обратил внимание на следующее:
- при добавлении в сравниловку не обновляется содержимое блока без перезагрузки страницы
- не получилось поуправлять порядком строк в таблице, на перестановку их местоположения в "Manage display" (и у display и у product type) никакой реакции
- нет возможности встроить ссылку добавления в сравниловку в каталоге продуктов (т.е. в views) - можно, конечно, попробовать добавить add to cart form и повыкусывать все ненужное оставив только ссылку - но это как-то не по-православному
- когда из блока удалено все что туда было набито - блок остается пустым. было бы логичным схлопнуть блок или выдать в нем сообщение типа "ничего не добавлено для сравнения"
- нет классов у строк (кроме odd&even) и у ячеек, было бы неплохо колонкам col-1...col-x классы назначить, а строкам от fields по наследству передавать
пока все.
UPD: не важно какое ограничение на количество добавляемых для сравнения продуктов - все равно происходит реакция на клик по Add to compare
NecroHill: с багами буду разбираться, когда дойдут руки до проджекта, где он реально используется. Сейчас пока не до него, к сожалению
http://nb7demo.drupalka.ru ...чем плохой модуль?
Ну, хотя бы тем, что вы не сможете сравнить с помощью него товары из дисплея. А в остальном модуль просто шикарен.
Может, тем, что первый релиз появился лишь через несколько месяцев после этого обсуждения?
Ну, это так, к сведению - имеет место быть!