xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Вывести самые продаваемые/популярные товары в Commerce

Опубликовано в

Пример вывода с помощью Views самых продаваемых (популярных) товаров:

Если коротко:

1. Выводим заказы (по другому не получится)
2. Джойним line item-ы, товары, ноды
3. Группируем и сортируем по COUNT(*)

Если подробно:

  1. Создаём представление по заказам (Commerce Order), без сортировки и с выводом полей:

  2. Добавляем связь Commerce Order: Referenced line items с именем Line items и включённой опцией Require this relationship:

  3. Добавляем связь Commerce Line item: Referenced products с именем Product и включённой опцией Require this relationship:

  4. Добавляем связь Commerce Product: Referencing Node с именем Product display и включённой опцией Require this relationship:

  5. Удаляем все дефолтные поля и добавляем поле Content: Rendered Node с опцией Show complete entity:

  6. Включаем агрегацию

  7. Добавляем сортировку по Commerce Order: Order ID, типом агрегации Count и порядком сортировки Sort descending

  8. Добавляем фильтр по Commerce Order: Order state с опциями Pending и Complete:

Полный скриншот вьюхи и результата.
Экспорт вьюхи.

Проблемы

Запрос получается достаточно тяжёлый, например при 2000 товаров и 2000 заказов он выполняется ~200 ms, поэтому нужно кэшировать, но кэшировать только результат запроса, а не результат рендеринга (комерц не любит кэшированные формы).
Повторные тесты показали что при 2000 товарах и 2000 заказах запрос выполняется терпимые 50-60 ms (скриншот). Видимо в первый раз где-то допустил ошибку в тестировании.

Вторая проблема — таким способом не удастся вывести товары, которые никогда не покупали. Хотя если у вас у одного товара только один дисплей, то поможет просто отключение опции "Require this relationship" у всех связей.

Третья проблема — если добавить другие поля кроме "Content: Rendered Node", то возникнут проблемы с группировкой и подсчётом. Хотя это решаемо.

И последняя проблема — этот способ не подойдёт если в каталоге нужна раскрытая сортировка по популярности.

Альтернативные способы

Способ 1: добавить product-дисплею новое числовое поле — "Число покупок" и с помощью Rules увеличивать его значение после оформления заказа. В представлении сортировать по этому полю. Минус — нельзя определить популярностью за определённый промежуток времени.

Способ 2: добавить product-дисплею новое числовое поле — "Число покупок" и по крону, раз в сутки, высчитывать новое значение этого поля. В представлении сортировать по этому полю. Подробнее здесь.

Способ 3: Commerce Product Popularity + Radioactivity.

Написанное актуально для Commerce 1
Похожие записи

Комментарии RSS

xandeadx, а можешь с точки зрения профи разобрать, хотя бы поверхностно, принципиальные различия, слабые места и преимущества Drupal Commerce по отношению к Ubercart. А то вроде обе системы популярные, тучи модулей под каждую, но вот четкого видения, на что ставить у меня пока нет.

Я с Ubercart не знаком. Но он морально устарел.

Вы случайно не планируете создать мануал по созданию аналогичного блока с помощью Способ 3: Commerce Product Popularity + Radioactivity.
Пытаюсь разобраться сам, что-то не получается... Не могу найти где настраивается Commerce Product Popularity и где этот сам блок... Понимаю что туплю, но в каком месте не могу обнаружить... :(

где настраивается Commerce Product Popularity

Commerce Product Popularity integrates with Radioactivity to provide a
product popularity field

как следует из описания - в настройках поля

где этот сам блок

It can be used for creating Views of most popular products and marking
individual products (or product displays) as 'hot sellers'.

как следует из описания - блок создаётся с помощью views

как следует из описания - в настройках поля

В настройках поля Radioactivity нашел

Update with Commerce Product Popularity
Check this if you'd like the field to be handled by Commerce Product Popularity's checkout rule

А вот в виевсе не могу понять что куда выставлять. :(

Предложенное решение работает, но у меня показываются одни и те же товары несколько раз. Подскажите как исправить?
А также не могли бы вы объяснить как сделать оптимальный вариант 1 или 3, потому что изменить значение поля Популярность для ноды после сохранения заказа через rules вообще не получается. как это делать?

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

зависит от причины

как это делать?

из коробки rules не умеет получать display nid по product id, поэтому либо писать свой экшен, либо пользоваться hook_commerce_order_presave()

из коробки rules не умеет получать display nid по product id, поэтому либо писать свой экшен, либо пользоваться hook_commerce_order_presave()

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

А как быть с анонимами?
Для них нет вывода =(

смотреть права доступа

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании