Как вывести цену со скидкой в карточке товара msDiscount ?
msDiscount выводит в каталоге, корзине всё норм, но в карточке товара не выводит, в доках не нашёл как вывести цену со скидкой в карточке товара
Код ниже уже готовый, проверенный, работает отлично по группам, по скидкам и так далее, выводит именно цену товара, а не саму скидку, для вывода самой скидкой нужно воспользоваться тем что написано в доках
Код ниже уже готовый, проверенный, работает отлично по группам, по скидкам и так далее, выводит именно цену товара, а не саму скидку, для вывода самой скидкой нужно воспользоваться тем что написано в доках
<?php
/** @var msDiscount $msDiscount */
/** @var msDiscount $price */
/** @var pdoTools $pdoTools */
if(empty($price)){
return '';
}
$pdoTools = $modx->getService('pdoTools');
$msDiscount = $modx->getService('msDiscount');
$date = $pdoTools->getStore('msd_date');
$usergroups = array_keys($msDiscount->getUserGroups($modx->user->id));
$sales = !empty($date)
? $msDiscount->getSales($date, true)
: $msDiscount->getSales();
if (empty($sale)) {
$sale = $pdoTools->getStore('msd_sale');
}
if (!empty($sale)) {
$tmp = array_map('trim', explode(',', $sale));
foreach ($sales as $id => $sale) {
if (!in_array($id, $tmp)) {
unset($sales[$id]);
}
}
}
if (!empty($row) && is_array($row)) {
$mode = 'prepare';
if (!empty($row['id'])) {
$id = $row['id'];
}
}
else {
$mode = 'standalone';
if (!empty($frontend_css)) {
$frontend_css = str_replace('[[+assetsUrl]]', $msDiscount->config['assetsUrl'], $frontend_css);
$modx->regClientCSS($frontend_css);
}
if (!empty($frontend_js)) {
$frontend_js = str_replace('[[+assetsUrl]]', $msDiscount->config['assetsUrl'], $frontend_js);
$modx->regClientScript($frontend_js);
}
if (empty($id)) {
$id = $modx->resource->id;
}
}
$remains = $discount = 0;
if (!empty($id) && !empty($sales)) {
foreach ($sales as $sale) {
// Check user groups
if (!empty($sale['users'])) {
$required = array();
foreach ($sale['users'] as $gid => $type) {
if ($type == 'out' && in_array($gid, $usergroups)) {
unset($sales[$idx]);
continue(2);
}
if ($type == 'in') {
$required[] = $gid;
}
}
if (!empty($required) && !array_intersect($required, $usergroups)) {
unset($sales[$idx]);
continue;
}
}
// Check product groups
if (!empty($sale['products'])) {
$groups_in = $groups_out = array();
foreach ($sale['products'] as $gid => $type) {
if ($type == 'out') {
$groups_out[] = $gid;
unset($sale['products'][$gid]);
}
else {
$groups_in[] = $gid;
}
}
}
if (!empty($groups_out) || !empty($groups_in)) {
$ids = $modx->getParentIds($id);
$ids[] = $id;
$q = $modx->newQuery('msCategoryMember', array('product_id' => $id));
$q->select('category_id');
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
$modx->queryTime += microtime(true) - $tstart;
$modx->executedQueries++;
if ($tmp = $q->stmt->fetchAll(PDO::FETCH_COLUMN)) {
$ids = array_merge($ids, $tmp);
}
}
$ids = array_unique($ids);
$where = count($ids) > 1
? array('document:IN' => $ids)
: array('document' => $ids[0]);
$q = $modx->newQuery('modResourceGroupResource', $where);
$q->select('document_group');
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
$modx->queryTime += microtime(true) - $tstart;
$modx->executedQueries++;
$groups = $q->stmt->fetchAll(PDO::FETCH_COLUMN);
if (!empty($groups_out) && array_intersect($groups_out, $groups)) {
continue;
}
elseif (!empty($groups_in) && !array_intersect($groups_in, $groups)) {
continue;
}
}
}
// Product match
$tmp_remains = ($sale['ends'] != '0000-00-00 00:00:00')
? strtotime($sale['ends']) - time()
: 0;
if (strpos($sale['discount'], '%') !== false && (empty($discount) || strpos($discount, '%') !== false)) {
if ($sale['discount'] > $discount) {
$discount = $sale['discount'];
$remains = $tmp_remains;
}
}
elseif (is_numeric($sale['discount']) && is_numeric($discount)) {
if ($sale['discount'] > $discount) {
$discount = $sale['discount'];
$remains = $tmp_remains;
}
}
else {
$discount = $sale['discount'];
$remains = $tmp_remains;
}
}
}
if($discount && $remains){
return (((int)$price * (100 - (int)$discount )/100));
}
return '';
Комментарии: 5
Такой очевидный вопрос, но в доках нет решения
Пока нет ответа со встроенным решением, сделал такой сниппет
[[!getProductDiscountPrice? &price=`[[*price]]`]]
.<?php
// Если не указан &uid=``, то выбираем для текущего юзера
if(empty($price)){
return '';
}
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 (((int)$price * (100 - (int)$group['discount'] )/100));
}
return '';
Как вывести скидку для всех тоже хз
Вывод вообще для всех
<?php
if(empty($price)){
return '';
}
$pdoFetch = $modx->getService('pdoFetch');
$group = $pdoFetch->getObject('msdUserGroup', array(), array(
'loadModels' => 'msdiscount',
'leftJoin' => array(
'modUserGroupMember' => array('class' => 'modUserGroupMember', 'on' => 'modUserGroupMember.user_group = msdUserGroup.id')
),
'groupby' => 'msdUserGroup.id',
'sortby' => 'CAST(`msdUserGroup`.`discount` AS DECIMAL(13,3))',
'sortdir' => 'desc',
'select' => 'discount',
));
if (isset($group['discount'])) {
return (((int)$price * (100 - (int)$group['discount'] )/100));
}
return '';
А для корзины скидку как вывести?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.