22
Tags:
php
Skrevet af
Bruger #8223
@ 29.09.2009
Øvelse: Blogsystem - Læs et indlægNu kan vi både oprette og se vores data, men det kan da være interessant at vælge ét enkelt blogindlæg ud og se det på skærmen. Derfor skal vi nu ind og tilføje lidt ekstra features til vores weblog. Først og fremmest skal controlleren have et adgangslag til at fremvise et indlæg, og den controller skal så hente dataene fra modellen, og sende dem videre til et view, ganske som vi er vandt til.
- function display()
- {
- $data = $this->weblog_model->display($this->uri->segment(3));
- $this->load->view('weblog_display', $data);
- }
Det nye her er, at vi skal fortælle vores model hvilket indlæg det specifikt er vi vil se. Det gør vi som ovenfor ved at hente id'et ud af det tredje url segment (det første er weblog og det andet er display) og sende det som argument til metodekaldet. Nu skal metoden laves, så tilføj til weblog_model.php følgende kode:
- function display($id)
- {
- $data = array('id'=>$id);
- $blog = $this->db->get_where('codeigniter_blog', $data);
- return $blog->row_array();
- }
Der er to nye ting i dette. Den første er at vi nu bruger get_where() istedet for get() til at hente data ud med. Dette er åbenlyst for at kunne give et ekstra argument der indeholder et array med identificerende data, så den ved hvad vi leder efter. Det andet er at vi bruger row_array() istedet for result_array() til at hente de endelige data. row_array() henter en enkelt række som et associativt array, snarere end et numerisk array indeholdende associative arrays, som før. Igen bruger vi _array varianten af metoden, for at få så simpelt et output som muligt.
Nu er databaseabstraktionen og adgangslaget ordnet, så mangler vi bare at lave viewet. Opret en fil i view-mappen der hedder weblog_display.php og fyld den op med HTML og PHP:
- <html>
- <head>
- <title>Læs et indlæg</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <body>
- <h1><?php echo $title; ?></h1>
- <p><?php echo nl2br($body); ?></p>
- <p><a href='http://dinServerUrl/MinApp/index.php/weblog/edit/<?php echo $id;?>'>Rediger</a> | <a href='http://dinServerUrl/MinApp/index.php/weblog/delete/<?php echo $id;?>'>Slet</a></p>
- <a href='http://dinServerUrl/MinApp/index.php/weblog/overview/'>
- Tilbage til oversigten
- </a>
- </body>
- </html>
Nu kan du klikke dig ind på de forskellige posts via listen, og se dem enkeltvis. Vi har ydermere lagt nogle links ind til redigering og sletning af indlægget, og at implementere dé funktioner bliver vores næste, og sidste, opgave i denne omgang.
Øvelse: Blogsystem – Slet/rediger indlægVi nærmer os noget der kan bruges til noget, nu mangler vi sådan set bare at kunne slette vores posts igen, eller rette i dem hvis vi har skrevet forkert. Vi er efterhånden så rutinerede udi at tilføje funktionalitet, at vejen frem burde være klar: controlleren skal have et adgangslag til sletning og redigering, modellen skal kunne opdatere databasen med de nye informationer, og vi skal have et interface til at redigere indlægget i. I controlleren skal vi derfor bruge to nye metoder:
- function delete()
- {
- $this->weblog_model->delete($this->uri->segment(3));
- $this->overview();
- }
-
- function edit()
- {
- $message = $this->weblog_model->edit($this->uri->segment(3));
- $data = $this->weblog_model->display($this->uri->segment(3));
- $data['message'] = $message;
- $this->load->view('weblog_edit', $data);
- }
Den ene tager sig af sletning, og viser derefter vores oversigt ved at kalde overview() - så vi undgår at skulle skrive den kode to gange - den anden af redigering. Først kører vi modellens logik og sender resultatet til en message-variabel. Dernæst henter vi indlægget ud, så vi kan fylde det ind i formularen, og til sidst sætter vi de to data-bidder sammen, og sender dem til viewet. Nu skal vi også have tilføjet funktionaliteten til modellen:
- function delete($id)
- {
- $data = array('id'=>$id);
- $this->db->delete('codeigniter_blog', $data);
- }
-
- function edit($id)
- {
- if(!$this->input->post('title') && !$this->input->post('body'))
- {
- return '';
- }
-
- if(empty($this->input->post('title')))
- {
- return 'Titel er ikke angivet!';
- }
-
- if(empty($this->input->post('body')))
- {
- return 'Der er ingen tekst!';
- }
-
- $data = array(
- 'title' => $this->input->post('title'),
- 'body' => $this->input->post('body')
- );
- $where = array(
- 'id' => $id
- );
- $this->db->update('codeigniter_blog', $data, $where);
-
- return 'indlægget blev redigeret';
- }
Vi har genbrugt meget af logikken fra create() med nogle edit() specifikke twists. Så mangler vi sådan set kun redigeringsformularen, som skal gemmes som weblog_edit.php i view-mappen:
- <html>
- <head>
- <title>Rediger indlæg</title>
- <meta http-equiv="content-type" content="text/html; charset=utf-8" />
- </head>
- <body>
- <p><?php echo $message; ?></p>
- <form method='post' action=''>
- <p><label for='title'>Titel:</label><br/>
- <input type='text' name='title' value='<?php echo $title; ?>'/></p>
-
- <p><label for='body'>Brødtekst:</label><br/>
- <textarea name='body'><?php echo $body; ?></textarea></p>
-
- <p><input type='submit' value='Rediger'/></p>
- </form>
- <a href='http://dinServerUrl/MinApp/index.php/weblog/overview/'>
- Tilbage til oversigten
- </a>
- </body>
- </html>
Et voila! Nu har du et fungerende blogsystem skrevet lynhurtigt i CodeIgniter. Det mangler en masse sjove features som for eksempel passwordbeskyttelse, kategorier og et lækkert design, men det vil jeg lade dig selv undersøge i din videre læsning.
AfrundingArtiklen her har kun lige ridset lidt i overfladen af hvad CodeIgniter er i stand til, men allerede nu burde det stå klart at CodeIgniter er et stærkt værktøj til at få en masse fra hånden hurtigt. Ved din videre læsning vil du opdage at til stortset enhver situation, har CodeIgniter en fremgangsmåde og et library til formålet.
Videre læsningDit næste stop må uden tvivl være CodeIgniter's veludviklede
User Guide – den indeholder både tutorials og dokumentation af de forskellige libraries' metoder, samt information om dele af CodeIgniter vi slet ikke har berørt her i artiklen. Som lovet i starten vil artiklen her lige kort ridse op hvad der ligger af godter i de øvrige mapper af en CodeIgniter installation:
- system/application/errors : indeholder templates til fejlmeddelelser
- system/application/helpers : indeholder såkaldte helpers. Helpers er funktioner der bruges i view filer, til at gøre typografi mv. Lettere at ordne server side.
- system/application/hooks : indeholder såkaldte hooks, der fungerer ved at kunne tilføje ekstra funktionalitet til bestemte punkter af en CI applikations kørselsfaser.
- system/application/language : indeholder sprogfiler til dynamisk oversættelse af dine systemer.
- system/application/libraries : libraries er klasser der tilføjer ekstra funktionalitet til din CodeIgniter applikation, men som er så generelle at de ikke giver mening at have i en model.
Hvis du har virkeligt meget blod på tanden kan du også gå ind på CodeIgniter.com's forum og wiki, og se de mange tredjeparts libraries der er lavet, og se om du kan bruge noget af det. Held og lykke!
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.