CakePHP & DIEVOLUTION Blog

CakePHP 1.2 Blog Tutorial Teil 3

 

Im letzten Teil des Tutorials beschäftigen wir uns mit dem Hinzufügen einiger Erweiterungen für unser rudimentäres Blog.
3. Extras

  1. Kommentarfunktion einbauen
  2. Helper erstellen


Teil 3.1
Kommentarfunktion einbauen
Jeder möchte in seinem Blog gerne Kommentare lesen (wenn es nicht gerade Spam ist). In diesem Teil des großen Cake 1.2 Tutorials werdet ihr lernen, was Scaffolding ist und wie man Tabellen verknüpft.

Fangen wir am besten mit dem Erstellen der Datenbanktabelle an. Ladet diesen SQL Code in eure Datenbank:

  1. CREATE TABLE cake_comments (
  2.     id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3.     autor VARCHAR(50),
  4.     inhalt TEXT,
  5.     post_id INT,
  6.     created DATETIME DEFAULT NULL,
  7.     modified DATETIME DEFAULT NULL
  8. );

Das hat gut funktioniert! Bevor ihr allerdings jetzt anfagt und Testdaten eintippt, muss ich euch leider enttäuschen, heute machen wir das anders.
Erstellt zuerst das Model
/app/models/comment.php

  1. <?php
  2.  
  3. class Comment extends AppModel
  4. {
  5.     var $name = ‘Comment’;
  6.    
  7.     var $belongsTo = array(‘Post’);
  8. }
  9.  
  10. ?>

Dies ist sogleich unsere Brücke zwischen den beiden Datenbanktabellen. Wir haben in der SQL Anweisung festgelegt, dass es ein Feld post_id geben soll, welches jedes Kommentar haben wird. Hier legen wir nun fest, dass jedes Kommentar zu einem bestimmten Post gehört. Wenn ihr die Cake Konventionen einhaltet, braucht ihr hier keiner weiteren Optionen zu wählen. Eine gute Übersicht über Beziehungen zwischen Models liefert die Cake Anleitung. In diesem Tutorial reiße ich das Thema nur an, um euch die Einfachheit von Cake näher zu bringen.

Erstellen wir nun den Controller:
/app/controllers/comments_controller.php

  1. <?php
  2.  
  3. class CommentsController extends AppController
  4. {
  5.     var $name = ‘Comments’;
  6.     var $scaffold;
  7. }
  8.  
  9. ?>

Hier bedienen wir uns der sogenannten Scaffolding Technik. Es wird automatisch ein CRUD (Create, Read, Update, Delete) erstellt, mit dem ihr in den frühen Phase eurer Anwendung bereits im Browser Einträge hinzufügen, bearbeiten und löschen könnt.
Ruft nun die URL www.example.com/comments auf (example.com natürlich ersetzen durch euer Cakeverzeichnis).
ihr seht, dass wir eine ähnliche Darstellung erhalten wie in unserem Blog, ohne eine einzige Zeile Code geschrieben zu haben. Klickt nun auf “New Comment”. Tragt als Autor “Testautor” ein, als Inhalt “Testinhalt” und wählt als Post die Nummer 1. Nun wird euer Kommentar als zu Post 1 gehörend gespeichert.
Wenn wir nun aber auf die “1″ klicken oder die URL www.example.com/posts/view/1 aufrufen, stellen wir fest, dass wir den Kommentar nicht sehen können. Dies liegt natürlich daran, dass wir dem View noch keine Kommentaranzeige hinzugefügt haben, aber auch daran, dass das Model gar nicht weiß, dass es zugehörige Kommentare besitzt! Diesen Zustand können wir aber ändern, indem wir das Post Model ändern:
/app/models/post.php

  1. <?php
  2.  
  3. class Post extends AppModel
  4. {
  5.     var $name = ‘Post’;
  6.         /*Neu*/
  7.         var $hasMany = array(‘Comment’);
  8.         /*Ende*/
  9.        
  10.         var $validate = array (
  11.                 ‘titel’ => array (
  12.                         ‘required’=>VALID_NOT_EMPTY,
  13.                         ‘length’=>array (
  14.                                 ‘rule’=>array(‘maxLength’,100)
  15.                         )
  16.                 ),
  17.                 ‘inhalt’=> VALID_NOT_EMPTY
  18.         );
  19.        
  20.        
  21. }
  22.  
  23. ?>

