Вопрос 1
Метод - обработчик можно ставить в любое место, но если у вас это будет логически связанное место с другими подобными методами, легче потом искать.
Таймер появляется если от Телеграм ушел на вебхук запрос, то должна быть какая-то реакция-результат от обработчика - вот он и ждет. Например какой-то текст, картинка или промежуточный sendChatAction ("печатает текст" или "отправляет фото" ...).
Также на каждое нажатие inline-кнопки обязательно нужно реагировать отправляя answerCallbackQuery - то есть уведомить Телеграм, что запрос от inline-кнопки пришел, в противном случае Телеграм будет слать повторные запросы, по своему расписанию (через 2 сек, 1 мин, 5 мин, 30 мин ...) пока не получит answerCallbackQuery, это даже если вы уже по своему сценарию все сделали и продолжаете работу, то фоном эти запросы все равно будут приходить.
Вопрос 2
Вместе с сообщением можно отправить только один набор объектов в reply_markup:
1. InlineKeyboardMarkup
2. ReplyKeyboardMarkup
3. ReplyKeyboardRemove
4. ForceReply.
В типовом приложении из статьи при старте отправляется набор объектов inline-кнопок с сылками на категории товаров. Добавить в сообщение еще один набор объектов не получиться, но вы можете отправить перед этим сообщение например с текстом "..." и приложить необходимый набор объектов с клавиатурой.
private function startBot($chat_id, $data)
{
// ...
$buttons_first[] = [
$this->buildKeyboardButton("Кабинет"),
$this->buildKeyboardButton("Помощь"),
];
// отправляем первый набор кнопок
$this->sendMessage($chat_id, "...", $buttons_first, true);
// отправляем привет
$this->sendMessage($chat_id, $text, $buttons);
}
И для этого надо обновить метод sendMessage
private function sendMessage($user_id, $text, $buttons = NULL, $type = false)
{
// готовим массив данных
$data_send = [
'chat_id' => $user_id,
'text' => $text,
'parse_mode' => 'html'
];
// если переданны кнопки то добавляем их к сообщению
if (!is_null($buttons) && is_array($buttons)) {
$data_send['reply_markup'] = !$type ? $this->buildInlineKeyBoard($buttons) : $this->buildKeyBoard($buttons);
}
// отправляем текстовое сообщение
return $this->botApiQuery("sendMessage", $data_send);
}
Нашел я в index.php
Скопировал кусок, вставил в обработчик, результат тот же, абсолютно. таймер висит и все.
Есть какое, то решение этой проблемы? С примером текстового сообщения который можно заменить после клика на кнопку оплата наличными, типа "Спасибо" и тд.
Касательно второго вопроса:
Все супер, все работает, шикарно, спасибо большое, но вот такой вопрос, а как продублировать кнопки во второй ряд?
Я их продублировал, но видно 2 кнопки, за место 4-х. $buttons_twice не выводятся, как быть?
Вытекающий из кнопок клавиатуры вопрос, как прикрутить к кнопкам функции?
Нашел статью , взял от туда код кнопок
Вопрос 2
Для вывода порядно клавиатуру, также как и inline-кнопки, нужно просто добавить массив объектов следующим элементом массива клавиатуры. Посмотрите какие параметры принимает метод sendMessage, в нем на входе только 1 набор клавиатуры, не пытайтесь направить в него $buttons_twice.
Обработать команды из клавиатуры, можно в методе router
Метод showCabinet для примера выше
между
Соответственно этих переменных в приложении из статьи не объявляли и будет ошибка.
как видно из скриншота, кнопки не понимают команды, если не сложно можно решение этой проблемы?
Касательно обработчика для оплаты наличными, спасибо большое таймер пропал, но я имел ввиду немного другое ,
сейчас у вас как видно из скриншота появляется всплывающее окошко,
я имел ввиду что после клика по инлайнкнопкам "Оплата Наличными" и тд., пользователь получает текстовое уведомление в чат по аналогии с вашим способом оплаты по умолчанию через яндекс деньги и текущий заказ после клика на "Оплата Наличными" был закрыт
Сейчас просто всплывает окошко и непонятно, прошел заказ, не прошел заказ, он просто висит на шаге выбора оплаты с кнопками туда/сюда - ни админ, ни пользователь ничего не получают, это так и должно быть?
Я приводил пример выше постом для кнопки клавиатуры "Кабинет", вам нужно просто добавить свои условия:
Фразы в условиях должны быть один в один как на кнопках.
Да, уведомление я привел как пример, вместо него вы можете делать, что угодно, если вы хотите вывести текстовое сообщение просто его отправьте:
Если все оставить как в вашем случае ничего не меняя
то все выводиться нормально
, но если подставить свои данные
то уже отображается по другому
также ссылки на документ автоматически стали выводиться при создании заказа сами по себе
как решить эти моменты? и как сделать переход в другой чат по клику на кнопку (сейчас он присылает ссылку на чат, если нажать кнопку).
и опять вопрос насчет метода оплаты
Спасибо, тоже все работает, но момент вот такой, как реализовать информирование админа (любое, простейшее) хоть в сам телеграм, хоть на почту, хоть еще куда), о том что заказ поступил? Потому что сейчас никаких уведомлений админу не поступает и не понятно есть заказ, нет заказа, существует он вообще. В случае с оплаты через яндекс деньги, реализованной вами по умолчанию, там хотя бы уведомление придет о тому, что поступил платеж на почту, а вообще в целом такие уведомления не приходят, а в случаях если пользователь делая заказ выбрал оплату наличными это очень критично, потому что это довольно казусная ситуация когда человек сидит и чего-то ждет, а о его заказе никто ни слуху ни духу как говориться. можно вариант решения этой незатейливой проблемы? Спасибо.
Обратите внимание на метод, которым я отправляю документ - sendDocument, а вы пытаетесь отправить его текстовым сообщением sendMessage, он вам ссылку текстом и присылает - все правильно отрабатывает.
======
Ссылку по кнопке я приводил пример, посмотрите выше - где документ по кнопке прилетает.
======
Уведомление админа можно, сделать в методе setReady
И как сделать так чтоб каждая запись, присваивалась своему полю?
потому что, сейчас написанное пользователем на этапе внесения адреса автоматически дублируется в другие поля
а как сделать так чтоб после полей "телефон" и "адрес", можно было добавить к примеру поле "комментарий к заказу" (введите комментарий и тд.) следующим шагом и/или другие поля, свои поля (к примеру, поле1, поле2 и тд.)? Можно какой нибудь шаблон который можно копипастить заменяя "поле1" на свое какое нибудь поле? Спасибо.
я так понимаю что в данном случае лишнии n можно убрать? они как отступ выступают или как перенос на новую строку?
Чтоб в бд добавить данные о платежных системах, достаточно импортировать данные код в таблицу?
В других приложениях я использую логику в которой данные для оформления заказа берутся из модели, в ней в массиве указаны какие поля запрашивать, формат данных у полей, описание полей, обязательно к заполнению или нет и т.д. - и расширить форму заказа можно просто дополнив этот массив не нарушая работу логики - это даже делается самим клиентом через удобный веб-интерфейс.
Для того, чтобы добавить обработку новых полей в приложении из статьи, вы можете по аналогии с предыдущими методами добавить свои, алгоритм используйте тот же:
1. сначала идет запрос на ввод данных Экран "Укажите данные для нового поля 1"
2. запись в бд пользователю, каким методом нужно обработать следующее сообщение "newField_1",
3. когда пользователь отправит сообщение роутер проверит наличии записи и перенаправит в нужный метод
3. метод newField обработает сообщение, запишит в бд заказа
4. выведет запрос на ввод данных Экран "Укажите данные для нового поля 2"
5. сменить запись в бд пользователю на "newField_2"
6. и тд. ...
Писать готовое решение не буду, для этого потребуется много времени.
======
- Дублируются данные потому что у вас в переменной $text лежат одни и те же данные.
- Лишние переносы строк, конечно лучше убрать.
- getNal_ лучше сделайте tinyint(1) по default поставьте 0 (как не наличные), в случае если пользователь укажет за наличные то сменяйте на 1
Я правильно понимаю что сначала нужно проделать вот это?
Затем 4 раза повторить данный код?
Как быть на этом моменте? Как перейти в следующий шаг newfield1?
Это правильный код?
>> Это правильный код?
Подправил без тестирования. Скинете весь код бота (через бот обратной связи) - попробую отладить.
И было бы очень здорово показать весь заказ клиенту, перед тем, как он его подтвердит, а вдруг чего-то забыл...
версия php 7.4.4, но ведь работало же... Ранее загруженные картинки выводятся нормально, а новые загружаться не хотят... в какую сторону копать?
Ошибки были найдены и устранены, всё оказалось так,: бот был продублирован из корня в каталог "бот", т.к. в корне осталась папка с картинками, то они спокойно вытаскивались, а при записи - в логе была найдена ошибка о неверной ссылке на директорию с картинками. При бота в каталог был изменён пут к "имг" на "бот/имг" - просмотр так же возможен, но записать он не может, смена пути на "имг" проблему решило, но стал не доступен просмотр. Решено - в строке $text .= "\n";} / был изменён на /bot/. Ещё свежий PHP ругается на некоторые строки, например в
пришлось добавить переменную $expl. да и по мелочи... чел.фак. так сказать... :)
По поводу реализации вывода полного чека админу и пользователю со всеми наименованиями, количеством и итогом - нужно будет создать отдельную публичную функцию?
Если да, то как указать несколько получателей?
Пример
Добавил:
- для админа просмотр заказов /orders, уведомление о новом заказе
- для пользователя кнопка "оплатить наличными", ссылка на переход в кабинет /lc
Обновил формирование ссылки на вывод картинки при просмотре товара
// Добавляем кнопки для категорий
$buttons[][] = $this->buildInlineKeyBoardButton($row['name'], "showUserCategory_" . $row['id']);
но тут непонятно как так же сделать...
Посмотрите что на выходе получается при отрисовке методом. Там все просто.
может типа такого что то надо мутить-
Вам надо перебрать массив категорий и после каждой третьей категории начинать новый вложенный массив
http://prntscr.com/u9vwj4
Выложите кто нибудь этого же бота но с уже рабочей функцией ОПЛАТА наликом и уведомлением админа о поступлении заказа.
спасибо!