Mrz
03

Screencasts für CakePHP

Vorgestern hatte ich mich im IRC mit David unterhalten über diverse Anfängerprobleme. Leider bin ich erst recht spät daraufgekommen, dass es für CakePHP einige Screencasts gibt, die einen schnellen Einstieg ermöglichen.
Hier die Liste der verfügbaren Screencasts. Ich musste übrigens die Quicktime Filmchen doppelt anklicken, da die sonst nicht losgelaufen sind.

Zusätzlich habe ich bei David Golding noch weitere Screencasts zu Cake gefunden, die das Angebot sicherlich gut ergänzen.

Hab ich was vergessen oder übersehen? Dann bitte in den Kommentaren nachtragen, dann kann ich es ergänzen.

Feb
28

CakePHP und jQuery. Tutorials und Tipps

Die letzten Tage hab ich ja schon mal nachgefragt, wie es denn mit Tipps für CakePHP und jQuery ausschaut. Jetzt hab ich mir mal eine Liste von Links zusammengesucht, die ich mir für den ersten Überblick mal herausgesucht habe. Vielleicht kann ja der eine oder andere mit der Liste etwas anfangen:

  1. JQuery autocomplete in CakePHP ” nuts and bolts of cakephp
  2. JQuery in the CakePHP world (part 1 - the basics) ” nuts and bolts of cakephp
  3. JQuery in the CakePHP world (part 2 - is client side code all that great?) ” nuts and bolts of cakephp
  4. jQuery Helper | The Bakery, Everything CakePHP : Articles
  5. Easy AJAX Pagination Using JQuery (Articles) | The Bakery, Everything CakePHP
  6. Felix Geisendörfer - Jquery and CakePHP by Mark Story, Cake Development Corporation
  7. AJAX failure catchall callback with jQuery and cakePHP : AJAX failure callback with jQuery
  8. Setting up TinyMCE with jQuery and CakePHP 1.2 | Late Night PC
  9. Ajax-Login mit jQuery und CakePHP | Hackthenet-Blog
  10. Edit in place with JQuery and CakePHP - cakebaker
  11. Cake PHP useful tips: List, JQuery & CakePHP
  12. Tutorial - CakePHP Ajax “Quick Save” with jQuery: CakePHP, jQuery
  13. With jQuery & CakePHP to World Domination
  14. jMaps - The jQuery Map Framework - Digital Spaghetti
  15. JQuery UI and CakePHP - Stack Overflow
  16. Ajax File Uploading with Cake and jQuery (ergänzt)
  17. jQuery example overview
  18. PQuery - PHP and JQuery | NGCoders - Next Generation Coders
  19. miPHP :: Blog :: Cakephp Helper For Jquery Validation Plugin

Nicht alles nur CakePHP, aber auf jeden Fall jQuery. Wenn ihr noch weitere Links und Tipps habt, dann einfach in die Kommentare und ich werde das Ganze dann weiter ergänzen.

Feb
24

CakePHP und jQuery

Heute mal eine Frage an die jQuery-Nutzer. Bisher habe ich in allen Projekten immer Prototype genutzt, da es unter anderem ja auch von CakePHP unterstützt wird. Allerdings will ich mir in Zukunft jQuery genauer anschauen und suche nun ein paar Tipps, wie man damit am Besten einsteigen kann.
Am liebsten wären mir eigentlich gute Beispiele für den Einsatz von jQuery in Cake Anwendungen um von Best-Practice Beispielen zu lernen. Da ich Javascript nicht im HTML-Code programmieren will, was ich auch mit Prototype schon vermeide, aber über den Ajax-Helper derzeit ja nicht untersützt wird, wären also Beispiele interessant, die es entsprechend einsetzen.

Any tipps ?

Feb
18

Wie man User-Routes erstellen kann

CakePHP bietet von Haus aus ein sehr flexibles System um URL auf Controller und Action umzusetzen. Viele URLs sehen deshalb etwas so aus:

   http://meinedomain.de/users/view/username

Der Controller ist also users>.
Die Action heißt in dem Fall view.
Der dritte Teil wird dann als Parameter in die Action des Controllers übergeben und kann einfach über

   function view($username)

verarbeitet werden.

In vielen Fällen wäre es aber schöner, wenn die URL einfach so aussehen würde:

   http://meinedomain.de/username

