Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

События aka Event


ArtemPitov

Recommended Posts

Доброго времени суток

 

Залез я разбираться с событиями в ОП2 и непонятно где они создаются

 

к примеру отзывы, вот тут сам вызов по старту отзыва

$this->event->trigger('pre.review.add', $data);

ну и когда все отработало 

$this->event->trigger('post.review.add', $review_id);

а где сам register

$this->event->register

и что он обрабатывает так и не нашел, поясните что куда и зачем, спасибо 

Змінено користувачем ArtenPitov
Надіслати
Поділитися на інших сайтах

Тоже кстати интересно для каких целей это чудо в oc2 можно применять на практике?
Была идея реализовать модуль для "прогрева кеша (mem)" с помощу ивентов. Что может быть еще?

Надіслати
Поділитися на інших сайтах

Ой.. много чего :)

 

Вы регистрируете событие и все!!!!

В 2.3 оно само выполнится..

В событие поступает все входные данные для метода. Если  событие возвращает true, то оно не дает выполняться самому методу.

 

 

Где применить...

 

Вам нужно вызвать метод getProducts (но облегченный или наооборот, более тяжелый, чем родной , только для вашего модуля)

Вы создаете событие и проверяете в нем какой метод его вызвал и выполняете свой запрос)..

Опа!!! И вы быстренько, без пыли, воспользовались стандартным методом. Не меняя всего запроса)

Надіслати
Поділитися на інших сайтах

  • 6 months later...
В 21.09.2016 в 21:34, chukcha сказал:

Вы создаете событие и проверяете в нем какой метод его вызвал и выполняете свой запрос)..

Каким образом это можно осуществить? Если вы про __METHOD__, то получите не метод который вызвал событие, а метод из своего модуля, где вы эту строку и прописали.

Надіслати
Поділитися на інших сайтах


Я про event

 

"Каждый" метод имеет два события - before и after

19 минут назад, arni сказал:

Если вы про __METHOD__,

Это причем?

Надіслати
Поділитися на інших сайтах

1 час назад, chukcha сказал:

Я про event

 

"Каждый" метод имеет два события - before и after

1 час назад, arni сказал:

Если вы про __METHOD__,

Это причем?

вы пишите: "создаете событие и проверяете в нем какой метод его вызвал и выполняете свой запрос"

Под "создаете событие", насколько я понял, вы понимаете создание обработчика события , который повесит выполнение нужного метода/класса своего модуля на определенное событие - например подключение модели. Вот меня интересует как в своем методе, который будет вызван, вы собираетесь проверить "какой метод его  вызвал"? Ведь событие не вызывается каким-либо методом, событие вызывается подключением всего класса целиком, например так

$this->load->model('account/address');

Змінено користувачем arni
Надіслати
Поділитися на інших сайтах


Посмотрите в сторону событий OC

как вызывается событие, в какой момент происходит вызрв события, какие данные предаются в событие

событие - event

Надіслати
Поділитися на інших сайтах

18 минут назад, chukcha сказал:

Посмотрите в сторону событий OC

как вызывается событие, в какой момент происходит вызрв события, какие данные предаются в событие

событие - event

Данные передаются не в событие, а в обработчик события (метод trigger). В зависимости от типа события (для контроллера, модели и тд.) в обработчик передаются разные данные, но в любом случае, среди этих данных нет названия метода который вызвал событие. Т.к. я уже писал - не метод вызывает событие, а загрузка класса целиком со всеми его методами. 

 

Пример события:

catalog/model/extension/extension/before

сработает перед загрузкой модели extension/extension.

аргумент $route, который получит метод модуля, будет содержать extension/extension, но вовсе не название какого-либо метода события. Вообще вызов метода модели происходит уже после того, как отработает наш модуль. Того я спрашиваю, как это вы собираетесь сделать: "проверяете в нем какой метод его вызвал"? Т.к. на момент выполнения своего метода, повешенного обработчиком на определенное событие, никакой метод того события еще не будет выполнен.

 

Смотрите файл system\engine\loader.php, там видно что передается в обработчик события, и это не метод, который его вызвал.

Надіслати
Поділитися на інших сайтах


catalog/model/            extension/extension/            before

Єто и есть роут который доступен в обработчике события (если вам так удобно)

 

перед вызовом  метода модели extension/extension/  будет вызван ваш обработчик

Надіслати
Поділитися на інших сайтах

Вы не внимательно прочитали -  я это уже описал выше:

ргумент $route, который получит метод модуля, будет содержать extension/extension"

extension/extension - тут нет названия метода, тут есть только класс модели, который его вызвал (не всегда класс содержит только один метод). А я спрашивал про метод! Т.к. вы писали "проверяете в нем какой метод его вызвал". Хотя, по-моему вы просто перепутали класс с методом.

Класс, конечно, можно получить из роута, только это далеко не название метода. Смысла узнать какой класс вызвал событие из метода своего модуля не много, т.к. когда устанавливается обработчик события, он уже цепляется на определенный класс. Другое дело, если бы, как вы писали, какой-то отдельный метод класса вызывал обработчик события, тогда было бы можно легко изменить этот метод под свои нужды. Вот в этом мой вопрос и состоял. Т.к. я пока не придумал легкого способа подмены одного из методов класса, который вызвал событие.

Надіслати
Поділитися на інших сайтах


class ControllerEventXxxxYyyyy extends Controller {
	public function before(&$route, &$data) {

public function view(&$view, &$data, &$output) {

где роут - метод того, кто вызвал

 

foreach ($actions as $action) {
					$result = $action->execute($this->registry, $args);

					if (!is_null($result) && !($result instanceof Exception)) {
						return $result;
					}
// Trigger the pre events
			$result = $registry->get('event')->trigger('model/' . $route . '/before', array(&$route, &$args, &$output));
			
			if ($result) {
				return $result;
			}

 

Надіслати
Поділитися на інших сайтах

Так нагляднее:

Получаем модель в контроллере:

$this->load->model('checkout/order');

роут у нас получится checkout/order. Это не метод, который вызывает событие, а только класс. При получении модели, методы не указываются в роуте! 

К моменту выполнения следующей строки кода в классе модели, событие уже прошло (и то что перед и то что после)

 

Открываем файл самой модели catalog\model\checkout\order.php - там несколько методов.

Далее в контроллере вызов одного такого метода (getOrder) данной модели:

$order_info = $this->model_checkout_order->getOrder($order_id);

как видите, методы уже загружены, к ним есть доступ, но эта строка кода вызова отдельного метода уже не приводит к возникновению событий. А строка загрузки модели не содержит какой-либо метод, т.к. грузит все методы. В результате из своего кода ни в роуте ни в другой переменной мы не можем получить метод который вызывает событие, т.к. метод модели событие не вызывает, а в роуте для модели метод не прописывается.

Змінено користувачем arni
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.