Андрей, а еще последний вопрос, все так же по оформлению заказа. Я пытаюсь разделить заказ на 2 с помощью события \Bitrix\Main\EventManager::getInstance()->AddEventHandler('sale', 'OnSaleOrderBeforeSaved', Array("EventsClass", "OnSaleOrderBeforeSavedHandler")); Для этого сперва удаляю некоторые товары из основного заказа class EventsClass { function OnSaleOrderBeforeSavedHandler(\Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); foreach ($basket as &$basketItem) { if(условие что товар должен быть перенесен в другой заказ) { $basketItem->delete(); } } } $basket->save(); } } в этом случае позиции $basketItem->delete(); не попадают в заказ но они почему то после оформления заказа остаются в корзине, а хотелось бы что бы они исчези из корзины. Если сделать вот так то работает корректно (товар в корзине не остается) class EventsClass { function OnSaleOrderBeforeSavedHandler(\Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); foreach ($basket as &$basketItem) { if(условие что товар должен быть перенесен в другой заказ) { \CSaleBasket::Delete($basketItem->GetField("ID"));//Удаляем товар из корзины дедовским способом } } } } } Но хотелось бы сделать красиво, что бы весь код был на D7
Как с помощью события сделать в bitrix:sale.order.ajax предустановку службы доставки на странице оформления заказа
Андрей Быкадоров со службами доставки все получилось, спасибо, а теперь таким же способом пытаюсь настроить ограничение по платежным системам Я сделал сделал по аналогии с доставками следующее в init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'sale', 'onSalePaySystemRestrictionsClassNamesBuildList', ['EventsClass', 'onSalePaySystemRestrictionsClassNamesBuildListHandler'] ); class EventsClass { function onSalePaySystemRestrictionsClassNamesBuildListHandler() { return new \Bitrix\Main\EventResult( \Bitrix\Main\EventResult::SUCCESS, array( '\CustomPaySystemRestriction' => '/bitrix/php_interface/include/CustomPaySystemRestriction.php', ) ); }
а в файле CustomPaySystemRestriction.php class CustomPaySystemRestriction extends Bitrix\Sale\Services\Base\Restriction { public static function getClassTitle() { return 'Кастомное ограничение'; }
public static function getClassDescription() { return 'Выбираем нужную службу доставки в зависимости от содержимого корзины'; } //в общем все те же методы как я делал в delivery } Но в админке для доставок появляется кастомное ограничение, а для оплат (сделанных таким же способом) не появляется. Может я не от того класса наследуюсь? Bitrix\Sale\Services\Base\Restriction Пример брал на форуме
Как с помощью события сделать в bitrix:sale.order.ajax предустановку службы доставки на странице оформления заказа
Андрей Быкадоров спасибо огромное, на первый взгляд именно то что мне нужно, тут как раз через ограничение можно оставить единственную службу доставки и соответственно автоматически подтягиваются оплаты которые к ней привязаны. Буду разбираться как ко всему этому подключить мой черный ящик, но это уже другая история, думаю проблем не возникнет
Как с помощью события сделать в bitrix:sale.order.ajax предустановку службы доставки на странице оформления заказа
Андрей, ок, может не с помощью события а другим способом. Вот например заходим мы на страницу оформления заказа, видим список служб доставки, кликаем мышкой по нужной нам и получаем то состояние страницы, которое я бы хотел видеть при самой первой загрузке страницы. Т.е. по факту с помощью ajax.php (который лежит в папке стандартного компонента bitrix:sale.order.ajax) формируется правильный json-массив который используется в JS для построения страницы оформления заказа. А в этом ajax.php вызывается тот же компонент bitrix:sale.order.ajax, значит теоретически если перед вызовом компонента на странице оформления заказа задать правильные значения в $_REQUEST, то теоретически страница оформления заказа загрузится с выбранной нужной мне службой доставки и правильным списком платежных систем.
PS Сразу отвечу на вопрос который возможно возникнет, я заранее не знаю какая служба доставки должна быть выбрана по умолчанию, она выбирается на основании содержимого корзины и такое условие не задать в ограничениях службы доставки. Т.е. есть некий черный ящик, туда мы скидываем содержимое корзины и он нам возвращает ID службы доставки конкретно для этой корзины и именно эта служба доставки должна быть выбрана по умолчанию.
Как с помощью события сделать в bitrix:sale.order.ajax предустановку службы доставки на странице оформления заказа
Андрей спасибо, но я ожидал увидеть более элегантное решение. Это событие я знаю, но проблема в том что тут придется очень много, изменять данных. Я предполагал вариант когда все действия будут производиться через объект заказа, на событии которое срабатывает еще до служб доставок и платежных систем, где мы выберем нужную службу доставки (в самом объекте), а уже платежные системы автоматически подцепятся нужные и например потом через то же событие OnSaleComponentOrderShowAjaxAnswer (что вы предложили), мы шлифанем $arrResult (т.е. удалим ненужные службы лдоставки из него).
Другими словами, есть какое то событие, в самом начале компонента, через него в объекте заказа делаем выбор нужной службы доставки, далее компонент сам все просчитывает, отталкиваясь от нашей выбранной доставки и возвращает полный список служб доставки в котором выбрана нужная служба и нужные платежные системы доступные для нужной службы доставки. Где мы потом просто откинем ненужные службы доставки из результирующего массива по событию OnSaleComponentOrderShowAjaxAnswer
Как с помощью события сделать в bitrix:sale.order.ajax предустановку службы доставки на странице оформления заказа
Всем привет! Помогите пожалуйста решить проблему. Есть страница оформления заказа на стандартном компоненте bitrix:sale.order.ajax Нужно что бы при определенном условии, на странице оформления заказа в списке служб доставок вывелась единственная нужная служба из нескольких доступных и она была уже выбрана по умолчанию, остальные скрыты. Так же что бы в списке платежных систем вывелись только те что доступны для этой службы доставки и была выбрана самая первая.
Вот пример в init.php я добавляю \Bitrix\Main\EventManager::getInstance()->addEventHandler('sale', 'какое использовать тут событие?', ['MyEvents', 'changeDelivery']);
class MyEvents { public static function changeDelivery(тут параметры прилетевшие по событию) { тут я получаю id нужной службы доставки по условиям задачи (с этим проблем нет) допустим я определяю что должно быть $deliveryId == 1
вот тут проблема по которой нужна помощь нужно произвести какие то действия чтобы на странице оформления заказа вывелась единственная служба доставки с ID === 1, которая уже выбрана (предустановлен checkbox/radio) и вывелся список платежных систем, который доступен для этой службы доставки (настройка ограничений платежной сыстемы по службе доставки в админке) и первая платежная система из списка уже была выбрана (предустановлен checkbox/radio) } }