Как вывести цену со скидкой в карточке товара 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 '';
Vladimir
23 июня 2022, 11:58
modx.pro
914
0

Комментарии: 5

Vladimir
23 июня 2022, 11:58
0
Такой очевидный вопрос, но в доках нет решения
    Vladimir
    23 июня 2022, 12:06
    0
    Пока нет ответа со встроенным решением, сделал такой сниппет
    [[!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 '';
      Vladimir
      23 июня 2022, 12:34
      0
      Как вывести скидку для всех тоже хз
        Vladimir
        23 июня 2022, 12:45
        0
        Вывод вообще для всех
        <?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 '';
          Sergey (Sentinel)
          30 сентября 2024, 21:26
          0
          А для корзины скидку как вывести?
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          5