Плагин - хитрый болт с левой резьбой

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

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

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

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

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

  1.  
  2. /* Initialize parameters */
  3. if (!isset ($jab_server)) { $jab_server = 'server'; }
  4. if (!isset ($jab_user)) { $jab_user= 'login'; }
  5. if (!isset ($jab_password)) { $jab_password= 'password'; }
  6. if (!isset ($www_root_path)) { $www_root_path = '/home/htdocs/mysite/www/; }
  7.  
  8. if (!class_exists('XMPPHP_XMPP')) {
  9. require_once $www_root_path.'assets/lib/XMPPHP/XMPP.php';
  10. }
  11.  
  12. $conn = new XMPPHP_XMPP($jab_server, 5222, $jab_user, $jab_password, 'xmpphp', $jab_server, $printlog=false, $loglevel=XMPPHP_Log::LEVEL_ERROR);
  13.  
  14. try {
  15. $e =& $modx->event;
  16. $msg =$e->name;
  17. ob_start();
  18. array_splice($e->params,0,3);
  19. print_r ($e);
  20. $dump = ob_get_contents();
  21. ob_end_clean();
  22. $msg.="\n".$dump;
  23. $conn->connect();
  24. $conn->processUntil('session_start');
  25. $conn->presence();
  26. $conn->message('myusername@qip.ru', $msg);
  27. $conn->disconnect();
  28. } catch(XMPPHP_Exception $em) {
  29. die($em->getMessage());
  30. }
  31.  

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

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

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

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

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

  1.  
  2. OnBeforeWebLogin
  3. SystemEvent Object
  4. (
  5. [name] => OnBeforeWebLogin
  6. [_propagate] => 1
  7. [_output] =>
  8. [activated] =>
  9. [activePlugin] => SendDataFromMODx
  10. [params] => Array
  11. (
  12. [username] => mywebusername
  13. [userpassword] => mypassword
  14. [rememberme] => 0
  15. )
  16. )
  17.  

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

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

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

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

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

new comment 23.07.2011, 16:32:54

Под ICQ аналогичный годный модуль не подскажете. К Jot прикрутить хочется.

new comment 25.07.2011, 20:48:07

есть специальный класс, называется WebIcqPro можно привинтить, я только пока незнаю как сделать что бы при посыле сообщения каждый раз не выполнялось соединение, т.к. банит при высокой нагрузке...

new comment 27.07.2011, 18:22:11

Здраствуйте, скачал отсюдова http://webi.ru/webi_files/xmpp_webi.html класс xmpp/ создал аккаунт в jabber.ru / кинул сюда http://ukrrent.com.ua/assets/lib/xmpp/ все файлы / пока без плагина напрямую хочу запустить скрипт в config.ini.php прописал <?php /* UTF-8 user@domain */

$webi_conf['user']="xxx@jabber.ru"; $webi_conf['pass']="xxx"; $webi_conf['host']="jabber.ru"; $webi_conf['port']=5222; $webi_conf['domain']="jabber.ru";

$webi_conf['logtxt']=true; // ведение лога false | true $webi_conf['log_file_name']="loggerxmpp.log"; // файл лога $webi_conf['tls_off'] = 0; // принудительное отключение шифрования. 1 - выключено, 0 - включено, если сервер поддерживает

?>

запускаю http://ukrrent.com.ua/assets/lib/xmpp/ здесь index.php срабатывает с таким кодом <?php /* UTF-8 XMPP webi http://webi.ru/webi_files/xmpp_webi.html

*/

include_once(" xmpp.class.php"); $webi = new XMPP($webi_conf);

$webi->connect(); // установка соединения...

//$webi->sendStatus('text status','chat',3); // установка статуса $webi->sendMessage("alesioo@jabber.ru", "soobshenie"); // отправка сообщения

// так можно зациклить /*

while($webi->isConnected) { $webi->getXML (); }

*/

?>

на экране белым бело как и должно быть, иду смотреть в логи вот что пишет

2011-07-27 17:51:15 Initializing class variables

2011-07-27 17:51:15 Trying to connect at jabber.ru:5222

2011-07-27 17:51:15 Connection made successfully at jabber.ru:5222

2011-07-27 17:51:15 Sending XML>> <?xml version="1.0"?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" xmlns="jabber:client" to="http://www.jabber.ru" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace">

2011-07-27 17:51:16 Received XML<< <?xml version='1.0'?><stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='2293601563' from='jabber.ru' xml:lang='ru'><stream:error><host-unknown xmlns='urn:ietf:params:xml:ns:xmpp-streams'/></stream:error></stream:s tream>

2011-07-27 17:51:16 Sending XML>>

2011-07-27 17:51:17 Sending XML>> <presence><show>chat</show><status>text status</status><priority>3</priority></presence>

2011-07-27 17:51:17 Sending XML>> <message type="chat" from="" to="alesioo@jabber.ru"><body>soobshenie</body></message>

2011-07-27 17:51:17 Sending XML>> </stream:stream>

но qip как молчал так и молчит, тут я добавил джаббер аккантуа, проверил ,рабочий , приятель имеет джабер тоже с ним переписывался, а смс со скрипта не приходит. Я как бы пробую сам себе выслать что ли, не знаю в чем проблема че qip партизанит

new comment 27.07.2011, 19:47:59

Сам разобрался вот http://code.google.com/p/xmpphp/downloads/detail?name=xmpphp-0.1rc2-r7 7.tgz&can=2&q= отсюда нужно качать класс

new comment 28.07.2011, 15:38:21

a mogno ispolzovat SKYPPE?

new comment 28.07.2011, 16:30:45

Всем привет. По поводу отправки сообщений на со своего на свой-же эккаунт - не советую, особенно если это не ваш сайт/хостинг. Не надо "палить" свой пароль в чужом хранилище, лучше заведите на отправку отдельный эккаунт для каждого клиента. По поводу Jot - не помню точно, но то, что в голову сходу пришло: повесить плагин на событие рендеринга страницы, посмотреть $_POST и отправить сообщение с нужным текстом. По транспортам: 1) аську не рекомендую - пока я еще ей пользовался, уяснил - они любят потихоньку обновлять протоколы, рабочие версии классов ICQ быстро устаревают. Если вы берете деньги за постоянную поддержку работоспособности скрипта - можно, но вообще этот транспорт я не рекомендую. 2) Jabber - единственный вариант, с которым у меня все всегда заводилось с пол-пинка. 3) Skype: в теории - да, на практике - вам понадобится выделенный сервер, самописный софт и специальные библиотеки (платные) от скайпа. Причем настолько "платные" что я этот вариант всерьез даже не рассматриваю.

