[miniShop2] Версия 2.1.0-pl1 Модификация цены и веса товаров

За один вчерашний день новый miniShop2.1 закачали больше раз, чем за все время бета-тестов.

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

Исправления

Исправлен файл action.php, который был оставлен для совместимости с уже работающими магазинами. Теперь он просто адресует все запросы в новый плагин - и проблем нет.

Немного изменена работа msProduct::toArray(). Свойства производителя теперь выводятся с префиксом не "vendor_", а "vendor." для единообразия со сниппетом msProducts. А то в одном месте через подчеркивание, а в другом через точку - непорядок.

Желательно так же получать и имя производителя через xPDO:

echo $resource->get('vendor.name');

хотя и старый вариант с подчеркиванием тоже вернёт что нужно.

Исправлена ошибка с мусорными записями в таблице событий плагинов. В скрипте сборки пакета балы ошибка, поэтому создавалось 27 событий с именами 0, 1, 2 и т.д.

Новая версия их чистит, и добавляет 2 новых и очень интересных события для модификации цен и веса.

Улучшения

Добавлены события для модификации цены и веса товаров: msOnGetProductPrice и msOnGetProductWeight.

Работает везде, включая сниппет msProducts. Хоть он и получает данные через pdoTools напрямую из БД, но потом проверяет, есть ли плагины-модификаторы и если есть - запускает нужные методы.

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

Если цена товара меняется после прохождения через плагин-модификатор, то оригинальное значение помещается в old_price, а его значение уже больше никого не интересует.

Это работает и при xPDO запросах:


if ($product = $modx->getObject('msProduct', 15)) {
    echo $product->get('price');
    echo $product->get('old_price');
    print_r($product->toArray());
}

Если цена модифицируется плагином, то вы получите сначала новую цену, затем старую, а потом и массив со всеми значениями, включая модифицированные. Свойства old_price заменяется и его нигде не видно, кроме админки - напоминаю еще раз.

Принцип работы плагинов MS2 описан здесь, а вот пример:


    case 'msOnGetProductPrice':
        // Плагин принимает:
        // $product - объект msProductData
        // $data - массив со свойствами товара, может отсутствовать
        // $price - текущая цена товара

        // Подключаем массив значений по ссылке - так удобнее
        $values = & $modx->event->returnedValues;

        // Цена может меняться несколькими плагинами сразу, поэтому проверяем:
        if (isset($values['price'])) {
            $price = $values['price'];
        }

        // Удваиваем цену:
        $values['price'] = $price * 2;
    break;

Результат работы: -

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

Системные параметры ms2_price_snippet и ms2_weight_snippet пока еще работают, для совместимости, но использовать их я не советую - переходите на системные плагины.

← Предыдущая заметка
[miniShop2] Версия 2.1.0-pl
Следующая заметка →
[pdoTools] Версия 1.7.2 - методы getObject и getCollection
Комментарии (12)
Mickle GoryachkinMickle Goryachkin
25.09.2013 11:25

Новый action.php это конечно хорошо, но как быть с тем что теперь в корзину не попадает не один дополнительный параметр. Сейчас js формирует строку при обращении к action.php:


id:30
count:1
size:22
ms2_action:cart/add
ctx:web

Вроде бы все отлично, все передается, но вот если мы заглянем в новый плагин, а именно посмотрим строку:

$miniShop2->cart->add(@$_POST['id'], @$_POST['count'], @$_POST['options']);

То видно что он ждет от нас строки вроде этой:


id:30
count:1
options[size]:22
ms2_action:cart/add
ctx:web

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

bezumkinВасилий Наумкин
25.09.2013 12:08

Надо поправить чанк tpl.msOptions.outer.

Заменить

<select name="[[+name]]" class="span2">[[+rows]]</select>

на

<select name="options[[[+name]]]" class="span2">[[+rows]]</select>
Mickle GoryachkinMickle Goryachkin
25.09.2013 12:32

Да все заработало спасибо. Что-то о чанке я даже не подумал.

Алексей Карташов
25.09.2013 18:06

это подготовка к новому дополнению msDiscount

Эх, так и не дошли у меня руки до скидочной системы.

Кстати, несколько человек не раз мне говорили, что нужна ещё и накопительная система скидок. Это я к чему - фича у заказчиков востребована. Можешь иметь это в виду :-) Конечно же, могу и другими идеями относительно функционала поделиться. Поделился бы и наработками, но, боюсь, ты на моё поделие без смеха сквозь слёзы не взглянешь))

bezumkinВасилий Наумкин
25.09.2013 23:18

Почему нет?

Давай ссылки, посмотрю.

Алексей Карташов
26.09.2013 12:58

Ок, установленный пакет есть вот тут. Там же можно забрать и установочный.

Самой логики начисления скидок нет, есть только админский интерфейс, который взаимодействует с базой. Интерфейс находится вот тут:

