PHP обробник та Telegram

PHP обробник та Telegram інтеграція

Форми в Landiro CMS обробляються на стороні сервера PHP обробником. Обробник зберігається у handler.php секції або вводиться адміністратором у редакторі.

Базовий обробник handler.php

<?php
function handleOrderForm(array $data): array {
    $name  = trim($data['name']  ?? '');
    $phone = trim($data['phone'] ?? '');

    if (!$name || !$phone) {
        return ['success' => false, 'message' => 'Заповніть всі поля'];
    }

    $token  = $data['_tg_token']  ?? '';   // передається з data-атрибутів форми
    $chatId = $data['_tg_chat']   ?? '';

    $text = "🛒 *Нове замовлення*\n" .
            "Ім'я: {$name}\n" .
            "Телефон: {$phone}\n" .
            "Товар: " . ($data['_product'] ?? '');

    if ($token && $chatId) {
        $response = file_get_contents(
            "https://api.telegram.org/bot{$token}/sendMessage?" . http_build_query([
                'chat_id'    => $chatId,
                'text'       => $text,
                'parse_mode' => 'Markdown',
            ])
        );
    }

    return ['success' => true, 'message' => 'Дякуємо! Ми зателефонуємо найближчим часом.'];
}

Як CMS викликає обробник

При POST запиті до лендингу (з полем X-CMS-Form: 1) — CMS знаходить секцію типу order-form з непорожнім php, записує код у тимчасовий файл і викликає функцію handleOrderForm($postData).

// Автоматично після успішної відправки:
// 1. Зберігається замовлення в orders.json
// 2. Відправляється Telegram (якщо налаштовано в Settings)
// 3. Відправляється Email (якщо налаштовано)
// 4. Викликається Webhook (якщо налаштовано)
// 5. Інкрементується лічильник orders в аналітиці

Заборонені функції в PHP обробнику

CMS перевіряє PHP код на заборонені функції перед виконанням:

// Ці функції ЗАБЛОКОВАНІ в обробнику форм:
exec, system, shell_exec, passthru, popen, proc_open,
eval, assert, preg_replace_callback, create_function,
pcntl_*, posix_*, dl()

Відправка форми зі сторони клієнта (JS)

Форма відправляється як JSON з заголовком X-CMS-Form: 1. При успіху — ховається форма і показується блок success:

(function () {
  document.querySelectorAll('.m1-form').forEach(function(form) {
    if (form.dataset.init) return;
    form.dataset.init = '1';
    form.addEventListener('submit', async function(e) {
      e.preventDefault();
      var btn = this.querySelector('button[type="submit"]');
      btn.disabled = true;
      var fd   = new FormData(this);
      var data = Object.fromEntries(fd);
      data._tg_token  = this.dataset.tgToken  || '';
      data._tg_chat   = this.dataset.tgChat   || '';
      data._product   = this.dataset.product  || '';
      try {
        var res = await fetch(window.location.pathname, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json', 'X-CMS-Form': '1' },
          body: JSON.stringify(data)
        }).then(r => r.json());
        if (res.success) {
          this.style.display = 'none';
          var ok = this.closest('.order-form-wrap')?.querySelector('.form-success');
          if (ok) ok.style.display = 'block';
        } else {
          alert(res.message || 'Помилка відправки');
          btn.disabled = false;
        }
      } catch(err) {
        alert('Помилка мережі. Спробуйте ще раз.');
        btn.disabled = false;
      }
    });
  });
})();
Оновлено: 26.10.2026 22:43 👁 27