Добрый вечер, уважаемые разработчики. Сюда меня отослали из тех. поддержки. Надеюсь на Вашу помощь и знания. Описываю свою проблему.После обновления битрикса с версии 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 она выглядела вот так:
в версии 18.1.4 выглядит вот так:
Из кода понятно что исчезло условие:
При добавлении этого куска к функции версии 18.1.4 все начинает работать. НО! Так как я понимаю что модифицировать ядро, это откровенно говоря, BAD!, и что если кода там нет значит его и не должно быть, то я хочу спросить у Вас - В чем причина того что без этого кода не работает оформление заказа. Возможно этот код добавил разработчик сайта. ТОгда другой вопрос: как обойтись без него, чтобы при будущих обновлениях не пришлось снова что-то править.
[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!, и что если кода там нет значит его и не должно быть, то я хочу спросить у Вас - В чем причина того что без этого кода не работает оформление заказа. Возможно этот код добавил разработчик сайта. ТОгда другой вопрос: как обойтись без него, чтобы при будущих обновлениях не пришлось снова что-то править.