Перейти к содержанию

Рекомендуемые сообщения

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

 

Залез я разбираться с событиями в ОП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 (но облегченный или наооборот, более тяжелый, чем родной , только для вашего модуля)

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 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 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.