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. Je traiterai également les problèmes liés au démarrage au fur et à mesure qu'ils surviennent.
Je suis également heureux d’annoncer que Meeting Planner est prêt à être testé. Vous pouvez envoyer des invitations à une réunion, recueillir les réactions de votre participant et finaliser la réunion en important le fichier iCal que je vais décrire aujourd'hui dans vos calendriers. Alors, visitez MeetingPlanner.io et essayez-le.
Dans le dernier tutoriel, j’ai décrit la manière dont j’ai construit les liens de commande et les opérations codées pour les participants qui commencent à répondre aux invitations par e-mail, c.-à-d. En consultant la page de la réunion ou en acceptant ou en refusant un lieu ou une heure..
J'ai également mentionné qu'une femme avec qui je sortais avait laissé entendre qu'elle ne savait pas si ou quand elle me reverrait sans l'invitation d'un planificateur de réunions, que j'ai bientôt fournie. Et puis elle a dit qu'elle ne saurait pas quand ni où se présenter sans une entrée de calendrier Google. Dans le tutoriel d'aujourd'hui, je vais décrire comment j'ai construit la fonctionnalité iCal pour livrer un fichier .ics qu'elle pourrait importer pour une date réussie. Il est toujours utile d'avoir quelqu'un qui motive le développement, mais ce sont généralement des collègues ou un responsable du développement..
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 notre série parallèle Programmation avec Yii2 chez Envato Tuts+.
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.
Définissant iCalendar, Wikipedia dit:
iCalendar est un format de fichier informatique qui permet aux utilisateurs Internet d'envoyer des demandes de réunion et des tâches à d'autres utilisateurs Internet, par courrier électronique ou en partageant des fichiers avec l'extension .ics..
Fondamentalement, il s’agit d’un fichier portant l’extension .ics, qui contient des informations pertinentes sur une réunion, l’organisateur et les participants, la date, l’heure et la durée, le lieu, etc., le tout dans un format que diverses plateformes et services de calendrier peuvent reconnaître..
Bien que iCalendar comporte des fonctionnalités avancées, à ce stade du produit minimal viable (MVP) de Meeting Planner, je souhaitais pouvoir importer facilement nos réunions planifiées dans Google Agenda, Google Agenda, Microsoft Outlook et être reconnues par les services de messagerie Web. Je travaillerai plus tard pour étendre ses fonctionnalités.
Lors de précédents tutoriels, j'avais construit la fonctionnalité qui rassemblait toutes les informations nécessaires telles que les participants, les dates, les heures et les lieux. Maintenant, il me suffisait de publier les détails de l'événement en pièce jointe et de les transmettre par courrier électronique..
Au lieu d’écrire du code .ics à partir de rien, j’ai commencé avec ics File Generator d’Ahmad Amin et je l’ai personnalisé. J'ai placé le code dans /common/models/Calendar.php
.
Les fichiers iCal sont différents selon l’utilisateur. En d'autres termes, ils doivent être personnalisés pour la livraison. Principalement, les liens vers Meeting Planner doivent être personnalisés pour être authentifiés par le détenteur du fichier .ics concerné..
Lors du processus de finalisation de la réunion, nous créons un fichier d'événements pour chaque participant avec des liens uniques et authentifiés:
foreach ($ participants en tant que $ cnt => $ a) … $ icsPath = Meeting :: buildCalendar ($ this-> id, $ ChoisiPlace, $ ChoisiTime, $ Participants);
Dans le modèle Meeting, le buildCalendar
méthode rassemble toutes les données dont le générateur aura besoin pour chaque utilisateur:
Fonction statique publique buildCalendar ($ id, $ selectedPlace, $ Choisedime, $ participants) $ meeting = Meeting :: findOne ($ id); $ invite = new \ common \ models \ Calendar (); $ start_time = $ selectedTime-> start + (3600 * 7); // temp timone ajuste $ end_time = $ start_time + 3600; // à faire - autorise la longueur des réunions pour le calcul de l'heure de fin $ sdate = new \ DateTime (date ("Y-m-j h: i: sA", $ start_time), new \ DateTimeZone ('PST')); $ edate = new \ DateTime (date ("Y-m-d h: i: sA", $ end_time), new \ DateTimeZone ('PST')); $ description = $ meeting-> message; // vérifie s'il s'agit d'une conférence sans emplacement if ($ selectedPlace! == false) if ($ selectedPlace-> lieu-> site Web <> ") $ description. = 'Site Web:'. $ selectedPlace-> lieu- > website; $ location = str_ireplace (',', ", $ ChoisiPlace-> Lieu-> nom.". str_ireplace (', Etats-Unis', ", $ ChoisiPlace-> lieu-> adresse_du_jour)); else $ location = "; $ invite -> setSubject ($ meeting-> sujet) -> setDescription ($ description) -> setStart ($ sdate) -> setEnd ($ edate) -> setLocation ($ location) - > setOrganizer ($ meeting-> propriétaire-> email, $ réunion-> propriétaire-> nom d'utilisateur); foreach ($ participants en tant que $ a) $ invite -> addAttendee ($ a ['email'], $ a ['nom d'utilisateur ']) -> setUrl (\ common \ components \ MiscHelpers :: buildCommand ($ id, Meeting :: COMMAND_VIEW, 0, $ a [' user_id '], $ a [' clé_automatique '])); $ invite-> generate () // générer l'invitation -> save (); // l'enregistrer dans un fichier; $ downloadLink = $ invite-> getSavedPath (); return $ downloadLink;
S'il y a un lieu (pour les réunions en personne), j'inclus un lien vers le site Web du lieu (si disponible) et une adresse pour les cartes incorporées. J'ai décidé de coder les dates et heures au format UTC pour plus de simplicité.
Les informations communes à la réunion sont configurées, puis l'organisateur et les participants sont ajoutés..
Voici à quoi ressemble un exemple de fichier à la fin:
BEGIN VERSION: 2.0 CALSCALE: MÉTHODE GREGORIEN: PUBLISH BEGIN: VEVENT UID: [email protected] DTSTART: 20160506T013000Z DTEND: 20160506T023000Z DTSTAMP: 20160506T013000Z ORGANIZER; http: // localhost: 8888 / mp / index.php / meeting / command? id = 45 & cmd = 10 & actor_id = 1 & k = ESxJU_2ZRhZIgzHFyJAIiC39RhZuLiM_ & obj_id = 0 ATTENDEE; PARTSTAT = NEEDS; ACHETER; = 0: mailto: [email protected] ATTENDEE; PARTSTAT = NEEDS-ACTION; RSVP = TRUE; CN = admin; X-NUM-GUESTS = 0: mailto: [email protected] CRÉÉE: DESCRIPTION: C'était amusant de courir vous - prenons cette bière! Site Web: http://www.patxispizza.com/ Dernière modification: 20160506T013000Z EMPLACEMENT: Pizza Ballard de Patxi 5323 Ballard Avenue NO Seattle WA 98107 SOMMAIRE: Meetup pour une conversation retardée et longue conversation SEQUENCE: 0 TRANSP: OPAQUE FIN: VEVENT FIN: VCALENDEND
Dans ce didacticiel précédent, j'ai décrit l'utilisation de la prise en charge de la messagerie intégrée à Yii2 avec l'extension SwiftMailer pour la fourniture d'invitations à des réunions. Pour la livraison du transport, j'ai utilisé l'intégration du service SMTP de Mailgun.
Certes, par le passé, intégrer des pièces jointes dans des messages était compliqué, mais maintenant, c’est très facile avec Yii. Voici le code pour ajouter le fichier à l'invitation à une réunion sortante:
// envoie le message $ message = Yii :: $ app-> mailer-> compose (['html' => 'finalize-html', 'text' => 'finalize-text'], ['meeting_id' => $ this-> id, 'noPlaces' => $ noPlaces, 'participant_id' => 0, 'propriétaire' => $ this-> propriétaire-> nom d'utilisateur, 'user_id' => $ a ['user_id'], 'auth_key '=> $ a [' auth_key '],' intro '=> $ this-> message,' links '=> $ links,' header '=> $ header,' ChoisiPlace '=> $ ChoisiPlace,' ChoisiTime '= > $ selectedTime, 'notes' => $ notes, 'meetingSettings' => $ this-> meetingSettings,]); $ icsPath = Meeting :: buildCalendar ($ this-> id, $ ChoisiPlace, $ ChoisiTime, $ Participants); $ message-> setFrom (array ('[email protected] '=> $ this-> propriétaire-> email)); $ message-> attachContent (file_get_contents ($ icsPath), ['fileName' => 'meeting.ics', 'contentType' => 'text / plain']); $ message-> setTo ($ a ['email']) -> setSubject (Yii :: t ('frontend', 'Meeting Confirmed:'). $ this-> sujet) -> send ();
J'avais juste besoin d'utiliser le $ icsPath
retourné ci-dessus et utiliser le attachContent
méthode pour l'inclure avec l'email d'invitation.
Voici à quoi cela ressemblait quand il est arrivé dans Gmail:
Lorsque j'ai ouvert le fichier d'invitation sous Mac OS, Apple Calendar a présenté cette première étape pour sélectionner un agenda auquel ajouter l'événement:
Voici à quoi cela ressemble dans la vue par jour de mon calendrier:
Une fois que l'événement est ajouté, il ressemblera à ceci lorsque vous cliquez dessus:
Dans l’ensemble, la génération d’événements s’est avérée être un travail relativement modeste et une mise en œuvre réussie. Les gens Alpha ont été impressionnés et nous l'avons utilisé pour des réunions en personne.
Tandis que j'apprenais et que j'essayais d'utiliser .ics, mes comptes de messagerie Web sur FastMail ne reconnaissaient que par intermittence mes fichiers .ics en tant qu'invitations d'agenda. J'ai eu besoin de mettre à jour les propriétés que j'ai incluses pour qu'il soit reconnu de manière conviviale.
Une structuration plus correcte du contenu du fichier .ics a permis à FastMail de reconnaître automatiquement la pièce jointe:
Malheureusement, ses Ajouter au calendrier bouton des liens vers son propre calendrier, que je n'utilise pas. Encore une fois, pour ajouter au calendrier Apple, comme avec Gmail, je devais télécharger et ouvrir le fichier .ics..
Mac OS semblait reconnaître les fichiers dès leur ouverture. Cela me permettrait de créer un événement du calendrier Apple (voir ci-dessus) en quelques étapes..
J'avais également besoin de définir un identifiant unique pour les événements afin que nous puissions envoyer des mises à jour à l'avenir. Pour l'instant, notre ID de réunion de base de données avec '@ meetingplanner.io' suffit, par exemple. uid = [email protected].
S'assurer que les fuseaux horaires étaient correctement définis dans les formats de fichier .ics a nécessité des recherches supplémentaires. Pour plus de simplicité, je me base sur le générateur ics d’Amin pour coder les dates et les heures au format UTC. J'ai plus de travail dans Meeting Planner pour gérer les fuseaux horaires des utilisateurs.
J'avais également laissé la durée et l'heure de fin de Meeting Planner. Ce sera quelque chose que je devrai corriger prochainement, probablement en ajoutant simplement une durée (en heures) pour la réunion moyenne et en permettant aux gens de la prolonger si nécessaire.
En fin de compte, j'aimerais que Meeting Planner utilise une étendue plus large des fonctionnalités d'iCal. Au départ, je voulais simplement que la fonctionnalité principale fonctionne pour le MVP. Voici quelques idées ci-dessous.
Il se peut que je veuille créer un paramètre utilisateur dans Meeting Planner qui ajouterait des alarmes aux entrées de calendrier des personnes. Dans iCal, cela s'appelle VALARM
, par exemple.:
DEBUT: VALARM TRIGGER: -PT1440M ACTION: DESCRIPTION DE L’AFFICHAGE: Rappel FIN: VALARM
Lorsque des personnes mettent à jour l'événement d'origine, même après sa finalisation, je souhaite prendre en charge les mises à jour de l'événement dans leur calendrier. Cela nécessite de livrer un VEVENT
avec un identique UID
mais avec un incrément SÉQUENCE
(via TutorialsBag):
COMMENCER: VERSION VCALENDAR: 2.0 CALSCALE: MÉTHODE GREGORIEN: DEMANDE COMMENCER: VEVENT UID: [email protected] DTSTART: 20130617T050000ZENDRE voir comment cela fonctionne réellement Dernière modification: 20130616T050000Z LOCALISATION: Queens, New York SOMMAIRE: Test Démo Inviter SEQUENCE: 1 TRANSP: OPAQUE FIN: VEVENT FIN: VCALENDAR
Actuellement, je ne dépiste pas un champ séquentiel pour les mises à jour..
J'aimerais également prendre en charge les fichiers d'annulation qui suppriment l'événement des calendriers. Ainsi, si une personne annule avec Meeting Planner, nous envoyons aux participants un fichier iCal qui supprime l'événement de leur calendrier:
MÉTHODE: ANNULER STATUT: ANNULÉ
Au fil du temps, j'aimerais mettre en cache les fichiers .ics de chaque événement et participant pour des problèmes de performances et de stockage. J'aimerais proposer une gestion des fichiers afin de réduire l'espace disque éventuellement nécessaire pour les stocker, car ils ne sont nécessaires que pour une courte période et peuvent être facilement régénérés à la demande..
Je veux également m'assurer que le répertoire dans lequel ils sont stockés est sécurisé afin qu'il ne puisse pas être compromis, car ils contiennent de nombreuses informations personnelles et privées, telles que des adresses électroniques et l'emplacement exact où vous pouvez trouver des personnes spécifiques à un moment donné..
À l'avenir, j'aimerais également essayer d'intégrer les fonctionnalités avancées moins régulièrement utilisées d'iCal pour se connecter directement à Meeting Planner. Par exemple, nous pourrons annuler ou reprogrammer des réunions de votre programme de calendrier iCal à l'aide des interfaces de programmation de Meeting Planner, sans avoir à revenir sur le site Web de Meeting Planner..
Surveillez les prochains tutoriels dans notre série Construire votre démarrage avec PHP. Dans le prochain épisode, je décrirai comment ajouter un support d'enregistrement via Google, Facebook et Twitter, ainsi que la connexion de comptes existants à ces réseaux sociaux afin d'accélérer l'adoption et de simplifier l'utilisation.
Encore une fois, Meeting Planner est prêt à être utilisé. Essayez et planifiez une réunion 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.
Je commence également à expérimenter WeFunder à partir de la mise en œuvre des nouvelles règles de la SEC en matière de financement participatif. S'il vous plaît envisager de suivre notre profil. Je peux écrire plus à ce sujet dans le cadre de cette série.