Как известно, в MODx есть возможность создавать свои плагины к CMS, но многие игнорируют этот мощный инструмент, даже те, кто уже вовсю использует самописные сниппеты. Между тем, создание плагина – такой же простой процесс, как написание сниппета. Сегодня мы потренируемся в этом, а заодно положим в свою библиотеку одну чертовски полезную штуку.

Итак, плагины. Собственно, ничего хитрого в них нет. Как и сниппеты, они создаются в менеджере CMS, закладка «Управление->Элементы->Плагины».

Лично мне часто недоставало возможности получить из кода какие-то данные, не выводя их в браузер. Типичный случай – работа на production-сервере, когда пугать клиента выводом дампов крайне нежелательно. Значит, данные нужно доставлять напрямую к нам, минуя возможность их попадания к кому-то постороннему.

Я использую интернет-пейджер QIP – по-моему, это достойный кандидат на то, чтобы стать клиентом нашего плагина на сервере. Он поддерживает несколько разных протоколов. ICQ я по понятным причинам проигнорировал, а вот Jabber – то, что надо. В него мы и будем слать отчеты из CMS.

Создаем новый плагин, называем его, к примеру, «SendDataFromMODx». Вносим в плагин следующий текст:

<?php
/* Initialize parameters */
if (!isset ($jab_server)) { $jab_server = 'server'; }
if (!isset ($jab_user)) { $jab_user= 'login'; }
if (!isset ($jab_password)) { $jab_password= 'password'; }
if (!isset ($www_root_path)) { $www_root_path = '/home/htdocs/mysite/www/'; }
 
if (!class_exists('XMPPHP_XMPP')) {
    require_once $www_root_path.'assets/lib/XMPPHP/XMPP.php';
}
 
$conn = new XMPPHP_XMPP($jab_server, 5222, $jab_user, $jab_password, 'xmpphp', $jab_server, $printlog=false, $loglevel=XMPPHP_Log::LEVEL_ERROR);
 
try {
    $e =& $modx->event;
    $msg =$e->name;
    ob_start();
    array_splice($e->params,0,3); 
    print_r ($e);
    $dump = ob_get_contents();
    ob_end_clean();
    $msg.="\n".$dump;
    $conn->connect();
    $conn->processUntil('session_start');
    $conn->presence();
    $conn->message('myusername@qip.ru', $msg);
    $conn->disconnect();
} catch(XMPPHP_Exception $em) {
    die($em->getMessage());
}
?>

Что делает этот плагин? Во-первых, задаются Jabber-сервер, пользователь и пароль, через которые будут отправляться сообщения, а также директория, в которой лежит класс для подключения к этому серверу. Во-вторых, подключается класс XMPPHP_XMPP для отправки сообщений. В-третьих (строка $conn = new ….) создается подключение к серверу. И наконец ($conn->message('myusername@qip.ru', $msg);) сообщение отправляется нужному пользователю, то есть вам.

Работа будет удобнее, если на закладке конфигурации плагина вы внесете в параметры такой текст:

&jab_server=XMPP server;string;jabber.ru  &jab_user=User name;string;username  &jab_password=Password;string;userpassword

Это позволит удобнее настраивать параметры подключения. Сам класс XMPPHP_XMPP можно легко найти в интернете.

Если вы обратили внимание на то, какие именно данные отправляются, то вы уже поняли, что придет в ваш Jabber-клиент. В зависимости от того, какие события вы активировали в плагине, (закладка «Системные события»), сообщения могут отличаться, но в целом они выглядят примерно так:

OnBeforeWebLogin
SystemEvent Object
(
    [name] => OnBeforeWebLogin
    [_propagate] => 1
    [_output] => 
    [activated] => 
    [activePlugin] => SendDataFromMODx
    [params] => Array
        (
            [username] => mywebusername
            [userpassword] => mypassword
            [rememberme] => 0
 )
)

У меня это означает, что плагин отслеживает событие «OnBeforeWebLogin» и система сообщила, что на сайт попытался зайти пользователь «mywebusername» с паролем «mypassword». Точно также приходят сообщения и об остальных событиях.

Для сообщений я рекомендую завести отдельный эккаунт, чтобы не светить свой пароль на чужом сайте. Я воспользовался сервисом jabber.ru.

Даже странно, что такой удобной фичи нет в MODx по умолчанию. Применений множество – отчеты о создании бэкапа, предупреждения о попытках входа в админку, отладка кода, коммуникации с посетителями. Больше всего мне нравится реакция клиента, который оставляет на сайте вопрос, а через несколько секунд получает телефонный звонок с ответом. Приятно делать приятное людям. Надеюсь, сделал приятно и вам.

Если у вас появились вопросы - пишите, я постараюсь ответить быстро ;)

Автор статьи: Александр Поляков, lecosson@mail.ru