<?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</title>
	<atom:link href="http://cakebakery.de/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>Themes in CakePHP</title>
		<link>http://cakebakery.de/2009/07/06/themes-in-cakephp/</link>
		<comments>http://cakebakery.de/2009/07/06/themes-in-cakephp/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:21:13 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://cakebakery.de/?p=58</guid>
		<description><![CDATA[CakePHP bringt von Haus aus eine Unterst&#252;tzung sogenannter &#8220;Themes&#8221;. Man kann sie mit Wordpress-Themes vergleichen, wobei CakePHP hier nat&#252;rlich nur die M&#246;glichkeit anbietet, diese Themes den eigenen Nutzern zur Verf&#252;gung zu stellen.
Wenn man aber, wie bei NoseRub Admins und Usern die M&#246;glichkeit geben m&#246;chte, das Aussehen der gesamten Installation, oder aber der eigenen Profilseite anzupassen, [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHP bringt von Haus aus eine Unterst&#252;tzung sogenannter &#8220;Themes&#8221;. Man kann sie mit Wordpress-Themes vergleichen, wobei CakePHP hier nat&#252;rlich nur die M&#246;glichkeit anbietet, diese Themes den eigenen Nutzern zur Verf&#252;gung zu stellen.</p>
<p>Wenn man aber, wie bei <a href="http://noserub.com/">NoseRub</a> Admins und Usern die M&#246;glichkeit geben m&#246;chte, das Aussehen der gesamten Installation, oder aber der eigenen Profilseite anzupassen, sind die Themes eine prima Sache &#8211; und auch sehr leicht zu implementieren.</p>
<p>Die Templates f&#252;r die Webseiten sind bei Cake in sogenannte <em>Views</em> organisiert und liegen im Normalfall unter <code>/app/views</code>. Zugeh&#246;rige CSS- und JavaScript-Dateien befinden sich unter <code>/app/webroot/</code>.</p>
<p>Um die Unterst&#252;tzung von Themes im eigenen CakePHP Projekt zu aktivieren, muss man erst einmal im entsprechenden Controller auf eine andere View-Klasse wechseln. Der Einfachheit halber kann man das direkt im AppController machen:</p>
<pre name="code" class="php">
class AppController extends Controller {
    public $view = 'Theme';
    ...
}
</pre>
<p>Vor dem Rendern muss CakePHP nun au&#223;erdem mitgeteilt werden, welches Theme benutzt werden soll. F&#252;r NoseRub habe ich das ebenfalls im AppController gemacht um als Standardwert ein vorgegebenes Theme auszuw&#228;hlen:</p>
<pre name="code" class="php">
class AppController extends Controller {
    public $view = 'Theme';
    public $theme = 'default';
    ...
}
</pre>
<p>Man kann das aber nat&#252;rlich auch an anderer Stelle im Controller &#228;ndern. Wenn also z.B. eine Profilseite des Users angezeigt werden soll und dabei ein vom User ausgew&#228;hltes Design genommen werden soll, kann man dies so erreichen:</p>
<pre name="code" class="php">
class UsersController extends AppController {
    public $uses = array('User');

    public function view($username) {
        $user = $this->find('first', array(
            'conditions' => array(
                'User.username' => $username
            )
        ));
        $this->set('user', $user);

        // todo: check that user exists before proceeding!
        // todo: check that value of user theme is valid

        $this->theme = $user['User']['theme'];
    }
}
</pre>
<p>Die Daten f&#252;r dieses View such CakePHP nun an folgenden Orten: <code>/app/views/themed/[theme name]/</code> und <code>/app/webroot/themed/[theme name]/</code>. F&#252;r ein Theme mit dem Namen <em>green</em> w&#252;rde Cake nun also zuerst das Default-Layout (ein anderes ist ja nicht gesetzt) unter <code>/app/views/themed/green/layouts/default.ctp</code> suchen und dann das View, welches hier gerendert werden soll in <code>/app/views/themed/green/users/view.ctp</code>.</p>
<p>Dabei ist das sch&#246;ne, dass Cake immer auf die Version ohne <code>themed</code> im Pfad zur&#252;ckgreift, falls die Variante mit <code>themed</code> gar nicht vorhanden ist. Wenn man seine Applikation also sch&#246;n mit Views und Elementen strukturiert, k&#246;nnen die Themes sehr einfach ausfallen und teilweise nur anderes CSS enthalten. (Man denke nur an <a href="http://www.csszengarden.com/">CSS Zen Garden</a>!)</p>
<p>Das funktioniert nat&#252;rlich auch f&#252;r Javascript Dateien. In NoseRub wird das JavaScript per Element in das Layout hinzugef&#252;gt und zwar &#252;ber folgende zwei Zeilen:<br />
<code name="code" class="php"><br />
echo $javascript->link('theme.js');<br />
echo $javascript->link('noserub.js');<br />
</code></p>
<p>Unter <code>/app/webroot/js/theme.js</code> liegt nun eine leere Implementierung, die automatisch von einer themespezifischen <code>theme.js</code> &#252;berschrieben wird, weil CakePHP diese ja beim Rendern vorziehen wird.</p>
<p>Einziger wirklicher Nachteil der Themes in CakePHP ist, das Views und CSS/JS von einander getrennt sind. Man kann also nicht einfach nur ein einziges Verzeichnis irgendwo hochladen um ein Theme zu &#8220;installieren&#8221;, wie das z.B. bei Wordpress geht. Andererseits ist das aber auch ein riesiger Sicherheitsgewinn, weil der PHP-Code in den Views abseits des &#246;ffentlich zug&#228;nglichen Webroots (vorausgesetzt, der liegt auf <code>/app/webroot/</code>, wie es empfohlen wird).</p>
<p>F&#252;r NoseRub werden wir daf&#252;r aber im Admin-Bereich eine Upload-M&#246;glichkeit geben, wo dann ein Archiv mit zwei Ordnern <em>views</em> und <em>webroot</em> erwartet werden &#8211; sofern uns keine bessere M&#246;glichkeit einf&#228;llt&#8230;</p>
<p><strong>Update: </strong> In den Kommentaren hat Robert noch eine wichtige Anmerkung zum Thema Caching und Themes gemacht.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2009/07/06/themes-in-cakephp/feed/</wfw:commentRss>
		<slash:comments>2</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>findCount() und belongsTo</title>
		<link>http://cakebakery.de/2007/02/16/findcount-und-belongsto/</link>
		<comments>http://cakebakery.de/2007/02/16/findcount-und-belongsto/#comments</comments>
		<pubDate>Fri, 16 Feb 2007 11:23:42 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2007/02/16/findcount-und-belongsto/</guid>
		<description><![CDATA[Die Model-Funktionen findCount() und findCountAll() ber&#252;cksichtigen die Model-Relation belongsTo, was zu ungewollten Effekten f&#252;hrt, da dies zu einigen JOINs in der Datenbankabfrage resultiert und somit mehr oder weniger Resultate liefert, als eigentlich beabsichtigt.
Deshalb sollte man auch vor einem findCount() auf expects() zur&#252;ckgreifen, um nur die Models zu ber&#252;cksichtigen, die auch gewollt sind:

$this->MeinModel->recursive = 0;
$this->MeinModel->expects('MeinModel');
$anzahl = [...]]]></description>
			<content:encoded><![CDATA[<p>Die Model-Funktionen <code>findCount()</code> und <code>findCountAll()</code> ber&#252;cksichtigen die Model-Relation <code>belongsTo</code>, was zu ungewollten Effekten f&#252;hrt, da dies zu einigen JOINs in der Datenbankabfrage resultiert und somit mehr oder weniger Resultate liefert, als eigentlich beabsichtigt.</p>
<p>Deshalb sollte man auch vor einem <code>findCount()</code> auf <a href="http://cakebakery.de/2007/02/16/fallstricke-bei-den-model-relationen/">expects()</a> zur&#252;ckgreifen, um nur die Models zu ber&#252;cksichtigen, die auch gewollt sind:</p>
<pre name="code" class="php">
$this->MeinModel->recursive = 0;
$this->MeinModel->expects('MeinModel');
$anzahl = $this->MeinModel->findCount();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2007/02/16/findcount-und-belongsto/feed/</wfw:commentRss>
		<slash:comments>0</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>Der Unterschied zwischen execute() und query()</title>
		<link>http://cakebakery.de/2007/02/15/der-unterschied-zwischen-execute-und-query/</link>
		<comments>http://cakebakery.de/2007/02/15/der-unterschied-zwischen-execute-und-query/#comments</comments>
		<pubDate>Thu, 15 Feb 2007 10:04:26 +0000</pubDate>
		<dc:creator>dirk.olbertz</dc:creator>
				<category><![CDATA[Code]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2007/02/15/der-unterschied-zwischen-execute-und-query/</guid>
		<description><![CDATA[Schaut man sich die Beschreibung zu beiden Methoden an, ist eigentlich kein Unterschied auszumachen. In der Praxis k&#246;nnen diese beiden Anfragen aber durchaus unterschiedlich reagieren:

$mein_model->cacheQueries = false;
$mein_model->query('SELECT COUNT(DISTINCT plz) FROM test_table');

$mein_model->cacheQueries = false;
$mein_model->execute('SELECT COUNT(DISTINCT plz) FROM test_table');

query() beachtet n&#228;mlich die Cache-Einstellungen via cacheQueries nicht, w&#228;hrend execute() dies aber tut. Die R&#252;ckgabe beider Methoden ist identisch, [...]]]></description>
			<content:encoded><![CDATA[<p>Schaut man sich die Beschreibung zu beiden Methoden an, ist eigentlich kein Unterschied auszumachen. In der Praxis k&#246;nnen diese beiden Anfragen aber durchaus unterschiedlich reagieren:</p>
<pre name="code" class="php">
$mein_model->cacheQueries = false;
$mein_model->query('SELECT COUNT(DISTINCT plz) FROM test_table');

$mein_model->cacheQueries = false;
$mein_model->execute('SELECT COUNT(DISTINCT plz) FROM test_table');
</pre>
<p><code>query()</code> beachtet n&#228;mlich die Cache-Einstellungen via <code>cacheQueries</code> nicht, w&#228;hrend <code>execute()</code> dies aber tut. Die R&#252;ckgabe beider Methoden ist identisch, man sollte also nach M&#246;glichkeit <code>execute()</code> statt <code>query()</code> benutzen, damit man mittels <code>cacheQueries</code> immer die M&#246;glichkeit hat, auf das Model-Caching von Cake Einflu&#223; nehmen zu k&#246;nnen.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2007/02/15/der-unterschied-zwischen-execute-und-query/feed/</wfw:commentRss>
		<slash:comments>1</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>CakePHP v1.1.8.3544</title>
		<link>http://cakebakery.de/2006/09/22/cakephp-v1183544/</link>
		<comments>http://cakebakery.de/2006/09/22/cakephp-v1183544/#comments</comments>
		<pubDate>Fri, 22 Sep 2006 14:59:58 +0000</pubDate>
		<dc:creator>christian</dc:creator>
				<category><![CDATA[CakePHP.org]]></category>

		<guid isPermaLink="false">http://cakebakery.de/2006/09/22/cakephp-v1183544/</guid>
		<description><![CDATA[Es gibt mal wieder eine neue Stable Release von CakePHP. v1.1.8.3544 wird die letzte Version der 1.1er Reihe sein. Mit v1.2 kommen dann einige Neuerungen wie etwa I18N und Behaviours auf uns zu!
Weiters wurde die offizielle Bakery von CakePHP er&#246;ffnet. Unter http://bakery.cakephp.org kann man Tutorials, Case Studies und Code Snippets finden. Geplant ist, dass s&#228;mtliche [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt mal wieder eine neue Stable Release von CakePHP. v1.1.8.3544 wird die letzte Version der 1.1er Reihe sein. Mit v1.2 kommen dann einige Neuerungen wie etwa I18N und Behaviours auf uns zu!</p>
<p>Weiters wurde die offizielle Bakery von CakePHP er&#246;ffnet. Unter <a href="http://bakery.cakephp.org">http://bakery.cakephp.org</a> kann man Tutorials, Case Studies und Code Snippets finden. Geplant ist, dass s&#228;mtliche Inhalte vom Wiki und von den Code Pastes auf die Bakery &#252;bertragen werden. Das hei&#223;t, jeder ist dazu aufgefordert Beitr&#228;ge zu schreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakebakery.de/2006/09/22/cakephp-v1183544/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>
	</channel>
</rss>
