Сегодня нам хотелось бы вам рассказать, как связать 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» из примера ссылки
Ну и предварительно что-то черкануть в чат боту, как и написано в статье
<?php switch($modx->event->name){ case 'OnEcMessageSave': if($object){ $data = $object->toArray(); $time = time(); $newMessage = 5; $createdon = strtotime($object->get("createdon")) + $newMessage; if ($createdon > $time) { // если сообщение новое то дальше отправляем в телеграм } } break; }$token = ""; $chat_ids = "chat_id_1,chat_id_2,chat_id_3"; // Замените на фактические ID чатов, перечисленные через запятую $values = $hook->getValues(); // Остальной код остается таким же // Разбиваем строку с ID чатов на массив $chat_ids = explode(",", $chat_ids); // Отправляем сообщение в каждый чат $website = "https://api.telegram.org/bot".$token; foreach ($chat_ids as $chat_id) { $params = [ 'chat_id' => trim($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, http_build_query($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;<?php $token = ""; $chat_id = ""; $values = $hook->getValues(); // Получаем текущий ресурс $resource = $modx->resource; // Получаем ссылку откуда была заполнена форма $urlAdress = $modx->makeUrl($resource->get('id')); // Получаем название страницы откуда была заполнена форма $pageTitle = $resource->get('pagetitle'); // Получаем название формы $formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->get('id')); // Получаем ip адрес отправителя $ip = $modx->getOption('REMOTE_ADDR', $_SERVER, ''); // Функция для получения информации о стране и регионе по IP function getCountryAndRegion($ip) { $ipInfo = file_get_contents("https://ipinfo.io/{$ip}/json"); $ipData = json_decode($ipInfo, true); return $ipData; } $ipData = getCountryAndRegion($ip); $country = $ipData['country'] ?? 'Unknown'; // Страна $region = $ipData['region'] ?? 'Unknown'; // Регион $city = $ipData['city'] ?? 'Unknown'; // Город // Берем данные с формы $fio = $values['fio']; $phone = $values['phone']; $email = $values['email']; $message = $values['message']; // Создаем массив данных $arr = array( "URL страницы" => 'https://mebel-murom33.ru/' . $urlAdress, "IP" => "$ip ($country, $region, $city)", "Имя" => $fio ); if($phone){ $arr["Телефон"] = $phone; } if($email){ $arr["Email"] = $email; } if($message){ $arr["Текст сообщения"] = $message; } $txt = '<strong>Заявка со страницы - '.$pageTitle."</strong>\n"; // Цикл по массиву (собираем сообщение) foreach($arr as $key => $value) { $txt .= "<strong>".$key."</strong>: ".$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, http_build_query($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;