CakePHP Tutorials von IBM updated

Freitag, Juni 19th, 2009

Die wahrscheinlich bei allen CakePHP Entwickler bekannten IBM Tutorials (zuerst 2006 erschienen) wurden vor 2 Wochen auf den neuesten Stand gebracht. Unter Cook up Web sites fast with CakePHP, Part 1: Getting started findet sich jetzt für CakePHP Neulinge ein umfassendes Tutorial das viele Features von CakePHP (u.a. Caching, Security, Ajax) relativ gut beleuchtet und sich als Einstieg hervorragend eignet.

via pseudocoder.com

Kostenfreies CakePHP Buch

Donnerstag, Juni 18th, 2009

Beim Pseudocoder gibt es für alle CakePHP Entwickler ein höchst interessantes kostenfreies CakePHP Buch im PDF Format.

For anyone who missed it, I released a free CakePHP book a month ago. Since then it’s been downloaded over 2500 times. I’ve also received some great feedback and have made a bunch of corrections to the code and grammar. The biggest change is that the table of contents is now links and will jump you right to the section. That’s reason enough alone to grab the updated version. The new permanent home page for the book is here.

Debug Informationen in CakePHP

Mittwoch, Juni 10th, 2009

Debugging von Anwendungen, die auf PHP basieren, ist zwar mit Tools wie Zend / Eclipse leichter geworden als noch vor einigen Jahren, aber manchmal bedarf es auch nur einer einfachen Anzeige von Header-, Session- oder anderen Requestdaten während der Laufzeit im Frontend.

Bei der Entwicklung von CakePHP Anwendungen können von Haus aus Informationen z.B. zur Datenbankabfrage mithilfe der Konfigurationsvariable debug und des Befehls

Configure::write("debug", 1);

ausgegeben werden.

Es gibt insgesamt 4 Debug Level, die hier im Kontext einer älteren CakePHP Version (dort wird die Konstante DEBUG genutzt) folgendermaßen bezeichnet werden:

There are 4 levels of debug: 0-production, 1- development, 2- full debug with sql and 3- full debug with sql and dump of the current object. Specifying this setting to a non-zero value will force Cake to print out the results of pr( ) and debug( ) function calls, and stop flash messages from forwarding automatically. In production, the “flash messages” redirect after a time interval. With the other debug levels you get to click the “flash message” to continue. For example, if you want to set the debug level to “full debug with sql”, the line should look like this: define(‘DEBUG’, 2);

Da die Debug Informationen von Cake immer am unteren Seitenende gerendert und – sobald man vom CakePHP Standardlayout abweicht – auch äußerst hässlich werden, gibt es bei Snook.ca die folgenden CSS Klassendefinitionen, um diese Infos generell schicker zu gestalten:

.cake-sql-log {
	position:fixed;
	top:99%;
	z-index:10;
	width:100%;
	background-color:#000;
	color:#FFF;
	border-collapse:collapse;
}

.cake-sql-log caption {
	background-color:#900;
	color:#FFF;
}

.cake-sql-log:hover {
	top:auto;
	bottom:0;
}

.cake-sql-log td {
	padding:3px;
	border:1px solid #999;
	background-color:#EEE;
	color:#000;
}

Wer jetzt noch weitere Informationen braucht (wie oben bereits erwähnt u.a. zu Sessiondaten, Log-Aktivitäten, Timings etc.) der ist mit der CakePHP DebugKit Toolbar von Mark Story gut bedient.

Die Toolbar “versteckt” sich geradezu absolut positioniert in der rechten oberen Ecke der Webseite und öffnet sich blei Klick auf ein kleines Icon.

Was sie alles bietet, zeigt sich in den folgenden Screenshots:

DebugKit Toolbar in CakePHP
DebugKit Toolbar  in CakePHP - Timings der Prozesse
DebugKit Toolbar - Sessioninhalte, schön ausklappbar

Ich binde die Toolbar dynamisch je nach Umgebung auf folgende Art und Weise im app_controller ein:

	public function __construct(){
		parent::__construct();
		if(DEVELOPMENT_ENVIRONMENT){
			$this->components[] = 'DebugKit.Toolbar';
			Configure::write('debug', 2);
		} else {
			Configure::write('debug', 0);
		}
	}

Hier prüfe ich auf die Konstante DEVELOPMENT_ENVIRONMENT, die ich, wie alle anderen Variablen, die global für die App zur Verfügung stehen müssen, in der bootstrap.php definiere. Solche Variablen könnten eben serverseitig zur Auswahl der entsprechenden Pfade (z.B. für Logs oder temporäre Uploads) oder auch für die Auswahl der entsprechenden Datenbankverbindungen herangezogen werden.

CakePHP: Auf Mac OS im Terminal bake ausführen

Dienstag, Juni 9th, 2009

CakePHP
Wer auf Mac OS versucht, im Terminal das “Bake Script” von CakePHP auszuführen, wird wahrscheinlich auf die Problematik stoßen, dass die mitgelieferte PHP Version von Mac OS nicht korrekt das Script ausführt.

Hier gibt es – wie ich gelesen habe – hundert Ansätze, das Problem zu umschiffen, der leichteste und praktikabelste ist in meinem Setting (mit MAMP auf Mac OS) folgender, direkter Aufruf einer anderen PHP Version zum Ausführen des PHP Scripts.

Der Aufruf erfolgt in dem Projekt- Konsolenordner (z.B. in meinem Fall /Users/lrheingans/Documents/Workspace/Project_X/cake/console/)

/Applications/MAMP/bin/php5/bin/php cake.php bake

Von hier läuft dann alles wie gewohnt.

Um das Bake Script unter Eclipse ausführen zu können, gibt es auch in der Bakery einige Tutorials (mir war der mini Aufwand allerdings nicht wert, ich mag meine Konsole)

Internationalisierung mit CakePHP’s i18n Features

Donnerstag, Februar 12th, 2009

Zu meiner Ankündigung, wie die i18n Features von CakePHP richtig eingebunden werden können, gibt es bei gouranga | CakePHP I18n & l10n ein gut geschriebenes und relativ umfassendes Tutorial.

Dort werden die von Cake bereitgestellten Funktionen (den Artikel Localizing your Application gibt es übrigens hier) beschrieben, wie die verschiedenen Strings der .po Dateien aus Cake heraus aufgerufen werden können.

Was in manchen unserer Projekte auch oftmals wichtig war, ist und sein wird:
Wie können dynamische Inhalte, also solche aus der Datenbank, internationalisiert werden? Statische Strings sind mit der .po-File Variante kein Problem – aber wie sieht es mit dynamischem Content aus?

Ein nützliches Tutorial für diesen Ansatz findet sich z.b. hier und der dazugehörige Teil 2 hier. Wie die Stolpersteine hier aussehen und wie CakePHP ein Speichern / Updaten von i18n Einträgen behandelt kann ich später erläutern, grundsätzlich gibt es bei dieser Herangehensweise eine weitere Tabelle im Datenbankmodell, die folgendermaßen aussieht:

CakePHP i18n Tabelle

In dieser Datenbanktabelle werden sämtliche Übersetzungen der verschiedenen Models gespeichert (die Tabelle kann also ziemlich fix ziemlich “umfangreich” werden).

Für alle, die auf dem Mac den hervorragenden und günstigen SQLEditor nutzen, gibt es hier die oben gezeigte SQS Datei, ansonsten kann die Tabelle auch im Terminal angelegt werden, indem man im Verzeichnis /console von Cake folgenden Befehl eingibt:

./cake i18n

[ einige weitere andere Infos dazu auch unter dem top-to-bottom-persistent-internationalization-Tutorial auf CakePHP.org zu finden ]

Leider können HABTM Relationships erst ab Version 1.3 mit dem Translation Behavior von Cake bedient werden, heisst also: Hier muss manuell Hand angelegt werden, sobald HABTM Relationships ins Spiel kommen.

