[Модуль] Commerce Comparer - сравнивалка товаров DC

Главные вкладки

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 5 февраля 2013 в 20:54

Написал модуль для сравнивания товаров.

Любой уважающий себя интернет магазин должен иметь

Работает так: в форме добавления в корзину есть ссылка "Добавить в корзину". Нажимаем - кладём товар в сравнение. Товары сортируются по типам продукта.
Два режима - показать все поля или только те, что отличаются.

Все добавленные товары храняться в сессиях.

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

Кому надо - разберётся Smile

Также там есть блок, где отображаются собранные для сравнения товары.

Ловлю брызги вашей радости по таким адресам:

Баксы Z343692985355
Рубли R295921006731
Гривны U678885001815

Комментарии

Аватар пользователя graker graker 5 февраля 2013 в 21:14

На Жар-паре делал год назад, в принципе - ничего сложного.
Флаг + вьюс + дисплей вьюс-флиппед-тейбл + (если надо) 1 страничка JS для сокрытия одинаковых полей - и всё. Вот тут примерно то же самое: http://www.turbopxl.ru/drupal/sravnenie-tovarov-v-drupal-7 только без JS

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 5 февраля 2013 в 21:43

Ожидал такого камента Smile
Я писал модуль под себя, ставить довольно увесистый флаг + ещё там что то только ради этого не хотелось, так я сообразил модулёк

Аватар пользователя graker graker 6 февраля 2013 в 13:54

<a href="mailto:volocuga@drupal.org">volocuga@drupal.org</a> wrote:
Ожидал такого камента Smile
Я писал модуль под себя, ставить довольно увесистый флаг + ещё там что то только ради этого не хотелось, так я сообразил модулёк

Я просто за универсальность решений: если можно сделать стандартными средствами, то не буду изобретать новые. Флаг (чем он увесистый-то?) отлично подходит для отметки "сравнить", вьюс - отлично подходит для вывода. Дополнительно нужен только flipped table - можно из views hacks поставить, можно самому темплейт написать. По сути, это тоже можно в модуль завернуть - в features.

Quote:
И потом: в моём модуле можно сравнивать именно товары, т.е те, что сгруппированы в дисплее. ТО есть, добавили один товар (набор опций) в сравнение, переключили опции, добавили ещё один и тд. При этом в таблице сводные поля - с продукта и дисплея. Ежели сравнивать дисплеи товаров (в ссылке выше походу об этом), то это сильно половинчатое решение
Да не, флаг можно на любую сущность навесить, да и во вьюзе к дисплею обратиться не проблема.

Quote:
graker: а тот JS что ты делал можно посмотреть?
Да там ничего особенного, добавляется чекбокс, функция бегает по строчкам, сравнивает что в 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));

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 5 февраля 2013 в 22:07

И потом: в моём модуле можно сравнивать именно товары, т.е те, что сгруппированы в дисплее. ТО есть, добавили один товар (набор опций) в сравнение, переключили опции, добавили ещё один и тд. При этом в таблице сводные поля - с продукта и дисплея. Ежели сравнивать дисплеи товаров (в ссылке выше походу об этом), то это сильно половинчатое решение

graker: а тот JS что ты делал можно посмотреть?

У меня сейчас это сделано так: ссылка с GET запросом. Нажимаем, страница перегружается, если запрос есть, обходим циклом массим значений полей для каждого сравниваемого товара. Смотрим пересечения массивов через array_uintersect_assoc(). В её колбэк - функции делаются строчные слепки массива через serialize. Если строки совпадают - значит массивы идентичны, их отсекаем Smile

Аватар пользователя NecroHill NecroHill 18 апреля 2013 в 10:12

полезный ты модуль намутил, дядя Юра, надеюсь выйдет из sandbox

потестировал как альтернативу flag+views. крутил на свежеразвернутом Commerce Kickstart 2.x

обратил внимание на следующее:
- при добавлении в сравниловку не обновляется содержимое блока без перезагрузки страницы
- не получилось поуправлять порядком строк в таблице, на перестановку их местоположения в "Manage display" (и у display и у product type) никакой реакции
- нет возможности встроить ссылку добавления в сравниловку в каталоге продуктов (т.е. в views) - можно, конечно, попробовать добавить add to cart form и повыкусывать все ненужное оставив только ссылку - но это как-то не по-православному
- когда из блока удалено все что туда было набито - блок остается пустым. было бы логичным схлопнуть блок или выдать в нем сообщение типа "ничего не добавлено для сравнения"
- нет классов у строк (кроме odd&even) и у ячеек, было бы неплохо колонкам col-1...col-x классы назначить, а строкам от fields по наследству передавать

пока все.

Аватар пользователя NecroHill NecroHill 18 апреля 2013 в 11:14

UPD: не важно какое ограничение на количество добавляемых для сравнения продуктов - все равно происходит реакция на клик по Add to compare

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 18 апреля 2013 в 13:34

NecroHill: с багами буду разбираться, когда дойдут руки до проджекта, где он реально используется. Сейчас пока не до него, к сожалению Smile

Аватар пользователя kirasnejnaia kirasnejnaia 11 октября 2013 в 15:32

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