Вы столкнетесь с проблемой при расчете скидок, если захотите добавлять товары в корзину с кастомной ценой. Скидки на такие товары просчитываться не будут. И об этом писали тут например https://idea.1c-bitrix.ru/26963/ . Нужно было как-то очень быстро и изящно решить эту проблему, хотя бы на время, пока разработчики наконец-то это не учтут в новых версиях. И очень рационально на мой взгляд сделать два разных параметра 'CHECK_PRICE' и 'CHECK_DISCOUNT' вместо 'CUSTOM_PRICE', что кстати уже реализовано в стандартном классе провайдере CCatalogProductProvider который по умолчанию передается параметром 'PRODUCT_PROVIDER_CLASS' в методе $basket->createItem, например.
Поэтому, исходя из проблемы, было принято решение скопировать стандартный PRODUCT_PROVIDER_CLASSCCatalogProductProvider (он находится тут /bitrix/modules/catalog/general/product_provider.php и реализован от интерфейса IBXSaleProductProvider ) и переименовать его, например, в CCatalogProductProviderCustom. В нашем новом провайдере меняем одну строчку (в моей версии это 65 строчка):
Теперь вы можете выставлять свою цену, а скидка будет просчитываться как раньше. p.s. Я предупреждаю, что данное решение на коленке, и если возможно оно кому-то поможет. Но если кто-то глубже погружался в проблему и знает, такого рецепта недостаточно, пожалуйста отпишитесь в комментариях. К слову версия Битрикса 18.1.3
Нет, не применяются скидки на сайте после обновления именно из-за CUSTOM_PRICE. Может я не так сделала: я в файле /bitrix/modules/catalog/general/product_provider.php закомментировала строчку $arParams['CHECK_PRICE'] = (isset($arParams['CHECK_PRICE']) && $arParams['CHECK_PRICE'] == 'N' ? 'N' : 'Y');
вместо нее написала $arParams['CHECK_PRICE'] = 'N';
и в этом же файле у PRODUCT_PROVIDER_CLASS заменила CCatalogProductProvider на CCatalogProductProviderCustom
1. Вы поправили код прямо в ядре. Если уж так и произошло, то PRODUCT_PROVIDER_CLASS нигде менять не нужно. Однако не следует править ядро, т.к. это вызовет проблемы. 2. Я пишу, что нужно нужно скопировать файл product_provider.php и переименовать название класса. Вы пишите что в этом же файле у PRODUCT_PROVIDER_CLASS заменила CCatalogProductProvider на CCatalogProductProviderCustom, но я имел ввиду, что PRODUCT_PROVIDER_CLASS нужно заменить там, где вы вызываете метод $basket->createItem.
Скидки могут не просчитываться по другой причине. У вас не работает это со стандартным шаблоном?
Перфильева Евгения, если так, то нужно будет убедиться, что используется ваш PRODUCT_PROVIDER_CLASS а не системный. Т.е. вы работаете на уровне методов, то в какой-то момент нужно будет указать свой класс в качестве аргумента, вот например тут https://dev.1c-bitrix.ru/api_help/sale...t__add.php параметром передается. Ну и в D7 методах тоже самое.
Если компонент у вас, то там смотреть надо. Сходу не скажу.
Перфильева Евгения, а что в $_POST["PRICE"]? Вообще странно, что у вас цена из POST принимается. Так любой сможет передать цену по которой хочет приобрести товар.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».
Подскажите, пожалуйста, как решить эту проблему для версии
Может я не так сделала: я в файле /bitrix/modules/catalog/general/product_provider.php закомментировала строчку
$arParams['CHECK_PRICE'] = (isset($arParams['CHECK_PRICE']) && $arParams['CHECK_PRICE'] == 'N' ? 'N' : 'Y');
вместо нее написала
$arParams['CHECK_PRICE'] = 'N';
и в этом же файле у PRODUCT_PROVIDER_CLASS заменила CCatalogProductProvider на CCatalogProductProviderCustom
Верно?
1. Вы поправили код прямо в ядре. Если уж так и произошло, то PRODUCT_PROVIDER_CLASS нигде менять не нужно. Однако не следует править ядро, т.к. это вызовет проблемы.
2. Я пишу, что нужно нужно скопировать файл product_provider.php и переименовать название класса. Вы пишите что в этом же файле у PRODUCT_PROVIDER_CLASS заменила CCatalogProductProvider на CCatalogProductProviderCustom, но я имел ввиду, что PRODUCT_PROVIDER_CLASS нужно заменить там, где вы вызываете метод $basket->createItem.
Скидки могут не просчитываться по другой причине. У вас не работает это со стандартным шаблоном?
Нам ответили из службы поддержки 1СБитрикс, что не работают скидки именно из-за CUSTOM_PRICE
Ну и в D7 методах тоже самое.
Если компонент у вас, то там смотреть надо. Сходу не скажу.
Нашла его тут. Да, у нас стандартный шаблон. Не знаю где искать
if($_POST["PRODUCT_ID"]){
if ($item = $basket->getExistsItem('catalog', $_POST["PRODUCT_ID"])) {
$item->setField('QUANTITY', $item->getQuantity() + 1);
}
else {
$item = $basket->createItem('catalog', $_POST["PRODUCT_ID"]);
$item->setFields(array(
'QUANTITY' => 1,
'CURRENCY' => Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => Bitrix\Main\Context::getCurrent()->getSite(),
'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
'NAME' => $_POST["NAME"],
"PRICE" => $_POST["PRICE"],
"DETAIL_PAGE_URL" => $_SERVER["REQUEST_URI"],
'CUSTOM_PRICE' => 'Y',
'IGNORE_CALLBACK_FUNC' => 'Y',
));
}
$basket->save();
Если пишу 'CUSTOM_PRICE' => 'Y', - не работают скидки, цена указывается верная.
Если пишу 'CUSTOM_PRICE' => 'N', - работают скидки, но цена равна 0.