Требуется вывести в прайс листе цены с учетом скидок (и вывести старые цены зачеркнутыми).
Добавляю в метод [B]onp_get_items[/B] ([U]bitrix/components/hightek/onepage/component.php[/U]) вызов своего метода, который должен получить скидки на текущий товар, категорию, подкатегорию.
Вот мой метод для получения скидок:
[CODE]/*
* Получение скидки в процентах.
*
* @param array $arRow св-ва одного продукта.
* @param array $userGroups группы пользователя.
*
* @return int процент.
*/
function getDiscount($arRow, $userGroups) {
global $DB;
// Получение родительского section_id.
$section_obj = CIBlockSection::GetList(array(),
array(
"IBLOCK_ID" => $arRow['IBLOCK_ID'],
"ID" => $arRow['IBLOCK_SECTION_ID']
), false);
if ($parent_id = $section_obj->GetNext()) {
$parent_section = $parent_id["IBLOCK_SECTION_ID"];
}
$section_id = $parent_section ? $parent_section : $arRow['IBLOCK_SECTION_ID'];
$arDiscounts = CCatalogDiscount::GetList(
array("SORT" => "ASC"),
array(
"USER_GROUP_ID" => $userGroups,
"ACTIVE" => "Y",
"+PRODUCT_ID" => $arRow['ID'],
"+SECTION_ID" => $section_id,
">ACTIVE_FROM" => $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")),
"<ACTIVE_TO" => $DB->FormatDate(date("Y-m-d H:i:s"),
"YYYY-MM-DD HH:MI:SS", CSite::GetDateFormat("FULL")),
),
false,
false,
array(
"ID", "SITE_ID", "ACTIVE", "ACTIVE_FROM", "ACTIVE_TO",
"RENEWAL", "NAME", "SORT", "MAX_DISCOUNT", "VALUE_TYPE",
"VALUE", "CURRENCY", "PRODUCT_ID", "LAST_DISCOUNT"
)
);
$discount_value = '';
while ($arDiscount = $arDiscounts->Fetch()) {
// Отрезает все нули после запятой.
$discount_value += number_format($arDiscount['VALUE'], 0);
// Прекратить дальнейшее применение скидок.
if ($arDiscount['LAST_DISCOUNT'] == 'Y')
break;
}
return $discount_value ? $discount_value : 0;
}
[/CODE]
Проблема в том, что [B]CCatalogDiscount::GetList[/B] не отрабатывает как нужно. Если задавать и PRODUCT_ID и SECTION_ID, то в результате получается ноль (потому-что скидка может быть как на товар, так же на категорию и подкатегорию). Знак "+" перед PRODUCT_ID и перед SECTION_ID, означает, что в SQL выражение нужно добавить условие "OR NULL". Вот дамп SQL запроса, который выполнится в результате запуска функции CCatalogDiscount::GetList:
[CODE]SELECT
CD.ID as ID, CD.SITE_ID as SITE_ID, CD.ACTIVE as ACTIVE, DATE_FORMAT(CD.ACTIVE_FROM, '%d.%m.%Y %H:%i:%s') as ACTIVE_FROM,
DATE_FORMAT(CD.ACTIVE_TO, '%d.%m.%Y %H:%i:%s') as ACTIVE_TO, CD.RENEWAL as RENEWAL, CD.NAME as NAME, CD.SORT as SORT,
CD.MAX_DISCOUNT as MAX_DISCOUNT, CD.VALUE_TYPE as VALUE_TYPE, CD.VALUE as VALUE, CD.CURRENCY as CURRENCY,
CDP.PRODUCT_ID as PRODUCT_ID, CD.LAST_DISCOUNT as LAST_DISCOUNT
FROM b_catalog_discount CD
LEFT JOIN b_catalog_discount2product CDP ON (CD.ID = CDP.DISCOUNT_ID)
LEFT JOIN b_catalog_discount_cond CDC ON (CD.ID = CDC.DISCOUNT_ID)
LEFT JOIN b_catalog_discount2section CDS ON (CD.ID = CDS.DISCOUNT_ID)
WHERE ((((CDC.USER_GROUP_ID = 1 )) OR ((CDC.USER_GROUP_ID = 2 )) OR ((CDC.USER_GROUP_ID = 3 ))))
AND ((((CD.ACTIVE = 'Y' ))))
AND ((((CDP.PRODUCT_ID = 4979 )) OR (CDP.PRODUCT_ID IS NULL) OR (CDP.PRODUCT_ID = 0)))
AND ((((CDS.SECTION_ID IN (0,350,349,348))) OR (CDS.SECTION_ID IS NULL) OR (CDS.SECTION_ID = 0)))
AND ((((CD.TYPE IS NULL) OR (CD.TYPE = 0)))) ORDER BY CD.SORT ASC [/CODE]Мне нужно между PRODUCT_ID и SECTION_ID изменить AND на OR (попробовал использовать логику в SQL, array("LOGIC"=> "OR", array('PRODUCT_ID' => 'value'), array('SECTION_ID' => 'value'))), но такой подход игнорируется, и просто не добавляется к запросу.
Так же пробовал метод [B]CCatalogDiscount::GetDiscountByProduct[/B] в результате пусто.
[B]Как быть с этими скидками, может быть я не теми методами пользуюсь ?[/B]
[I]p.s я конечно же могу сделать все через обычный query. Но условия скидки слишком широки(она может быть - на категорию, на товар, на производителя и на многое другое), требуется штатные рабочие методы.[/I]