Mit Hilfe der Klasse Routes lässt sich das auch so oder so ähnlich umsetzen. Im einfachsten Fall würde das so aussehen:

   Routes::connect('/*', array('controller'=>'users', 'action'=>'view'));

Allerdings führt das zu dem Problem, dass alle anderen Controller und Actions nicht mehr erkannt werden.
Das kann man recht einfach dadurch lösen, dass man die genutzten Controller vor der oben genannten Route auflistet, was dann in etwa so aussehen würde, wenn man davon ausgeht, dass es noch einen PagesController und einen ProjectsController gibt:

   Routes::connect('/pages/*', array('controller'=>'pages', 'action'=>'display')); // nur display
   Routes::connect('/projects', array('controller'=>'projects')); // alle actions
   Routes::connect('/*', array('controller'=>'users', 'action'=>'view')); // die Usernamen hier zuletzt abfangen.

Vielleicht gibt es dazu ja auch noch eine geschicktere Lösung, aber damit bin ich bisher ganz gut ausgekommen und werde es in Kürze auch auf der Twitter-Anwendung http://21tweets.com einbauen.

Feb
12

a, aa, am, e, h und clearCache

CakePHP bietet in der Datei basics.php einige sehr praktische Funktionen, auf die ein genauer Blick sich lohnt. Auslöser für mich das das Posting von teknoid über die Funktion pr() bzw. debug(), die beide ebenfalls in basics.php zu finden sind.

Die Funktion clearCache() kann ohne Argumente aufgerufen werden und löscht alle Cache-Views, die in CACHE.DS.views enthalten sind. Zusätzlich bietet clearCache die folgenden Parameter, mit denen sich recht individuell Dateien aus dem Cache löschen lassen.

function clearCache($params = null, $type = 'views', $ext = '.php')

Mehr dazu in der Doku.

Feb
04

Redirect 301 mit CakePHP

Aufgrund einer nicht sonderlich geschickten Programmierung hatte ich in einem älteren Programm ein

   $this->redirect(array('controller'=>'inquries', 'action'=>'request'));

drin gehabt. Allerdings führt das bei der Suchmaschine immer dazu, dass damit ein HTTP-Error 302 mitgeschickt wird. Da ich gerade die Programmierung angepasst habe, hat es sich ergeben, dass ich dieses Manko auch gleich mit abstellen wollte und dazu bietet Controller::redirect() auch einen zweiten Parameter, den man einfach mit dem gewünchten HTTP-Status vorbelegen kann. Also ganz einfach:

   $this->redirect(array('controller'=>'inquries', 'action'=>'request'), 301);

Schon fertig. Siehe dazu auch die API und das Error-Handling.

Feb
04

VCard oder RSS-Feed ?

Cake bietet mit seiner Router-Funktionalität die Chance ganz einfach neue Ausgabeformate zu definieren. Dem Router erklärt man erstmal mit

    Router::parseExtensions('rss', 'vcf');

auf welche Extensions er reagieren soll. RSS gehört dabei in Cake zu den Standardextensions, die über den RSS-Helper selbständig erzeugt werden kann. D.h. also, wenn

    http://meine.domain.de/products/index

einfach die Extension .rss an die Url angehängt wird

    http://meine.domain.de/products/index.rss

dann erkennt der Router die Erweiterung RSS in der URL und holt sich den RSS-View zur Ausgabe der Daten im RSS-Format. Normale Views finden sich in APP/views/products bezogen auf das obige Beispiel. Um nun die RSS-Ausgabe zu formatieren, erzeugt man einen zusätzlichen Unterordner APP/views/products/rss und legt dort für jeden gewünschten View, der als RSS-Feed erzeugt werden soll, eine entsprechende Datei. Also beispielsweise APP/views/products/rss/index.ctp und erzeugt mit Hilfe des RSS-Helpers die gewünschte Ausgabe.

