22
Tags:
php
Skrevet af
Bruger #8223
@ 29.09.2009
Controllers og ViewsLad os komme igang med at pille ved noget kode. Som du kan se på velkomstsiden ligger der nogle filer der bliver brugt ligenu, i henholdsvis system/application/views/welcome_message.php og system/application/controllers/welcome.php. Efter deres filnavne burde det være åbenlyst hvilket formål de hver især tjener. Hvis vi starter med at åbne system/application/views/welcome_message.php vil vi blive mødt af følgende kildetekst:
- <html>
- <head>
- <title>Welcome to CodeIgniter</title>
-
- <style type="text/css">
-
- body {
- background-color: #fff;
- margin: 40px;
- font-family: Lucida Grande, Verdana, Sans-serif;
- font-size: 14px;
- color: #4F5155;
- }
-
- a {
- color: #003399;
- background-color: transparent;
- font-weight: normal;
- }
-
- h1 {
- color: #444;
- background-color: transparent;
- border-bottom: 1px solid #D0D0D0;
- font-size: 16px;
- font-weight: bold;
- margin: 24px 0 2px 0;
- padding: 5px 0 6px 0;
- }
-
- code {
- font-family: Monaco, Verdana, Sans-serif;
- font-size: 12px;
- background-color: #f9f9f9;
- border: 1px solid #D0D0D0;
- color: #002166;
- display: block;
- margin: 14px 0 14px 0;
- padding: 12px 10px 12px 10px;
- }
-
- </style>
- </head>
- <body>
-
- <h1>Welcome to CodeIgniter!</h1>
-
- <p>The page you are looking at is being generated dynamically by CodeIgniter.</p>
-
- <p>If you would like to edit this page you'll find it located at:</p>
- <code>system/application/views/welcome_message.php</code>
-
- <p>The corresponding controller for this page is found at:</p>
- <code>system/application/controllers/welcome.php</code>
-
- <p>If you are exploring CodeIgniter for the very first time, you should start by reading the <a href="user_guide/">User Guide</a>.</p>
-
-
- <p><br />Page rendered in {elapsed_time} seconds</p>
-
- </body>
- </html>
Du kan prøve at ændre lidt i filen og se dem slå igennem på velkomstsiden. Dette er ikke videre avanceret, så lad os prøve at kigge på controller-koden, og se hvad der sker derinde i “motorrummet”:
- <?php
-
- class Welcome extends Controller {
-
- function Welcome()
- {
- parent::Controller();
- }
-
- function index()
- {
- $this->load->view('welcome_message');
- }
- }
-
- /* End of file welcome.php */
- /* Location: ./system/application/controllers/welcome.php */
Det er jo næsten skræmmende simpelt. Læg iøvrigt mærke til at filen ikke lukkes med et ?> tag. Dette er for at undgå whitespace(det kan være et mellemrum eller linieskift efter et afsluttende ?> tag i en vilkårlig fil et sted), der kan forårsage problemer med det outbutbuffering-system som CodeIgniter gør brug af. Istedet afsluttes filen med en erklæring om at filen er slut, hvad den hedder, og hvor den ligger. Det anbefales kraftigt at denne konvention følges. Mere om dette og andre konventioner i afsnittet konventioner.
Hvis vi gennemgår hvad der sker i Controlleren kan vi se at den til at starte med bliver erklæret med navnet Welcome, og er en udvidelse af Controller klassen, der er en integreret del af CodeIgniter. At den er en Controller betyder at den bliver til CodeIgniters superobjekt - det objekt som hele applikationen kommer til at køre igennem. Når Controlleren instantieres bliver diverse libraries loadet, urlens segmenter bliver filtreret for XSS-forsøg og stillet til rådighed gennem metoden $this->uri->segment(n), samt diverse andre småting der er rare at have. Hvis du har tilføjelser til denne procedure kan du definere dem i controllerens konstruktør, i dette tilfælde welcome() - gør du det skal du huske, som det også bliver vist i eksemplet, at køre parent::Controller() for at få den basale Controller-opstartslogik med også. Når det er gjort bliver den requestede “action” kaldt som metode. En action skrives i urlen. Hvis ingen action er defineret, kaldes index() som default. Hvis du ikke kører med url rewriting vil et kald til velkomstsiden se således ud:
http://dinServerUrl/MinApp/index.php/welcome/index
I det ovenstående eksempel vil $this->uri->segment(1) returnere “welcome”, og $this->uri->segment(2) vil returnere “index”.
Prøv at jok lidt rundt i controllerkoden og ret lidt hist og pist, eventuelt smide nogle echo statements ind eller prøve at kalde nogle andre view-filer, og se hvordan det går. Når du føler dig klar kan du gå videre til næste afsnit.
ModelsNu har vi kigget lidt på hvordan output er struktureret, nu skal vi kigge lidt på hvor vi får vores data fra. En model er i og for sig ikke nødvendig for en CodeIgniter applikation. Det er et view i grunden heller ikke, da man bare kan echo'e de data der skal ud. Men ligesom views er models en rigtig god idé i projekter af stortset alle størrelser, for at gøre det så enkelt som muligt at skifte dele af logikken ud uden at røre ved resten. I CodeIgniters eksempelkode bliver der ikke brugt en model, så lad os lave en selv, der bare returnerer noget flad data til at starte med. Skriv følgende kode i din editor og gem filen som welcome_model.php i mappen system/application/models :
- <?php
-
- class Welcome_model extends Model {
-
- function Welcome_model()
- {
- parent::Model();
- }
-
- function get()
- {
- return 'Hello, World!';
- }
- }
-
- /* End of file welcome_model.php */
- /* Location: ./system/application/models/welcome_model.php */
Den ovenstående fil er meget, meget basisk, men tjener sit formål ganske udmærket – den definerer en model der hedder Welcome, har en konstruktør der kalder Model-klassens konstruktør, hvorefter din egen kode kan tilføjes til konstruktøren hvis du ønsker det.
Ligenu gør vores model ikke så meget, da den bare ligger i mappen uden at blive hentet nogen steder. Åbn din welcome.php controller igen og tilføj $this->load->model('welcome_model'); til din konstruktør, efter kaldet af parent-konstruktøren, for at hente modellen ind. Nu kan modellen kaldes fra objektet $this->welcome_model.
Nu har vi mulighed for at hente data ud fra vores model – omend det endnu er noget simple data vi har med at gøre – og få dem ind i vores controller. Nu skal vi have fundet ud af at skubbe de data videre til vores view, så brugeren kan se dem. Dette gøres ved at smide dem ind i et array, som du sender som argument til $this->load->view(). Efterhånden skulle din controller-fil se således ud:
- <?php
-
- class Welcome extends Controller {
-
- function Welcome()
- {
- parent::Controller();
- $this->load->model('welcome_model');
- }
-
- function index()
- {
- $data['welcome'] = $this->welcome_model->get();
- $this->load->view('welcome_message', $data);
- }
- }
-
- /* End of file welcome.php */
- /* Location: ./system/application/controllers/welcome.php */
Dette er imidlertid ikke nok, for viewet ved ikke at dataene kommer endnu. Derfor skal vi åbne welcome_message.php og tilføje følgende kode i body-elementet:
- <p>Resultatet fra vores model er:</p>
- <code><?php echo $welcome; ?></code>
Gem filen, og test den i din browser. Du har nu en fin Hello, World! besked i dit view, der kommer fra modellen.
Dette kaldes at pushe data til viewet gennem controlleren, og fungerer ved at det array eller objekt du giver til viewet bliver splittet op til enkeltstående variabler og skubbet ind i koden, hvor de så kan echoes, loopes igennem etc. som normalt. Tillykke, du kender nu til det basale i CodeIgniter, og kan i princippet gå igang med at skrive applikationer! Inden da kan det dog være smart at læse det følgende afsnit, der fortæller om hvilke kodekonventioner du bør følge når du udvikler i CodeIgniter, for at din kode er forståelig for andre, samt for at undgå fejl. Efterfølgende vil du blive sat igang med en øvelse, hvor artiklen vil guide dig igennem udviklingen af en meget simpel weblog.
Vedhæftede filer:
Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.
Del også gerne artiklen med dine Facebook venner:
Kommentarer (10)
Struktureret artikel med gode formulering. Jeg føler selv at jeg har fået noget ud af at læse den.
Kanon god artikel. Jeg har selv længe holdt mig fra frameworks, da jeg ikke har kunne se det smarte i at benytte det frem for mine egne klasser. Men den store fordel er gået op for mig at jeg kan stadig bruge mine egne klasser, nu kan de komme nemmere over i MVC plus Codeigniter tilbyder noget security jeg har ikke selv har haft nogle smarte løsninger på. Thumbs up og en femmer herfra.
Jeg takker mange gange for de rosende ord og den pæne rating
Vil da lige give lidt feedback efter et par meget lærrige timers læsning :-)
Side 4, afsnit 2 -
Du skriver: "Den ovenstående fil er meget, meget basisk" <--- så vidt jeg ved kan filer ikke være basiske ;-) basisk er noget man snakker om i kemi. Basal er det rette danske ord for det engelske 'basic'.
Side 6, første PHP kode -
du bruger $this->weblog_model->opret(); i koden, men betegner den $this->weblog_model->create() i teksten
Side 6, anden PHP kode -
jeg har problemer med empty(), da den ikke accepterer et function return som argument. Jeg valgte at bruge == "" i stedet.
Ellers vil jeg sige tak for en super guide :-) en 5'er fra mig.
Tak for dine indspark Randi!
Basisk og opret/create havde jeg ikke lige set, tak for det.
Den med empty havde jeg godt spottet et stykke tid efter jeg uploadede den, men udvikleren.dk har ikke rigtigt nogen mulighed for at man kan redigere i sine artikler efter de er godkendt. Men det er iøvrigt slet ikke nødvendigt med det tjek. Funktionen returnerer nemlig boolean false hvis den er empty såvel som !isset, har jeg sidenhen erfaret.
Oh, ja det var jo rart at vide ;-) det havde jeg ikke lige fået tjekket efter... Så er det jo ikke det store problem.
Så, for at forklare for andre der ser det her, og ikke forstår hvad vi snakker om:
I artiklen står der nogle steder if(empty($this->input->post('noget')) - der kan I nøjes med if(!$this->input->post('noget'))
Hej alle, ved godt det er over et år siden der sidst er skrevet kommentarer til denne artikel
jeg faldt bare over den og læste den igennem, fandt så det CodeIgniter spændende og ville prøve det.
Kunne så bare overhovedet ikke få det til at virke, og da jeg så selv kigger de filer igennem jeg har hentet fra Codeigniter kan jeg se at bla. Controlleren den kalder i starten: #
# class Welcome extends Controller {
hedder nu CI_Controller, det er bare en lidt træls fejl hvis folk ikke har prøvet rode med det før da den bare viser blank side, om der er andet der er galt har jeg ikke lige undersøgt
Synes os bare jeg lige ville give heads up til andre der kaster sig ud i det.
Anyways super god artikel, godt skrevet og godt formuleret
For lige at følge op på min tidligere post, har jeg efter at ha rodet en del rundt med det fundet ud af at den version jeg har hentet 2.0.0 Er ret så meget anderledes end den sidste tidligere 1.7.3.. Stortset alle guides osv. på nettet understøtter ikke rigtigt 2.0.0 så tror indtilvidere for nybegyndere at det ville være en fordel at hente den tidligere udgave, ihvertfald indtil der er mere hjælp at hente på den nye
Ja, det er korrekt. Efter 2.0(en *længe* sukket efter udgivelse i miljøet) blev udgivet er der sket en del store omvæltninger.
For at få artiklen til at virke skulle det dog være nok at lave et lille hack:
En fil i application/core kaldet MY_Controller.php (extended core-controller) der indeholder følgende
<?php
class Controller extends CI_Controller {}
class Model extends CI_Model {}
class MY_Controller {
// hvad end du vil have i din egen MY_Controller
}
// EOF
Du skal være
logget ind for at skrive en kommentar.