Как проверить товар по его id, на соответствие какому-либо правилу работы с корзиной и получить для него привязанный купон, который необходимо вывести в карточке товара.
Добрый ночи. Возникла проблема и нужна Ваши помощь!!! Есть задача вывести купон в карточке товара. Много чего перепробывал, но ничего не выходит.
Я могу получить список купонов с помощью этого:
Код
use Bitrix\Sale\Internals\DiscountCouponTable;
$arResult["COUPONS"] = DiscountCouponTable::getList()->fetchAll();
Из полученных купонов можно получить id правил работы с корзиной, которые применены к этим купонам. И вот теперь вопрос! Как проверить товар по его id, на соответствие какому-либо правилу?
Заранее спасибо за любые советы и решения! Все добра!!!
Добрый вечер, уважаемые разработчики. Сюда меня отослали из тех. поддержки. Надеюсь на Вашу помощь и знания. Описываю свою проблему.После обновления битрикса с версии 17.0.4 до 18.1.4 возникла ошибка при попытке оформить заказ. Текст ошибки прилагаю: [TypeError] Argument 1 passed to Bitrix\Sale\PaySystem\Manager::getListWithRestrictions() must be an instance of Bitrix\Sale\Payment, boolean given, called in /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php on line 2771 (0) /home/u564/newsite.drovosek-profi.ru/WWW/bitrix/modules/sale/lib/paysystem/manager.php:287 #0: Bitrix\Sale\PaySystem\Manager::getListWithRestrictions(boolean) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:2771 #1: SaleOrderAjax->getInnerPaySystemInfo(object) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:2863 #2: SaleOrderAjax->initPayment(object) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:4265 #3: SaleOrderAjax->getOrder(string) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:4223 #4: SaleOrderAjax->createOrder(string) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:4356 #5: SaleOrderAjax->processOrderAction() /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:4332 #6: SaleOrderAjax->doAction(string) /home/u564/newsite.drovosek-profi.ru/WWW/local/components/smedia/sale.order.ajax/class.php:4552 #7: SaleOrderAjax->executeComponent() /home/u564/newsite.drovosek-profi.ru/WWW/bitrix/modules/main/classes/general/component.php:638 #8: CBitrixComponent->includeComponent(string, array, boolean) /home/u564/newsite.drovosek-profi.ru/WWW/bitrix/modules/main/classes/general/main.php:1038 #9: CAllMain->IncludeComponent(string, string, array, boolean, array) /home/u564/newsite.drovosek-profi.ru/WWW/personal/order/make/index.php:60
Блуждая по Вашим огромным трудам, а именно исходникам, и сравнивая файлы нашел проблему в одной функции находящейся в \bitrix\modules\sale\lib\paymentcollection.php Публичная функция getInnerPayment. При сравнении выяснилось что функция изменилась. в версии 17.0.4 она выглядела вот так:
Код
public function getInnerPayment(){
/** @var Order $order */
if (!$order = $this->getOrder())
{
throw new Main\ObjectNotFoundException('Entity "Order" not found');
}
if ($paySystemId = PaySystem\Manager::getInnerPaySystemId())
{
/** @var Payment $payment */
foreach ($this->collection as $payment)
{
if ($payment->getPaymentSystemId() == $paySystemId)
return $payment;
}
/** @var Service $paySystem */
if ($paySystem = Manager::getObjectById($paySystemId))
{
return $this->createItem($paySystem);
}
}
return false;
}
в версии 18.1.4 выглядит вот так:
Код
public function getInnerPayment(){
/** @var Order $order */
if (!$order = $this->getOrder())
{
throw new Main\ObjectNotFoundException('Entity "Order" not found');
}
if ($paySystemId = PaySystem\Manager::getInnerPaySystemId())
{
/** @var Payment $payment */
foreach ($this->collection as $payment)
{
if ($payment->getPaymentSystemId() == $paySystemId)
return $payment;
}
}
return false;
}
Из кода понятно что исчезло условие:
Код
/** @var Service $paySystem */
if ($paySystem = Manager::getObjectById($paySystemId))
{
return $this->createItem($paySystem);
}
При добавлении этого куска к функции версии 18.1.4 все начинает работать. НО! Так как я понимаю что модифицировать ядро, это откровенно говоря, BAD!, и что если кода там нет значит его и не должно быть, то я хочу спросить у Вас - В чем причина того что без этого кода не работает оформление заказа. Возможно этот код добавил разработчик сайта. ТОгда другой вопрос: как обойтись без него, чтобы при будущих обновлениях не пришлось снова что-то править.