Создание своего события в MODX

Сижу посматриваю исходники minishop. Заинтересовался созданием собственных событий в MODX.
$response = $this->ms2->invokeEvent('msOnBeforeAddToOrder', array(
'key' => $key,
'value' => $value,
'order' => $this
));
Правильно ли я понял что вот данный кусок кода и вызывает событие?
Если да, то каким образом теперь его отследить?

Реально ли сделать так —
$modx->invokeEvent('myEvent');
и затем создать плагин на это событие?
Каким макаром сделать чтобы свое событие появилось в создание плагина? В базу лезть и ручками добавлять или?
Короче у меня одни вопросы…
Буду рад, если кто нибудь немного осветит эту тему!
Заранее благодарю!
Володя
12 апреля 2014, 10:24
modx.pro
13
8 836
0
Поблагодарить автора Отправить деньги

Комментарии: 8

Сергей
12 апреля 2014, 15:30
+1
Вот тут чуть ниже середины есть раздел Custom Events, описывающий что куда.(Кратко: сначала нужно создать евент через апи, а только потом использовать)
    Василий Наумкин
    12 апреля 2014, 15:35
    +2
    Правильно ли я понял что вот данный кусок кода и вызывает событие?
    Да.

    Реально ли сделать так
    Конечно.

    В базу лезть и ручками добавлять или?
    Или твой пакет должен создавать события при своей установке.

    Короче, ничего сложного. Нужно всего 3 составляющих:
    — Событие в БД с произвольным именем
    — Плагин, у которого оно отмечено
    — Вызов этого события в любом месте MODX.
      Володя
      12 апреля 2014, 20:10
      +1
      да все получилось! Спасибо!
        Володя
        13 апреля 2014, 11:04
        4
        +1
        Приведу небольшой пример на пакете — Office, может кому пригодится…
        Допустим хотим ограничить доступ пользователей по email. Пускать только разрешенные email.
        1. создаем свое событие для плагина
        <?php
        $Event = $modx->newObject('modEvent');
        $Event->set('name', 'OnOfficeBeforeLogin');
        $Event->set('service',1); 
        $Event->set('groupname', 'office');
        $Event->save();
        проверить создалось ли событие можно так
        $test = $modx->getObject('modEvent',array('name'=>'OnOfficeBeforeLogin'));
        echo $test->get('groupname');
        2. добавляем в action.php
        $modx->invokeEvent('OnOfficeBeforeLogin', array(
                    '_REQUEST' => $_REQUEST
        		));
        3. пишем плагин на наше событие
        <?php
        switch ($modx->event->name) {
        
        	case 'OnOfficeBeforeLogin':
        	    if ($_REQUEST['action']='auth/sendlink') {
        	    
        	    $command = $modx->getOption('office_ms2_command', null, "", true);//системная настройка с email участниками
                    $instructor = $modx->getOption('office_ms2_instructor', null, "", true);//системная настройка с email тренерами
                
                    $emails = array_merge(explode(',', $command ),explode(',', $instructor ));
          
        	    if (!in_array($_REQUEST['email'], $emails)) {
        	        //меняем почту на неправильную для выдачи ошибки
                    $_REQUEST['email'] = "неправильная";
           
        	    }
        	    else {
                   //если есть доступ то ничего не делаем
                   //или делаем чтото еще)))
        	    }
        
        	    }
        	    break;
        }
          Володя
          20 апреля 2014, 17:51
          0
          Вопрос как вернуть переменную из плагина?
          банально
          return $properties;
          не срабатывает.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8