Самой логики нет, потому что пара моментов: 1. Долго возился с extjs (это было моё первое с ним знакомство. затянулось) 2. Нужна зависимость от веса: 3. Идея с привязкой товара и автоматическим присвоением владельца первой свободной карте этой скидки (звучит мутно, да) не прошла критику. Здесь логика была такая: есть в магазине товар "Дисконтная карта на 10%". Создаём скидку в интерфейсе - "10%", связываем скидку с этим товаром и вуаля - юзер, купивший эту дисконтную карту автоматически становится владельцем первой свободной дисконтной карты с этой скидкой. И только этот юзер сможет воспользоваться этой картой. Но: 3.1. А если в магазине ведётся учёт остатков? А если остатки товара-дисконтной карты = 0, а свободные карты в таблице msDiscountCard имеются? А если наоборот? А если учёт остатков не ведётся? Плюс при ошибках надо как-то юзера уведомлять обо всём этом (из стороннего компонента к ms2 не так просто сделать это красиво и удобно). 3.2. Есть ещё такая фигня, как подарочные сертификаты. А значит при покупке такого товара-карты автоматическую привязку к пользователю делать нельзя. Либо на фронте написать интерфейс, где юзер может указать мыло того, кому хочет подарить. Но это уже через чур усложнение. Не все юзеры поймут что от них требуется. Или у того, кому он хочет сделать подарок, нет email. Ведь в реальной жизни дисконтными картами можно пользоваться и оффлайн в точках продаж. И люди, которые получили в подарок подарочный сертификат, в основном так и делают - идут напрямую в магазин.

Вообще, при общении с владельцем магазина оказалось, что требования у них кудааа разнообразнее. Плюс тем магазинам, у которых есть оффлайн точки, делать дисконтные карты на сайте нету никакого смысла, если расплатиться этими картами можно только онлайн. Тут всё сложнее - для них нужен какой-то оффлайновый учёт, у многих свои CRM'ы. Да и карты могут быть именными и не именными. Простая ситуация - представим себе какой-нибудь летуаль. И представим, что дисконтные карты у них именные. Как кассир в точке продаж определит, что карта принадлежит именно этому человеку? Полезет на сайт и будет искать эту карту в списке карт и сверять владельца? А как им потом скидку в 1с связать с этим человеком? И надо ли им это делать (скидку указывать)? Да, проблему можно решить просто - выкинуть понятие "именная карта". Но с обычними скидочными картами проблем не меньше и как минимум те же - им же по-любому надо указывать в своих ERP (тот же 1с) по какой карте сделана скидка. Карты надо как-то синхронизировать с ERP и сайтом. Иначе одну и ту же карту надо будет вбивать 2 раза - и в системе учёта и на сайте. При чём источником должен быть не сайт, а внутренняя система учёта, доступ к которой имеют ограниченный доверенный круг лиц (ведь есть же нечистые на руку продавцы, менеджеры, которые будут скидки своим выделять при отсутствии контроля). Да там вопросов куда больше, чем ответов. Пока с владельцем магазина обсуждали эту тему - нюансов вылезло - мама не горюй, всё и не вспомню. Плюс обсуждалось это всё с владельцем небольшой сети интим-шопов - а там тоже есть свои нюансы, в т.ч. с анонимностью :-)

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

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

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

В текущем виде (если выкинуть пару моментов) и добить логику, компонент идеально подходит для каких-то акционных и сезонных общедоступных скидок. Например: - "Спешите, только с 3го по 10е декабря, каждому купившему на сумму от 10000 рублей - доставка бесплатно!" - "Спешите, только 3 часа, с 6ти до 9ти вечера, первым 100 покупателям скидка 25%!" Вариаций может быть много.

А вот как быть со скидочными картами - я хз.

bezumkinВасилий Наумкин
26.09.2013 13:06

Спасибо за информацию, я где-то примерно так же мозг уже себе сломал, но пошел в другом направлении.

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

Спасибо!

Алексей Карташов
26.09.2013 13:38

Да не за что)

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

Свистунов Андрей
08.10.2013 16:40

Система скидок это конечно хорошо, но факт того, что в магазине до сих пор отсутствует возможность простейшего учета остатков говорит о том, что этот магазин полноценно использовать в торговле и учете не возможно. Интересно неужели только меня это беспокоит или я чего-то упустил?

bezumkinВасилий Наумкин
08.10.2013 16:54

Ну невозможно, так невозможно.

Буду иметь в виду.

BournDmitry Rodionov
27.01.2014 16:53

написал модифицирующий плагин для изменения цены в зависимости от валюты, но заполняется поле old_price которое используется для указания старой цены для скидки, что с этим можно сделать?

BournDmitry Rodionov
27.01.2014 17:01

так же к примеру стоит модифицировать old_price исходя из выбранной валюты, но я так понимаю невозможно?

bezumkin
Василий Наумкин
04.07.2022 23:34
Что-то странное у тебя произошло: миграция есть, и вроде как выполнена, но таблицы при этом отсутств...
inetlover
Александр Наумов
03.07.2022 20:36
Василий, спасибо! Все понятно!
bezumkin
Василий Наумкин
02.07.2022 20:28
Спасибо, поправил!
bezumkin
Василий Наумкин
30.06.2022 03:58
Есть ли возможность формировать &quot;friendly URL aliases&quot;, используя аналог translit MODx? ...
bezumkin
Василий Наумкин
27.06.2022 03:32
Спасибо за исправления, очень выручаешь =) Но учитывая количество не описаных в заметке дополнительн...
bezumkin
Василий Наумкин
27.06.2022 03:10
что будет использоваться для вывода многоуровневого меню Посмотри как работают комментарии на этом ...
bezumkin
Василий Наумкин
25.06.2022 11:56
Поправил, спасибо!
bezumkin
Василий Наумкин
21.06.2022 01:58
onLoad(data) { this.total = data.total }, и onLoad({total}) { this.total = total }, В нашем случ...
bezumkin
Василий Наумкин
20.06.2022 14:01
Прекрасно тебя понимаю, я когда сам в этом разбирался - голова дымилась. Но зато теперь прямо-таки п...
bezumkin
Василий Наумкин
20.06.2022 09:30
Не надо, оно по умолчанию так - я просто чуть более подробно написал.