Заметка о событиях в ядре D7 Битрикс.
На днях работал с платежами в CRM Битрикс24. Была, небольшая на первый взгляд, задача дать возможность пользователям менять валюту в счетах. Пока не будем о том как удалось это решить, не об этом речь. Но после того, как стало возможным менять валюту в счетах Битрикса, появилась другая задача. В данные платежа (эта та настройка, где выбираем «способ оплаты») не попадал выбранный код валюты: RUB, USD, BYR и т.д.
То есть, если ранее при создании счета код валюты был RUB, то он таким и останется. За платеж отвечает класс \Bitrix\Sale\Payment. В его методе обнаружился интересный метод создания событии до обновления и после обновления сущности.
До обновления:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$eventName = static::getEntityEventName(); if ($this->isChanged() && $eventName) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', 'OnBefore'.$eventName.'EntitySaved', array( 'ENTITY' => $this, 'VALUES' => $this->fields->getOriginalValues() )); $event->send(); } |
То есть имя события генерируется динамически. За это отвечает метод Bitrix\Sale\Internals\Enity::getEntityEventName().
Вот этот метод:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public static function getEntityEventName() { $eventName = null; $className = static::getClassName(); $parts = explode("\\", $className); $first = true; foreach ($parts as $part) { if (strval(trim($part)) == '') continue; if ($first === true && $part == "Bitrix") { $first = false; continue; } $eventName .= $part; } return $eventName; } |
То есть имя события зависит от имени класса. В моем случае, это класс \Bitrix\Sale\Payment. Название Bitrix отбрасывается и получается OnBeforeSalePaymentEntitySaved для события до сохранения сущности и
1 2 3 4 5 6 |
$event = new Main\Event('sale', 'On'.$eventName.'EntitySaved', array( 'ENTITY' => $this, 'VALUES' => $this->fields->getOriginalValues(), )); |
OnSalePaymentEntitySaved после сохранения.
Ну, хорошо. И что это дает?
Это значит, что даже не зная названия определенного события можно поэкспериментировать, основываясь на названии класса. Если конечно, класс относится в ядру D7.