[Seminar] [Kohana: En Let PHP Framework] [Brandon Liu] [Harvard University] [Dette er CS50.] [CS50.TV] Hej alle. Mit navn er Brandon. Jeg er en junior her på kollegiet gør datalogi, og i dag vil vi tale om Kohana, som er et PHP web udvikling rammer. I dag bliver en levende kodning seminar, så jeg dybest set kommer til at bruge 5-10 minutter forklarer, hvad Kohana er, og så vil jeg bogstaveligt talt kommer til at bygge en super simpel blog for dig lige her bogstaveligt fra bunden. Vi kommer til at hente koden fra Kohana hjemmeside, og vi kommer til at begynde at bygge en blog, og forhåbentlig vil det være meget lærerigt, fordi du vil se måske måske jeg vil lave nogle fejl, og du vil se mig komme fra dem, eller du vil se min tanke proces som jeg opbygge gennem denne blog, og i mellemtiden, vil du også blive fortrolig med ramme i sig selv. Forhåbentlig vil det være en meget lærerig øvelse. Først, hvad der præcist er en ramme? Hvis du har taget CS50 hidtil, har du ikke rigtig har arbejdet med nogen rammer endnu, og de ting er dette. Du har sikkert gjort 1 webudvikling PSET allerede og lad os sige, du fortsætter med at bygge websites og holde opbygning af hjemmesider. Du vil begynde at lægge mærke til et par ting. Den første ting du vil bemærke er, at du sandsynligvis laver de samme ting igen og igen hele tiden, ting som rengøring brugerdata input data, ting som at organisere dine filer på en bestemt måde. Den anden ting du vil sandsynligvis også bemærke er, at din kode kan begynde at blive meget, meget rodet, og du kan lade det rodet og bare have en meget hård tid på at vedligeholde det, eller du kan begynde at strukturere din kode og gøre det modulære på bestemte måder at gøre det lettere at vedligeholde. Det er her, web rammer stort set kom i. Disse mennesker, der havde bygget en masse hjemmesider, sagde de, "Vi behøver ikke at gentage det hver eneste gang vi opbygge en hjemmeside." "Hvorfor gør vi ikke bare lave en pakke, der gør alle disse ting for dig hver eneste gang, du ønsker at opbygge en hjemmeside? " Og så når du laver en ny hjemmeside, du bare fokusere på, hvad netop denne særlige hjemmeside handler om. Du behøver ikke at gentage alle de forskellige konfiguration og adskillelse af koder og omskrive kode at du ofte nødt til at gøre, når man laver hjemmesider. Ideen er, at en ramme tillader dig at skrive et højere niveau kode uden at skulle bekymre sig om detaljer på lavere niveau. Et lavere niveau detalje kunne være noget lignende beskæftiger sig med rengøring brugerens inddata. Det er noget, du burde egentlig ikke behøver at bekymre sig om. Du bør fokusere på, hvad din web-fordeling er faktisk om. Det eliminerer en masse standardteksten kode. Det er en arkitektur for dit projekt. Den mest populære ville være Model-View-Controller, som jeg har tænkt mig at tale om i en anden. Og en masse gange disse rammer legemliggøre et sæt procedurer, regler og bedste praksis for dig at bruge så når man vedtager web rammer du skal skrive din kode på en bestemt måde, og det er generelt en aftalt sæt principper af det samfund, der er almindeligt accepteret at være en god måde at skrive kode. Det gør din kode mere vedligeholdelsesvenlig, mere brugbart, så videre og så videre. Og endelig, de ting jeg ønsker at understrege om rammer versus bibliotekerne er denne idé om inversion af kontrol, og de ting er dette. Forskellen mellem et bibliotek og en ramme er, at med et bibliotek er du stadig skriver hovedprogrammet, og du slags påberåber biblioteket og som opfordrer biblioteket til at gøre noget for dig. Forskellen mellem et bibliotek og en ramme er, at de rammer starter ud med den kontrol, og det påberåber din kode, så du kan tænke på det som - det er derfor, det hedder en ramme - rammerne giver denne ramme og struktur for din kode, og du udfylde hullerne, og det vil fremgå mere tydeligt i en anden når du ser mig begynde at skrive kode i led. Du vil se, at jeg udfylde hullerne, og rammerne er slags kontrollere alle de bevægelige dele, og jeg er nødt til at sætte brikkerne på de rigtige steder. I dag vil vi tale om Kohana, som er en af ​​mange PHP rammer. Der er web rammer, og der er dem i stort set hver eneste sprog, og jeg plukke Kohana fordi Kohana er velsagtens og almindeligt anerkendt som den nemmeste PHP ramme til at samle op. Det er den mest letvægt. Der er andre derude, der kommer med mange, mange flere funktioner, men de har tendens til at være sværere at samle op. Og endelig bruger Kohana MVC arkitektur. Det er let nok, at vi bogstaveligt talt kan bygge et projekt lige her lige foran dine øjne, og du kan temmelig meget følge med temmelig nemt. Hvad er MVC arkitekturen? Det står for Model-View-Controller, og måske hvis du tænker over den kode, du har skrevet hidtil for nogle af dine web-udvikling psets du kan være i stand til at se nogle af dette, men som regel, når du begynder at skrive en mere kompleks webapplikation, opdelingen mellem disse 3 segmenter bliver mere og mere tydeligt. Jeg lagde ud MVC her slags som en stak, og ofte vil du høre folk tale om stakke i webudvikling, og det er at illustrere idéen om, at hvert lag, hver komponent virkelig forsøger at kun kommunikere mellem 2 andre komponenter. Nogen adgang til din hjemmeside som en klient eller en browser. De interagerer med dit program gennem visningen kode. Udsigten kode interagerer med controlleren. Styringen interagerer med den model, og modellen interagerer med SQL-database. Og der er ingen hopping i mellem, hvis du skriver din kode ordentligt. Hvad har disse ting at gøre? Modellen væsentlige er det stykke kode, der beskæftiger sig med dine data. Alt, hvad der beskæftiger sig med din database, med de objekter, som du gemmer, eller hente disse objekter i databasen, Det er alt håndteres af modellen. Måske har du objekter i databasen. Vi kommer til at skabe en model, der har at gøre med indlæg, så et indlæg kan have nogle attributter til det. Du har måske funktioner omkring opbevaring af disse stillinger eller hentning af poster eller filtrering af stillinger og så videre og så videre, og det er alt den kode, der er håndteret af modellen. Styringen er en slags af ansøgningen logik, og en masse forskellige ting kan gå i ansøgningen logik. Hvis du taler med en anden API, der kan være, hvor du beskæftiger sig med ansøgningen logik. Hvis du forsøger at få til at bringe i data fra flere forskellige modeller og er nødt til at kombinere dem på nogen måde, der ofte kan håndteres af controlleren. For eksempel, på Facebook, hvis du ven nogen, så måske denne retsakt godtgøre, at forholdet kan ske ved hjælp af kontrolleren. Og endelig, udsigten er den kode, der er at generere hvad du faktisk ser. En masse gange jeg tror i CS50 psets de ikke virkelig opfordre jer til at adskille disse 3 ting. Du vil sandsynligvis have denne store, lang fil, hvor i toppen du lave nogle SQL-forespørgsel, og måske gøre nogle behandling på de data, du har hentet fra databasen, og så har du alle dine HTML nederst. Og du kan opleve, at når du opretter flere og flere sider at du kommer til at have noget kode gentagelser, og også, de ting er din fil bliver rigtig stor og lang og bliver uhåndterligt at administrere. Grunden MVC er så godt betragtes er af en række årsager. Den første ting er noget, der hedder adskillelse af bekymringer hvilket er den idé, at når du har - ideelt set 1 stykke kode skal gøre 1 ting og gøre det rigtig godt, og du bør ikke kombinere stykker kode, der gør forskellige ting. For eksempel se koden og model kode, de behøver ikke virkelig nødt til at være relateret. De behøver ikke at være i de samme filer, så når du kan, skille dem ud så det er let at vedligeholde. Den anden ting er genbrug af kode. Du kan finde dig selv skrive den samme SQL-forespørgsel eller laver lignende forespørgsler, der kan indvindes i 1 funktion, og det er ideen bag modeller og controllere, have det i en særskilt funktion, som du kan genbruge i forskellige steder i dit projekt. Og endelig, der er bundet til tørring din kode, eller ikke gentage dig selv, ikke gentage dig selv. Dette er meget forståeligt i udvikling. Når du kan, så du ikke ønsker at gentage dig selv, fordi hvis du gentager dig selv,  det er meget dyrere at vedligeholde. Hvis du ønsker at ændre 1 ting, du nødt til at ændre det overalt, og det fører til fejl, og det er forfærdeligt. Okay. Eventuelle spørgsmål, så langt om Kohana overhovedet? Store. Nu skal vi til at dykke ned i live kodning session og forhåbentlig alt går godt. Jeg vil stort set bygge denne hjemmeside på en af ​​mine fjerntliggende servere, og på den måde du fyre kan også se hjemmesiden og få adgang til hjemmesiden, og også miljøet er bedre konfigureret end min fjernbetjening maskine, fordi det kører Linux i stedet for OS X. Vi bogstaveligt talt kommer til at starte. KohanaFramework.org. Jeg har tænkt mig at hente koden fra hjemmesiden. Jeg har tænkt mig at kopiere linket adresse, gå til min server, så download den, og jeg har tænkt mig at pakke den ud. [Studerende] Hvad er det største, du kan gøre teksten? [Brandon Liu] Er det bedre? [Studerende] Er det doable? [Brandon Liu] Ja, det er fint. Jeg har hentet en ZIP-fil og lynede det i en mappe kaldet Kohana, og vi kommer til at omdøbe det CS50-Kohana, og lad os gå i. Awesome. Her kan du se en masse forskellige filer. De fleste af jer kan ignorere - vi er klar ikke kommer til at gå igennem hver enkelt fil, der er i her på grund af vores tidsbegrænsninger, men generelt, når du installerer Kohana, den første ting du gør er du gå til den mappe, og du vil stort set gøre nogle miljø tests og whatnot for at sikre dit miljø er korrekt indstillet til at køre Kohana og sørg for, at alt er i orden. Du kan se de fleste ting passerede, men generelt du altid løbe ind i dette problem 1 hvor det klager over, at nogle mappe er ikke skrivbar, og det er på grund af nogle tilladelser. Jeg ved ikke, hvor meget du fyre har lært om filrettigheder i CS50, men hvis du gør webudvikling, er du nødt til at løbe ind i dette spørgsmål en masse. Jeg har tænkt mig at gøre det skrivbar og jeg tror jeg også nødt til - der vi går. Okay, så nu kan du se alt gik, og nu vil den fortælle dig at omdøbe install.php fil. Jeg har tænkt mig at flytte install.php fil til installed.php, og nu, hvis jeg opdatere, det giver mig nogle fejl, og det er her, debugging kommer i. Dette er, hvor du kan se, hvad der rent faktisk kommer til at ske. Sagen er, som standard, Kohana antager, at dit projekt er i rodmappen på dit domæne, så det forventer du at være på demo.brandonkliu.com. Vi er nødt til at fortælle det, at det faktisk i en undermappe. Det er i en undermappe kaldet CS50 Kohana. Sagen er den, det er fejlfortolke CS50-Kohana som noget andet, som jeg vil forklare dig i en anden. Men jeg skal fortælle dig, det er noget, der kan forventes. Hvad vi vil gøre, er at vi kommer til at gå ind i denne mappe kaldet bootstrap.php, der er konfigurationen mappe, hvor en masse forskellige ting er sat op. Jeg åbner det op. Så måske en af ​​de første ting, jeg vil gøre, er at ændre tidszonen. Og lad så se. Aha! Lige her. Der er en masse forskellige konfiguration ordsprog i her, men det jeg leder efter, er denne ting kaldet basis-URL, og som standard jeg får det sat til Kohana, men jeg har tænkt mig at ændre det til CS50-Kohana, og jeg tror, ​​at skulle ordne det. Ja, stor. Som standard, at se, at det virker, det siger, "Hello World". Hvor kom det fra? Hvordan kom vi til Hello World? Hvor præcis er den kode, der rent faktisk skrev, at? For at forstå det, vil jeg præsentere dette koncept kaldet routing. Stort set alle web rammer har begrebet kaldes routing, som er det stykke af software, der vil kortlægge en bestemt URL til et bestemt stykke kode i din ramme. For eksempel, hvis du har nogle URL, og du går til nogle URL ligesom foo.com / blog / all så hvad rammerne kommer til at gøre - eller i det mindste hvad Kohana kommer til at gøre - det kommer til at finde en klasse kaldet controller blog, og det kommer til at køre funktion med navnet handling alle. Jeg ved, jeg taler om klasse og funktioner, og jeg ved, du fyre har ikke dækket klasser og funktioner i CS50 endnu, men for nu, du kan tænke på klasser som bare en gruppe af funktioner, en måde at gruppere funktioner sammen. Det er virkelig alt hvad du behøver at vide. Nu, hvis vi ser på vores mappestruktur, inde i programmet mappe er der en anden mappe kaldet klasser, og de andre mapper kaldes Controller og model. Hvis du kigger i mappen Controller, vi se, at der er en fil kaldet Velkommen, og du kan se her er en klasse kaldet Controller Velkommen, og der er en funktion kaldet Action Index, og hvad det gør, er det sætter kroppen af ​​dit svar til Hello World. Det er, hvor koden bliver skrevet. Det andet spørgsmål er, godt, jeg ikke gå til blah, blah, blah, / welcome / indeks. Hvordan gjorde jeg ender her? Tja, det er simpelthen fordi her i bunden af ​​vores bootstrap fil hvor vi sætter vores ruter du kan se, at de sætter nogle standardindstillinger for dig. Standarden controller er Velkommen. Standardhandlingen er Index. Det er derfor, når vi sætter noget i der det automatisk gik til Welcome controller og indekset aktion. Alt mening hidtil? Nu kan du gøre mere end blot at gå til Controller og en bestemt handling. Du kan også passere i parametre til controlleren. Blot som eksempel, Jeg har tænkt mig at tilføje en anden handling til denne controller til at vise dig. Lad os kalde denne handling Echo, fordi det kommer til at fortælle dig, hvad du giver det, og så jeg dybest set kommer til at få fat i en parameter, der kommer til at blive sendt igennem mig til routing-program, og som du kan se her, denne linje lige her, kan du se, at dette dybest set betyder, at du har controller, og du har en /, og du har handling, og du har en anden /, og det kommer til at være parametre, og fordi vi har dette navn id inden vinkelbeslag, der betyder, at vi navngivning denne parameter-ID. Senere i min controller kode, hvis jeg ønsker at gribe fat i denne parameter, Jeg kan bruge den kode jeg skrev, finde parameteren hedder id. Det er, hvad jeg gjorde her, og jeg har tænkt mig at vende tilbage og sige, "Du sagde," at. Og så nu, hvis jeg går til vores hjemmeside, Jeg går til cs50-kohana/welcome/echo/Helloooo-- Åh, det er rigtigt. Der er 1 skridt jeg udeladt. Dette er en del af den levende kodning idé. Her er 1 ting. Lad os se. Så normalt som standard med en masse af disse web-applikationer du er nødt til at medtage denne index.php ting i din webadresse, fordi ideen er index.php er en slags indgang af din ansøgning, men selvfølgelig, det er lidt irriterende at have. Du ønsker ikke at have index.php vises i din webadresse, og stort set alle web rammer ud af kassen har dette index.php problem, og så er du nødt til at træffe nogle foranstaltninger for at være i stand til at fjerne det. Og så i dette tilfælde, hvad vi vil gøre, er at vi kommer til at bruge en fil kaldet. htaccess, og det er noget, der er specifikke for Apache webserver, og det kan gøre ting som omskrivning URL'er og omdirigeringswebadresser og så videre og så videre, og Kohana er rart nok til at give en skabelon. htaccess fil, som vi kan bruge. Som du kan se, er der en fil der hedder example.htaccess, og vi kommer til at kopiere det til. htaccess. Jeg har tænkt mig at åbne denne og redigere den, og dybest set det gør en masse forskellige ting. Nøglen linje, du måske ønsker at se på, er lige her. Ideen er, at dette opstiller en regel, der siger, "Okay, hvad du skriver i, prepend index.php til det." Du kan se, at. Den. * Står for noget, der passer til noget, og derefter den anden del er index.php / $ 0, og $ 0 indebærer uanset blev matchet tidligere. Giver det mening? Men de virkelig centrale ting jeg ønsker at ændre, er at ændre denne omskrivning base, som er URL base. Den slags antager hvor du arbejder fra. Jeg har tænkt mig at tilføje CS50 Kohana til det, og på den måde nu, hvis jeg fjerner index.php, det bør arbejde, og jeg har tænkt mig at tilføje nogle tal at vise, at det rent faktisk virkede. Lyder godt. Eventuelle spørgsmål indtil videre? [Studerende] Hvordan gik det vide for at gøre de 123? Er det et argument? Præcis. Du kan tænke på det ligesom et argument. Men den underlige ting er dog, at den måde Kohana gør det er, at de ikke gør det præcis som et argument. Du er nødt til at få fat i det på denne måde. Du er nødt til at få fat i objektet anmodning og bede om den parameter, er opkaldt id, og det navn id stammer fra at bootstrap fil at jeg viste tidligere, og navnet id var i disse vinkelbeslag, og det er hvordan du fat i disse parametre. Awesome. Andre spørgsmål? Som jeg sagde, controllere, de håndterer ansøgning logik, så det er 1 tilfælde, hvor du kan se that - Det er meget grundlæggende, men det er stadig ansøgning logik, tanken om at snuppe den parameter, og skabe en ny streng der siger: "Du sagde bla," og derefter spytte det tilbage til dig. Og generelt, hvad du gør, er du oprette forskellige controllere. Du opretter separate controllere til forskellige dele af din hjemmeside. I dag vil vi lave en meget simpel hjemmeside, og det kommer til at være en meget grundlæggende blog. Vi kommer til at lave en ny controller bare for stillingerne i en blog. Men så hvis jeg skulle også tilføje kommentarer til blog-indlæg, så ville jeg sikkert gerne lave en ny controller til disse bemærkninger. Hvis jeg ønskede at tilføje brugere, ville jeg nok tilføje en ny controller til disse brugere, og i almindelighed, er ideen, at når du har en ny model, en ny data objekt, som du har med at gøre, du har en enkelt controller til at data objekt. I dag er vi kun kommer til at arbejde med 1 data objekt, og det kommer til at være indlæg, og også du kan tænke på dataobjekter som svarende til tabeller. Generelt hver tabel svarer til 1 type data objekt, så stillingen bordet vil have 1 indlæg model, som vil have en postkontrollør der svarer til den, og det samme for kommentarer, det samme for brugerne, og så videre og så videre. Og det er en generel tommelfingerregel. Der vil være særlige tilfælde, hvor du kan afvige fra det, men 90% af den tid, der er, hvad du vil gøre, og jeg vil vise dig det er, hvad vi vil gøre i dag. 1 mere begreb før vi dykker tilbage i koden, denne idé om objekt relationelle kortlægning. Gutter har allerede gjort en web-udvikling PSET, og du har set, at du laver en SQL-forespørgsel, og hvad det vender tilbage til dig er rækker. Du får disse rækker, og du indeksere dem af nogle navn, navnet på søjlen og bordet, og det er, hvordan du arbejder med det, og det kan være lidt besværlig. Men desuden, hvis du har relationer i databasen, som for eksempel hvis jeg har kommentarer og indlæg, så måske jeg ønsker at få fat moderselskabet stillingen en kommentar. Hvis jeg bruger bare rækker i SQL, så kan jeg kun få er ID- af moderselskabet post og ikke den faktiske stilling selv. Men når vi kodning, hvad vi egentlig ønsker, er rent faktisk at få fat i  moderselskabet bogføre selv nogle gange. Hvad objekt relationelle kortlægning gør, er det tager resultaterne af databaseforespørgslen og sætter det ind i objekter for dig, som er meget pænere at arbejde med end almindeligt arrays og rækker. For eksempel nu hvor jeg har en kommentar måske, og jeg ønsker at få fat sit moderselskab indlæg, og jeg kan måske kommentere pil indlæg, så vil det faktisk give mig stillingen objekt svarer til de faktiske forælder posten ikke blot nogle id, som jeg ellers ville have til at bruge og gøre en anden SQL-forespørgsel til at få fat i stillingen, som er besværlig og unødvendig. Og desuden, ved at kortlægge alle disse datarækker i genstande, Du kan også vedhæfte flere funktioner til objekter, så for eksempel, jeg talte om, hvordan klasser er hovedsagelig grupperinger af funktioner. Du kan tænke på det på den måde. For eksempel, måske har jeg dette indlæg objekt, og måske vil jeg gerne have en form for funktion knyttet til det der dybest set fortæller mig blev det for nylig sendt? Var det bogført inden for den sidste uge, sandt eller falsk? Og det er en funktion, jeg kan vedhæfte på dette formål, og det er virkelig praktisk at have det på samme sted, og der er et væld af forskellige funktioner, du kan oprette for disse objekter, og det er virkelig rart at være i stand til at knytte det til en klasse, til et objekt, hvorimod hvis du lige har haft rækker, der kommer fra din database, så kan du ikke rigtig vedhæfte noget funktionalitet til det. Det er bogstavelig talt lige data. Eventuelle spørgsmål om det overhovedet? ORMs er meget almindelige web-udvikling, og der er en masse forskellige typer af ORMs, og Kohana har sin egen ORM. Det er meget grundlæggende, men du får en forsmag på, hvad det ligner. Lad os skabe en model for vores blogindlæg, og den første ting, vi selvfølgelig nødt til at gøre, er at skabe en egentlig tabel inden for vores database til rent faktisk at gemme vores data for disse stillinger. Den første ting, jeg har tænkt mig at gøre, er at gå til phpMyAdmin. Har du fyre brugte phpMyAdmin før? Okay, awesome, så du fyre allerede ved, hvad det er, og jeg har tænkt mig at oprette en ny tabel kaldet Kohana Indlæg, og det kommer til at være meget simpelt. Jeg bliver nødt til at logge ind igen Alt, hvad vi kommer til at gøre i dag er at have en forfatter og en krop, bare holde det simpelt. Jeg har tænkt mig at oprette denne tabel, og nu skal vi bare have en tabel, der repræsenterer vores indlæg med 2 felter for vores forfatter og vores krop. Den anden ting, jeg vil gøre nu, er konfigurere min web-applikation, så den ved, hvordan man opretter forbindelse til databasen, og dette igen, er noget, du bliver nødt til at gøre med alle web-applikationer. Du er nødt til at fortælle det brugernavn og password og navnet på databasen, og så videre og så videre at regne ud, hvordan man rent faktisk forbindelse til din database. I Kohana, vi har noget, der hedder en database modul, og i mappen konfiguration, vi har denne mappe kaldet Database, og som du kan se, er der en masse indstillinger, du nødt til at indstille her at fortælle det, hvad er brugernavn og password for databasen, så jeg kan faktisk forbindelse til det. Og da jeg ikke vil have jer til rent faktisk at vide brugernavn og adgangskode på min database, Jeg har en fil, hvor jeg allerede sætte det hele op, og jeg har tænkt mig at kopiere og indsætte det over. Awesome. Okay. Jeg tror, ​​det er al den konfiguration jeg har brug for at gøre, men lad os se. Vi arbejder på det, og hvis noget går ned, så vil vi ordne det. Nu, hvad jeg har tænkt mig at gøre, er at jeg har tænkt mig at oprette en ny controller. Eller faktisk, undskyld. Først vil jeg nødt til at oprette en ny model. Jeg vil oprette en ny model kaldet Post.php, og hvad vi vil gøre, er at vi vil kalde det klasse Model_Post. Få nogle syntaks fremhæve på, og så når jeg siger, "udvider ORM," det er dybest set nogle mere objektorienteret programmering, som desværre gutter har ikke lært i CS50 endnu, men det er ret nemt at samle op. Det giver mig alt dette ekstra funktionalitet, der kommer i denne ORM pakke, og så får jeg en masse ekstra funktioner og whatnot gratis, som du vil se lidt af i en anden. Lige nu faktisk alt hvad jeg behøver at gøre er at oprette denne klasse. Jeg behøver ikke engang at gøre nogen funktion eller noget, men jeg har oprettet en klasse, der repræsenterer tabellen, og fordi jeg har udvidet denne ORM klasse, Jeg får en masse ting gratis, så for nu du ikke behøver at sætte noget mere op. Og nu, hvad jeg har tænkt mig at gøre, er at jeg har tænkt mig at oprette en ny controller, som jeg har tænkt mig at nævne blog.php, og jeg har tænkt mig at kopiere over Welcome controller så jeg ikke behøver at genindtaste nogle ting, og nu er jeg nødt til at omdøbe dette. Nu, hvad jeg har tænkt mig at gøre for at teste for at sikre, at alt fungerer ud, Jeg har tænkt mig at få fat i det første indlæg fra min database og udskrive kroppen af ​​stillingen på skærmen. For at gøre dette, hvad jeg har tænkt mig at gøre først er jeg har tænkt mig at spare de stillinger til en variabel, så hvad vi vil gøre, er - i Kohana hvad du skal gøre er at få fat i stillingen objekt Det er lidt besværligt, men du er nødt til at gøre dette kaldes ORM :: fabrik, og så skal du passere i navnet på den model, du ønsker, og den returnerer ORM objekt, der repræsenterer den model. Og så, som jeg sagde, da vi udvider ORM objekt, vi får alle disse metoder for gratis, så for eksempel, vi får denne nye funktion kaldet "find all" der automatisk tilbage hver eneste indlæg i databasen, der er temmelig praktisk. Og nu i kroppen, jeg har tænkt mig at vende tilbage det første indlæg og returnere sin krop. Og selvfølgelig, jeg har brug for at oprette et indlæg, så lad os indsætte et nyt indlæg. Jeg vil sige, "Brandon, min allerførste indlæg." Awesome. Og nu vil vi gå til blogs og hvis alt fungerer godt - Åh, det er nogle andre dumme fil tilladelse ting igen. Hold på 1 sekund. Det er lidt absurd. Der vi går. Okay. Jeg fast, at tilladelse problem. Det forsøgte at skabe nogle filer og nogle log, og tilladelserne, igen, var ikke indstillet korrekt, så jeg gjorde det så disse filer var skrivbar og eksekverbare så det kunne faktisk logge på ting. Nu er det at give mig en anden undtagelse siger, "klasse ORM ikke fundet" og det er fordi jeg har glemt endnu et skridt. Det er for dårligt. I bootstrap mappe fil, der er disse moduler her, som du kan vælge at aktivere eller deaktivere. Disse er en masse forskellige funktioner, som du kan vælge at bruge inden Kohana, som er en slags rart. For eksempel har de en autentificeringsmodul som du kan bruge til at godkende brugere. De har en caching modulet, hvis du ønsker at gennemføre en slags caching tilbage ende at gøre anvendelsen arbejde hurtigere og whatnot. Vi er nødt til at aktivere databasen og ORM-modulet, fordi som jeg sagde, bruger vi databasen, naturligvis, og vi er også nødt til at aktivere ORM-modul, fordi vi gerne vil have den ekstra funktionalitet, som er rart at have. Alt, hvad jeg skal gøre er at udkommentere disse 2 linjer og nu, hvis jeg opdaterer, det gav mig en anden fejl. Den siger, "Class Model_Post ikke fundet." Nu er det en god problem at have. Lad os se. Gør det offentlige. Nej Hold ud. Åh, kære. Jeg ved ikke, hvorfor det ikke er i stand til at finde det. Det er virkelig mærkeligt. Jeg har denne klasse lige her. Jeg tror, ​​jeg måske nødt til - oh. Jeg er så dum. Jeg glemte at tilføje en PHP tag. Det er derfor. Nu er jeg nødt til at fortryde, at 1 ændring, jeg lige gjorde. Okay. Der vi går. Det var virkelig dumt. Jeg havde ikke en åbning PHP tag. Men som du kan se, nu er det fungerer korrekt, ikke? Vi har 1 indlæg. Vi greb det første indlæg, og nu har vi udskrives sin krop. Store. Fantastic. Eventuelle spørgsmål, så vidt? Nope? Eventuelle spørgsmål? Okay, så vi lige har oprettet stillingen model, meget grundlæggende, og vi kommer til at tilføje nogle funktioner senere. Vi kan tilføje valideringer og filtrering. Valideringer er en af ​​de ting, at rammer løse for dig virkelig, virkelig godt, og jeg tror ikke, du fyre havde at gøre dette til din CS50 PSET, men hvis du gør webudvikling for dit afgangsprojekt, du sandsynligvis vil ønsker at gøre en form for validering, som ikke at have tomme brugernavne, måske have en adgangskode med mindst nogle længde, ting som. Og det er virkelig besværligt at gennemføre disse ting ved os selv, og stort set hver eneste web-rammer gør det for dig og tillader dig at gøre det i en meget ren måde. Og modellen er, hvor du generelt udtrykke disse valideringsregler, fordi det er validering, hvorvidt en model er gyldig eller ej. Men for nu, vi kommer til at sætte det til senere, og for nu vil vi til at arbejde på en anden del, og vi vil forsøge at gøre et nyt syn der viser alle de stillinger. De involverede i at gøre en ny indsats for en liste over alle de stillinger trin er at få fat i en liste over alle de stillinger og derefter gøre liste over alle de stillinger gennem en visning. Lige her, heldigvis nok, vi allerede grebet alle de stillinger, ved brug af denne linje, finde alle funktion, og nu, hvad vi vil gøre, er så langt Jeg har været direkte indstille kroppen af ​​svar ved at føre streng, men nu vil jeg bruge en visning, og forskellen mellem en visning og bare gør det er med henblik på, jeg kan få en dejlig, stor HTML skabelon og hvad jeg kan gøre, er at give det bestemte variabler og så har det synspunkt automatisk udfylde sin skabelon bruge disse variabler. Hvad jeg vil gøre, er at jeg vil oprette en ny visning, og jeg vil nævne visningen noget lignende "blog / index" og jeg har tænkt mig at stort set binde det - åh, hvad jeg skriver? Min hjerne er et andet sted. Jeg har tænkt mig at binde de stillinger variabel til visning, så på den måde visningen har adgang til dette indlæg variabel. Og så nu har jeg brug for at skabe denne opfattelse, så her har vi denne mappe kaldet "synspunkter", og først, jeg har tænkt mig at oprette en ny mappe under det såkaldte "blog". Det er rart. På den måde kan vi få en dejlig hierarki for vores synspunkter. Og så har jeg tænkt mig at oprette en anden fil i der hedder "index.php". Awesome. Faktisk, lad os få dem begge her. Realiseringen af ​​et view fil er formentlig den enkleste del af alt dette, og disse er sikkert ting, du allerede er bekendt med. Vi kommer til at gøre noget virkelig simpelt, begynde at sige, "Min liste over blogindlæg." Så kan vi gå igennem, og vi kan gentage gennem indlæg array, Grib hver enkelt post og sige noget lignende - måske tilføje en linje og derefter udskrive forfatteren og kroppen. Det giver mening hidtil? Og lad os se om det virker. Intet skete. Jeg spekulerer på, hvorfor. Åh, jeg savnede 1 trin. Meget dumt af mig. Jeg har oprettet en visning, men jeg havde ikke indstille visningen som svar, så du er nødt til at gøre 1 ting mere. Du er nødt til at gøre "dette svar krop" og sæt den til at være visningen. Der vi går. Vi har vores overskrift, og så har vi en stilling, og bare for sjov, lad os indsætte en anden stilling så vi kan se en liste. Og indsætte disse 2 stillinger, og nu, hvis jeg opdatere siden, vi se alle disse indlæg her. Betyder det mening hidtil? Ja, et spørgsmål? Åh, okay. Som du kan se, har vi været i stand til at adskille alle disse koder ud i forskellige sektioner, og derefter kan du se, det er mest tydeligt med visningen kode. Denne fil her, der repræsenterer den opfattelse, det kun bekymrer sig om repræsentere data, visning af data. Det bliver bestået en form for data, og alt det gør, er bare vise det til dig. I alle andre dele af din kode, vil du ikke behøver at bekymre sig om noget af det, og på samme måde, din mening koden ikke behøver at bekymre dig noget om hvordan du får adgang til databasen og så videre og så videre, som er virkelig god og gør din kode meget mere vedligeholdelsesvenlig. Som jeg sagde, synspunkter, de er dynamisk i, at det er 1 fil, men det ville generere forskellige synspunkter baseret på de variabler, du faktisk passere i, og desuden er der en masse forskellige hjælpefunktioner som du kan bruge til at hjælpe dig med at skrive din kode hurtigere, som jeg vil vise dig på bare et sekund. Ja. [Studerende] Så $ 0 er en controller, right? Denne anden ting. Spørgsmålet er er $ 0 a controller? 0 $ er en variabel jeg oprettet lige her. Jeg har oprettet en visning først. Jeg er tildelt det til nogle variabel. Så jeg gik den ind i denne funktion, skal du indstille den som selve svaret. Giver det mening? [Studerende] Så er udsigt :: fabrik, er visning som en klasse eller et bibliotek [uhørligt] fabrikken funktion? Spørgsmålet er, om visningen :: fabrik funktion, og dybest set er det nogle mere objektorienteret programmering væsentlige. View er udsigten klasse, og det har en metode kaldet "Factory" og det er en måde at få fat i det objekt, der er navnet "blog / index". Og det er noget mere objektorienteret programmering stuff at jeg ikke har tænkt mig at gå ind i her for meget. Nu selvfølgelig ønsker vi at skabe nye stillinger men vi ønsker ikke at have at gøre det via en database, så vi kommer til at oprette en ny handling for at skabe et nyt indlæg, og der er en masse ting, vi er nødt til at gøre. Den første ting, vi vil gøre - så lad os tackle disse ting én efter én. Det første, vi vil gøre, er vi nødt til at oprette en formular til at indsætte et nyt indlæg, men jeg vil også tilføje en ny aktion først, så tilføje en ny handling er lige så let som tilføje en ny funktion med din controller, og nu vil jeg til at gøre noget meget grundlæggende, bare snuppe denne opfattelse, og sende det, bare vise det for dig. Og så nu jeg har tænkt mig at oprette en ny visning fil, og jeg har tænkt mig at begynde at skrive nogle ting. Hvad er rart om Kohana er, at de giver en masse forskellige hjælpefunktioner for dig at skrive view kode lettere og 1 af disse hjælpefunktioner eller hjælperceller moduler er omkring at skrive formularer. For at skrive formularer, jeg ikke virkelig nødt til direkte at skrive noget HTML selv. I gutter har skrevet HTML-formularer. Du ved, hvordan det kan være virkelig, virkelig smertefuldt og besværligt at skrive formularer. Det er ikke sjovt, så heldigvis Vi kan stort set skrive en formular ved hjælp Kohana s danne hjælperfunktioner at gøre det for os. Vi kommer til at dybest set har felter for hver enkelt ting, vi har, så man for forfattere og én for de organer. Vi kommer til at have en etiket, og vi kommer til at have en indgang. Og så endelig, vi kommer til at have et manuskript. Og som du kan se, det er meget renere at skrive end alt det rodet HTML, som er form for nice. Givet, er der andre web-rammer, der har det endnu renere end det, men i det mindste er det bedre end at skrive HTML selv. Awesome, så dette er hvad du ser. Det er lidt rodet, så jeg har tænkt mig at tilføje et linjeskift der for at gøre det ser lidt pænere. Nå, selvfølgelig, det stadig ser virkelig, virkelig dårlig, men vi kun fokuseret på funktionaliteten for nu og ikke på æstetik. Ingen tid til at gøre alt. Og som du kan se, nu har vi en super grundform, som er form for nice. Denne kode vil jeg sige er renere end at forsøge at skrive en HTML-formular selv, så det er rart. Hvad er det næste? Nu er vi nødt til at gøre ting med handlingen. Normalt når du skriver HTML-formularer, du nødt til at fortælle det, når det kommer til at sende formularen til. Som standard i de fleste web rammer, den forelægger nøjagtig samme webadresse, så de ting er, hvis du sender en get anmodning til / blog / nyt, det skal vise dig den form men hvis du sender et indlæg anmodning til / blog / nyt med data, Det burde faktisk prøve at redde denne post og gøre noget med det. Hvad vi skal gøre, er dybest set alt, hvad vi skal gøre for at kontrollere, om det er en post anmodning eller en get anmodning er at kontrollere, hvad der er de indlæg variabler, du kan indstille. Og hvis stillingen variabel er sat, så vi kommer til at forsøge at skabe et nyt indlæg. Igen, vi bare gør det, og det skaber et nyt indlæg, og vi bogstaveligt kommer til at fastsætte sine områder som dette, og så vi kommer til at gemme det. Og så har jeg tænkt mig at omdirigere til indeks side, så de kan se vores liste over stillinger igen. Lad os prøve det. Jeg vil sige, "Brandon" og derefter sende post, og hvis alt går godt, som du kan se, er det omdirigeret mig til indekset siden, og hvis jeg rulle til bunden, har vi en nyindsatte indlæg. Yay! Ja, spørgsmål. [Studerende] Hvad hvis du havde indtastet præcis det samme du indtastede før? Er det tjek for at sikre, at du ikke har kopieret samme indsendelse? Være standard, nej, fordi som standard - undskyld, er spørgsmålet, hvis du indtaster i nøjagtig samme data i form og indsende det, vil det give dig mulighed for at indsætte en kopi objekt, en kopi af posten væsentlige? Lige nu, ja, det vil tillade dig at gøre det, fordi i databaser, det er helt i orden at have helt dublerede rækker, men hvis det er en bekymring, så kan du tilføje valideringer, for eksempel, at sørge for, at hvis det er præcis det samme som noget, der allerede eksisterer, så sige, at det er et ugyldigt objekt, og så kan du endda angive din fejlmeddelelse og sige, "Ugyldig fordi det eksisterer allerede" eller noget lignende. Men i dette tilfælde kunne jeg bare skabe noget eksemplarer. Lad os nu prøve at tilføje nogle valideringer. Problemet med dette lige nu, er, at Jeg kunne bogstaveligt indsende en helt blank indlæg. Jeg kan klikke på denne knap lige nu, og der går vi. Du kan ikke rigtig se det, men denne ekstra linje her angiver, at jeg bogstaveligt talt har et nyt indlæg. Det bare har en tom forfatter og en blank krop, og vi ønsker ikke at tillade folk at gøre det. Det er her, validering kommer ind Jeg kan gå til min model objekt, og nu kan jeg tilføje en ny funktion, der angiver hvad validering regler jeg bør tilføje til denne model at sørge for at det er gyldigt, eller at specificere, hvad betyder det at være en gyldig indlæg? Og jeg vil gerne sige, det er kun et gyldigt indlæg, hvis både forfatteren og krop ikke er tom, og det er hvordan du gør det i Kohana. Du opretter en ny funktion kaldet "Regler", og så du dybest set returnere et associativt array der definerer valideringsregler for dette objekt. Vi kommer til at returnere array, og så hvad vi vil gøre, er sige "forfatter", det går til et array, der går til andet array kaldet "ikke tom". Og så har jeg tænkt mig at sige "krop". Okay, og syntaksen for dette og struktur for denne ser lidt tung og lidt kompliceret. Hvis du læser dokumentationen, er det temmelig ligetil at finde ud af, Men det væsentlige er, hvad du skal gøre for at specificere nogle valideringsregler, og der er en masse forskellige regler at Kohana vil give dig gratis, ligesom du kan føje regler til at sige Det skal være mindst denne længde. Måske det skal være numerisk. Måske det skal være alfanumerisk. Måske har det at være på de fleste denne længde, så videre og så videre. Der er en masse forskellige regler, Kohana giver dig, og du kan gå på deres hjemmeside, se på dokumentation, og du kan se alle de forskellige ting, du kan gøre. Men det er alt jeg har at gøre, og lad os nu se hvad der sker hvis jeg indsende et tomt indlæg. Hvad kommer til at ske? Åh, nej, jeg får en fejl. Jeg får en validering undtagelse. Tja, det er godt. Det fortalte mig, at min model er ugyldig, men jeg ønsker ikke at vise en undtagelse til mine brugere, når de forsøger at indsende noget ugyldig, right? Jeg ønsker at give dem en form for venligere fejlmeddelelse når noget går galt. Hvad vi vil gøre, er at vi kommer til at wrap alt i en try catch løkke. Faktisk, jeg tror, ​​det er også noget, du ikke har lært endnu i CS50, fordi C programmeringssproget C, ikke har undtagelser, men næsten hver eneste andet sprog har undtagelser, så virkelig, virkelig kortvarigt, en undtagelse er noget, som et stykke kode kan smide en undtagelse, når noget går galt, men så måske nogle andre stykke kode højere op kan fange denne undtagelse og gøre noget med det. For eksempel, i dette tilfælde, det stykke kode, der forsøger at gemme en model, det validerer modellen, og hvis den siger, "Okay, denne model er ugyldig," det kommer til at smide en undtagelse, og det er lidt svarende til i C kan du returnere en -1 eller noget lignende. Og så for mig, denne funktion, min kode på et højere niveau, kan jeg forsøge at fange denne undtagelse og dybest set siger, "Okay, hvis jeg fange undtagelsen, hvad skal jeg gøre?" Eller jeg kunne vælge ikke at fange denne undtagelse og lade en højere op fange undtagelsen, eller hvis ingen fanger den, så hele programmet går ned og siger, "Noget gik galt, og jeg kunne ikke klare det." Men hvad vi gør, er du sætte et stykke kode i en try-blok, og så skal du også tilføje noget, der hedder en catch-blok, der er den slags kode, der vil forsøge at fange undtagelser, der kan opstå. Og så hvis jeg fange denne særlige undtagelse eller ugyldiggørelse undtagelse, så hvad jeg har tænkt mig at gøre, er Jeg har tænkt mig at sætte de fejl - jeg tror, ​​det er hvordan jeg gør det - og jeg har tænkt mig at sætte de fejl til nogle objekt. Og hvad så jeg har tænkt mig at gøre, er, hvis den rammer denne undtagelse, det kommer ikke til at omdirigere, og hvis det ikke omdirigere det kommer til at komme ud af, hvis blog og ramte denne blog / nyt, hvilket vil have jeg ønsker at gøre. Hvis der er en fejl, så jeg ønsker at gå tilbage til formularen og vise disse fejl. Nu, hvad jeg ønsker at gøre, er at jeg ønsker at passere i disse fejl til visningen. Okay, jeg tror jeg har den opfattelse lige her, og dybest set vil jeg vise disse fejl, hvis de findes. Før jeg skriver HTML for det, vil jeg virkelig hurtigt vise dig, hvad strukturen af ​​denne fejl variable ser ud, og det er en god praksis i almindelighed. En masse gange, du får noget tilbage fra nogle metode, en funktion i web rammer og du ved ikke, hvad den variable ser ud, så du ikke ved, hvordan man arbejder med det. Jeg har tænkt mig at bruge en print r metode til stort set printe det ud. Og som du kan se, det fortæller mig, at det er et associeret array, og du har en nøgle, forfatter point til denne streng, Forfatteren må ikke være tomme, og en anden nøgle, krop, peger på en anden streng, krop må ikke være tomme. Jeg er ligesom, okay, cool. Så kan jeg gentage gennem array og udskrive hver enkelt besked. Det er dybest set som et associativt array med en masse beskeder. Hvad jeg har tænkt mig at gøre, er at "hvis fejl" og jeg har tænkt mig at oprette en uordnet liste, og jeg har tænkt mig at gentage gennem alle de fejl. Og dette, og nu er jeg har tænkt mig at forsøge at sende det igen, og lad os se, hvad vi får. Nu får vi denne nice liste af fejl, og det er stadig temmelig grim, men det kan naturligvis være formateret til at se pæn, men den grundlæggende idé er bare i et par linjer kode, vi var i stand til at validere vores model, sørg for, at visse områder ikke var tomme og hvis noget gik galt, og derefter returnere en slags fejlmeddelelse Jeg kunne så præsentere tilbage til brugeren. Du kan også tilpasse din validering så du rent faktisk kan få en fejlmeddelelse der er mere specifik for dit program eller noget lignende. Alt, hvad der er generelt tilpasses. Desværre, vi løber tør for tid, så jeg har tænkt mig at skulle afskære live kodning session her. Der er en masse andre funktioner, som jeg ønsker at demonstrere for dig i dette eksempel. For eksempel kan du tilføje skabeloner til dit websted, så måske er der en vis form for HTML-kode, som du ønsker at anvende til hver enkelt side på dit websted, og i stedet for at indsætte som i hver enkelt visning fil, du har, hvilket naturligvis ville være en dårlig praksis, du kan stort set definere disse skabeloner, og derefter i din controller sige, "Okay, jeg bruger denne skabelon." "Er alle mine synspunkter bruge denne skabelon." Og en sidste ting, jeg vil gerne vise dig så godt at vi ikke har tid til er cross-site scripting, og dybest set tror jeg jer har sikkert set i CS50 - Jeg tror, ​​David Malan formentlig talte om, hvordan du kan som regel indsprøjte JavaScript-kode ind i - har du talt om det her? Måske? Måske ikke? Men en masse gange kan du injicere skadelig JavaScript-kode ind i en database, og hvis de ikke undslippe det ordentligt, så når de præsenterer disse data tilbage til brugeren, så kan det køre en slags tilfældig JavaScript-kode, du ikke ønsker skal ske, og jeg skulle til at demonstrere, hvordan du ville gøre det inden Kohana. Det er faktisk virkelig, virkelig nemt. Jeg kunne gøre det lige nu om 2 sekunder bogstaveligt. Alt du skal gøre, er dybest set wrap disse ting i denne ting kaldet HTML-entiteter. Og det vil automatisk slippe alle tegn korrekt og sørg for at du ikke får dette problem. [Studerende] Du stavet den første test forkert. [Brandon Liu] Åh, oops. Okay, det er alt hvad jeg havde at dele med dig i dag. Disse slides vil blive bogført, men disse er generelt de eneste ressourcer, du skal virkelig brug for at komme i gang med Kohana. Du kan gå til hjemmesiden. De har en brugervejledning, og de har også en API Explorer. Vi kan udforske alle de forskellige funktioner og hjælpefunktioner de har for dig. De har generelt nok oplysninger på hjemmesiden som du kan bruge til at komme i gang og komme i gang med Kohana. Der er ikke så mange tutorials, tror jeg, for Kohana, uden for hvad de har på hjemmesiden her, så det er nok din bedste satsning. Men hvis du ønsker at gå med web rammer og du ikke ønsker at skulle hente et nyt sprog, og du vil have noget, der er relativt let og har en let indlæringskurve, Endeligt vil jeg foreslå Kohana. Det er nok det bedste udbud til det. Den sjove ting er dog, hvis vi bruger Ruby on Rails, vi kunne have gentaget, hvad vi lige gjorde og sandsynligvis mere i under 3 minutter. Ingen joke, men at lære Ruby on Rails tager meget længere tid end det ville tage at lære Kohana. Det er dybest set dit valg på, hvad du ønsker at vælge at lære, men hvis du ønsker at komme op og køre hurtigt, Kohana er helt sikkert et meget godt valg. Nogle sidste spørgsmål, før vi ender? Ja. [Studerende] Hvordan ville vi integrerer at i en CSS ramme som du brugte, da du blev instruere? Spørgsmålet er, hvordan ville vi integrerer det med en CSS ramme? Hvad ville vi sandsynligvis gøre, er at vi ville sandsynligvis omfatte en ny mappe, hvor vi ville dumpe alle vores CSS-filer, og så ville vi også tilføje en ny skabelon. I skabelonen ville vi medtage disse CSS-filer at sikre, at de er refereres på hver enkelt side, og så når du rent faktisk skriver HTML, du blot tilføje relevante klasser og whatnot, og for eksempel, når du bruger noget som formularen hjælpefunktion, kan du tilføje flere parametre bagefter at angive, hvilke klasser du ønsker at være knyttet til forskellige ting så de kunne style det ordentligt, og det er dybest set, hvordan du ville gå. Andre spørgsmål? Awesome. Tak for din tid, og tak fordi du kom. Jeg var ikke til at tilføje meget andet, men 1 virkelig hurtig ting er, at vi ikke har et link til formularen. Virkelig dum. Lad os tilføje et - faktisk i visningen, blog, indeks, lad os virkelig hurtigt tilføje et link, der går til den nye side, den side, hvor vi kan indsætte et nyt indlæg. Vi kommer til at gøre dette. Hvad er rart er at der er hele denne gruppe af HTML hjælperfunktioner der gør forskellige ting for dig, så du allerede har set de enheder fungere her, men de har også en funktion kaldet "anker" som du kan skrive i blog / nyt og sige, "Send en ny blog." Og det ville skabe dette link for dig, og dette synes virkelig trivielt at gøre, men det er rart, fordi antage, at du bevæger din hjemmeside fra 1. domæne til et andet. Og hvis du bare skrev de webadresser selv, så ville du nødt til at ændre alle de webadresser. Eller måske har du flyttet den fra 1. undermappe til en anden undermappe. Du ville have til at ændre alle disse webadresser selv, og det er ikke sjovt. Du kan bruge denne anker lige her, og du kan ændre det domæne eller den undermappe præfiks i konfigurationsfilen én gang, og så vil det gælde, at overalt, og det er, igen, et godt eksempel på ikke gentage dig selv, Tørring din kode ud. Uanset hvor du gentage dig selv, så prøv og ekstrakt i en slags konfigurationsfil eller til en anden funktion, og har det klare det for dig. Og den allersidste ting, som jeg ville vise dig, var formoder, at vi er tilbage på dette indlæg, og jeg havde komponeret nogle virkelig lang essay, men jeg glemte at medtage min forfatter. Nu når jeg klikker på "Send Post" Jeg har lige mistet alt. Nej! Virkelig trist. Så hvordan kan du håndtere det? Dette er, hvad vi gør. Hvad vi gør, er her for disse input og tekst områdets funktioner hvis vi medtager en anden parameter, så værdien af ​​denne anden parameter kommer til at være, hvad området vil indledningsvis befolket med. Hvad vi kan gøre, er i vores blog-controller, vi kunne binde en anden variabel. Kald det "værdier" måske. Og passere i stillingen array, bogstaveligt. Det betyder, at hvis valideringen mislykkedes, passere mig stillingen array, jeg forelagde den sidste anmodning, og på den måde kan jeg bruge værdierne fra min sidste fremlæggelse at genbefolke felterne. Nu kan jeg gøre noget lignende værdier forfatter og værdier krop, og på den måde nu, hvis jeg gør nogle tilfældige ting og klik på "Send indlæg", så det bliver der. Men vi kommer til at løbe ind i et andet problem. Det virker, men hvis jeg går til den side, den allerførste gang, det kommer til at gå ned, og det er fordi den allerførste gang vi gå til den side, har dette indlæg variabel ikke defineret endnu. Det er null. Det findes ikke. Og hvad vi ønsker at sige, er, hvis denne nøgle findes, derefter returnere værdien af ​​denne opstilling, men hvis nøglen ikke eksisterer, derefter en tom streng. Det er den funktionalitet, vi ønsker her. Vi ønsker at kontrollere, om nøgle findes, før du prøver at få adgang til array, og heldigvis nok, Kohana giver os også en hjælper funktion for det. De har hele denne pakke af funktioner under navnet ARR, kort for array, og de har 1 funktion kaldet "få" og du kan passere i array, og du kan passere i navnet på nøglen. Så dybest set, hvad det vil gøre, er at det vil forsøge at få den nøgle, men hvis nøglen ikke eksisterer i arrayet, så det vil vende tilbage blank, eller vi kan også angive en standard, tror jeg, hvilket er rart. Nu, hvis vi gør det samme igen, så se dig nu virker det første gang omkring, og igen, hvis vi skriver i nogle tilfældige ting og prøv og indsende, så det bliver der. Og jeg tror, ​​jeg kan også vise dig, hvordan du tilføjer en skabelon virkelig hurtigt. Hvad vi kan gøre første er kan vi tilføje en ny visning kaldet "template.php" inden for mappevisninger, og hvad jeg har tænkt mig at gøre, er at jeg har tænkt mig at udskrive noget, der hedder "indhold" der kommer til at være min hovedindhold. Og måske i selve bunden Jeg har tænkt mig at tilføje, siger, ophavsret. [Uhørligt student spørgsmål] [Brandon Liu] Måske er det en super grundlæggende skabelon jeg vil bruge. Jeg ønsker at have en mappe med min ophavsret på hver enkelt side, og nu, hvad jeg har tænkt mig at gøre inden min controller er nu i stedet for at sige, "udvider Controller" Jeg har tænkt mig at sige, "udvider Controller_Template" og nu i stedet for at sige, "svar krop er lig med denne opfattelse" Jeg har tænkt mig at sige, "denne skabelon indhold er -" og jeg tror - sætter jeg et lighedstegn? Jeg glemmer. Ja, det tænkte jeg nok. Og nu har jeg sat, at indhold variabel lig med den opfattelse. Jeg kan gøre det samme her. Og nu, hvis jeg opdatere, kan du nu se denne copyright tilføjes der, og bare gøre nogle tilfældige indlæg, og så igen, bør du se, at ophavsretten er selve bunden af ​​siden. Great. Det er alt, jeg ville vise jer. [Bifald] Eventuelle spørgsmål? [CS50.TV]