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

Construire votre démarrage avec PHP: Commandes par e-mail

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Delivering the Meeting Invitation
Building Your Startup With PHP: Email Commands

French (Français) translation by honeymmmm (you can also view the original English article)

Final product image
What You'll Be Creating

introduction

Ce tutoriel fait partie de la série Construire votre démarrage avec PHP sur Envato Tuts +. Dans cette série, je vous guide dans le lancement d'une startup du concept à la réalité, en utilisant mon application Meeting Planner comme exemple concret. À chaque étape du processus, je publierai le code de Meeting Planner sous forme d’exemples open source à partir desquels vous pourrez apprendre. J'aborderai également les problèmes commerciaux liés au démarrage à mesure qu'ils surviennent.

Que couvre cet épisode?

Dans le dernier tutoriel, nous avons commencé à envoyer des invitations à des réunions par e-mail contenant de nombreux liens permettant aux participants de répondre, par exemple, afficher la page de la réunion, accepter tous les lieux et heures, refuser un lieu ou une heure, etc.

Dans ce didacticiel, je vais décrire comment j'ai choisi de construire et de traiter ces liens de manière fonctionnelle et sécurisée. La majorité des participants à la réunion (surtout au début) n'auront jamais utilisé Meeting Planner auparavant - ils nous seront inconnus. Cependant, nous voudrons les authentifier en toute sécurité pour leur permettre de visualiser et d'interagir avec la demande de réunion et de créer la leur pour le futur. Nous souhaitons également disposer de certaines garanties lorsque les personnes transmettent les demandes de réunion avec leurs codes sécurisés sans se soucier des conséquences (néophytes! Ou peut-être simplement des gens ordinaires).

Pour rappel, tout le code de Meeting Planner est écrit dans le framework Yii2 pour PHP. Si vous souhaitez en savoir plus sur Yii2, consultez ma série parallèle Programming With Yii2 chez Envato Tuts +.

Au moment où vous lisez ceci, vous pouvez probablement commencer à essayer des invitations à des réunions sur le site Web en direct, MeetingPlanner.io (gardez à l’esprit, il reste encore beaucoup de travail d’amélioration de l’expérience utilisateur et de polissage à effectuer). Je participe aux discussions ci-dessous et m'intéresse particulièrement si vous avez des idées supplémentaires ou si vous souhaitez suggérer des sujets pour de futurs tutoriels. Vous pouvez également me joindre sur Twitter @reifman.

Commandes du planificateur de réunions

L'importance des commandes

Au cours de mon processus de conception, j'ai considéré les commandes de courrier électronique comme des éléments à la fois du processus de planification de la réunion et de l'heure de l'événement.

Lorsqu'un participant reçoit une invitation par courrier électronique, des autorisations sécurisées lui sont proposées pour afficher la page de la réunion, mais également pour déterminer si des lieux et des heures spécifiques leur conviennent.

Une fois la réunion finalisée, nous pouvons commencer à envoyer des rappels aux participants proposant des commandes spécialisées telles que "Je suis en retard", qui pourraient envoyer un message textuel aux autres parties, ou "demander un changement de lieu" ou "annuler".

Toutes ces commandes doivent authentifier le destinataire et leur fournir un accès sécurisé au site Web afin que Meeting Planner puisse traiter correctement leurs réponses. Cependant, le site doit également éviter de publier la liste complète des contacts d'un membre s'il transmet par erreur un courrier électronique d'invitation à une réunion à une autre partie, qui clique ensuite sur les liens. La partie secondaire se connecterait facilement au compte Meeting Planner du destinataire et serait en mesure de voir toutes ses réunions et ses informations personnelles.

Quelles commandes sont nécessaires?

