← Вернуться к списку тем

Кнопки телеграм бот

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

<?php

// токен бота
$bot_token = "токен";

// админ бота
$bot_admin = айди;

// получаем данные от телеграм
$data = json_decode(file_get_contents("php://input"));

// tg://resolve?domain=iMakeBot&start=s_3_0-1

/**
 * Контент
 */
$content = [
    "steps" => [
        [
            "name" => "start",
            "line" => 0,
            "type" => "text",
            "text" => "Добро пожаловать в Welcome book! Какой вопрос вас интересует?",
            "media" => null,
            "steps" => [
                [
                    "name" => "О компании",
                    "line" => 0,
                    "type" => "text",
                    "text" => "Проверка действия 1",
                    "media" => "null",
                    "steps" => []
                ],
                 [
                    "name" => "Сайты компании",
                    "line" => 0,
                    "type" => "text",
                    "text" => "Проверка действия 2",
                    "media" => "null",
                    "steps" => []
                ],
                 [
                    "name" => "Корпоративный кодекс",
                    "line" => 0,
                    "type" => "text",
                    "text" => "Проверка действия 2",
                    "media" => "null",
                    "steps" => []
                ],
                   [
                    "name" => "Карта производства",
                    "line" => 0,
                    "type" => "text",
                    "text" => "Проверка действия 2",
                    "media" => "null",
                    "steps" => []
                ],
                   [
                    "name" => "График и режим работы",
                    "line" => 0,
                    "type" => "text",
                    "text" => "Проверка действия 2",
                    "media" => "null",
                    "steps" => []
                ],
                
                [
                    "name" => "Кадры",
                    "line" => 1,
                    "type" => "text",
                    "text" => "Проверка действия 3",
                    "media" => null,
                    "steps" => [
                        [
                            "name" => "текст",
                            "line" => 0,
                            "type" => "text",
                            "text" => "Проверка картинки",
                            "media" => "",
                            "steps" => [
                                [
                                    "name" => "текст",
                                    "line" => 0,
                                    "type" => "text",
                                    "text" => "Проверка действия 1--0",
                                    "media" => "",
                                    "steps" => []
                                ],
                                [
                                    "name" => "текст",
                                    "line" => 0,
                                    "type" => "text",
                                    "text" => "Проверка действия 1--1",
                                    "media" => "",
                                    "steps" => []
                                ],
                            ]
                        ],
                        [
                            "name" => "текст",
                            "line" => 0,
                            "type" => "text",
                            "text" => "Проверка видео-файла",
                            "media" => "",
                            "steps" => []
                        ],
                        [
                            "name" => "текст",
                            "line" => 1,
                            "type" => "text",
                            "text" => "Проверка документа",
                            "media" => "",
                            "steps" => []
                        ],
                        [
                            "name" => "текст",
                            "line" => 2,
                            "type" => "text",
                            "text" => "Проверка аудио-файла",
                            "media" => "E",
                            "steps" => []
                        ]
                    ]
                ]
            ]
        ]
    ]
];

/** Запрос в Телеграм
 * @param $method
 * @param array $fields
 * @return mixed
 */
$query = function ($method, $fields = []) use ($bot_token) {
    // откроем соединение
    $ch = curl_init("https://api.telegram.org/bot" . $bot_token . "/" . $method);
    // определим опции
    curl_setopt_array($ch, [
        CURLOPT_POST => count($fields),
        CURLOPT_POSTFIELDS => http_build_query($fields),
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_TIMEOUT => 10
    ]);
    // спарсим в объект результат запроса
    $result = json_decode(curl_exec($ch), true);
    // закроем соединение
    curl_close($ch);
    // вернем результат
    return $result;
};

/**
 * Выводим уведомление
 * @param $cbq_id
 * @param $text
 */
$notice = function ($cbq_id, $text = null) use ($query) {
    // определим данные
    $data = [
        "callback_query_id" => $cbq_id,
        "alert" => false
    ];
    // если есть текст то добавим
    if (!is_null($text)) {
        $data['text'] = $text;
    }
    // отправим в Телеграм
    $query("answerCallbackQuery", $data);
};

/** Получаем контент
 * @param $step_idx
 * @param $parents
 * @param $data
 * @return array
 */
$getContent = function ($step_idx, $parents, $data) use (&$getContent) {
    // определим результат по умолчанию
    $result = null;
    // проверим
    if (!is_null($parents)) {
        // получим родителя
        $parent = array_shift($parents);
        // проверим значение
        if (isset($data['steps'][$parent])) {
            // проверим путь
            if (count($parents)) {
                // отрпавим на рекурсию
                $result = $getContent($step_idx, $parents, $data['steps'][$parent]);
            } else {
                // определим результат
                $result = $data['steps'][$parent]['steps'][$step_idx];
            }
        }
    } else {
        // определим результат
        $result = $data["steps"][$step_idx];
    }
    // вернем результат
    return $result;
};

/** Выводим сообщение по запросу
 * @param $step_idx
 * @param $parents
 * @param $chat_id
 * @param null $cbq_id
 * @param null $message_id
 */