Hier ist es zwar grammatikalisch nicht ganz korrekt (”hat viele Kommentar”), aber ihr versteht, wie Cake funktioniert. Wir geben diesem Model nun die Information, dass es viele Kommentare hat. Wird nun die URL www.example.com/posts/view/1 aufgerufen und der read Befehl in der Post Controller View Action ausgeführt, sucht Cake nun nicht nur die Informationen des Post selbst, sondern auch alle Comments, die zu diesem Post gehören.
Nun fehlt eigentlich nur noch die Kommentaranzeige, die wir nun dem view-View hinzufügen:
/app/views/posts/view.ctp

  1. <h1><?php echo $post[‘Post’][‘titel’];?></h1>
  2. <p><?php echo $post[‘Post’][‘inhalt’];?></p>
  3. <p>Dieser Beitrag wurde erstellt am: <?php echo $post[‘Post’][‘created’];?></p>
  4. <p><?php echo $html->link(‘zurück zur Übersicht’, ‘/posts/’);?></p>
  5.  
  6. <!– NEU –>
  7. <h2>Kommentare:</h2>
  8. <?php foreach($post[‘Comment’] as $comment):?>
  9. <p><?php echo $comment[‘autor’];?> schrieb am <?php echo $comment[‘created’];?>:</p>
  10. <p><?php echo $comment[‘inhalt’];?></p>
  11. <hr>
  12. <?php endforeach;?>
  13. <!– Ende –>

Wir lassen alle Kommentare durch eine Schleife laufen. Das Array selbst könnt ihr euch mittels zum besseren Verständnis einmal ausgeben lassen.

  1. (
  2.     [Post] => Array
  3.         (
  4.             [id] => 1
  5.             [titel] => Ein Titel
  6.             [inhalt] => und ein Inhalt
  7.             [created] => 2007-10-01 22:12:20
  8.             [modified] =>
  9.         )
  10.  
  11.     [Comment] => Array
  12.         (
  13.             [0] => Array
  14.                 (
  15.                     [id] => 1
  16.                     [autor] => Testautor
  17.                     [inhalt] => Testinhalt
  18.                     [post_id] => 1
  19.                     [created] => 2007-10-02 11:59:14
  20.                     [modified] => 2007-10-02 11:59:14
  21.                 )
  22.  
  23.             [1] => Array
  24.                 (
  25.                     [id] => 2
  26.                     [autor] => Kommentar2
  27.                     [inhalt] => Ich habe hier einen zweiten Kommentar verfasst.
  28.                     [post_id] => 1
  29.                     [created] => 2007-10-02 12:09:17
  30.                     [modified] => 2007-10-02 12:09:17
  31.                 )
  32.  
  33.         )
  34.  
  35. )

Natürlich eignet sich die oben vorgestellte Scaffold Möglichkeit nicht für den Produktiveinsatz, hier wäre es angebracht, im View ein Möglichkeit des Kommentar hinzufügens zu erstellen. Dies ist aber eine Aufgabe, die ihr mit dem bereits erhaltenen Cakewissen selbst erstellen könnt.