Will man also auf die gleiche Weise statt einem RSS-Feed nun eine VCard von einem Kontakt erzeugen, dann geht man entsprechend vor. Zusätzlich benötigt man aber ein Layout für VCF-Dateien das man in APP/views/layouts/vcf/default.ctp anlegen muss. Dort hinterlegt man für die VCard die notwendigen Ausgaben, um das Format über den Browser auch richtig ausliefern zu können:

    Configure::write('debug', 0); // nur nötig, falls man im Debug-Mode arbeitet und trotzdem die Ausgaben testen will
    header(
        'Content-Type: application/directory; ' .
        'profile="vcard"; ' .
        'charset=' . $charset
    );
    header('Content-Length: ' . strlen($content_for_layout));
    header("Content-Disposition: $disposition; filename=\"$filename\"");
    echo $content_for_layout;
Jan
31

Eigene Vorlagen für Scaffolding und von Bake erzeugte Views

Scaffolding ist ja CakePHP Programmierung für ganz Faule. Naja, nicht nur, weil man damit ja schon recht einfach und vorallem schnell die notwendigen Dateien für Model, Controller und auch die Views erzeugen kann. Aber es geht natürlich auch mit

1
    var $scaffold;

das Scaffolding zu nutzen. CakePHP erzeugt dann keine Views oder sondern nutzt die zur Verfügung gestellten Vorlagen.

Genau um die Vorlagen gehts in dem Posting von teknoid, der das wohl von Mark Story im IRC-Chat aufgeschnappt hat.

Hier die Tipps zum Nachvollziehen:

Kopiere auf dem Verzeichnis cake/libs/view/scaffolds die Dateien für die entsprechenden Views - also

edit.ctp
index.ctp
view.ctp

ins eigene app/views/scaffolds Verzeichnis. Dabei wird übrigens für add und edit beidesmal edit.ctp eingesetzt. In app/views/scaffolds können die Views jetzt beliebig angepasst werden, bis sie euch gefallen.

Wenn man sich allerdings von der cake console mit Hilfe von bake die Views erzeugen lässt, dann macht man sich auch Kopien und zwar aus cake/console/libs/templates/views werden die Dateien

form.ctp
home.ctp
index.ctp
view.ctp

nach app/vendors/shells/templates/views kopiert und können dort einfach wieder verändert werden. Achtung das Verzeichnis views muss wohl erst noch erstellt werden. Also nicht wundern.

So und nun happy baking.

Jan
25

Kleine Tricks

Vieles in CakePHP lässt sich leichter programmieren, wenn man den einen oder anderen “Trick” kennt, der einem hilft schneller ans Ziel zu kommen.

$this->data im View nutzen

Wenn man im Controller Daten abholt und dann gleich an this->data zuweist, dass man die Daten nicht extra an den View weitergeben muss, sondern steht als this->data gleich zur Verfügung.

1
     $this->data = $this->MyModel->find('all');

Das allseits bekannte set muss dann nicht ausgeführt werden. Also kann man sich das

1
     $this->set('data', $this->data);

sparen, sondern kann im View einfach direkt weiterarbeiten:

1
2
3
4
     // ausgabe.ctp
     foreach ($this->data as $data) {
         // ausgabe von $data
     }

Wenn man das konsequent anwendet lassen sich viele Views recht schnell umsetzen, da man nicht ständig das $thi->set nutzen muss. Falls man übrigens mehrere Datenbereiche abholen und an den View übergeben will, dann nutzt man am Besten compact() also wie hier beispielsweise:

1
2
3
4
5
     $products = $this->Product->find('all');
     $categories = $this->Category->find('all');
     $customers = $this->Customer->find('all');
     // und jetzt mit einem set()
     $this->set(compact('products', 'categories', 'customers'));

Damit stehen dann im View alle drei Variablen $products, $categories, $customers bereit.

$id nutzen für das Update

Der zweite kleine Trick den ich hier am Sonntag noch schnell zur verfügung stellen will hat mit dem Update von einzelnen Feldern zu tun. Der umständliche Weg sieht in etwa so aus:

1
2
3
     $this->data = $this->MyModel->find('first', array('conditions'=>array('id' => $id)));
     $this->data['MyModel']['meinfeld'] = 'neuer Feldinhalt';
     $this->save($this->data);

Aber es geht in dem Fall ein wenig einfacher und zwar so:

1
2
     $this->MyModel->id = $id;
     $this->MyModel->saveField('meinfeld', 'neuer Feldinhalt');

So das war heute der Sonntagsbeitrag. Morgen gibts wieder etwas Ausführlicheres.

Oben