Сегодня нам хотелось бы вам рассказать, как связать MODx с Telegram. Рассказ будет на основе связки AjaxForm с FormIt. Но любой может адаптировать код по своему и присылать сообщения в телеграм по любому событию в MODx Revo.
Итак, для начала нам нужно создать бота для Telegram. Как это сделать вы легко сможете найти на просторах сети. После того, как вы создали бота, вы получите token, который в дальнейшем нам понядобится. Также напишите что-нибудь вашему боту и перейдите по ссылке:
https://api.telegram.org/bot[token]/getUpdates
, где [token] — это тот токен, который вы получили при создании бота. На данной странице вы увидите JSON код, в котором вам необходимо найти следующую строчку: «chat»:{«id»:<chat_id>"}, где <chat_id> — это идентификатор чата, который нам понадобится в дальнейшем.
Отлично! Теперь у нас есть токен и идентификатор чата и мы можем приступить к написанию сниппета, который будет hook’ом для FormIt:
<?php $token = "<token>"; $chat_id = "<chat_id>"; $values = $hook->getValues(); // Получаем название формы $formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->get('id')); // Получаем ip адрес отправителя $ip = $modx->getOption('REMOTE_ADDR', $_SERVER, ''); // Берем данные с формы $name = $values['name']; $phone = $values['phone']; $email = $values['email']; $subject = $values['subject']; $text = $values['text']; // Создаем массив данных $arr = array( "Название формы" => $formName, "IP" => $ip, "Имя" => $name); if($phone){ $arr["Телефон"] = $phone; } if($email){ $arr["Email"] = $email; } if($subject){ $arr["Тема сообщения"] = $subject; } if($text){ $arr["Текст сообщения"] = $text; } $txt = '<b>Заполнена форма - '.$formName."</b>\n"; // Цикл по массиву (собираем сообщение) foreach($arr as $key => $value) { $txt .= "<b>".$key."</b>: ".$value." \n"; } // Отправляем сообщение посредством cURL $website="https://api.telegram.org/bot".$token; $params=[ 'chat_id' => $chat_id, 'text' => $txt, 'parse_mode' => 'html' ]; $ch = curl_init($website . '/sendMessage'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, ($params)); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); $modx->log(MODX_LOG_LEVEL_ERROR, $result); curl_close($ch); //Возвращаем true – это особенность написания хуков для FormIt. return true;
Хук у нас написан! Теперь вызовем его при инициализации FormIt:
[[!AjaxForm? &snippet=`FormIt` &form=`contactFormTpl` &hooks=`spam,email,FormItSaveForm,telegrambot` &emailTpl=`contactEmailTpl` &emailSubject=`Вам сообщение с сайта [[++site_name]]` &emailTo=`info@dart.agency` &emailFrom=`noreply@dart.agency` &formName=`Сообщение с сайта` &validate=`name:required,email:required,text:required,user:blank,username:blank,captcha:blank` ]]
Теперь вы получите не только email сообщение, но и сообщение в Telegram от бота.
Получилось сделать, скопировав сниппет. Но, наверное, есть решение поизящнее
api.telegram.org/bot0000-0000-0000-0000/getUpdates
Видимо, верстка съела слово «token» из примера ссылки
Ну и предварительно что-то черкануть в чат боту, как и написано в статье