Skip to content

Latest commit

 

History

History
105 lines (63 loc) · 10.8 KB

File metadata and controls

105 lines (63 loc) · 10.8 KB

Архитектура

English version

Сайт

Используйте виджеты и хэлперы для предотвращения дублирования, копирования кода. Виджеты и хэлперы помогают переиспользовать существующий код, быстро и безопасно наращивать новый функционал.

Виджеты

Кнопки

  • AddButton - кнопка добавления нового элемента
  • CancelButton - кнопка закрытия модального окна или возврата
  • DeleteButton - кнопка удаления элемента (включено окно confirm)
  • TrashButton - кнопка удаления элемента (включено окно confirm). В отличие от Delete обозначена иконкой мусорного ведра
  • EditButton - кнопка редактирования
  • SaveButton - кнопка сохранения
  • SendButton - кнопка отправления

Namespace кнопок-виджетов: app\widgets\buttons. При вызове виджета можно не передавать параметры.

Для отображения кнопок рекомендуется использовать короткую конструкцию <?= ?>, так как при отображении более одной кнопки такая конструкция добавляет пространство между кнопками, что не даёт им слипнуться.

Создание кнопок

При создании нового виджета-кнопки необходимо наследовать базовый класс LinkButton или PjaxButton.

Оба класса наследуются от класса Linkable, который возвращает сгенерированную гиперссылку Html::a.

При вызове виджетов, унаследованных от Linkable, во view можно передать следующие параметры:

  • url (array|string|null) - url-адрес для перехода
  • options (array) - третий параметр для a
  • text (string) - текст или иконка (app\components\helpers\Icon)

А также можно переопределить или дополнить дефолтные параметры внутри класса в массиве defaultOptions, который являются третьим параметром метода Html::a.

Класс PjaxButton в отличие от первого в дополнение задаёт параметры для работы с Pjax (defaultOptions) и в основных параметрах содержит:

  • confirm (bool) - включает/отключает нативное окно confirm
  • confirmMessage в параметрах (string) - задаёт сообщение при выводе confirm-окна

При создании нового класса, убедитесь, что Ваш класс наследует Linkable или любой другой дочерний класс. При переопределении init() не забудьте вызвать родительский метод (parent::int()), и если необходимо переопределить run() без изменения возврата метода, то также необходимо в конце вызвать родительский run() (parent::run()).

Модальные окна

В проекте используется два вида модальных окон:

При использовании модальных окон необходимо придерживаться следующий правил:

  1. Модальное окно должно иметь кнопку закрытия (крестик). Для этого достаточно не устанавливать параметр 'closeButton' в значение false.
  2. При создании модального окна ModalAjax в view не создавайте отдельную html-структуру как для обычной страницы. Виджет подгрузит контент внутрь готового контейнера.

Телеграм бот

Значения для callback кнопок должны быть в пределах 1-64 байт. Подробнее.

На данный момент возможна обработка 3 типов update’ов от телеграма:

  • Message
  • CallbackQuery
  • Location

Роутингом каждого типа update’а отвечает класс CommandRouteResolver. При помощи классов, наследуемых от интерфейса IRequestHandler, он получает строку, исходя из которой он может получить путь к нужному контроллеру. На каждый тип update’а существует отдельный RequestHandler.

Например, для Message это MessageRequestHandler, который получает строку из поля text. CallbackQueryRequestHandler получает эту строку из поля data объекта CallbackQuery. LocationRequestHandler просто возвращает константу, если в апдейте содержится Location.

Если вы захотите добавить обработку, например, аудио, то вам нужно создать класс AudioRequestHandler и соответствующе реализовать его.

После того, как CommandRouteResolver вернул роут, Module создает соответствующий контроллер и запускает action. Все action’ы контроллеров должны возвращать массив объектов, наследуемых от класса Command. После выполнения action’а, Module отправит каждую команду.

Класс Command - это просто класс, который знает о том, как отправить определенный запрос в телеграм.

Например, существует SendMessageCommand, который отправляет запрос /sendMessage... для отправки сообщения пользователю. Опять же, если вам понадобиться делать новый запрос, то нужно создавать новый класс, наследуемый от класса Command.

У самого модуля существует четыре поля, которые идентифицируют пользователя и могут вам пригодиться: update, user, telegramUser и telegramChat. Для простоты доступа, в базовом классе контроллеров определены методы для получение данных полей.

Контроллеры на данный момент разделяются на публичные (папка publics), которые вызываются при обработке команд из групп, и приватные (папка privates),которые вызываются от при обработке команд из личной переписки пользователя с ботом. Вьюхи разделены аналогично.

Бот удаляет свои предыдущие сообщения в приватном чате с пользователем, которые не связаны с текущим запросом, и удаляет все сообщения пользователя. При этом для вывода сообщения бота используется команда editMessageTextOrSendMessage. Когда необходимо отправить несколько сообщений (например, сперва отобразить текстовое сообщение «Ваше местонахождение», затем отправить сообщение с геолокацией, а затем сообщение с клавиатурой), то следует сперва вызвать команду editMessageTextOrSendMessage, а затем команды sendLocation и sendMessage.

Используется для быстрой инициализации режимов добавления и редактирования обьектов в сервисах бота. Данный контроллер берет на себя основную часть рутинной работы, следуя правилам из метода rules.

Для подключения:

  • Наследуйте ваши контроллеры от данного контроллера.
  • Создавайте в ваших контроллерах методы rules и afterSave.

Примеры подключения можно увидеть в сервисах "Обьявления" и "Работа".

Core