Uw start-up samenstellen Routes gebruiken om met mij te plannen

Wat je gaat creëren

Deze zelfstudie maakt deel uit van de Bouw je Startup met PHP-serie op Envato Tuts +. In deze serie begeleid ik je door het opstarten van een startup van concept naar realiteit met behulp van mijn Meeting Planner app als een realistisch voorbeeld. Elke stap die ik doe, zal ik de Meeting Planner-code vrijgeven als open-source voorbeelden waar je van kunt leren. Ik zal ook opstartgerelateerde zakelijke problemen aanpakken zodra deze zich voordoen.

Onlangs vroeg ik of onze startup-serie heeft elk van uw eigen ideeën geïnspireerd en heeft u code laten schrijven. Zo ja, deel een beetje met ons in de comments.

Laten we elkaar ontmoeten, ga naar mijn pagina met mijn schema

Al heel lang sinds ik aan dit project begon, wilde ik dat Meeting Planner en Simple Planner een publiek toegankelijke pagina hadden die je met mensen kunt delen om een ​​vergadering met je te plannen. Met andere woorden: "Natuurlijk, laten we afspreken, ga gewoon naar mijn planning met mij pagina op Meeting Planner, ik ben Bernie Sanders (geen spatie)." 

In de tutorial van vandaag laat ik je zien dat ik het gedaan heb met Yii's routing en enkele van de gerelateerde problemen die naar boven kwamen.

Als je nog niet hebt geprobeerd een vergadering te plannen, kun je zien hoe het in deze video is gedaan:

 

De pagina Schedule With Me is ongeveer zoals de PayPal-betaalpagina:

Ik neem wel deel aan de opmerkingen hieronder, dus vertel me wat je denkt! Je kunt me ook bereiken op Twitter @lookahead_io. Ik ben vooral geïnteresseerd als je nieuwe functies wilt of onderwerpen wilt voorstellen voor toekomstige zelfstudies.

Ter herinnering: alle code voor Meeting Planner is geschreven in het Yii2 Framework voor PHP. Als je meer wilt weten over Yii2, bekijk dan onze parallelle serie Programming With Yii2.

Laten we beginnen.

De Schedule With Me-pagina plannen

Notitie: Bernie is eigenlijk geen Meeting Planner-gebruiker, voor zover ik weet.

Elke Meeting Planner-gebruiker heeft een unieke gebruikersnaam, bijvoorbeeld berniesanders, en ik besloot om dit te gebruiken voor het schema met mij URL. Er waren enkele uitdagingen voor deze functie:

  1. De pagina ontwerpen
  2. Werken met Yii Routing om een ​​rootpad aan elke persoon toe te wijzen
  3. Beheer van de aanmelding, login en terugkeer naar planning

De pagina ontwerpen

Geïnspireerd door de PayPal Pay Me-pagina (hierboven) en andere soortgelijke, wilde ik de dingen aanvankelijk eenvoudig houden. Ik gebruikte een responsief raster met offsets en centrering:

Hier is de weergave /frontend/views/meeting/scheduleme.php voor de pagina:

avatar <> ") echo ''; else echo \ cebe \ gravatar \ Gravatar :: widget (['email' => $ user-> email, 'options' => ['class' => 'profile-image' , 'alt' => $ user-> gebruikersnaam,], 'size' => 128,]);?>

user-> isGuest) ?> $ Gebruikers-> gebruikersnaam])?>

De code geeft de profielafbeelding weer die de gebruiker heeft geüpload in gebruikersinstellingen of gebruikt een algemene Gravatar.

Natuurlijk heb ik /frontend/web/css/site.css gebruikt om de marges, rand en achtergrond aan te passen:

