Задать вопрос
@mamkaror
Программист

Почему обработчик события не вызывается?

Добрый день.

Не вызывается обработчик события, зарегистрированный в своем модуле в файле ../install/index.php
RegisterModuleDependences('sale', 'OnSaleOrderSaved', $this->MODULE_ID, '\\Yolo\\Bonus\\EventHandler', 'myFunction');

тут все ок, он зарегистрировался, я так уже с другими делал)

Теперь в файле ../lib/Eventhandler.php
<?php
namespace Yolo\Bonus;
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');

$module_id = "yolo.bonus";
\CModule::IncludeModule('main');
\CModule::IncludeModule('sale');
\CModule::IncludeModule($module_id);

use Bitrix\Main;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\Application;
use Bitrix\Main\Type\DateTime;
use Yolo\Bonus;
use Yolo\Bonus\Core;
use Bitrix\Sale;
use Bitrix\Sale\Order;
use Bitrix\Sale\Basket;
use Bitrix\Sale\Delivery;
use Bitrix\Sale\PaySystem;
class EventHandler{
  public function OnSaleStatusOrder($order_id, $status_val){
	// ...	
  }
	
  public function myFunction(\Bitrix\Main\Event $event)
{
    /** @var Order $order */
    $order = $event->getParameter("ENTITY");
    $oldValues = $event->getParameter("VALUES");
    $isNew = $event->getParameter("IS_NEW");

    if ($isNew)
    {
        $sum = $order->getPrice();
        // . . . 
    }
}
}
?>

В итоге выходит ошибка :
Argument 1 passed to Yolo\Bonus\EventHandler::myFunction() must be an instance of Bitrix\Main\Event, instance of Bitrix\Sale\Order given (0)

Я так понимаю, что в функцию передается объект Bitrix\Sale\Order а не Bitrix\Main\Event

Я уже подключил все что можно, и все равно не понимаю в чем дело.
На самом деле я только только начал писать модуль и возможно много чего не понимаю еще, но вроде все было логично до этого момента.
В документации показано что должен передаваться Bitrix\Main\Event, а по факту передается Bitrix\Sale\Order...

Подскажите пожалуйста.
  • Вопрос задан
  • 4245 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
@PetrPo
Пришлось потупить немного...

Если зарегистрируешь так событие, твой вариант будет ок работать
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->registerEventHandler('sale', 'OnSaleOrderSaved', $this->MODULE_ID, '\\Yolo\\Bonus\\EventHandler', 'myFunction');

5e3d6ad0da8ad239350040.jpeg

P.S. не забудь удалить свое событие из базы и почистить кеш

P.P.S. в доках на счет объекта \Bitrix\Main\Event $event все верно написано, просто замес старого и нового апи получился)) Таже херня получится между AddEventHandler и $eventManager->addEventHandler
Ответ написан
udjin123
@udjin123
PHP, Golang, React
В документации сказано "объект заказа", в исходниках если посмотреть, то тоже увидим что, передается класс Order. Соответственно поменяйте тип параметра. Ошибка в документации есть, а конкретно в приведенном примере.
5e3d2f64eed24570834732.jpeg

Вот вызов события
$event = new Main\Event('sale', EventActions::EVENT_ON_ORDER_SAVED, array(
                'ENTITY' => $this,
                'IS_NEW' => $this->isNew,
                'IS_CHANGED' => $this->isChanged(),
                'VALUES' => $this->fields->getOriginalValues(),
            ));


И как выше чуть написали - параметры объявляйте все, сколько передается, static писать тоже, это не фатальные ошибки, но так не правильно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
gromdron
@gromdron
Работаю с Bitrix24
Во первых, такие методы стоит помечать как static, чтобы не вызывать ошибки самого php.
Во вторых, есть описание событий - https://dev.1c-bitrix.ru/api_d7/bitrix/sale/events... в которых сказано что обработчик события принимает 3 параметра.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы