Акции
В msDiscount есть 2 вида скидок: постоянные акции и одноразовые купоны.
Для акций вы можете указать:
- Дату начала и дату окончания
- Группы товаров, на которые скидка действует, или наоборот - не действует
- Группы пользователей, для которых скидка есть, или нет
- Каждую скидку можно связать с ресурсов MODX и назначить картинку, если вы заходите вывести их список через xPDO
Алгоритм работы и проверка
- Выбираются все активные акции, то есть включенные и с нужной датой работы (если указана)
- Затем группы указанного пользователя
- И группы товаров
- Если активных акций нет — просто проверяем персональные скидки у групп и выбираем максимальную
- Если акции есть — проверяем еще их, в цикле
- Если акция исключает какую то группу — то она не работает для текущего юзера и товара, то есть - пропускается
- Если пользователь и товар входят в требуемые группы — назначаем скидку акции
- И сравниваем её с персональной скидкой групп товаров и юзеров. Если какая-то из них выше — она перекрывает акционную
- Если в подходящих акциях указана скидка и абсолютная (в валюте магазина), и в процентах — приводим процент к числу от цены товара и сравниваем, что из них больше.
- В итоге проходимся по всем скидкам и выбираем максимальную
Для проверки этого алгоритма, в админке компонента предусмотрен отдельный раздел:
Вы можете указать товар, пользователя и проверить скидку на определённую дату.
Вывод скидки пользователя
Следуя логике работы компонента, у покупателя нет скидки, как таковой - она есть только по отношению к определённому товару и времени.
Однако, если пользователь приписан к группе, для которой указана скидка, её можно вывести таким сниппетом:
php
<?php
// Если не указан &uid=``, то выбираем для текущего юзера
if (empty($uid)) {$uid = $modx->user->id;}
$pdoFetch = $modx->getService('pdoFetch');
$group = $pdoFetch->getObject('msdUserGroup', array('modUser.id' => $uid), array(
'loadModels' => 'msdiscount',
'leftJoin' => array(
'modUserGroupMember' => array('class' => 'modUserGroupMember', 'on' => 'modUserGroupMember.user_group = msdUserGroup.id'),
'modUser' => array('class' => 'modUser', 'on' => 'modUser.id = modUserGroupMember.member AND modUser.id = '.$uid),
),
'groupby' => 'msdUserGroup.id',
'sortby' => 'CAST(`msdUserGroup`.`discount` AS DECIMAL(13,3))',
'sortdir' => 'desc',
'select' => 'discount',
));
if (isset($group['discount'])) {
return $group['discount'];
}
Сниппет вернёт максимальную скидку группы пользователя, или пустоту.
Для работы требуется pdoTools, который идёт в комплекте с miniShop2.