at bygge din startkapital: adgangskontrol, aktive registrere forbindelser og snegle

, at bygge din startkapital: adgangskontrol, aktive registrere forbindelser og snegle,,,,, 21,,,,,,,,, 4,,,,,,, det cyber - mandag envato tuts + kurser vil blive reduceret til $3.- og' t miss. denne post er en del af en serie kaldet bygge din startende med folkesundhedsprogrammet. bygge din startende med folkesundhedsprogrammet: lokalisering med i18nbuilding din startkapital med folkesundhedsprogrammet: bruger indstillinger, profil, billeder og kontaktoplysninger,,, hvad du vil lave,,, det er femte del af bygningen din startende med folkesundhedsprogrammet serie om tuts +.i denne serie, jeg leder dig gennem iværksættelse af en startkapital fra idé til virkelighed ved hjælp af mit møde kalender app som et eksempel fra det virkelige liv.hvert skridt på vejen, vi åbner mødet planner kode som open source - eksempler, de kan lære af.vi vil også tage fat på nystartede forbundne forretningsmæssige spørgsmål, efterhånden som de opstår.,,, af koden for møde kalender er skrevet i yii2 ramme for folkesundhedsprogrammet.hvis du vil lære mere om yii2, tjek lige vores række   programmering med yii2   på tuts +. i denne lektion, jeg følger dig gennem flere elementer i den yii ramme, som vil gøre vores eksisterende forvaltnings - kode mere robust.vi skal gennemføre yii er enkel adgang til kontrol for at sikre, at der kun er logget på brugere og steder.vi skal bruge aktive registrere forbindelser, således at kun placerer brugeren har tilføjet anføres på deres opfattelse af det indeks side.vi skal også bruge yii er sluggable opførsel at gennemføre url venlige kugler til at vise disse steder.og vi kommer til at gøre lidt mere, rengøring og polske rundt, træk, bare en påmindelse, jeg vil deltage i bemærkning tråde nedenfor.jeg er især interesseret i, hvis man har forskellige tilgange, eller   supplerende idéer, eller hvis du   vil foreslå emner for fremtidige tutorials.jeg glæder mig også over træk anmodninger om møde kalender.,,, adgangskontrol, kode, vi har skrevet hidtil gør det muligt for nogen at skabe pladser, selv om de ikke har undertegnet.vi kan bruge yii2 er simpel adgangskontrol, ved at sikre, at brugere registrere og tegn før tilføjelse og - steder.  ,, yii2 giver også mere avancerede (og komplekse) rolle baseret adgangskontrol (rbac), som vi ikke vil gennemføre på dette tidspunkt, hvis brugerne ikke er logget ind, når de kommer på besøg sted, sider, yii vil omdirigere dem til indlogningsside.,, yii2 er   indbygget adgangskontrol støtter kun to   roller som standard: gæst (ikke logget på), repræsenteret ved? ",   og bekræftet, repræsenteret ved "@".hvis du er interesseret,   koden ninja skrev et godt eksempel ved at udvide denne til støtte for lyddæmpere og administratorer (enklere rolle baseret tilladelse i yii 2.0) uden at skulle ty til anvendelse af rbac.,,, rammer gør det meget let at gennemføre denne kontrol.vi har lige tilføje, at placecontroller.php adfærd, som fastlægger regler for adgang til hver aktion, f.eks. indeks, skabe, betragtning osv. her vil vi gennemgå adgang opførsel, men hvis du er interesseret,   yii er verbum filtre, giver dig mulighed for at begrænse http aktiviteter baseret på din registeransvarlige handling.,, offentlig funktion behaviors() {afkast ["verber. = > [" klasse "= > verbfilter: classname()" aktioner "= > [" fjerne "= > ['post ']]]," adgang "= > [" klasse "= > det yii. filtre) accesscontrol:: classname()," kun "= > ['index,'create", "create_geo,'create_place_google,'update,'view,'slug "regler" = > [//tillade bekræftet brugere ['tillader = > sandt, "roller" = > [' @ '] //alt andet er nægtet]]]}, når tilføjes, hvis du knipser de  , steder, menu, du vil blive omdirigeret til indlogningsside:,,,,, yii behandler også den rette tilbage til indholdsfortegnelsen, når login er fuldført.,, hvor brugerne adgang til det sted, sider, kan vi finde den pågældende bruger med denne kode:,,, yii: $app - > og bruger - > getid(),,,,, så, lige før nye steder er reddet, vi cen ajourføring af  , created_by, inden   til logget på brugeren.og vi kan stole på adgang til kontrol for at sikre, at de skaber metode er adgang til kun bekræftet brugere:,, offentlig funktion actioncreate() {$model = nye place(); hvis ($model - > belastning (yii: $app - > anmodning - > post())) ($form = yii:: $app - > anmodning - > post(). $model - > created_by = yii: $app - > brugeren - > getid(). $model - > save();,, aktive registrere forbindelser i møde kalender, jeg vil spore, der bruger først skaber et sted.det er lagret i, created_by område.vi ønsker også at finde steder, at brugerne tyder på, og for deres møder, den hyppighed, hvormed de steder, og deres favoritter.vi bruger   userplace tabel for.,, men nu ved vi, at der bruger er undertegnet i, når vi skal skabe et sted, vi ønsker at skabe en relationel række   i userplace tabel. det, vi skal bruge yii er code generator, gil (http: ///////////////8888 localhost: mp /index.php /gil /model), at skabe en model for userplace:,,,,, derefter, når der er held tilføjes, vi ønsker at skabe et register i userplace tabel for den aktive brugere.vi kan udvide yii activerecord med, aftersave metode.i den model, vi tilføjer:,, offentlig funktion aftersave ($indsætte, $changedattributes) (moder: aftersave ($indsætte, $changedattributes); hvis ($indsæt) {% = nye userplace. $- > der tilsættes ($- > created_by $- > id)), i userplace model, vi tilføje funktion: //tilføje, at brugeren sted liste offentlig funktion tilføje ($user_id, $place_id) (//kontrol, hvis en sådan findes, hvis (!userplace: find() - > hvor (["user_id = > $user_id, place_id = > $place_id]) - > exists()) (//hvis ikke tilføje det $= nye userplace. $- > user_id = $user_id. $- > place_id = $place_id. $- > save();}}, når brugeren besøg sted indeks side ønsker vi at vise de steder, de har anvendt, kun de i userplace tabel for brugeren.  ,,, jeg vil følge dig gennem to forskellige måder at gøre det her.jeg er stadig at opnå erfaring med   yii2. x som jeg gå med detaljerne i   bedste fremgangsmåde var nye for mig.jeg vil gerne takke alex makarov, en yii entreprenør, der forvalter også yiifeed.com, for hans støtte.både han og yii grundlægger qiang xue har været meget hjælpsom med at besvare spørgsmål og støtte min indsats med   disse yii forbundne tutorials.,, det nemmeste tilgang, det nemmeste er at slutte sig til det sted, tabel med userplace tabel på, userplace.place_id, ejendom, filtrering på  , userplace.user_id, med   den nuværende autentificeret bruger., her er misligholdelse indeks   registeransvarlige metode:,, offentlig funktion actionindex() ($searchmodel = nye placesearch(). $dataprovider = $searchmodel - > søgning (yii: $app - > anmodning - > queryparams); tilbage $- > de ('index ", -" searchmodel = > $searchmodel, dataprovider = > $dataprovider]);}, vil vi skabe en ny registeransvarlige metode kaldet din:,,,offentlig funktion actionyours() {$forespørgsel = sted: find() - > joinwith ('userplaces') - > hvor (['user_id = > yii: $app - > brugeren - > getid()]); $searchmodel = nye placesearch(). $dataprovider = nye activedataprovider (["spørgsmål" = > $forespørgsel, sidenummerering = > ['pagesize = > 10]); tilbage $- > de ('yours "[" dataprovider = > $dataprovider, searchmodel = > $searchmodel,])), er det, joinwith ('userplaces), bruger gil, der genereres familiemæssige spørgsmål i place.php-it kan være en smule forvirrende som du udelader "får" præfiks: /* * * @ tilbage. yii (db), activequery * /offentlige funktionerdette getuserplaces() {tilbage $- > hasmany (userplace: classname() ['place_id = > »id«]);}, er vi også nødt til at ændre den, placesearch, klasse: //tilføje en nødvendig regel for created_by offentlig funktion rules() {afkast [[['created_by "] »krævet«] //tilføje med i eftersøgningen forespørgsel offentlige funktion søgning ($params) ($forespørgsel = sted: find() - > joinwith ('user_place ') - > hvor (['user_id = > yii: $app - > bruger - > getid()]); $dataprovider = nye activedataprovider ([" spørgsmål "= > $forespørgsel,]), en alternativ metode, en anden måde at gennemføre dette på er gennem en userplace registeransvarlige.vi er trods alt viewing "brugerens steder".i dette tilfælde kan vi få en mindre ændring til gil, der genereres registeransvarlige indeks metode:,, offentlig funktion actionindex() ($searchmodel = nye userplacesearch(). $searchmodel - > user_id = yii: $app - > brugeren - > getid(). $dataprovider = $searchmodel - > søgning (yii: $app - > anmodning - > queryparams); tilbage $- > de ('index "[" searchmodel = > $searchmodel, dataprovider = > $dataprovider]);}, så i  , /synspunkter /bruger sted /index.php, er vi nødt til at ændre de genererede forbindelse veje og model adgang til data, f.eks. /stedet /create_place_google:,, < p > <?= html: en (yii:: t ('frontend, skabe (modelclass} "[" modelclass = > ']) [/sted /skabe], ['class = > btn btn succes "]).> <?= html: en (yii:: t ('frontend,'add nuværende beliggenhed), [/sted /create_geo '], ['class = > btn btn succes "]).> <?= html: en (yii:: t ('frontend,'add en google (modelclass} "[" modelclass = > ']) [/sted /create_place_google'], ['class = > btn btn succes "]).> < /p >,, i nettet opfattelse dims, vi bruger userplace forhold til det sted, tabel til egenskaber fra sidstnævnte model, f.eks. $model - > - > kugle,:,, <?= gridview: widget (["dataprovider = > $dataprovider, //'filtermodel = > $searchmodel, kolonne" = > [//['class = > yii. net. serialcolumn "[" give "= > place_name", "format = >" rå "," værdi "= > funktion ($model) (modydelse på < div >. $model - > - > navn. < /div > «).] ['attribut = > place_type", "format = >" rå "," værdi "= > funktion ($model) (modydelse på < div >. $model - > - >getPlaceType($model->place->place_type).'</div>'; }, ], ['class' => 'yii\\grid\\ActionColumn', \t\t\t 'template'=>'{view} {update} ', \t\t\t\t\t 'buttons'=>[ 'view' => function ($url, $model) { return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', Yii::getAlias('@web').'/place/'.$model->place->slug, ['title' => Yii::t('yii', 'View'),]);\t \t\t\t\t\t\t }, 'update' => function ($url, $model) { return Html::a('<span class="glyphicon glyphicon-pencil"></span>', Yii::getAlias('@web').'/place/update/'.$model->place_id, ['title' => yii:: t ('yii "," ajourføring)]).]]]]).>,, userplace tilgang kræver nogle ændringer til forbindelser omkring brødkrummer, dims aktion forbindelser og kommando knapper, men stadig er ret enkel.,, hvis du gennemgå kode i denne overgang, kan du se brugerens steder fra:   http: //localhost: 8888 /mp /sted /din   og   http: //localhost: 8888 /mp /bruger.det er interessant at se, hvordan man kan opnå denne funktion med to forskellige fremgangsmåder inden for yii.,, snegle, når du aktivere ret url - adresser i yii ramme, på side for en model objekt typisk er noget, som http://meetingplanner.com/place/692, hvor 692 repræsenterer id af formålet at vise.ud over at være ubeskrivelig til brugeren, og det er også mindre effektivt med   søgemaskiner.det er bedre praksis at anvende url venlige   tråde, som f.eks.   http://meetingplanner.com/place/caffe-seattle.snoren er undertiden omtales som en snegl.yii2 er indbygget støtte til kugler, i form af sluggable adfærd.opførsel er en del af yii er aktive »recordstore«, og de kan anvendes til automatisk at data objekt modeller.,, i vores model, har vi tilføjet en snegl ejendom.her er, hvordan vi gennemfører sluggable opførsel i stedet model:,, offentlig funktion behaviors() {afkast [[(klasse "= > sluggablebehavior: classname(), attribut = >" navn "," fælles "= > sandt, ensureunique = > sandt,],, yii vil sikre i, save(), drift, at kuglen område er befolket med en url venlige version af navn.med andre ord, hvis betegnelse er oddfellows cafe, kuglen vil blive oddfellows cafe.,, fast ejendom, sikrer, at kuglen aldrig ændrer sig, selv om den venlige navn er udeladt.det er nyttigt for at bevare forbindelsen til steder samt søgemaskine henvisninger.,, ensureunique ejendom   genererer en enestående kugle af tilføje suffikset indeks automatisk.  ,, yii er automatiseret code generator "typisk forbindelser til genstande af numeriske id.vi ønsker at ændre disse forbindelser til at bruge kuglen.der er to steder, hvor denne kodeks findes, er den første på stedet indeks side i nettet aktion kolonner.du kan vælge de forbindelser, som det i /frontend /synspunkter /steder /index.php:,, <?= gridview: widget (["dataprovider = > $dataprovider, filtermodel = > $searchmodel, kolonne" = > [['class = > yii. net. serialcolumn "navn" ["give" = > "place_type", "format = >" rå "," værdi "= > funktion ($model) (modydelse på < div >. $model - > getplacetype ($model - > place_type). < /div > '},] ['class = > yii. net. actioncolumn", "model" = > « (betragtning} {ajourføre} "," knapper "= > [" lyset "= > funktion ($url - model (r)eturn html: en (< over klasse = "glyphicon glyphicon øje åbent" > < /span > "," /". $model - > kugle -, ['title = > yii:: t ('yii", "lyset"),]))]]]]).>,, det andet sted er brødkrummer:,,,,, f.eks. i /frontend /synspunkter /sted /ajourføring. folkesundhedsprogrammet, er vi nødt til at ændre denne:,, <?folkesundhedsprogrammet aspektet anvendelse yii. hjælpere. http: //; /* @ var $denne yii. web. betragtning * /* @ var $model frontend. modeller. sted * $- > afsnit = yii:: t ('frontend "," ajourføring (modelclass}: "[" modelclass = > ']). ". $model - > navn; $- > params ['breadcrumbs'] [...] = (»mærket« = > yii:: t ('frontend "," steder), url '= > ['index']] $- > params ['breadcrumbs'] [...] = (»mærket« = > $model - > navn, url '= > ['view "," id = > $model - > id); $- > params ['breadcrumbs'] [...] = yii:: t ('frontend "," ajourføring ").>,, at erstatte den opfattelse, id - kode at bruge kuglen:,,...$- > params ['breadcrumbs'] [...] = (»mærket« = > yii:: t ('frontend "," steder), url '= > ['index']] $- > params ['breadcrumbs'] [...] = (»mærket« = > $model - > navn, url '= > ['slug "," kugle "= > $model - > kugle]] $- > params ['breadcrumbs'] [...] = yii:: t ('frontend", "ajourføring');,, rengøring og polske, som bygger vi møde kalender, vil der være en kode sprint at skabe nye funktioner og perioder, der er nødvendige for rengøring og polske.det er sandsynligt, at der vil være en gentagen cyklus.,, jeg vil gå igennem et par scenarier, jeg vil tage fat på dette tidspunkt.der vil naturligvis fortsat være mulige områder nødvendige, så længe vi er bygning kode, der bruger feedback   og forbedring af produktet, at   navigation bar,, yii2 er godt integreret med bootstrap, så deres ansøgninger ser godt ud og løb responsively ud af æsken.hvis man vil bygge et navigation bar med dropdown menuer, det er nyttigt, hvis du   revision bootstrap er dokumentation   og forstå yii2 er anvendelse af   kort array note i folkesundhedsprogrammet.The Yii2 Navbar widget documentation doesn't provide a lot of examples at this time.,,I decided to begin to update the Meeting Planner navigation with some dropdown menus based on user state, e.g. guest or authenticated.,,,,,Here's the code that implements the above—I'm sure I'll keep modifying it as we go along:,,NavBar::begin([ 'brandLabel' => Yii::t('frontend','MeetingPlanner.io'), // 'brandUrl' => Yii::$app->homeUrl, 'options' => [ 'class' => 'navbar-inverse navbar-fixed-top', ], ]); if (Yii::$app->user->isGuest) { $menuItems[] = ['label' => Yii::t('frontend','Signup'), 'url' => ['/site/signup']]; $menuItems[] = ['label' => Yii::t('frontend','Login'), 'url' => ['/site /login']]} andre ($menuitems = [[»mærket« = > yii:: t ('frontend,'places), url '= > [/sted /dit]]]} $menuitems [] = (»mærket« = > yii:: t ('frontend,'about "),'items = > [[»mærket« = > yii:: t ('frontend,'learn mere), url' = > [/site /om]], [»mærket« = > yii:: t ('frontend,'contact), url '= > [/site /kontakt"]]]; hvis (!yii: $app - > brugeren - > isguest) ($menuitems [] = ["mærkning" = > "til", "produkter" = > [["mærkning" = > yii:: t ('frontend,'contact oplysninger "), url '= > [' /bruger kontakt"], ["mærkning" = > yii:: t ('frontend,'logout). "(".yii: $app - > brugeren - > identitet - > brugernavn. ")"url '= > [/site /logout'], linkoptions = > ['data-method = >" post "]]]]} echo nav: widget ([" muligheder "= > ['class = >" navbar nav navbar ret "," produkter "= > $menuitems]); navbar: end();,, validering af modeller ordentligt, før at, jeg har omskrevet den skabe aktioner i placecontroller at validere modeller, før vi forsøger at tilføje userplace   forbindelser.   var der nogle tilfælde, hvor ugyldig data   kunne indgives, og det ville bryde forsøg på at tilføje forholdet.det sikrer også, at brugere vil blive returneret til form med venlige fejlmeldinger, når valideringer mislykkes.,, offentlig funktion actioncreate() {$model = nye place(); hvis ($model - > belastning (yii: $app - > anmodning - > post())) ($form = yii:: $app - > anmodning - > post(); hvis (!is_numeric ($model - > place_type)) ($model - > place_type = sted: type_other;} $model - > created_by = yii: $app - > brugeren - > getid(); //validere form mod model regler, hvis ($model - > validate()) (//alle input er gyldige $model - > save(); //lookup gps - koordinater fra adresse $model - > addlocationfromaddress ($model, $form ['place '] ['full_address']); tilbage $- > omdirigere (['view "," id » = > $model - > id]);} andre (//validering ikke returnere $- > de ('create "[" model "= > $model.);}} andre {tilbage $- > de ('create "[" model "= > $model]);}}, forebyggelse af kopier, i vores første sted oprettelse kode, vi ønsker at beskytte mod kopier.steder, kan have samme navn, f.eks. er der mange   starbucks coffee (alt for mange),  , men vi vil forhindre, at den nøjagtige   sted skabt to gange, f.eks. en kop kaffe med identiske google sted id eller identiske navn og adresse  .,, yii giver model validitetskontrollører, der integrerer med activeforms til at gøre en masse dette arbejde for os.her er de regler, som vi skal definere i stedet model: /* * * @ inheritdoc * /offentlige funktion rules() {afkast [[['name,'slug "»krævet«], [['place_type", "status", "created_by", "created_at", "updated_at ']" heltal], [['name "," google_place_id "," kugle "," websted, full_address "," nærhed "," streng "," max "= > 255], [['website'], url '], [['slug'." unique], [['searchbox "," enestående ",'targetattribute = > google_place_id '], [['name", "full_address", "unik", "targetattribute = > ['name", "full_address']]]}, validitetskontrollører kan håndhæve krævede områder og   områdetyper og længde.de kan også godkende url - adresser, f.eks. med hjemmesiden felt over, e - mail - adresser og mere.du kan også skrive skik - validatorer.,, der er flere indbyggede   validitetskontrollører særlige karakter.de kan f.eks. validering af indre område   enestående karakter, som vi har gjort med kuglen område.men der er også mere komplekse karakter - validatorer.,,, når brugeren tilføjer et sted med google autocomplete, ønsker vi at håndhæve enestående egenskaber, som google_place_id, i det skjulte område  , men vi ønsker fejlmeddelelse skal anføres på den, searchbox område.denne definition gør det:,, [['searchbox "," enestående ",'targetattribute = > google_place_id", ønsker vi også at sikre, at navn og adresse er enestående.med andre ord, flere steder kan have samme navn, eller den samme adresse, men intet sted kan blive ens på begge områder.denne definition betyder det:,, [['name "," full_address "," unik "," targetattribute = > ['name "," full_address']], naturligvis mange brugere kan tilføje det samme sted på deres liste over userplaces.,, at jeg også udgå, ønsker at beskytte mod sletning af steder.   yii er automatiseret code generator "typisk forbindelser at slette operationer fra indeks   net og ajourføre sider.vi ønsker at fjerne dem.og vi ønsker at begrænse adgangen   til   slette aktion fra den registeransvarlige, her er et eksempel på stedet indeks side med slette ikoner:,,,,,, da vi - kugle forbindelser over, vi fjernede den misligholdelse, anvendelse af   slette kommando.,, ved den måde,   jeg virkelig sætter pris på yii anvendelse bootstrap og glyphicons.de arbejder fint.,, her er den opfattelse, side med sletknappen:,,,,,, lige nu, lad os komme ud af koden for sletknappen i /frontend /synspunkter /sted /view. folkesundhedsprogrammet.vi kunne have det tilbage for administratorer på et tidspunkt.,, <?php /*::: en (yii:: t ('frontend "," ikke ") ['delete", "id = > $model - > id] [" klasse "= > btn btn fare", "data" = > ["- = > yii:: t ('frontend", "er du sikker på, du ønsker at slette dette punkt på dagsordenen. ')"metoden" = > "post",]) * /?>,, at autocomplete enter indgivelse, som jeg var ved at bygge nogle af de html5 geolokalisering og google steder autocomplete kode, der var et par fejl dukker op, nogle i forbindelse med javascript.,, hvis du for eksempel tryk enter, efter at skrive i autocomplete område, google forelægger form.vi har brug for til at tilsidesætte dette.,, i vores create_place.js, tilføjer vi en vigtig handling for at standse den form for at indgive:,, funktion setuplisteners() (//...var place_input = dokument. getelementbyid ('place-searchbox) google. kort. begivenhed. adddomlistener (place_input, keydown, funktion (e) (hvis (e.keycode = = 13) (f. preventdefault();}})}, nu da du slog ind, så vil du se kortet på side og være i stand til at redigere resten af form, inden de indgiver.,,,,, revision af fordelene ved at anvende en ramme, en masse mennesker tror, folkesundhedsprogrammet er et mindre alvorligt, eller som kan platform at bygge videre på.for mig, facebook succes med folkesundhedsprogrammet har altid vist dem forkert.  , mange mennesker har ikke hørt om   yii ramme   eller afskedige værdien af rammer.  , kort i denne nystartede serie, vi allerede har nydt godt af et stort antal yii ramme træk hurtigere udvikling, med en ren arkitektur og kvalitet - kode:,, mvc arkitektur, database, migration, aktive rekord model forbindelser og validering, elektronisk kode generation bootstrap integration og glyphicons, adgangskontrol filtre, en adfærd, internationalisering, og det er grunden til, at jeg er en stor fortaler for yii rammer.det har gjort mig til en meget mere effektiv entreprenør, der kan levere løsninger meget hurtigere, end jeg ville med vanilje folkesundhedsprogrammet.

Final product image
Meeting Planner Login Page
Meeting Planner Yii2 Gii Model Generator User Place
Meeting Planner Breadcrumbs
Bootstrap Dropdown Menu in Meeting Planner
Meeting Planner Place Index Page with Delete Action
Meeting Planner Update with Delete button
Create a Place from Google Places



Previous:
Next Page: