Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Пишем свой стартап на PHP: подготовка к напоминаниям

by
Read Time:10 minsLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Delivering Notifications
Building Your Startup: Dynamic Ajax Forms for Scheduling

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Этот учебник является частью серии статей Пишем свой стартап на PHP на Envato Tuts +. В этой серии я направляю вас через запуск приложения от концепции до готового продукта, используя приложение Планировщик встреч в качестве реального приложения. На каждом шаге я делаю релиз кода планировщика собраний в качестве примеров с открытым исходным кодом, из которых вы можете узнать что-то новое. Я также рассмотрю связанные с запуском бизнес-вопросы по мере их возникновения.

В этой серии из двух частей я опишу, как мы построили инфраструктуру для напоминаний и их доставки. Этот эпизод будет посвящен инфраструктуре и пользовательскому опыту по настройке напоминаний.

Если вы еще не опробовали Планировщик собраний, то обязательно запланируйте свою первую встречу. Я участвую в комментариях ниже, так что дайте мне знать, что вы думаете об этом уроке! Меня особенно интересуют, если вы хотите новые функции или предлагаете темы для будущих учебников.

Напомним, что весь код Планировщика собраний написан на Yii2 Framework для PHP. Если вы хотите узнать больше о Yii2, ознакомьтесь с нашей параллельной серией Программирование с Yii2.

Как будут работать напоминания

Сначала я создал несколько простых напоминаний в таблице UserSetting. Однако я понял, что пользователи захотят гораздо большей гибкости и контроля над тем, когда и как будут отправляться их напоминания.

Люди должны иметь возможность устанавливать напоминания за 30 минут до, за 3 часа до и за 48 часов до или только за 1 час до собрания. Этого должно хватить. Они также должны иметь возможность выбирать, хотят ли они получать напоминания по электронной почте, SMS или и по тому и другому. Планировщик встреч пока не поддерживает SMS, но скоро под это будет отдельный учебник.

Вот пример гибкости, которую предлагает Apple Calendar:

Meeting Planner Reminders - Apple Calendar Reminder AlertsMeeting Planner Reminders - Apple Calendar Reminder AlertsMeeting Planner Reminders - Apple Calendar Reminder Alerts

Разрешаем людям настраивать напоминания

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

Meeting Planner Reminders - Create a ReminderMeeting Planner Reminders - Create a ReminderMeeting Planner Reminders - Create a Reminder

Таблица напоминаний

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

Вот консольная команда Yii для создания миграции базы данных:

Затем я изменил этот файл свойствами, которые мне нужны:

Если напоминание за 48 часов до этого, duration_friendly и unit будут 48 и UNIT_HOURS, тогда как поле duration будет в секундах, например. 48 * 60 минут * 60 секунд или 172 800 секунд до собрания. Это поможет как упростить интерфейс пользователя, так и обработать напоминания.

Reminder_type будет указывать на адрес электронной почты, SMS или и то, и другое.

Затем я использовал Gii, его генератор кода для создания каркасов, чтобы быстро создать код MVC для контроллера, модели и представлений. Начальный пользовательский интерфейс был готов в считанные минуты. Вы можете увидеть форму напоминания выше и список напоминаний ниже.

Meeting Planner Reminders - A persons customizable remindersMeeting Planner Reminders - A persons customizable remindersMeeting Planner Reminders - A persons customizable reminders

Инициализация напоминаний для существующих и новых пользователей

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

Я решил, что сначала должны быть три Напоминания по умолчанию для пользователей, запланированные на 3 часа, 1 день и 3 дня до собрания. Код ниже создает эти напоминания для пользователя:

Но что делает processNewReminder? Он заполняет строки в другой таблице, которые я опишу ниже.

Обработка напоминаний

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

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

По мере обновления времени собрания записи таблицы MeetingReminder для этого собрания должны измениться. Аналогичным образом, если человек обновляет свои настройки напоминания, также необходимо обновить запланированные напоминания в таблице MeetingReminder.

Давайте создадим миграцию для таблицы MeetingReminder:

Вот код миграции; это довольно просто. В принципе, для каждого напоминания есть MeetingReminder, который соответствует напоминанию пользователя о встрече. Оно знает, что напоминание должно быть due_at в течение определенного времени и имеет статус, который определяет, было ли оно еще отправлено или нет:

Задание мониторинга в фоне сможет сортировать таблицу MeetingReminder по времени и быстро узнать, какой небольшой набор напоминаний действительно нужно доставить. И оно может отслеживать, какие из них были отправлены для каждой встречи и участника.

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

Как я уже намекал ранее, таблица MeetingReminder оказалась сложной:

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

В конечном итоге для создания напоминаний использовалось множество вспомогательных функций.

Вот вспомогательная функция, которая создает MeetingReminder для конкретного пользователя для напоминания о конкретной встрече. Если собрание уже прошло, статус отражает это:

Таким образом, всякий раз, когда создается напоминание, вот код, который создает все записи MeetingReminder для каждого из собраний пользователя:

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

Обработка создания новых напоминаний

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

Обработка изменений напоминаний

Если пользователь изменяет напоминание, нам нужно обновить таблицу MeetingReminder для этого reminder_id:

Если время ожидания due_at для напоминания уже прошло, мы установим его статус как завершенный.

Обработка при завершении совещания

Когда собрание завершено, время установлено, нам нужно настроить MeetingReminders на основе настроек напоминания каждого участника. Метод setMeetingReminders выполняет следующее:

Обработка при изменении времени собрания

Аналогично, когда время собрания изменяется (еще не поддерживаемого в текущем наборе функций), я создал простую функцию для удаления и перестройки MeetingReminders для нового времени:

Функция, которая кажется простой на первый взгляд, требует много деталей и внимания.

Что дальше?

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

Meeting Planner Reminders - Example of a Reminder EmailMeeting Planner Reminders - Example of a Reminder EmailMeeting Planner Reminders - Example of a Reminder Email

Пока вы ждете, попробуйте функцию напоминания, запланируйте первую встречу, а затем обновите настройки напоминаний. Кроме того, я был бы признателен, если вы поделитесь своим опытом ниже в комментариях, и меня всегда интересуют ваши предложения. Вы также можете связаться со мной в Twitter @reifman.

Я также начинаю экспериментировать с WeFunder, основываясь на реализации новых правил SEC. Пожалуйста, обратите внимание на наш профиль. Я могу написать об этом больше в качестве урока нашей серии.

Следите за предстоящими учебными пособиями в разделе Пишем свой стартап на  PHP. В дополнение к напоминаниям, также есть много другой работы и еще несколько больших функций.

Ссылки по теме

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.