Teil 3.2
Helper erstellen
Wie ich im zweiten Teil des Tutorials bereits erwähnte, sind die SQL Datumsausgaben für uns Europäer schwer verständlich, da wir ein Datum gerne im Format TT.MM.JJJJ lesen. Anhand dieser kleinen Aufgabe erstellen wir uns einen Helper, mit dem wir das SQL Format beliebig ändern können.
Was sind Helper?
Helper sind kleine Scripte, die in Views helfen, die Ausgabe zu modifizieren. Ihr habt bereits mit dem Form-Helper einen Helfer kennengelernt, der das Erstellen von Formularen erleichtert.
Unsere Aufgabe wird nun sein, einen Helper zu erstellen, der ein ein SQL Datumsformat in ein normal lesbares Datumsformat umwandelt und dies mit oder ohne Zeitanzeige wieder ausgibt.
Erstellen wir zunächst den Helper. Helper werden im Ordner /app/views/helpers erstellt, wir nennen ihn datum.php:
/app/views/helpers/datum.php

  1. <?php
  2. class DatumHelper extends Helper
  3. {
  4.         /* Diese Funktion wandelt SQL Datumsangaben im Datetimeformat
  5.          * in das deutsche Datumsformat um. Folgende Optionen können
  6.          * angegeben werden:
  7.          * 0 oder keine Angabe: Nur das Datum wird erstellt.
  8.          * 1: Es werden auch Stunden und Minuten ausgegeben.
  9.          * 2: Es werden Stunden, Minuten und Sekunden ausgegeben.
  10.          */
  11.        
  12.         function date_de($datum,$option = NULL) {
  13.                 //Datum umwandeln
  14.                 $ausgabe = date(“d.m.Y”, strtotime($datum));
  15.                 //Prüfen ob Optionen angebeben
  16.                 if ($option == 1) {
  17.                         //Anhängen der Stunden und Minuten
  18.                         $ausgabe .= date(” H:i”, strtotime($datum));
  19.                 } elseif ($option == 2) {
  20.                         //Anhängen der Stunden, Minuten und Sekunden
  21.                         $ausgabe .= date(” H:i:s”, strtotime($datum));
  22.                 }
  23.                 return $this->output($ausgabe);
  24.         }
  25. }
  26. ?>

Wichtig ist, dass ihr bei return $this->output($ausgabe) zurückgebt, damit Cake dies besser versteht.
Euren gerade erstellten Helper fügt ihr nun noch in den Controller ein, damit der Helper auch geladen wird:
/app/controllers/posts_controller.php

  1. <?php
  2.  
  3. class PostsController extends AppController
  4. {
  5.     var $name = ‘Posts’;
  6.     /*NEU */
  7.     var $helpers = array(‘Form’, ‘Datum’);
  8.     /*Ende */
  9.    
  10.     function index() {
  11.       $eintraege = $this->Post->findAll();
  12.      
  13.       $this->set(‘posts’,$eintraege);
  14.     }
  15.  /*Hier folgt der weitere Code des Controllers*/ 
  16. }
  17.  
  18. ?>

Ist auch dieser Schritt geschafft, folgt nun die Anpassung des view-Views.
/app/views/posts/view.ctp

  1. <h1><?php echo $post[‘Post’][‘titel’];?></h1>
  2. <p><?php echo $post[‘Post’][‘inhalt’];?></p>
  3. <!–NEU –>
  4. <p>Dieser Beitrag wurde erstellt am: <?php echo $datum->date_de($post[‘Post’][‘created’]);?></p>
  5. <!–ENDE –>
  6.  
  7. <p><?php echo $html->link(‘zurück zur Übersicht’, ‘/posts/’);?></p>
  8.  
  9. <h2>Kommentare:</h2>
  10. <?php foreach($post[‘Comment’] as $comment):?>
  11. <!– NEU –>
  12. <p><?php echo $comment[‘autor’];?> schrieb am <?php echo $datum->date_de($comment[‘created’],2);?>:</p>
  13. <!– ENDE –>
  14. <p><?php echo $comment[‘inhalt’];?></p>
  15. <hr>
  16. <?php endforeach;?>

Wie auch beim Form-Helper lautet die Schreibweise $helpername->funktionsname($argument1, $argument2,…). Nun solltet ihr deutsche Datumsanzeigen haben. Damit ist auch dieser Teil des Tutorials fertig. Dieses Beispiel ist natürlich nur ein ganz

Damit sind wir am Ende des großen Tutorials. Ich hoffe, ich konnte euch CakePHP 1.2 näher bringen und ihr werdet selbst ganz große Bäcker. Ich werde dieses Tutorial mit Sicherheit noch um ein paar Sektionen erweitern, also abonniert doch am besten einfach mein Blog.

