Требуется вывести в прайс листе цены с учетом скидок (и вывести старые цены зачеркнутыми).
Добавляю в метод onp_get_items (bitrix/components/hightek/onepage/component.php) вызов своего метода, который должен получить скидки на текущий товар, категорию, подкатегорию.
Вот мой метод для получения скидок:
Проблема в том, что CCatalogDiscount::GetList не отрабатывает как нужно. Если задавать и PRODUCT_ID и SECTION_ID, то в результате получается ноль (потому-что скидка может быть как на товар, так же на категорию и подкатегорию). Знак "+" перед PRODUCT_ID и перед SECTION_ID, означает, что в SQL выражение нужно добавить условие "OR NULL". Вот дамп SQL запроса, который выполнится в результате запуска функции CCatalogDiscount::GetList:
Мне нужно между PRODUCT_ID и SECTION_ID изменить AND на OR (попробовал использовать логику в SQL, array("LOGIC"=> "OR", array('PRODUCT_ID' => 'value'), array('SECTION_ID' => 'value'))), но такой подход игнорируется, и просто не добавляется к запросу.
Так же пробовал метод CCatalogDiscount::GetDiscountByProduct в результате пусто.
Как быть с этими скидками, может быть я не теми методами пользуюсь ?
p.s я конечно же могу сделать все через обычный query. Но условия скидки слишком широки(она может быть - на категорию, на товар, на производителя и на многое другое), требуется штатные рабочие методы.
Добавляю в метод onp_get_items (bitrix/components/hightek/onepage/component.php) вызов своего метода, который должен получить скидки на текущий товар, категорию, подкатегорию.
Вот мой метод для получения скидок:
Код |
---|
/* * Получение скидки в процентах. * * @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; } |
Проблема в том, что CCatalogDiscount::GetList не отрабатывает как нужно. Если задавать и PRODUCT_ID и SECTION_ID, то в результате получается ноль (потому-что скидка может быть как на товар, так же на категорию и подкатегорию). Знак "+" перед PRODUCT_ID и перед SECTION_ID, означает, что в SQL выражение нужно добавить условие "OR NULL". Вот дамп SQL запроса, который выполнится в результате запуска функции CCatalogDiscount::GetList:
Код |
---|
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 |
Так же пробовал метод CCatalogDiscount::GetDiscountByProduct в результате пусто.
Как быть с этими скидками, может быть я не теми методами пользуюсь ?
p.s я конечно же могу сделать все через обычный query. Но условия скидки слишком широки(она может быть - на категорию, на товар, на производителя и на многое другое), требуется штатные рабочие методы.