Повідомлення з форми Drupal 8 в бот Telegram

На початку ми створюємо бота через @BotFather, даємо йому ім'я, опис, додаємо зображення і отримуємо API-ключ. Тепер нам потрібно отримати ID чату, куди будуть надсилатися наші повідомлення. Для цього введіть адресу в адресному рядку.

https://api.telegram.org/bot<token>/getUpdates

де <token> це наш токен, який нам надається під час створення бота. Цей токен, у випадку потреби, може бути перегенерований в BotFather.

Після введення адреси ми відкриємо сторінку з даними чату, де нас цікавить рядок чату: id:

Chat ID

Це ідентифікатор чату, куди наш бот буде відправляти результати форм.

Тепер ми створюємо модуль на сайті, створюємо власну папку в каталозі modules і папку telegram_notification в ній. У цій папці створюємо два файли - telegram_notification.info.yml і telegram_notification.module.

У файлі info додаємо інформацію про наш модуль.

name: Telegram Notification
description: Webform notification for Telegram
core: 8.x
type: module

У разі, якщо модуль буде використовуватися у Drupal 9, вам потрібно зробити такий запис

core_version_requirement: ^8 || ^9

Додаємо таке наповнення в другий файл:

<?php

/**
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * @param $form
 * Implements hook_form_FORM_ID_alter()
 */

function telegram_notification_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

    if($form['#id'] == 'webform-submission-price-add-form'){
        $form['actions']['submit']['#submit'][] = '_telegram_notification_form_submit';
    }
}

/**
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 * Callback telegram_notification
 */
function _telegram_notification_form_submit(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {

    # Telegram data
    $telegram_token = 'bot'; // Your token, which is built using the bot + token template
    $telegram_id_chat = '';  // chat ID

    if (!empty($telegram_token) && !empty($telegram_id_chat)) {
        # Form data
        $data = $form_state->getValues();
        $data_result = array(
            'name' => '<b>Name:</b> ' . $data['name'],
            'email' => '<b>Email:</b> ' . $data['email'],
            'phone' => '<b>Phone:</b> ' . $data['phone']
        );
        # Send message
        $message = implode($data_result, '%0A');
        $send_message = fopen("https://api.telegram.org/{$telegram_token}/sendMessage?chat_id={$telegram_id_chat}&parse_mode=html&text={$message}", "r");
    }
}

Тут в строці

if($form['#id'] == 'webform-submission-price-add-form'){

ми встановлюємо умову, результати якої форми ми будемо надсилати боту. Зазначено ID нашої форми.

Нижче ми додаємо токен бота та ID чату, куди будуть надсилатися результати.

Після строки

$data_result = array(

Ми маємо список полів нашої форми та даних, які будуть передані.

Якщо нам потрібно передати, наприклад, статичну назву форми, у самій формі ми додаємо приховане поле з значенням за замовчуванням, яке буде дорівнювати тому, яке нам потрібно відобразити.

Після цього ми очищаємо кеш і спробовуємо відправити форму, результати якої повинні надійти до нашого бота.

У випадку, якщо нам потрібно працювати з кількома формами, ми можемо створити кілька умов на основі id-форм та вказати різні функції, які ми просто копіюємо нижче та встановлюємо наші назви та вивід наших полів.

Крім того, може виникнути потреба надсилати результати кільком користувачам. Проблема полягає в тому, що цей API передбачає відправку лише одного ідентифікатора чату одночасно. Як можливий варіант рішення, додайте бота до групи, надайте йому права адміністратора. Після цього знову виконайте запит, щоб отримати ідентифікатор спеціаліста. На перший погляд, ідентифікатор особи може бути дуже різним і навіть мати мінус на початку ідентифікатора, але ми все одно копіюємо і вставляємо його у змінну $telegram_id_chat = ''.

Після всіх маніпуляцій ми повинні отримати бота, який надсилає повідомлення з усіх вказаних форм до групи в Telegram.

Можливо, вам доведеться змінити значення "Group Privacy / Privacy mode" і встановити його на "disabled" в налаштуваннях бота, через BotFather, а потім додати його знову до групи та призначити адміністратором.

Простий текст

  • Не дозволено жодних HTML теґів.
  • Рядки й абзаци переносяться автоматично.
  • Адреси вебсторінок та адреси електронної пошти автоматично перетворюються у посилання.
Код мови коментаря.