<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cake Bakery &#187; Uncategorized</title>
	<atom:link href="http://cakebakery.de/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://cakebakery.de</link>
	<description>Rezepte für die Entwicklung mit CakePHP</description>
	<lastBuildDate>Wed, 22 Jul 2009 14:59:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ausblick auf Cake3</title>
		<link>http://cakebakery.de/2009/07/22/ausblick-auf-cake3/</link>
		<comments>http://cakebakery.de/2009/07/22/ausblick-auf-cake3/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 14:59:10 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/?p=64</guid>
		<description><![CDATA[In einem Interview hat Nate Abele, der Hauptentwickler von CakePHP, ein paar Ausblicke zu Cake 3 gegeben. Das h&#246;rt sich wirklich spannend, modern und vielversprechend an.
Sofort dachte ich mir aber: Dann bin ich ja monatelang damit besch&#228;ftigt, den Code von NoseRub kompatibel mit Cake 3 zu bekommen&#8230;
Das mag zwar ein wenig Panikmache sein, denn noch [...]]]></description>
			<content:encoded><![CDATA[<p>In einem <a href="http://debuggable.com/posts/Cake_3_interview_with_Nate_Abele:4a665a5e-5bfc-4e42-96ee-6d284834cda3">Interview</a> hat Nate Abele, der Hauptentwickler von CakePHP, ein paar Ausblicke zu Cake 3 gegeben. Das h&#246;rt sich wirklich spannend, modern und vielversprechend an.</p>
<p>Sofort dachte ich mir aber: Dann bin ich ja monatelang damit besch&#228;ftigt, den Code von <a href="http://noserub.com/">NoseRub</a> kompatibel mit Cake 3 zu bekommen&#8230;</p>
<p>Das mag zwar ein wenig Panikmache sein, denn noch ist &#252;berhaupt nicht klar, wie die Umstellung auf Cake 3 laufen soll, aber ich mache mir trotzdem schon einmal Gedanken dazu, wie man die Umstellung m&#246;glichst reibungslos hinbekommt.</p>
<p>Ich denke mal, dass Tests der Schl&#252;ssel zum Erfolg sind. Dabei sind jedoch nicht nur Unittests gemeint, sondern auch Tests mit Selenium um die Funktionalit&#228;t &#252;berpr&#252;fen zu k&#246;nnen.</p>
<p>Da kommt noch eine ganze Menge Arbeit auf mich zu&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2009/07/22/ausblick-auf-cake3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakeBakery nun auch auf Englisch</title>
		<link>http://cakebakery.de/2009/07/06/cakebakery-nun-auch-auf-englisch/</link>
		<comments>http://cakebakery.de/2009/07/06/cakebakery-nun-auch-auf-englisch/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 10:12:01 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/?p=56</guid>
		<description><![CDATA[Hier soll zuk&#252;nftig wieder ein bisschen mehr passieren, schlie&#223;lich fallen mir eigentlich fast t&#228;glich wieder Sachen in Bezug auf CakePHP auf. Die Arbeit mit NoseRub (Code) liefert dazu gen&#252;gend Nachschub :-)
Gleichzeitig werde ich die Artikel auch auf Englisch ver&#246;ffentlichen. Meistens wahrscheinlich mit einem kleinen Zeitverzug werden sie dann unter CakeBakery.net erscheinen.
]]></description>
			<content:encoded><![CDATA[<p>Hier soll zuk&#252;nftig wieder ein bisschen mehr passieren, schlie&#223;lich fallen mir eigentlich fast t&#228;glich wieder Sachen in Bezug auf CakePHP auf. Die Arbeit mit <a href="http://noserub.com">NoseRub</a> (<a href="http://noserub.com/code">Code</a>) liefert dazu gen&#252;gend Nachschub :-)</p>
<p>Gleichzeitig werde ich die Artikel auch auf Englisch ver&#246;ffentlichen. Meistens wahrscheinlich mit einem kleinen Zeitverzug werden sie dann unter <a href="http://cakebakery.net">CakeBakery.net</a> erscheinen.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2009/07/06/cakebakery-nun-auch-auf-englisch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Warum man query() und execute() niemals nutzen sollte</title>
		<link>http://cakebakery.de/2009/07/06/warum-man-query-und-execute-niemals-nutzen-sollte/</link>
		<comments>http://cakebakery.de/2009/07/06/warum-man-query-und-execute-niemals-nutzen-sollte/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 10:09:00 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/?p=54</guid>
		<description><![CDATA[Statt sich mit find() Anweisungen herumzuschlagen, passiert es gerade Anf&#228;ngern immer wieder, dass sie statt dessen lieber direkt ein SQL-Statement mittels query() oder execute() ausf&#252;hren.
Das solltet ihr aber wirklich nicht tun!
Mit einem Kollegen hatte ich dar&#252;ber viele Diskussionen, weil ich auch lieber direkt das SQL angegeben habe, aber dann brachte er irgendwann das ultimative Argument:

Du [...]]]></description>
			<content:encoded><![CDATA[<p>Statt sich mit <code>find()</code> Anweisungen herumzuschlagen, passiert es gerade Anf&#228;ngern immer wieder, dass sie statt dessen lieber direkt ein SQL-Statement mittels <code>query()</code> oder <code>execute()</code> ausf&#252;hren.</p>
<p><strong>Das solltet ihr aber wirklich nicht tun!</strong></p>
<p>Mit einem Kollegen hatte ich dar&#252;ber viele Diskussionen, weil ich auch lieber direkt das SQL angegeben habe, aber dann brachte er irgendwann das ultimative Argument:</p>
<blockquote><p>
Du umgehst damit <code>beforeFind()</code> und <code>afterFind()</code>!
</p></blockquote>
<p>Das war&#8217;s. Das ultimative Argument. Denn er hat Recht.</p>
<p>Stellt euch vor, dass ihr in <code>afterFind()</code> eines Models die gefundenen Daten zus&#228;tzlich anreichert. Sei es ein einfaches <em>name</em>, welches sich aus Vor- und Nachname zusammensetzt, oder andere, beliebig komplexe Dinge.</p>
<p>Wenn ihr nun mittels <code>query()</code> Daten aus diesem Model holt, fehlen die zus&#228;tzlichen Felder. Die Folge wird sein, dass euer Code Fehler produziert.</p>
<p>Macht euch also lieber die Arbeit und setzt euch mit <strong>find()</strong> auseinander. Dabei lernt ihr nicht nur eine Menge &#252;ber CakePHP, sondern habt im Ergebnis auch besser wartbaren Code.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2009/07/06/warum-man-query-und-execute-niemals-nutzen-sollte/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fallstricke bei den Model-Relationen</title>
		<link>http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/</link>
		<comments>http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 11:15:13 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/</guid>
		<description><![CDATA[Die Relationen bei CakePHp Models sind ein grundlegendes Feature und definieren, wie Models untereinander verbunden sind.
S&#228;mtliche find-Methoden aus Cake (auch findCount() und read()) benutzen diese Informationen, um verbundenen Models zu holen. Grunds&#228;tzlich eine prima Sache, aber bei komplexeren Datenstrukturen und Rekursionslevel von 2, kann da ein einfaches find() ganz sch&#246;n viel Daten zur&#252;ckliefern.
In der Praxis [...]]]></description>
			<content:encoded><![CDATA[<p>Die Relationen bei <a href="http://manual.cakephp.org/chapter/models">CakePHp Models</a> sind ein grundlegendes Feature und definieren, wie Models untereinander verbunden sind.</p>
<p>S&#228;mtliche <code>find</code>-Methoden aus Cake (auch <code>findCount()</code> und <code>read()</code>) benutzen diese Informationen, um verbundenen Models zu holen. Grunds&#228;tzlich eine prima Sache, aber bei komplexeren Datenstrukturen und Rekursionslevel von 2, kann da ein einfaches <code>find()</code> ganz sch&#246;n viel Daten zur&#252;ckliefern.</p>
<p>In der Praxis behilft man sich dann meistens mit <code>unbindModel()</code> und <code>bindModel()</code>. Hat man in seinen Models alle Relationen aufgef&#252;hrt, benutzt man vor jedem <code>find()</code> ein <code>unbindModel()</code> um &#252;berfl&#252;ssige Models zu entfernen. Der andere Weg w&#228;re, die Relationen im Model ganz weg zu lassen und dann jeweils gezielt mit <code>bindModel</code> zu spezifizieren, welche Models ben&#246;tigt werden.</p>
<p>Letzeres ist aber nicht wirklich erstrebenswert, weil damit in der Applikationslogik verborgen ist, wie die Models untereinander verbunden sind. Bliebe also nur, die unn&#246;tigen Models vor einem <code>find()</code> mit <code>unbindModel()</code> zu entfernen. Das ist aber dann problematisch, wenn in die Applikation immer mal wieder neue Models und Relationen eingepflegt werden. Denn dann m&#252;sste man diese neuen Relationen bei Bedarf (bzw. Nicht-Bedarf) in den <code>unbindModel()</code>-Aufrufen ebenfalls nachpflegen.</p>
<p>Alles in allem also irgendwie ziemlich unbefriedigend. Das hat sich auch Mariano Iglesias gedacht und <a href="http://bakery.cakephp.org/articles/view/185">expects()</a> erdacht. Mit <code>expects()</code> hat man die M&#246;glichkeit genau zu spezifizieren, welche Models beim nachfolgenden <code>find()</code> geholt werden sollen. Es ist damit nur eine andere Notation f&#252;r <code>bindModel()</code> und <code>undbindModel()</code>. Aber wesentlich einfacher gehalten, da in den Models weiterhin die Art der Relation (belongsTo, hasMany, etc.) spezifiziert wird und mittels <code>expects()</code> nur noch die in der R&#252;ckgabe erwarteten Models spezifiziert werden.</p>
<p><code>expects()</code> wird im AppModel eingef&#252;gt, man bleibt damit also unabh&#228;ngig von CakePHP selbst, was einem regelm&#228;&#223;ige Updates von CakePHP erleichtert.</p>
<p>Bei oben verlinktem Beitrag zu <code>expects()</code> sollte man unbedingt auch die Kommentare lesen, weil sie noch ein paar wichtige Fragen und Hinweise enthalten.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>YAML oder CSS-Fertigmischung</title>
		<link>http://cakebakery.de/2006/12/31/yaml-oder-css-fertigmischung/</link>
		<comments>http://cakebakery.de/2006/12/31/yaml-oder-css-fertigmischung/#comments</comments>
		<pubDate>Sun, 31 Dec 2006 13:27:17 +0000</pubDate>
		<dc:creator>teemow</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/12/31/yaml-oder-css-fertigmischung/</guid>
		<description><![CDATA[Hier ist nicht wirklich viel passiert, aber das heisst ja nicht, dass man hier nicht doch noch mal ein paar Tipps loswerden kann. Ich habe ja bereits &#252;ber eine m&#246;gliche Organisation des Javascripts geschrieben und mittlerweile auch eine Webseite zu Jamal aufgesetzt und auf den Barcamps in Berlin und K&#246;ln dar&#252;ber gesprochen (in K&#246;ln gab [...]]]></description>
			<content:encoded><![CDATA[<p>Hier ist nicht wirklich viel passiert, aber das heisst ja nicht, dass man hier nicht doch noch mal ein paar Tipps loswerden kann. Ich habe ja bereits &#252;ber eine m&#246;gliche <a href="http://cakebakery.de/2006/08/17/waschmittel-in-der-kuche/">Organisation des Javascripts</a> geschrieben und mittlerweile auch eine Webseite zu <a href="http://jamal.moagil.de/">Jamal</a> aufgesetzt und auf den Barcamps in Berlin und K&#246;ln dar&#252;ber gesprochen (in K&#246;ln gab es auch eine CakePHP Session). So etwas wie ein Release gibt es zwar immer noch nicht, aber das Ganze ist zumindest in meinem Kopf weitergewachsen ;). Nachdem man also CakePHP auf Seiten PHP einsetzt, sein Javascript irgendwann in naher Zukunft durch Jamal organisiert, fehlt eigentlich nur noch das XHTML bzw. CSS.</p>
<p>Dazu kann ich jedem <a href="http://www.yaml.de/">YAML &#8211; Yet another Multicolumn Layout</a> (nicht zu verwechseln mit dem <a href="http://en.wikipedia.org/wiki/YAML">Markup</a>) von Dirk Jesse empfehlen. Dies ist ein &#8216;CSS-Framework&#8217;, das als Grundbaustein f&#252;r allerlei Spaltenlayouts einzusetzen ist und eine Menge Arbeit spart, wenn man sich an die dazugeh&#246;rigen Konventionen h&#228;lt. Die Dokumentation des Frameworks ist sehr ausf&#252;hrlich und erkl&#228;rt die vielen CSS Probleme und Stolperfallen ausf&#252;hrlich. Selbst, wenn man YAML nicht einsetzen m&#246;chte, lohnt sich das Lesen. Zudem hat Dirk Jesse gerade sein Buch <a href="http://www.amazon.de/CSS-Layouts-Praxisl%C3%B6sungen-YAML-Dirk-Jesse/dp/3898428370/?tag=gcnewde-21">&#8216;CSS Layouts &#8211; Praxisl&#246;sungen mit YAML&#8217;</a> bei <a href="http://www.galileocomputing.de/?GPP=yaml">Galileo</a> ver&#246;ffentlicht.</p>
<p>Allen Bakern einen guten Rutsch und viel Erfolg im kommenden Jahr.</p>
<p><strong>Update:</strong> Mein Dank geht an dieser Stelle nochmal an <a href="http://anatom5.de/">Ansgar Hein</a> und <a href="http://grochtdreis.de/">Jens Grochtdreis</a>, die mir YAML auf einer Barcamp Session in K&#246;ln n&#228;hergebracht haben. Im Fr&#252;hjahr wird es im &#220;brigen wieder ein Barcamp in Deutschland geben, diesmal in Frankfurt: <a href="http://barcampfrankfurt.pbwiki.com/">Barcamp &#8211; Frankfurt</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/12/31/yaml-oder-css-fertigmischung/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>favicon.ico und die Nebenwirkungen</title>
		<link>http://cakebakery.de/2006/09/18/faviconico-und-die-nebenwirkungen/</link>
		<comments>http://cakebakery.de/2006/09/18/faviconico-und-die-nebenwirkungen/#comments</comments>
		<pubDate>Mon, 18 Sep 2006 07:20:44 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/09/18/faviconico-und-die-nebenwirkungen/</guid>
		<description><![CDATA[Es gibt manchmal schon lustige Zuf&#228;lle: letzte Woche musste ich selbst mit dem Ph&#228;nomen k&#228;mpfen und ein paar Tage sp&#228;ter las ich dann das hier in der CakePHP Google-Group: da wunderte sich jemand, warum eine Zeile drei Mal in eine Tabelle eingef&#252;gt wird, obwohl er es doch nur einmal im Code aufruft. Die L&#246;sung ist [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt manchmal schon lustige Zuf&#228;lle: letzte Woche musste ich selbst mit dem Ph&#228;nomen k&#228;mpfen und ein paar Tage sp&#228;ter las ich dann das hier in der <a href="http://groups.google.com/group/cake-php/browse_thread/thread/cf7290023e46f884">CakePHP Google-Group</a>: da wunderte sich jemand, warum eine Zeile drei Mal in eine Tabelle eingef&#252;gt wird, obwohl er es doch nur einmal im Code aufruft. Die L&#246;sung ist &#8211; &#252;berraschenderweise &#8211; meilenweit entfernt von seinem Code.</p>
<p>Denn im Header-Bereich seiner Seite wurde extra ein Link f&#252;r ein Favicon definiert, welcher auf <i>favicon.ico</i> zeigt und nicht etwa <i>/favicon.ico</i>. Dieser kleine Unterschied hat eine gro&#223;e Auswirkung, denn der Browser versucht nun, in jedem Unterverzeichnis ein Favicon zu finden.</p>
<p>Und wenn man in CakePHP so sch&#246;n mit <a href="http://cakebakery.de/2006/07/27/nette-urls/">netten URLs</a> arbeitet (das ist keine Kritik an den Nice-URLs!), steht im Browser oft sowas hier: <i>http://mein-cooles-projekt.de/produkte/neu/</i>. F&#252;r den Browser ist das ein Verzeichnis und so versucht er, aus <i>/produkte/neu/</i> das Favicon zu laden. Aufrgrund der Verarbeitung der Routen in CakePHP wird dabei aber erneut die Controller-Action aufgerufen, darin wieder die Seite gerendert, nochmal ein Link auf das Favicon gesetzt, usw.. Warum der Controller nun genau drei Mal aufgerufen wird, kann ich nicht genau sagen. Vielleicht ist dies dann auch nur eine Race-Condition, die eine Endlosschleife verhindert.</p>
<p>Beobachtet habe ich dieses Verhalten &#252;brigens mit dem Firefox und auf die Schliche gekommen bin ich letztendlich mit der wunderbaren Erweiterung <i>Live HTTP Headers</i>.</p>
<p>Gel&#246;st werden kann das Problem auf zwei Arten: entweder man verzichtet g&#228;nzlich auf die Favicons und l&#246;scht die entsprechende Zeile aus <i>layout/default.html</i>. Oder man f&#252;gt ein / vor <i>favicon.ico</i> ein. Dann sucht der Browser nur im Document-Root nach dem Favicon.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/09/18/faviconico-und-die-nebenwirkungen/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Waschmittel in der K&#252;che</title>
		<link>http://cakebakery.de/2006/08/17/waschmittel-in-der-kuche/</link>
		<comments>http://cakebakery.de/2006/08/17/waschmittel-in-der-kuche/#comments</comments>
		<pubDate>Thu, 17 Aug 2006 14:02:33 +0000</pubDate>
		<dc:creator>teemow</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/08/17/waschmittel-in-der-kuche/</guid>
		<description><![CDATA[Eigentlich geht es nicht direkt nur um Waschmittel, sondern um den Einsatz aller Putzutensilien und dem dazugeh&#246;rigen Putzschrank. 
Als ich letztes Jahr anfing CakePHP zu nutzen, gab es da schon einen Helper f&#252;r Ajax eigentlich insbesondere f&#252;r Prototype. Leider hatte ich immer das Problem, dass der nie genau das tun wollte, was ich gerade vorhatte. [...]]]></description>
			<content:encoded><![CDATA[<p>Eigentlich geht es nicht direkt nur um Waschmittel, sondern um den Einsatz aller Putzutensilien und dem dazugeh&#246;rigen Putzschrank. </p>
<p>Als ich letztes Jahr anfing CakePHP zu nutzen, gab es da schon einen Helper f&#252;r Ajax eigentlich insbesondere f&#252;r Prototype. Leider hatte ich immer das Problem, dass der nie genau das tun wollte, was ich gerade vorhatte. Zum Beispiel gab es damals noch keine saubere Umsetzung ein Formular per Ajax abzuschicken, aber genauso ohne Javascript zu funktionieren. Heute findet man auch im trac etwas zu <a href="https://trac.cakephp.org/wiki/Proposals/JavaScript">&#8216;degradable ajax&#8217;</a>. </p>
<p>Das &#228;ndert aber nichts daran, dass die Javascript Generierung nach wie vor nicht alle M&#246;glichkeiten bietet und das HTML mit Script-Bl&#246;cken und hart codierten Eventhandlern durchsetzt. Was wenn ich eine Applikation bauen m&#246;chte, in der CSS und Javascript &#8216;degradable&#8217; sein sollen, sehr unsch&#246;n ist. Dieses Problem zu l&#246;sen w&#252;rde mir ein Maximum an Usability und gleichzeitiger Accessibility bieten.</p>
<p>Davon abgesehen ist die Pflege des Javascript Codes schwierig, wenn die Funktionen &#252;ber viele Views hinweg verstreut in der Gegend herum liegen. Da wird es auch schwer sein Javascript test-getrieben zu entwickeln. Ich war zwar froh mit CakePHP ein Framework gefunden zu haben, mit dessen Konventionen ich sehr gut leben und meinen PHP Code besser strukturieren kann, aber das Javascript ist und bleibt chaotisch.</p>
<p>Was also, wenn ich mein Javascript komplett von meinen Templates trennen m&#246;chte? Wieso ist mein Javascript nicht auch nach MVC getrennt? Warum &#252;bertrage ich nicht einfach die Ideen aus Rails und CakePHP auf mein Javascript?</p>
<p>Diese Fragen schwirrten lange in meinem Kopf herum. Mittlerweile habe ich mir ein rudiment&#228;res Javascript Framework geschrieben, der gr&#246;&#223;te Dank geht dabei an <a href="http://jquery.com/">jQuery</a>! Mit jQuery kann ich mein Javascript komplett vom HTML trennen ohne f&#252;r jedes Element Ids vergeben zu m&#252;ssen. Die Notation ist &#228;hnlich wie bei Prototype &#252;ber $(), jedoch kann man anstelle der Id auch eine CSS &#228;hnliche Notation verwenden (das hat uns ja auch schon behaviour gezeigt). jQuery ist mit 17kb recht kompakt, performant und bietet neben Ajax, Effekten und Eventhandling die M&#246;glichkeit recht schicke Plugins zu schreiben.</p>
<p>Derzeit habe ich also bei einer Cake Applikation kein einziges &#8216;onclick, onsubmit usw.&#8217; und ausser den im Head eingebundenen Javascript Dateien keinen weiteren Skript-Block in meinen Views. Die Initialisierung des Javascripts l&#228;uft, nach dem Laden des DOMs &#252;ber jQuery&#8217;s document.ready(). Das Startup Skript l&#228;dt die Routen f&#252;r die Applikation, initialisiert &#252;ber einen Dispatcher den jeweiligen Controller und startet eine Methode, genauso geht es ja auch in Cake zu. In der Controller Methode werden dann die Events dieser Seite registriert und die f&#252;r die Intialisierung der Seite notwendigen Model bzw. View Methoden direkt aufgerufen.</p>
<p>Die Konzepte Model, View, Controller in Javascript zu Ã¼bertragen ist recht einfach. Zuerst einmal wird ein Request durch ein Event ausgel&#246;st. D.h. der Controller startet die f&#252;r das Event registrierte Funktion und je nachdem ob es sich z.b. um ein Ajax Request oder Business Logik handelt wird eine Model Funktion aufgerufen. View Methoden bestehen aus Effekten z.b. das Ein/Ausblenden von Elementen, CSS Modifikationen und dem Rendern von neuen Elementen.</p>
<p>Die Kommunikation zwischen Cake und Javascript l&#228;uft &#252;ber JSON und es k&#246;nnen von Cake gerenderte View-Elemente oder auch Objekte/Arrays &#252;bergeben werden.</p>
<p>Die Ordnerstruktur ist &#228;hnlich aufgebaut, wie in Cake d.h. w&#228;hrend der Entwicklung ist das Javascript immer sch&#246;n dokumentiert und in verschiedenen Dateien. Bei einem Deploy kann man dann z.b. &#252;ber den <a href="http://dojotoolkit.org/docs/compressor_system.html">Dojo Compressor</a> eine einzelne Datei generieren.</p>
<p>Zu guter letzt hab ich die vorhandene <a href="http://cakeforge.org/projects/testsuite/">Test Suite</a> von Cake aufgebohrt, um die Javascript Dateien mit der <a href="http://www.jsunit.net/runner/testRunner.html?testpage=/runner/tests/jsUnitTestSuite.html">Testing Umgebung von jsUnit</a> testen zu k&#246;nnen.</p>
<p>Wir arbeiten jetzt hier bei <a href="http://ormigo.com/">Ormigo</a> mit dieser Architektur. Da im Moment sehr viel zu tun ist, gibt es noch kein Release. Wer es aber nicht aush&#228;lt und unbedingt sehen will wie das Ganze funktioniert schreibt einfach einen Kommentar oder ne Mail an mich.</p>
<p><strong>Update:</strong> Kurzes Beispiel:</p>
<p>Startup Skript:</p>
<pre name="code" class="js">
var routes = {
    '/profil/': 'Users/profile',
    '/kontakte/*/': 'Users/contact_page',
};

$(document).ready(function(){
    dispatcher = new Dispatcher(routes);

});
</pre>
<p>Controller:</p>
<pre name="code" class="js">
/*
 * UsersController
 *
 */
UsersController = function () {
    views['Users'] = new UsersView();
    models['User'] = new User();

    /**
     * User Profile
     */
    this.profile = function(filter) {
        $('div.person div.container').tabs({on: 1});

        $('div.fragment dl dd', filter).hover(
                    function(){views.Users.showTeaser(this);},
                    function(){views.Users.hideTeaser(this);});

        $('div.fragment dd', filter).click(function(){
            views.Users.showAllInput(this);
            views.Users.showInput(this);
        });

    }

    /**
     * Contact page
     */
    this.contact_page = function(filter) {
        $('div.person div.container').tabs({on: 1});
    }

}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/08/17/waschmittel-in-der-kuche/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Deutschsprachige CakePHP Ressourcen</title>
		<link>http://cakebakery.de/2006/07/29/deutschsprachige-cakephp-ressourcen/</link>
		<comments>http://cakebakery.de/2006/07/29/deutschsprachige-cakephp-ressourcen/#comments</comments>
		<pubDate>Sat, 29 Jul 2006 15:20:14 +0000</pubDate>
		<dc:creator>Daniel Hofstetter</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/07/29/deutschsprachige-cakephp-ressourcen/</guid>
		<description><![CDATA[In diesem Post werde ich versuchen, die mir bekannten deutschsprachigen Ressourcen zum Thema &#8220;CakePHP&#8221; aufzulisten (falls eine Ressource fehlt, einfach einen Kommentar hinterlassen). 
Falls ihr nun eine lange Liste erwartet, so muss ich euch leider entt&#228;uschen, es gibt n&#228;mlich bis jetzt kaum deutschsprachige CakePHP Ressourcen :&#124;
http://groups.google.com/group/cakephp-de: &#8220;Forum&#8221; mit momentan etwas mehr als 20 Mitgliedern.
http://wiki.cakephp.org/tutorials:litte_german_example: Ein [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Post werde ich versuchen, die mir bekannten deutschsprachigen Ressourcen zum Thema &#8220;CakePHP&#8221; aufzulisten (falls eine Ressource fehlt, einfach einen Kommentar hinterlassen). </p>
<p>Falls ihr nun eine lange Liste erwartet, so muss ich euch leider entt&#228;uschen, es gibt n&#228;mlich bis jetzt kaum deutschsprachige CakePHP Ressourcen :|</p>
<p><a href="http://groups.google.com/group/cakephp-de">http://groups.google.com/group/cakephp-de</a>: &#8220;Forum&#8221; mit momentan etwas mehr als 20 Mitgliedern.</p>
<p><a href="http://wiki.cakephp.org/tutorials:litte_german_example">http://wiki.cakephp.org/tutorials:litte_german_example</a>: Ein Tutorial f&#252;r Anf&#228;nger, bei dem haupts&#228;chlich um das Benutzen von bake geht.</p>
<p>irc.freenode.org #cakephp: Streng genommen ist dies keine deutschsprachige Ressource, aber es tummeln sich dort meistens auch Leute, die deutsch sprechen.</p>
<p><a href="http://de.wikipedia.org/wiki/CakePHP">http://de.wikipedia.org/wiki/CakePHP</a>: Eintrag bei Wikipedia.</p>
<p><a href="http://rikman.mtb-news.de/tag/cakephp">http://rikman.mtb-news.de/tag/cakephp</a>: Mehrere Beispiele von Applikationen, die mit CakePHP entwickelt wurden.</p>
<p>Und schliesslich noch dieses Blog hier ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/07/29/deutschsprachige-cakephp-ressourcen/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Nette Urls</title>
		<link>http://cakebakery.de/2006/07/27/nette-urls/</link>
		<comments>http://cakebakery.de/2006/07/27/nette-urls/#comments</comments>
		<pubDate>Thu, 27 Jul 2006 10:25:36 +0000</pubDate>
		<dc:creator>teemow</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/07/27/nette-urls/</guid>
		<description><![CDATA[Grunds&#228;tzlich bietet CakePHP &#252;ber Routen recht einfach konfigurierbare Urls. Als Beispiel nehme ich mal das Blog Tutorial. Die folgende Route ruft die Add Methode im PostController auf, um das Template f&#252;r einen neuen Blog Beitrag zu rendern.
routes.php


$Route->connect('/beitrag/anlegen', array('controller'=>'posts', 'action'=>'add'));

posts_controller.php

function add() {
    if (!empty($this->data)) {
        ...
 [...]]]></description>
			<content:encoded><![CDATA[<p>Grunds&#228;tzlich bietet CakePHP &#252;ber Routen recht einfach konfigurierbare Urls. Als Beispiel nehme ich mal das <a href="http://wiki.cakephp.org/tutorials:blog_tutorial_-_1">Blog Tutorial</a>. Die folgende Route ruft die Add Methode im PostController auf, um das Template f&#252;r einen neuen Blog Beitrag zu rendern.</p>
<p>routes.php</p>
<pre name="code" class="php">

$Route->connect('/beitrag/anlegen', array('controller'=>'posts', 'action'=>'add'));
</pre>
<p>posts_controller.php</p>
<pre name="code" class="php">
function add() {
    if (!empty($this->data)) {
        ...
    }
}
</pre>
<p>Das ist also kein Problem. Jetzt m&#246;chte ich aber den neuen Beitrag in der Url nicht &#252;ber seine ID referenzieren, sondern auch hier eine sprechende Url verwenden.</p>
<p>routes.php</p>
<pre name="code" class="php">
$Route->connect('/beitrag/anzeigen/*', array('controller'=>'posts', 'action'=>'view'));
</pre>
<p>posts_controller.php</p>
<pre name="code" class="php">
function view($url) {
    if ($post = $this->Post->findByUrl(urldecode($url))) {
        $this->set('data', $post);
    }
}</pre>
<p>Falls man das &#8216;anzeigen&#8217; in der Url weglassen m&#246;chte, dann m&#252;ssen in der routes.php auf jeden Fall alle anderen statischen Urls vor der &#8216;beitrag/*&#8217; Route stehen.</p>
<p>Jetzt w&#228;re es nat&#252;rlich sch&#246;n wenn man neben dem Anlegen, die restlichen <a href="http://de.wikipedia.org/wiki/CRUD">CRUD Funktionen</a> auch sprechend verlinken k&#246;nnte. D.h. man ruft das Editieren eines Beitrags nicht &#252;ber /beitrag/editieren/nette-urls/ sondern per /beitrag/nette-urls/editieren/ (oder auch /kommentar/anlegen/nette-urls/ vs. /beitrag/nette-urls/kommentar/anlegen/) auf. </p>
<p>routes.php</p>
<pre name="code" class="php">
$Route->connect('/beitrag/:post_url/editieren/', array('controller'=>'posts', 'action'=>'edit'));
</pre>
<p>posts_controller.php</p>
<pre name="code" class="php">
function edit() {
    if ($post = $this->Post->findByUrl(urldecode($this->params['post_url']))) {
        $this->set('data', $post);
    }
}</pre>
<p>Am besten nutzt man eine Komponente, die beim Anlegen eines Beitrags den Titel in eine valide Url konvertiert. Die Url muss nat&#252;rlich auch eindeutig sein, ein UNIQUE auf das Datenbankfeld und eine entsprechende Pr&#252;fung in der Komponente sind also noch n&#246;tig. Das k&#246;nnte dann z.B. so aussehen:</p>
<pre name="code" class="php">
class UrlComponent extends Object {
    /**
     * lower case without special chars
     */
    function getNiceUrl($str, $except=array()) {
        $str = strtr($str,"Ã€ÃÃ‚ÃƒÃ„Ã…Ã Ã¡Ã¢Ã£Ã¤Ã¥Ã‡Ã§Ã’Ã“Ã”Ã•Ã–Ã˜Ã²Ã³Ã´ÃµÃ¶Ã¸ÃˆÃ‰ÃŠÃ‹Ã¨Ã©ÃªÃ«ÃŒÃÃŽÃÃ¬Ã­Ã®Ã¯Ã™ÃšÃ›ÃœÃ¹ÃºÃ»Ã¼Ã¿Ã‘Ã±",
        "AAAAAAaaaaaaCcOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNn");

        $str = strtolower(trim ($str) ) ;

        $str = preg_replace ('/[^a-z0-9\-\.,\*]/', '-', $str) ;
        $str = preg_replace ('/([\-\.,\*]{2,})/ue', "substr('\\1', 0, 1)", $str) ;
        $str = preg_replace ('/^[^a-z0-9]|[^a-z0-9]$/', '', $str ) ;

        $i = 1;
        while(in_array($str, $except)) {
            $str = $str . '-' . $i;
            $i++;
        }
        return $str;
    }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/07/27/nette-urls/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>20 Stunden fÃ¼r eine CakePHP-Website</title>
		<link>http://cakebakery.de/2006/07/26/20-stunden-fur-eine-cakephp-website/</link>
		<comments>http://cakebakery.de/2006/07/26/20-stunden-fur-eine-cakephp-website/#comments</comments>
		<pubDate>Wed, 26 Jul 2006 15:34:51 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/07/26/20-stunden-fur-eine-cakephp-website/</guid>
		<description><![CDATA[In einem Erfahrungsbericht zu seinem CakePHP-Projekt Tourguide.MTB-News.de erklÃ¤rt Rikman wie relativ wenig Arbeitsaufwand in der Umsetzung mit CakePHP steckte:
Nach dem das Konzept fertig war und die Applikationsstruktur in Datenbanktabellen (es sind nur fÃ¼nf StÃ¼ck) Ã¼bersetzt wurde, konnte ich die Applikation von der ersten getippten Codezeile (irgendwann am Donnerstag, 22. Juni 2006) bis zum Release (Montag, [...]]]></description>
			<content:encoded><![CDATA[<p>In einem <a href="http://rikman.mtb-news.de/archives/2006/07/04/cakephp-mtb-news-tourguide/">Erfahrungsbericht</a> zu seinem CakePHP-Projekt <a href="http://tourguide.mtb-news.de/">Tourguide.MTB-News.de</a> erklÃ¤rt <i>Rikman</i> wie relativ wenig Arbeitsaufwand in der Umsetzung mit CakePHP steckte:</p>
<blockquote><p>Nach dem das Konzept fertig war und die Applikationsstruktur in Datenbanktabellen (es sind nur fÃ¼nf StÃ¼ck) Ã¼bersetzt wurde, konnte ich die Applikation von der ersten getippten Codezeile (irgendwann am Donnerstag, 22. Juni 2006) bis zum Release (Montag, 26. Juni 2006) in nur gut 20 Arbeitsstunden fertig stellen.</p></blockquote>
<p>Auch die anderen Passagen sind sehr aufschluÃŸreich. Einen Screenshot seiner CakePHP-Site hat er lobenswerter Weise auch schon in der <a href="http://flickr.com/photos/rikman/198839785/in/pool-cakephp/">Flickr-Gruppe</a> verÃ¶ffentlicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/07/26/20-stunden-fur-eine-cakephp-website/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