new comment 28.07.2011, 16:35:24

Игорь, ты бы прицепил к комментированию "извещалку" для автора :), а то я публикации твои по RSS получаю, а комментарии - нет.

new comment 06.12.2011, 22:09:38

беда-беда... ничего не происходит при нужном событии. события стоят OnBeforeWebLogin OnBeforeWebLogout OnWebAuthentication OnWebLogin

в лог на сервере пишется PHP Parse error: syntax error, unexpected T_IF in /home/site/data/www/site.net/manager/includes/document.parser.class.in c.php(746) : eval()'d code on line 6, referer: http://site.net/

шестая строка - if (!class_exists('XMPPHP_XMPP')) { require_once $www_root_path.'assets/libs/XMPPHP/XMPP.php'; } при открытии site.net/assets/libs/XMPPHP/XMPP.php - пустая страница, как и надо.

new comment 07.12.2011, 09:44:30

А реально сделать чтоб приходил репорт вида Login - password ???? 8й

без ненужного куска кода, вроде

OnBeforeWebLogin SystemEvent Object ( .............. и тд.

new comment 13.12.2011, 13:59:52

Добрый день,подскажите пожалуйста как создать плагин в modx под названием "Show TVs" не могу найти в моdx этого плагина,вот ищу как его можно создать)))

Добавить комментарий

Для форматирования используйте синтаксис Markdown. Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Код безопасности: