<?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>Blog :: deam.org &#187; PHP/ PHP-Frameworks/ CakePHP</title>
	<atom:link href="http://blog.deam.org/tag/php-frameworks-cakephp/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deam.org</link>
	<description>hier schreibt Klaus M. Brantl</description>
	<lastBuildDate>Wed, 01 Sep 2010 06:27:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Core Helpers: HTML</title>
		<link>http://blog.deam.org/2008/10/31/core-helpers-html/</link>
		<comments>http://blog.deam.org/2008/10/31/core-helpers-html/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 09:17:34 +0000</pubDate>
		<dc:creator>Klaus M. Brantl</dc:creator>
				<category><![CDATA[PHP/ PHP-Frameworks/ CakePHP]]></category>
		<category><![CDATA[tableCells]]></category>

		<guid isPermaLink="false">http://blog.deam.org/?p=50</guid>
		<description><![CDATA[Ich habe zwar in den letzten Tagen sehr viele graue Haare auf Grund von HABTM bekommen, aber das ist ein Thema für einen separaten Post. Heute gibt es wieder eine undokumentierte Kleinigkeit: TD-Optionen bei tableCells. In der aktuellen Doku steht lediglich der Teil  mit den TR-Optionen drin. Das man aber auch TD&#8217;s mit zusätzlichen Angaben [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe zwar in den letzten Tagen sehr viele graue Haare auf Grund von HABTM bekommen, aber das ist ein Thema für einen separaten Post. Heute gibt es wieder eine undokumentierte Kleinigkeit: TD-Optionen bei tableCells.</p>
<p>In der aktuellen Doku steht lediglich der Teil  mit den TR-Optionen drin. Das man aber auch TD&#8217;s mit zusätzlichen Angaben versehen kann, steht da leider nicht drin. Erst durch das Ticket <a title="https://trac.cakephp.org/ticket/2406" href="http://">https://trac.cakephp.org/ticket/2406</a> hab ich herausgefunden das es diese (lebens-)notwendige Funktion gibt :-)</p>
<p>Ist eigentlich ganz einfach &#8211; das bisherige Beispiel:</p>
<pre class="ln-"><code class="php">&lt;?php echo $html-&gt;tableCells(array(
array('Jul 7th, 2007', 'Best Brownies', 'Yes'),
array('Jun 21st, 2007', 'Smart Cookies', 'Yes'),
array('Aug 1st, 2006', 'Anti-Java Cake', 'No'),
));
?&gt;

//Output
&lt;tr&gt;&lt;td&gt;Jul 7th, 2007&lt;/td&gt;&lt;td&gt;Best Brownies&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Jun 21st, 2007&lt;/td&gt;&lt;td&gt;Smart Cookies&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Aug 1st, 2006&lt;/td&gt;&lt;td&gt;Anti-Java Cake&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;</code></pre>
<p>Und das ist meine kleine Ergänzung für die CakePHP-Doku:</p>
<pre class="ln-"><code class="php">&lt;?php echo $html-&gt;tableCells(array(
array('Jul 7th, 2007', array('Best Brownies', array('style'=&gt;'font-weight:bold;')) , 'Yes'),
array('Jun 21st, 2007', 'Smart Cookies', 'Yes'),
array('Aug 1st, 2006', 'Anti-Java Cake', array('No', array('style'=&gt;'background-color:#ff0000;'))),
));
?&gt;

//Output
&lt;tr&gt;&lt;td&gt;Jul 7th, 2007&lt;/td&gt;&lt;td style="font-weight:bold;"&gt;Best Brownies&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Jun 21st, 2007&lt;/td&gt;&lt;td&gt;Smart Cookies&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Aug 1st, 2006&lt;/td&gt;&lt;td&gt;Anti-Java Cake&lt;/td&gt;&lt;td style="background-color:#ff0000;"&gt;No&lt;/td&gt;&lt;/tr&gt;</code></pre>
<p>Es gibt noch einen count-Parameter, den ich mir aber noch nicht näher angesehen habe.<br />
Das man &lt;td&gt;&#8217;s also auch direkt mit Attributen versehen kann, macht die ganze Sache dann doch recht elegant.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deam.org/2008/10/31/core-helpers-html/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>codeBlock und object: JSON mit CakePHP</title>
		<link>http://blog.deam.org/2008/10/15/codeblock-und-object-json-mit-cakephp/</link>
		<comments>http://blog.deam.org/2008/10/15/codeblock-und-object-json-mit-cakephp/#comments</comments>
		<pubDate>Wed, 15 Oct 2008 15:56:23 +0000</pubDate>
		<dc:creator>Klaus M. Brantl</dc:creator>
				<category><![CDATA[PHP/ PHP-Frameworks/ CakePHP]]></category>
		<category><![CDATA[$javascript->codeBlock]]></category>
		<category><![CDATA[$javascript->object]]></category>

		<guid isPermaLink="false">http://blog.deam.org/?p=40</guid>
		<description><![CDATA[Mit $javascript-&#62;codeBlock lässt sich recht elegant Javascript-Code einbetten (vor allem interessant, wenn man die ein oder andere Referenzinformation für eine JS-Funktion zur Verfügung stellen will &#8211; und das ohne AJAX). $javascript-&#62;codeBlock(&#8220;alert(&#8216;hallo&#8217;);&#8221;, array(&#8216;inline&#8217; =&#62; false)); Das &#8216;inline&#8217; =&#62; false ist Gold wert. Hat man in seinem default.ctp schön brav &#60;?php echo $scripts_for_layout ?&#62; in den &#60;head&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Mit $javascript-&gt;codeBlock lässt sich recht elegant Javascript-Code einbetten (vor allem interessant, wenn man die ein oder andere Referenzinformation für eine JS-Funktion zur Verfügung stellen will &#8211; und das ohne AJAX).</p>
<p><strong>$javascript-&gt;codeBlock(&#8220;alert(&#8216;hallo&#8217;);&#8221;, array(&#8216;inline&#8217; =&gt; false));</strong></p>
<p>Das &#8216;inline&#8217; =&gt; false ist Gold wert. Hat man in seinem default.ctp schön brav &lt;?php echo $scripts_for_layout ?&gt; in den &lt;head&gt; geschrieben, dann wird der JS-Code nicht mitten in die Seite &#8220;geschmiert&#8221;, sondern schön in den &lt;head&gt;-Bereich des Dokuments platziert. Sowas sorgt für Ordnung.</p>
<p><strong>$javascript-&gt;object($this-&gt;viewVars['adressenstatus'], false, &#8216;adressenstatus = &#8216;, &#8216;;&#8217;);</strong></p>
<p>Die <strong>object</strong>-Funktion macht aus einem Array entsprechend JSON &#8211; mit allem was dazugehört. In diesem Fall beziehe ich mich auf ein zweidimensionales Array, welches ich sowieso für die Ausgabe eines Popups brauche. Das <strong>$this-&gt;viewVars['adressenstatus']</strong> wird<strong> </strong>mit einem Präfix &#8216;adressenstatus = &#8216; und einem Suffix &#8216;;&#8217; versehen. Und schon habe ich ein schönes Javascript-Objekt.<strong> </strong>Das sieht dann in etwa so aus:</p>
<pre class="ln-"><code class="php">adressenstatus = {"Mitgliedschaft":{"1":"Plus-Mitgliedschaft","2":"Standard-Mitgliedschaft","3":"Gruppen-Mitgliedschaft"},"sonstiges":{"0":"Neuanmeldung","4":"Interessent","5":"Multiplikator","6":"Referent","7":"ruhende Mitgliedschaft","8":"Presse\/ \u00d6ffentlichkeitsarbeit\n"}};</code></pre>
<p>Jetzt kombiniere ich beides und schwups hängt das ganze im &lt;head&gt;-Bereich meiner Seite:</p>
<pre class="ln-"><code class="php">$javascript-&gt;codeBlock($javascript-&gt;object($this-&gt;viewVars['adressenstatus'], false, 'adressenstatus = ', ';'), array('inline' =&gt; false));</code></pre>
<p>Die Funktion <strong>$javascript-&gt;object</strong> werde ich wohl noch recht oft einsetzen. Vor allem auch in Zusammenhang mit AJAX.</p>
<p>Ziel der Übung von oben ist es bei einem onchange-Event eines Popups entsprechende Formularteile ein- oder auszublenden. Hier macht es imho wenig Sinn mit einem XHTTP-Request zu arbeiten, wenn der Datenumfang des Popups klein ist (in diesem Fall ja nur 9 Datensätze). Da liefert man das Objekt für Javascript einmal im &lt;head&gt; und bezieht sich dann entsprechend darauf.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deam.org/2008/10/15/codeblock-und-object-json-mit-cakephp/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>MVC: ein schöner Gedanke</title>
		<link>http://blog.deam.org/2008/09/05/mvc-ein-schoner-gedanke/</link>
		<comments>http://blog.deam.org/2008/09/05/mvc-ein-schoner-gedanke/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 12:33:30 +0000</pubDate>
		<dc:creator>Klaus M. Brantl</dc:creator>
				<category><![CDATA[PHP/ PHP-Frameworks/ CakePHP]]></category>
		<category><![CDATA[app_model.php]]></category>
		<category><![CDATA[beforeSave()]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false">http://blog.deam.org/?p=12</guid>
		<description><![CDATA[Ich verwende die Version 1.2. Aktuell in zwei Varianten mit dem RC2 und einem einigermassen aktuellem NightlyBuild. Ich gehe davon aus, das ich noch eine Weile benötige um richtig drin zu sein und dann sollte ja ggf. schon ein RC3 oder eine Release in Aussicht stehen. Nach dem Einlesen war mir klar, das ich mit [...]]]></description>
			<content:encoded><![CDATA[<p>Ich verwende die Version 1.2. Aktuell in zwei Varianten mit dem RC2 und einem einigermassen aktuellem NightlyBuild. Ich gehe davon aus, das ich noch eine Weile benötige um richtig drin zu sein und dann sollte ja ggf. schon ein RC3 oder eine Release in Aussicht stehen.</p>
<p>Nach dem Einlesen war mir klar, das ich mit dem 1.1 nicht mehr anfangen will, da hier einige grundlegende Teile fehlen. Zumindest so grundlegendes, dass ich nicht wirklich den Vorteil zu meinem framework gesehen habe. Das entscheidend neue (zumindest für mich) an 1.2 sind die eingebauten Validierungsregeln &#8211; das ist in der 1.1er deutlich &#8220;schlanker&#8221;.</p>
<p><strong>Aber fangen wir doch mal von vorne an: MVC.</strong><span id="more-12"></span></p>
<p>Ich bin ein Scripter. Ich schreibe schon eine gute Weile Perl- und fast genauso lange PHP-Scipts. ich denke von oben nach unten und habe mich eigentlich erst in den letzten 4 Jahren stärker auf Trennungen von Funktion und Inhalt konzentriert (vorher schon auch, aber eben nicht so intensiv).</p>
<p>Das MVC-Prinzip (Model-View-Controller) wird auf der <a href="http://book.cakephp.org/de/view/11/%C3%9Cbersicht">CakePHP-Seite</a> auch schön in deutsch beschrieben. Im Grunde ist es keine Hexerei. Es bedeutet aber viel Selbstbeherrschung. Der View-Teil ist dabei noch am leichtesten &#8211; nach dem Motto &#8220;hier nur Zeug zum Anzeigen rein und ausser ein paar IF-Abfragen keine wirkliche Logik machen&#8221;.</p>
<p>Model und Controller lassen sich dabei aber schon nicht mehr so gut trennen. Bzw. ist die Gefahr gross, dass man die Trennung nicht so klar macht. Ich habe inzwischen angefangen mich sehr auf die Callbackfunktionen zu konzentrieren. Diese stehen eigentlich immer jeweils nur in einem Typ zur Verfügung. Z.B. wenn ich <a href="http://book.cakephp.org/de/view/76/Callback-Methods">beforeSave()</a> verwende, dann ist das ein Model-Callback. Wenn ich also Daten kurz vorm Speichern (und in diesem Fall nach Validierung) noch &#8220;korrigieren&#8221; will, dann ist das der richtige Platz. Und da das beforeSave() nur in der Model-Klasse verfügbar ist, muss ich mch auch gar nicht aktiv zwischen Controller und Model entscheiden :-)</p>
<p>Was mir gestern erst so richtig klar geworden ist, dass man Superklassen hat. (WARNUNG: ich bin wie gesagt ein Scripter, deshalb kann es jetzt schonmal vorkommen, dass ich die Bezeichnungen nicht immer ganz korrekt hinbekomme). Das heisst man kann die Model-Klasse an oberster Stelle modifzieren. D.h. also ich kann mit app_model.php direkt im app-Ordner z.B. diese Funktion einsetzen:</p>
<pre class="ln-"><code class="php">class AppModel extends Model {
	function beforeSave()
	{
		/**
		 * Überprüft die Metadaten des Models und setzt dann die aktuellen Daten auf "null", wenn kein Inhalt gegeben ist.
		 *
		 * http://bakery.cakephp.org/articles/view/null-behavior
		 */

		$tableInfo = $this-&gt;schema();
		foreach ($tableInfo as $name =&gt; $field)
		{
			if($field['null'])
			{
				if(isset($this-&gt;data[$this-&gt;name][$name]) &amp;&amp; $this-&gt;data[$this-&gt;name][$name] === '')
				{
					$this-&gt;data[$this-&gt;name][$name] = null;
				}
			}
		}

		return true;
	}
}</code></pre>
<p>(Aus den Kommentaren der Bäckerei: <a href="http://bakery.cakephp.org/articles/view/null-behavior">http://bakery.cakephp.org/articles/view/null-behavior</a>)</p>
<p>Das nenne ich Handwerkszeug. Solche Funktionen sind nicht Bestandteil von CakePHP &#8211; auch nicht als Konfigurationsoptionen. Es ist aber nicht besonders schwer sowas zu integrieren. Und genau daran arbeite ich gerade, da ich möglichst viel Funktionsweisen in eine Form bringen möchte, damit ich sie wiederverwenden kann. Da würde dann wohl auch der <strong>vendor</strong>-Ordner mit hereinspielen. Aber soweit bin ich noch nicht :-)<br />
Ich arbeite mit einer MySQL und diese unterscheidet sehr wohl zwischen einem leeren String oder eben NULL. Und gerade bei formalen Feldtypen wie &#8220;date&#8221; ist es entscheidend ein NULL setzen zu können, wenn z.B. ein Geburtsdatum in der Adressverwaltung optional ist.</p>
<p>Aktuell integriere ich dieses Beispiel <a href="http://bakery.cakephp.org/articles/view/using-the-unobtrusive-date-picker-widget-in-cakephp">http://bakery.cakephp.org/articles/view/using-the-unobtrusive-date-picker-widget-in-cakephp</a> für eine Datumsauswahl in der app_model.php &#8211; und zwar in einer Form das ich mich damit nicht mehr weiter befassen muss und in der entsprechenden View nur noch entscheiden muss &#8220;will ich oder will ich nicht&#8221;. Der Standardselektor für Datumsauswahl gefällt mir nämlich ganz und gar nicht.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deam.org/2008/09/05/mvc-ein-schoner-gedanke/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>CakePHP: mal was anderes lernen</title>
		<link>http://blog.deam.org/2008/09/04/cakephp-mal-was-anderes-lernen/</link>
		<comments>http://blog.deam.org/2008/09/04/cakephp-mal-was-anderes-lernen/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 19:30:17 +0000</pubDate>
		<dc:creator>Klaus M. Brantl</dc:creator>
				<category><![CDATA[PHP/ PHP-Frameworks/ CakePHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php5]]></category>

		<guid isPermaLink="false">http://blog.deam.org/?p=3</guid>
		<description><![CDATA[Das deam.org-Blog wird mit Arbeit eröffnet. Ich habe über die letzten Jahre ein recht brauchbares framework entwickelt. Ein kleines framework, das den jeweiligen Nutzungsumständen immer gut anzupassen war. Inzwischen ist das Entwickeln aber deutlich komplexer geworden, d.h. es müssen mehrere Leute gleichzeitig arbeiten können. Dabei hat mein framework ein paar Limitierungen &#8211; nicht zuletzt in [...]]]></description>
			<content:encoded><![CDATA[<p>Das deam.org-Blog wird mit Arbeit eröffnet.</p>
<p>Ich habe über die letzten Jahre ein recht brauchbares framework entwickelt. Ein kleines framework, das den jeweiligen Nutzungsumständen immer gut anzupassen war. Inzwischen ist das Entwickeln aber deutlich komplexer geworden, d.h. es müssen mehrere Leute gleichzeitig arbeiten können. Dabei hat mein framework ein paar Limitierungen &#8211; nicht zuletzt in der Dokumentation. Es bedeutet doch relativ hohen Aufwand Dritte einzuführen, mit denen man zum ersten Mal zusammen arbeitet.</p>
<p>Aus diesem Grund habe ich mich entschieden einen neuen Weg zu gehen, oder ihn zumindest zu suchen. Mitte August 2008 hatte ich endlich ein paar Stunden Zeit mit CakePHP zu beginnen. Von allen MVC-ausgerichteten frameworks erscheint mit CakePHP bislang als das am besten &#8220;verfügbare&#8221; (dazu später noch mehr). Allerdigs bin ich mir zum jetzigen Stand noch nicht sicher, wie viel effektiver ich damit arbeiten kann.</p>
<p>Über die nächsten Wochen bis voraussichtlich Mitte November werde ich versuchen mich in CakePHP einzuarbeiten und mir entsprechendes Handwerkszeug zurecht zu legen. Einen guten Teil davon werde ich in diesem Blog veröffentlichen &#8211; in deutsch.</p>
<p>Es gibt eine Menge Quellen, aber im deutschsprachigen Raum ist es etwas mager. Ausserdemist das Thema der richtigen Vorgehensweise (&#8220;hänge ich das jetzt ins Model oder mach ich ein Behavior draus?&#8221;) auch in der englischen Google-Group nicht immer hinreichend gut zu klären.</p>
<p>Meine Aufgabenstellung ist eine Adressverwaltung, die ich vor mehr als 10 Jahren in PHP geschrieben habe und die immer noch im Einsatz ist. Beim letzten Switch von PHP4 auf PHP5 hat sich bei dieser Verwaltung gezeigt, dass es doch ein kleinwenig zuviel Anpassungen bedingte. Das Projekt ist aber überschaubar genug, um sich nicht an planungstechnischen Details aufhalten zu müssen, aber komplex genug um sich mit CakePHP intensiver beschäftigen zu müssen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deam.org/2008/09/04/cakephp-mal-was-anderes-lernen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