$printUpdate = function ($step_idx, $parents, $chat_id, $cbq_id = null, $message_id = null) use ($getContent, $query, $notice, $content) {
    // переопределим вложенность
    $parents = !is_null($parents) ? explode("-", $parents) : null;
    // получаем шаг
    $step = $getContent($step_idx, $parents, $content);
    // проверим
    if (!is_null($step)) {
        // готовим данные
        $data = [
            "chat_id" => $chat_id,
        ];
        // если это нажатие по кнопке то удалим текущее сообщение
        if (!is_null($cbq_id)) {
            // гасим запрос
            $notice($cbq_id);
            // удаляем сообщение
            $query("deleteMessage", array_merge($data, ["message_id" => $message_id]));
        }
        // дополним данные
        $data["parse_mode"] = "html";
        // определим кнопки если они есть
        $buttons = [];
        // проверим
        if (count($step['steps'])) {
            // определим начало
            $line = 0;
            // определим путь
            $parents_ = !is_null($parents) ? implode("-", array_merge($parents, [$step_idx])) : $step_idx;
            // переберем
            foreach ($step['steps'] as $key => $next) {
                // добавим кнопку
                $buttons[$next['line']][] = [
                    "text" => $next['name'],
                    "callback_data" => "s_" . $key . "_" . $parents_
                ];
            }
        }
        // кнопка вернуться
        if (!is_null($parents)) {
            // получим первого
            $parent = array_pop($parents);
            // добавим кнопку последним рядом
            $buttons[count($buttons)][] = [
                "text" => "Вернуться",
                "callback_data" => "s_" . $parent . "_" . implode("-", $parents)
            ];
        }
        // проверим добавление кнопок
        if (count($buttons)) {
            // добавим кнопки
            $data["reply_markup"] = json_encode(['inline_keyboard' => array_values($buttons)]);
        }
        // поддерживаемые типы
        if (!is_null($step['media']) && in_array($step['type'], ['photo', 'video', 'audio', 'document'])) {
            // проверим описание
            if (!empty($step['text'])) {
                $data['caption'] = $step['text'];
            }
            // добавим медиа
            $data[$step['type']] = $step['media'];
            // отправим сообщение
            $query("send" . ucfirst($step['type']), $data);
        } elseif ($step['type'] === "text" && !empty($step['text'])) {
            // добавим текст
            $data['text'] = $step['text'];
            // отправим сообщение
            $query("sendMessage", $data);
        } else {
            // выведем ошибку о не поддерживаемом методе
            $query("sendMessage", array_merge($data, ["text" => "Sorry, error 405"]));
        }
    } else {
        // проверим на нажатие кнопки
        if (!is_null($cbq_id)) {
            // выведем уведомление
            $notice($cbq_id, "Error 404 STEP");
        }
    }
};

/**
 * Простой роутер бота
 */
if (isset($data->message)) {
    // получим id чата
    $chat_id = $data->message->from->id;
    // если это текстовое сообщение
    if (isset($data->message->text)) {
        // проверим что это старт бота
        if ($data->message->text == "/start") {
            // выводим сообщение
            $printUpdate(0, null, $chat_id);
        }
        // если это старт по ссылке
        elseif (preg_match("~\/start s_([\d]+)_?([\d-]*)~", $data->message->text, $matches)) {
            // выведем сообщение по ссылке
            $printUpdate($matches[1], $matches[2], $chat_id);
        }
    }
    // другие типы сообщений
    else {
        // если это админ бота направляет сообщение
        if ($chat_id === $bot_admin) {
            // по умолчанию
            $file_id = null;
            // если это картинка
            if (isset($data->message->photo)) {
                // file_id последней картикни
                $file_id = end($data->message->photo)->file_id;
            } // если это фидео-файл
            elseif (isset($data->message->video)) {
                // file_id видео-файла
                $file_id = $data->message->video->file_id;
            } // если это аудио-файл
            elseif (isset($data->message->audio)) {
                // file_id аудио-файла
                $file_id = $data->message->audio->file_id;
            } // если это документ
            elseif (isset($data->message->document)) {
                // file_id документа
                $file_id = $data->message->document->file_id;
            }
            // проверим необходимость отправки
            if (!is_null($file_id)) {
                // отправим file_id
                $query("sendMessage", [
                    "chat_id" => $chat_id,
                    "text" => $file_id
                ]);
            }
        }
    }
// если это нажатие по кнопке
} elseif (isset($data->callback_query)) {
    // получим id чата
    $chat_id = $data->callback_query->from->id;
    // получим callBackQuery_id
    $cbq_id = $data->callback_query->id;
    // получим переданное значение в кнопке
    $c_data = $data->callback_query->data;
    // спарсим значения
    $params = explode("_", $c_data);
    // если это переход по шагам
    if ($params[0] == "s") {
        // выводим сообщение
        $printUpdate(
            $params[1],
            ($params[2] !== "")
                ? $params[2]
                : null,
            $chat_id,
            $cbq_id,
            $data->callback_query->message->message_id
        );
    }
    // если это другие кнопки
    else {
        // заглушим просто запрос
        $notice($cbq_id, "This is notice for bot");
    }
}

Авторизуйтесь через Telegram, чтобы оставить комментарий.
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.