En réfléchissant davantage à la vision de l'application, il existe un grand nombre de commandes potentielles. En voici quelques unes dans l'invitation initiale (que je pourrais simplifier à un moment donné pour améliorer l'expérience utilisateur):

  • Voir la réunion
  • Accepter tous les lieux et horaires
  • Refuser l'invitation
  • Accepter ou rejeter des lieux particuliers
  • Accepter ou rejeter des dates et heures particulières
  • Finaliser la réunion *
  • Proposer un autre lieu *
  • Proposer une autre date et heure *
  • Choisissez le lieu final *
  • Choisissez la date et l'heure finales *
  • Ajouter ou répondre aux notes de réunions
  • Afficher une carte de l'emplacement des lieux dans le contexte de la réunion
  • Vérifiez vos paramètres de messagerie
  • Empêcher cet organisateur de vous envoyer un courrier électronique
  • Se désabonner de tous les courriels de Meeting Planner

Remarque: l'apparence des éléments suivis (*) dépend des paramètres de réunion de l'organisateur.

Une fois la réunion planifiée, il existe également diverses commandes de suivi:

  • Replanifier la réunion
  • Annuler la réunion
  • Montre moi une carte
  • Obtenir des itinéraires
  • Demander une modification de l'heure
  • Demander un changement de lieu
  • Avertir les parties que vous êtes en retard

Considérations architecturales

Compte tenu de la multitude de commandes, j’ai pensé qu’il serait utile de les authentifier et de les traiter toutes de manière identique dans un seul contrôleur.

Pour l'instant, j'ai créé un seul point de traitement dans MeetingController, mais je m'attends à créer ultérieurement un CommandController dédié. J'ai également envisagé de créer un contrôleur d'accès API à l'avenir et de canaliser toutes les fonctionnalités de l'application via ce point d'entrée sécurisé unique. Pour l'instant, je vais m'arrêter là-dessus.

Pour commencer, j'ai donné à chaque commande une définition constante spécifique dans le modèle Meeting.php:

Construire les liens de commande

J'ai décidé que, pour l'instant, chaque commande aurait les arguments d'URL suivants:

  • $id pour le meeting_Id
  • $cmd pour l'action de commande (à partir des constantes ci-dessus)
  • $obj_id quel que soit l’objet pouvant faire l’objet d’un lieu ou d’une date
  • $actor_id pour le user_id appelant la commande
  • $k pour la clé qui authentifie le $ actor_id sur leur compte

Au début, la majorité des participants ne se seront pas inscrits, mais nous créons des clés d'authentification liées à leurs courriels d'invitation lors de la création de la réunion. C'est ainsi que nous authentifions leurs liens à partir d'invitations par courrier électronique.

Voici un exemple de lien URL intégré dans des courriels:

http://meetingplanner.io/meeting/command?id=27&cmd=70&actor_id=18&k=9cHGl...1x

Compte tenu de la complexité de la création des URL avec divers arguments à de nombreux endroits du code, j'ai créé une bibliothèque /common/components/MiscHelpers.php, qui a commencé par buildCommand:

Voici un exemple de notre fichier de vue invitation-html.php appelant buildCommand() pour afficher des rangées de lieux. Chaque lieu a des commandes qui doivent fournir tous ces arguments dans les URL:

Vous pouvez voir à quoi ils ressemblent ci-dessous:

Meeting Planner Places and Commands for Places

Traitement des commandes

Ensuite, j'ai créé la fonction de contrôleur pour authentifier et traiter les commandes. Voici la première partie:

Au départ, je souhaitais fournir des garanties pour mes propres tests ainsi que pour les personnes transmettant des e-mails avec leurs liens d'authentification.

Un événement que je vérifie est si le $actor_id est un utilisateur différent de l'utilisateur actuellement connecté. Cela peut se produire lors de tests avec plusieurs comptes ou si le participant envoie son invitation à l'organisateur. En fin de compte, je fournirai des informations sur la situation et offrirai des choix aux personnes. Cependant, pour l'instant, je déconnecte simplement l'utilisateur actuel avant de l'authentifier.

Si l'utilisateur est déjà connecté en tant que $actor_id, il est authentifié. S'ils ne sont pas authentifiés, nous effectuons le contrôle d'authentification:

Nous utilisons pour cela les fonctions intégrées findIdentity et validateAuthKey de Yii.

Dans un proche avenir, je prévois de faire en sorte que l’authentification par courrier électronique fournisse un accès limité aux fonctionnalités du compte. Par exemple, lorsque des utilisateurs ne sont pas connectés mais cliquent sur des liens de commande, nous limitons leurs activités à cette réunion et à quelques fonctionnalités connexes. Ils ne pourront pas voir d'autres réunions, les amis du titulaire du compte, etc. Cependant, nous leur proposerons un lien convivial leur permettant de se connecter à leur compte via mot de passe ou connexion sociale. Cela minimisera les impacts sur la sécurité des personnes qui transmettent les invitations.

De même, si un nouvel utilisateur qui ne s'est jamais enregistré auparavant clique sur un lien de commande, nous lui présenterons des rappels lui permettant de s'inscrire et de créer un mot de passe ou un identifiant social. Le modèle User.php comporte des champs d’état indiquant si un utilisateur s’est déjà inscrit ou s’il a été invité de manière passive à une réunion.

Pour l'instant, si l'authentification réussit, nous pouvons simplement traiter chacune des commandes:

Pour les fonctionnalités que je n'ai pas encore créées, j'ai créé une vue pour indiquer qu'elle n'est pas disponible, par exemple. /views/site/unavailable.php, ou si la commande est mal comprise, alors /views/site/error.php.

Deux exemples de commandes

Regardons deux exemples de commandes. Tout d'abord, regardons en suggérant un autre endroit:

Dans ce cas, la fonctionnalité nécessite que l'utilisateur revienne sur notre site Web pour remplir un formulaire dans lequel il peut sélectionner un nouveau lieu. Donc, nous les redirigeons simplement vers la page de création de lieu de réunion pour cette meeting_id. Et ils sont déjà authentifiés et connectés depuis le haut.

Voici un exemple: remarquez que le menu de navigation est adapté au contexte de la réunion, par exemple Petit déjeuner-réunion:

Meeting Planner Email Commands - Add a Meeting Place

Deuxièmement, voyons comment accepter toutes les dates et heures:

Dans ce cas, nous devons accepter tous les horaires de cette réunion et $actor_id. L'acceptation se fait de manière transparente en coulisse. Après cela, nous pouvons les rediriger pour voir la réunion.

Voici à quoi cela ressemble quand vous atteignez la vue de la réunion avec tout ce qui est accepté, par exemple. d'accord, d'accord, d'accord pour les lieux et heures ci-dessous:

Meeting Planner Email Commands - Accept all places and times

Une histoire drôle

L'implémentation de toutes ces commandes a pris un certain temps, mais les fonctionnalités de Meeting Planner ont vraiment commencé à prendre vie. Et j'ai pu envoyer mes premières invitations dans le monde.

Une femme avec qui je sortais savait que je m'apprêtais à achever cette fonctionnalité et a donc décidé de me motiver pour la terminer plus rapidement. Dit-elle:

"Je ne sais pas du tout quand je vais vous voir car je n'ai pas encore reçu mon invitation de planificateur de réunion."

Après quelques jours de travail supplémentaire, je lui ai envoyé la deuxième invitation de planificateur de réunion.

Impressionnant, lorsque ma date a reçu son invitation, elle a rapidement demandé deux fonctionnalités utiles. Tout d'abord, elle a dit qu'elle n'était pas sûre de pouvoir se présenter à notre rendez-vous à moins que l'événement ne soit dans le calendrier Google de son téléphone (en général, je préfère sortir avec des utilisateurs iOS, pas avec Android). Le prochain tutoriel racontera l’histoire de la création d’un fichier iCal (.ics) à importer (pour que ma date sache où aller). Je ne vous garderai pas en suspens - j'ai terminé la fonction à temps pour notre rendez-vous.

Deuxièmement, elle a demandé un film auquel j'avais pensé mais que je n'avais pas compris à quel point c'était important. Elle voulait pouvoir spécifier un lieu avec une heure. En d’autres termes, Restaurant Canlis le vendredi à 19h mais le Paseo le samedi à 20h. Actuellement, les lieux et les horaires sont proposés séparément et non combinés. Je vais sauvegarder cette fonctionnalité pour un futur épisode.

Cela soulève la question générale de savoir comment, au cours du processus de démarrage, recueillez régulièrement les commentaires des personnes et intégrez-les dans vos exigences et votre planification du développement. Tous vos utilisateurs ne vous proposeront pas de dates en échange de leurs fonctionnalités préférées. J'ai prévu un épisode de tutoriel pour expliquer comment le faire à l'avenir, malgré l'absence de motivation secondaire.

Et après?

Dans le prochain épisode, je détaillerai les fichiers de construction du calendrier (.ics) à importer dans Google Calendar, Outlook et Apple Calendar avec les détails de l'invitation. Inclure les coordonnées et les cartes et gérer les problèmes de fuseau horaire en sont les principaux aspects.

Surveillez les prochains tutoriels dans la série Création de votre démarrage avec PHP. J'espère que vous avez hâte d'essayer Meeting Planner. Essayez maintenant!

N'hésitez pas à ajouter vos questions et commentaires ci-dessous; J'essaie de participer régulièrement aux discussions. Vous pouvez également me joindre sur Twitter @reifman.

Liens connexes

Advertisement
Advertisement
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.