.scheduleme-top margin-top: 8%;  .schedule-me background-color: # f3f3f3; min-width: 500px; opvulling: 100px 25px 65px 25px; rand: 1px vast # e0e0e0;  // responsieve aanpassingen @media only screen en (min-device-width: 320px) and (max-device-width: 667px) en (-webkit-min-device-pixel-ratio: 2) ... schedule-me  min-width: 75%; opvulling: 60px 10px 40px 10px; 

Beheer van de Yii-routeringswijzigingen

De routering voor hoe Yii omgaat met inkomende browser-aanvragen wordt behandeld in /frontend/config/main.php onder componenten. Als u niet voorzichtig bent met het configureren van dit, kunt u uw hele toepassing vernietigen omdat binnenkomende verzoeken niet op foutpagina's kunnen worden weergegeven.

Dit is de eerdere routing voor het schema met mij:

 [... 'urlManager' => ['class' => 'yii \ web \ UrlManager', 'enablePrettyUrl' => true, 'showScriptName' => false, // 'enableStrictParsing' => false, 'rules' => [ 'place' => 'place', 'place / yours' => 'place / yours', 'place / create' => 'plaats / create', 'place / create_geo' => 'plaats / create_geo', 'plaats / create_place_google '=>' plaats / create_place_google ',' plaats / bekijk /'=>' plaats / aanzicht ',' plaats / update /'=>' plaats / update ',' plaats /'=>' plaats / naaktslak ','/'=>'/ bekijken ','//'=>'/',' daemon /'=>' daemon /', // incl acht char action' site /'=>' site /', // incl acht char action' features '=>' site / features ',' about '=>' site / about ',' wp-login | wp-admin '=>' site / neverland ','/'=>' vergadering / identiteit ', // opmerking - huidige acties met 8 letters en geen params zullen mislukken'/'=>'/',],

Ik heb al eerder geschreven over routes in Hoe programmeer ik met Yii2: Sluggable Behavior, onderdeel van onze Yii-programmeringsreeks, en je kunt meer achtergrondinformatie lezen in de Yii-documentatie.

Bij het opbouwen van uw startup: vergaderingen met meerdere deelnemers schreef ik twee afleveringen over dynamische paden per gebruikersnaam voor unieke ontmoetings-URL's, zoals hieronder getoond:

'/'=>' vergadering / identiteit ',

Dit heeft veel routes met twee items verbroken, zoals vergadering / [meeting_id] totdat ik meer dynamische toewijzing boven mijn hoofd kreeg om voorrang te krijgen:    

'/'=>'/ bekijken ','//'=>'/', 

En alle tweede itempaden met tekens moesten statisch worden gedefinieerd, omdat onze identiteitsreeksen voor vergaderingen acht tekens zijn, bijvoorbeeld. Kenmerken.

Routes zoals Kenmerken zijn opgelost, die naar controller gaat plaatsen en actie Kenmerken zoals hierboven getoond. Resterende functies worden dynamisch toegewezen, zoals in: '/'=>'/',

Probeert een dynamische variabele route van één item te maken, zoals / [gebruikersnaam], bijvoorbeeld https://meetingplanner.io/berniesanders, heeft veel single-item-routes verbroken, zoals https://meetingplanner.io/about en de reminderspagina https://meetingplanner.io/reminder.

Dus ik moest statisch beginnen met het definiëren van veel van hen. 

Dit is de laatste routing met nieuwe statische routes voor paden van één woord:

'urlManager' => ['class' => 'yii \ web \ UrlManager', 'enablePrettyUrl' => true, 'showScriptName' => false, // 'enableStrictParsing' => false, 'rules' => ['plaats '=>' plaats ',' plaats / jouwe '=>' plaats / jouwe ',' plaats / maak '=>' plaats / maak ',' plaats / create_geo '=>' plaats / create_geo ',' plaats / create_place_google '=>' plaats / create_place_google ',' plaats / bekijk /'=>' plaats / aanzicht ',' plaats / update /'=>' plaats / update ',' plaats /'=>' plaats / naaktslak ','/'=>'/ bekijken ','//'=>'/',' daemon /'=>' daemon /', // incl acht char action' site /'=>' site /', // incl acht char action' features '=>' site / features ',' about '=>' site / about ',' wp-login | wp-admin '=>' site / neverland ','/'=>' meeting / identity ',' meeting '=>' meeting ',' friend '=>' friend ',' reminder '=>' reminder ',' user-contact '=>' user-contact ',' gebruikersprofiel '=>' gebruikersprofiel ',' gebruikersinstelling '=>' gebruikersinstelling ',''=>' meeting / scheduleme ', // note - huidige acties met 8 letters en geen params zullen mislukken'/'=>'/',],],

En u kunt "Bernie's pagina" bekijken en een afspraak met hem maken hier:

https://simpleplanner.io/berniesanders

Notitie: Meeting Planner en Simple Planner werken door elkaar en ik run beide sites om gebruikers meerdere merken aan te bieden. Simple Planner is voor sociale borrels en Meeting Planner is voor meer zakelijke aangelegenheden.

Aanmelden en aanmelden beheren op de pagina Planning met mij

De meeste mensen die in eerste instantie een schema met mij bezoeken, hebben geen account bij ons. Dus ze worden omgeleid wanneer ze klikken Plan met mij naar de aanmeldings- of inlogpagina.

Nadat ze zich hebben aangemeld, willen we ze terugsturen naar de pagina voor het maken van vergaderingen die vooraf is geladen met de eigenaar van het schema en de pagina die ik als deelnemer heb toegevoegd. We gebruiken setReturnUrl om dit te doen:

Yii :: $ app-> gebruiksvriendelijkheid> setReturnUrl ([vergadering / create / ', 'met'=> $ u-> username]);

Het werkt de sessie bij (meestal via een cookie), zodat nadat een persoon zich aanmeldt of zich aanmeldt, deze wordt teruggebracht naar de doelpagina.

Hier is de volledige /frontend/controllers/MeetingController.php actionScheduleme methode:

public function actionScheduleme () $ username = Yii :: $ app-> request-> getPathInfo (); $ u = Gebruiker: find () -> where (['username' => $ username]) -> one (); if (is_null ($ u)) return $ this-> goHome ();  elseif (! Yii :: $ app-> user-> isGuest) if (Yii :: $ app-> user-> getId () == $ u-> id) Yii :: $ app-> getSession ( ) -> setFlash ('info', Yii :: t ('frontend', 'Welkom bij uw openbare planningspagina.'));  $ userprofile = \ frontend \ models \ UserProfile :: find () -> where (['user_id' => $ u-> id]) -> one (); Yii :: $ app-> gebruiksvriendelijkheid> setReturnUrl ([vergadering / create / ', 'met'=> $ u-> username]); return $ this-> render ('scheduleme', ['user' => $ u, 'displayName' => MiscHelpers :: getDisplayName ($ u-> id, true), 'userprofile' => $ userprofile,]); 

De eigenaar van de schema-pagina toevoegen als deelnemer

Hier is de /frontend/controllers/MeetingController.php actionCreate methode:

public function actionCreate ($ with = ") ... if ($ with <>") $ u = User :: find () -> where (['username' => $ with]) -> one (); if (! is_null ($ u)) $ with_id = $ u-> id;  else Yii :: $ app-> getSession () -> setFlash ('error', Yii :: t ('frontend', 'Sorry, we konden niemand met die naam vinden.Ga naar support als je hulp nodig hebt.' )); $ with_id = 0;  else $ with_id = 0;  // voorkom het creëren van talloze lege vergaderingen $ meeting_id = Meeting :: findEmptyMeeting (Yii :: $ app-> user-> getId (), $ with_id); if ($ meeting_id === false) // anders een nieuwe vergadering maken $ model = new Meeting (); $ model-> owner_id = Yii :: $ app-> gebruiker-> getId (); $ model-> sequence_id = 0; $ model-> meeting_type = 0; $ model-> subject = Meeting :: DEFAULT_SUBJECT; $ Model-> save (); $ Model-> initializeMeetingSetting ($ model-> id, $ model-> owner_id); $ meeting_id = $ model-> id;  if ($ with_id! = 0) Participant :: add ($ meeting_id, $ with_id, Yii :: $ app-> user-> getId ());  $ this-> redirect (['view', 'id' => $ meeting_id]); 

Het verwerkt de gebruikers-ID van het schema met mij pagina-eigenaar als $ with_id om ze toe te voegen als deelnemer. En het controleert ook eerst om er zeker van te zijn dat er niet al een vergadering tussen deze twee personen plaatsvindt - om duplicaten te voorkomen:

openbare statische functie findEmptyMeeting ($ user_id, $ with_id = 0) // als u iemand ontmoet, kijk dan of deze al bestaat ($ with_id! = 0) // controleer of er een deelnemer is met with_id $ meetings = Meeting :: find () -> where (['owner_id' => $ user_id, 'status' => Meeting :: STATUS_PLANNING]) -> limit (7) -> orderBy (['id' => SORT_DESC]) -> all ( ); foreach ($ meetings as $ m) if (! is_null ($ m) && (count ($ m-> participants) == 1 && $ m-> participanten [0] -> participant_id == $ with_id)) ga terug $ m-> id;  // zoekt naar lege vergadering in laatste zeven $ meetings = Meeting :: find () -> where (['owner_id' => $ user_id, 'status' => Meeting :: STATUS_PLANNING]) -> limit (7 ) -> orderBy (['id' => SORT_DESC]) -> all (); foreach ($ meetings as $ m) if (! is_null ($ m) and ($ m-> subject == Meeting :: DEFAULT_SUBJECT || $ m-> subject == ") en (count ($ m-> deelnemers ) == 0 && count ($ m-> meetingPlaces) == 0 && count ($ m-> meetingTimes) == 0)) return $ m-> id; return false;

Ik heb de functie oorspronkelijk toegevoegd om te voorkomen dat gebruikers nieuwe vergaderingen kunnen maken wanneer er alweer een lege nieuwe vergadering was die ze eerder hadden gemaakt.

Vooruit kijken

Er zullen een aantal dingen over deze pagina zijn die ik in de toekomst zal opruimen als ik spreek met echte gebruikers en feedback verzamel. Misschien deel ik automatisch de meest voorkomende dagen en tijden van de gebruiker voor vergaderingen. En ik maak een gebruikersinstelling om uw planningspagina uit te schakelen voor het geval u het niet wilt.

In Closing

Al het werk dat ik onlangs met Bootstrap heb gedaan om een ​​beter reagerende interface voor Meeting Planner te creëren, maakte het voor mij gemakkelijker om snel de planning met mij pagina te coderen.

Het was het moeilijkste om ervoor te zorgen dat de nieuwe Yii-routes werkten en niets op de site braken. Ik ging ook en controleerde al mijn Ajax-oproepen om zeker te zijn dat geen van hen werd beïnvloed.

Ik hoop dat de zelfstudie van vandaag nuttig voor u was bij het leren aanpassen van site-URL's voor uw gebruikersbestand en de basisbeginselen van MVC-routering.

Heb je je eigen gedachten? Ideeën? Feedback? Je kunt me altijd rechtstreeks op Twitter @lookahead_io bereiken. Kijk hier voor komende tutorials in de Building Your Startup With PHP-serie. Sommige coole functies zijn onderweg.

Nogmaals, als je nog geen Meeting Planner of Simple Planner hebt geprobeerd, ga je gang en plan je eerste vergadering. 

Gerelateerde Links

  • Simple Planner of Meeting Planner
  • Programmeren met Yii2
  • Hoe te programmeren met Yii2: slap gedrag
  • Uw start-up opbouwen: het mobiele web verbeteren