Sollten euch Fehler in einem der Tutorialteile aufgefallen sein oder versteht ihr Teile des Tutorials nicht, so schreibt am besten einen Kommentar, damit andere, die über denselben Fehler stolpern, informiert sind. Natürlich sind auch Kritiken immer gerne willkommen, schließlich ist dies eins meiner ersten Tutorials, und soweit ich mich erinnern kann auch mit Abstand das größte, dass ich je geschrieben habe.
In diesem Sinne: Backt weiter!

Anhang:
Alle Dateien des Tutorials als Download: Download


Veröffentlicht am Dienstag, den 2. Oktober 2007 um 13:00 Uhr veröffentlicht

Du kannst einen Kommentar schreiben, oder einen Trackback auf deiner Seite einrichten.

19 Reaktionen zu “CakePHP 1.2 Blog Tutorial Teil 3”

 

  1. CakePHP & DIEVOLUTION Blog » Blog Archiv » CakePHP 1.2 Blog Tutorial Teil 2 Am 2. Oktober 2007 um 13:03 Uhr

    […] 02.10.2007: CakePHP 1.2 Blog Tutorial Teil 3 […]

  2. Klaus Am 8. Oktober 2007 um 14:50 Uhr

    Vielen Dank für dieses klasse Tutorial.
    Ich habe es zu großen Teilen “nachgespielt” - es war mein erster richtiger Kontakt zu CakePHP, da meine vorherigen Versuche, die Originaltutorials nachzuvollziehen, allesamt gescheitert waren. ;-)

    Zwei klein Bugs: auf Seite 2 sollte es statt “INSERT INTO posts” heißen: “INSERT INTO cake_posts”.
    Und kurz darauf sind auch keine “mogelds” gemeint.

    Du schreibst, dass sich im 1.2 die Helperfunktionen zum Formular geändert haben. Könntest Du vielleicht noch einen Link dazu posten, ich bin nämlich nicht fündig geworden - und mein erstes eigenes Formular funktioniert noch nicht.

    Und was mir auch noch nicht klar geworden ist: Wie bekomme ich die blauen Balken auf der Seite weg…?
    Sprich: Wo lege ich im Cake das grundlegende Layout fest?

    Danke nochmals für die super Arbeit hier,
    weitere Beiträge werde ich selbstverständlich verfolgen.

    Klaus

  3. dievo Am 8. Oktober 2007 um 15:16 Uhr

    Hallo Klaus. Danke für dein Kommentar, werde die beiden Fehler gleich verbessern. Aber zwei Fehler bei sovielen Zeilen ist doch gar nichtmal so schlecht ;-)

    Die Layouts findest du im Ordner /app/views/layouts/. Leider sind da seit 1.2 keine default Files mehr drin, also einfach eine default.ctp Datei erstellen und folgenden Code einfügen
    < ?php
    $session->flash();
    echo $content_for_layout
    ?>
    Dies hat zwei Folgen: Zum einen siehst du deine Views ($content_for_layout) und zum anderen bei $session->flash() die Meldungen, die z.B. beim Abschicken eines Formulars auftauchen.

    Achja, eine gute Hilfe zu den 1.2 Helpers findest du hier:
    http://www.donutczar.com/cake1point2/donuts

    Hoffe das hilft dir weiter :-)
    Thomas

  4. Klaus Am 8. Oktober 2007 um 15:41 Uhr

    Boah, das geht ja schnell bei Dir!

    Ich habe gerade gesehen (als ich den Feed zu Deiner Seite abonniert habe), dass Du zum Formhelper auch schon geschrieben hast. das werde ich mir auch gleich genauer ansehen.

    Vielen Dank!
    Klaus

  5. Sven Am 15. Oktober 2007 um 13:02 Uhr

    Und wie können jetzt am besten Besucher ein Kommentar hinterlassen ?
    Kommt dafür noch ein weiteres Tutorial ?

    Klasse arbeit übrigens ! Danke für deine Mühe !

    -S.

  6. Helmut Am 15. Oktober 2007 um 13:11 Uhr

    Hallo Thomas!

    Danke für das Beispiel. Netter Stil, angenehm zum Lesen.

    Leider gehen die Codes nicht für Copy&Paste (feature?) ;-)

    Weiter so!

    Helmut

  7. Axl Am 16. November 2007 um 12:05 Uhr

    Danke für das schöne Tutorial. Ich bin gerade dabei, mit Cakephp 1.2 eine kleine Anwendung zu schreiben und Dein Post hat mir schon ein wenig weiter geholfen. Wenn Du Zeit hast, könntest Du noch Tags zu den Artikeln hinzufügen. Die Art, wie HABTM Beziehungen in Cake behandelt werden, habe ich nämlich noch nicht so ganz kapiert. Vor allem, was da unter der Oberfläche dieser ganzen automagic passiert, ist mir - auch wegen fehlender Dokumentation - noch unklar.

    Gruß,
    Axl

  8. Simon Brüchner Am 1. Dezember 2007 um 05:32 Uhr

    Der Beispielcode kann hiermit gesäubert werden:
    http://www.kolchose.org/simon/replaceMarkup/
    @Helmut; Damit Copy&Paste doch noch funktioniert!

  9. Simon Brüchner Am 1. Dezember 2007 um 06:39 Uhr

    Hier gehts weiter mit dem vierten Teil: http://blog.dievolution.net/cakephp/cakephp-12-blog-tutorial-teil-4-mehr-geback/ für alle die per Suchmaschine oder Deeplink auf dieser Seite gelandet sind.

  10. Alexia Am 7. Dezember 2007 um 18:29 Uhr

    ne kleine Anmerkung noch habe:

    beim Scaffolding der kommentare ist es nicht unbedingt hübsch die post-id auszuwählen, wer merkt die sich schon.

    Man geht in die Datei /apps/models/post.php

    folgende Zeile noch hinzu:
    var $displayField = ‘titel’;

    dann wird anstatt der id der Titel angezeigt.

    liebe Grüsse
    Alexia

  11. Alexia Am 18. Dezember 2007 um 11:53 Uhr

    moin moin,

    ich hab da noch mal ne frage zu

    /app/controllers/comments_controller.php

    ich würde aber gerne eigene add.ctp erstellen,
    ich bekomme das soweit hin nur bei dem select tag für die post hänge ich.

    Ich bin soweit dahinter gekommen, das dies was mit generatelist zu tun hat, aber viel weiter komme ich nicht.

    magst mir vieleicht einmal unter die arme greifen…

    lieben dank alexia

  12. Sander Versluys Am 25. Januar 2008 um 01:41 Uhr

    Thanks for the great tutorial. Exactly what I was looking for…

    There not enough good CakePHP tutorials out there.

    Thanks a lot!

  13. Markus Am 25. Januar 2008 um 19:17 Uhr

    Kann es sein, dass die Download Datei nicht mehr verfügbar ist? Könnte Ihr sie nochmals online stellen bzw. den Link aktualisieren?

    Vielen Dank,
    Markus

  14. chrispie Am 20. April 2008 um 22:55 Uhr

    super ! gefällt mir gut !

  15. alexunil Am 28. Oktober 2008 um 19:02 Uhr

    Vielen Dank für dieses gelungene Tutorial. War mein erster Kontakt mit cakePHP und bin überzeugt.
    Alex

  16. Datum ins Deutsche ändern mit cake Helper | freude code Am 14. November 2008 um 14:46 Uhr

    […] Gefunden bei dievolution […]

  17. Drazen Am 14. Dezember 2008 um 08:56 Uhr

    Vielen Dank! Eines der besten deutschsprachigen CakePHP Einsteigertutorials dass sich im Moment im Netz googlen lässt.

    Weiter so.

  18. Robert Am 25. Februar 2009 um 12:39 Uhr

    Danke für die Mühe. Hat mir sehr geholfen.

  19. cakePHP Framework - Blog Tutorial Am 19. April 2009 um 14:07 Uhr

    […] Blog Tutorial  - Die Einleitung  Blog Tutorial  - Das Tutorial  Blog Tutorial  - Extras  […]

Einen Kommentar schreiben