Kleiner Seitenhinweis:
Über die Konsole kann bei Cake auch ein komplettes, sog. “Baking” stattfinden, das anhand der Datenbankkonfiguration das komplette Projekt einmal initial erstellt, mit sämtlichen Models, Controllern und Views und sämtlichen CRUD Funktionen.

Sehr gute, verschiedene Screencasts zu CakePHP (Installation, Baking,
Scaffolding, …) finden sich im Übrigen sich auf der Webseite von David Golding, seines Zeichens Verfasser des Buches “Beginning CakePHP” (das, in meinen Augen, bei weiterm nicht mit dem CakePHP Buch von O’Reilly mithalten kann).

Syntax Highlighting in WordPress Blogs für CakePHP Beiträge

Dienstag, Februar 10th, 2009

Nach anfänglich großen Tönen ist zwar weiterhin nicht viel passiert, aber wo ich jetzt ein Wordpress Plugin um in einem Beitrag Syntax Highlighting mitzuliefern gefunden habe kann jetzt die Artikelflut losgehen.

Durch umfangreiche Arbeiten mit CakePHP in den letzten Wochen könnten verschiedene Themen aus unterschiedlichsten Bereichen interessant sein, die ich ggfls. in den nächsten Tagen Wochen mal vorstellen könnte:

  • Wie sieht eine sinnvolle Entwicklungsumgebung in Teams von Entwicklern aus? Wie kann man also mit Eclipse und SVN und anderen Techniken besser und schneller gemeinsam mit weniger Fehlern entwickeln.
  • Wie kann ich die CakePHP config so anpassen, dass ein Deployment auf unterschiedlichen Servern sinnvoll funktioniert (z.B. für verschiedene Server für Development, Testing und Live)
  • Wie nutzt man die CakePHP Auth Component richtig (immer wieder ein heisses Thema)?
  • Wie binde ich die i18n Features von CakePHP richtig ein?
  • Wie kann man die Pagination von CakePHP mit weiteren, eigenen Parametern oder Filtern versorgen?
  • Wie kann ich die Performance von CakePHP Projekten weiter verbessern?

Falls bei dem ein oder anderen Thema besonderes Interesse bestehen sollte – immer her mit Kommentaren.

CakePHP: Nach Ajax Reload funktionieren Ajax Links nicht mehr

Dienstag, Dezember 9th, 2008

Wer mit dem großartigen PHP Framework CakePHP arbeitet, kommt schnell in den Genuss des dort integrierten AJAX Helpers.

Hierbei können einzelne Div Inhalte einer Seite relativ problemlos mit aktualisierten Daten ausgetauscht werden. Im Hintergrund wird hier von CakePHP auf das Prototype Javascript Framework aufgesetzt (konkret: Ajax.Updater).

Im Grunde funktioniert das im Beispiel eines Formulars folgendermaßen:

echo $ajax->form(’sendMessage/’.$details['Nachricht']['id'],
‘post’,
array(‘update’ => ‘message-reply’.$details['Nachricht']['id'],
‘before’=>’toggleViewOfDiv(\’message-reply’.$details['Nachricht']['id'].’\')’,
‘complete’ => ‘new Ajax.Updater(\’all_messages_ajax\’, \’/news/messagebox\’,
{ evalScripts : true });’));

Wenn es sich nicht um ein Formular handelt, kann auch im $ajax->link im Optionsarray manuell der Ajax.Updater als Argument für die Option “complete” aufgerufen werden:

echo $ajax->link(__(‘Lesen’, true),
‘getMessageBody/’.$news['Nachricht']['id'],
array(‘complete’=>’new Ajax.Updater(\’all_messages_ajax\’, \’/news/messagebox\’,
{ evalScripts : true });’,
‘update’=>’message-’.$news['News']['id']));

Da bei einigen Leuten die nach dem Submit gerenderte Seite nicht mehr auf die durch $ajax->link generierten Links reagiert, muss als Option für den Ajax.Updater “evalScripts: true” übergeben werden.