<?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>donlarsoN - what makes me tick</title>
	<atom:link href="http://donlarson.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://donlarson.de</link>
	<description>donlarsoN Blog php symfony zend development</description>
	<lastBuildDate>Fri, 16 Sep 2011 15:23:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Problem using join in Zend_Db_Table</title>
		<link>http://donlarson.de/problem-using-join-in-zend_db_table/</link>
		<comments>http://donlarson.de/problem-using-join-in-zend_db_table/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 10:18:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Zend]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=213</guid>
		<description><![CDATA[Ich stand nun vor folgendem Problem: Von einem Projekt ableitend sollte ich eine Tabelle mit einer zweiten zusammenführen. Hierbei wurde anhand der Zend_Db_Table Funktion folgende Abfrage im Model geschrieben: $resultSet = $this->getDbTable()->fetchAll( $this->getDbTable() ->select() ->where("category_id = ?", intval($cat)) ); Fügt man jetzt einfach einen ->join() ein bringt er einen Fehler. Einen Blick auf die Zend-Library [...]]]></description>
			<content:encoded><![CDATA[<p>Ich stand nun vor folgendem Problem:<br />
Von einem Projekt ableitend sollte ich eine Tabelle mit einer zweiten zusammenführen.<br />
Hierbei wurde anhand der Zend_Db_Table Funktion folgende Abfrage im Model geschrieben:</p>
<p><code><br />
$resultSet = $this->getDbTable()->fetchAll(<br />
$this->getDbTable()<br />
        ->select()<br />
        ->where("category_id = ?", intval($cat))<br />
);<br />
</code></p>
<p>Fügt man jetzt einfach einen ->join() ein bringt er einen Fehler. Einen Blick auf die Zend-Library (select.php) zeigt uns hierbei mehr. Standardgemäß ruft er eine Funktion &#8220;setIntegrityCheck()&#8221; auf, welche eine Flag auf true gesetzt hat und das Joinen von 2 oder n Tabellen verhindert. Dieses müssen wir beim Query als false-Flag mit übergeben. Zudem ist es jetzt notwendig die &#8220;from&#8221;-Zuweisung zu deklarieren.</p>
<p>Nachher:</p>
<p><code<br />
 $query = $this->getDbTable()<br />
                        ->select()<br />
                        ->from('premium')<br />
                        ->setIntegrityCheck(false)<br />
                        ->join('premium_translation', 'premium_translation.id = premium.id')<br />
                        ->where("premium.category_id = ?", intval($cat))<br />
 $resultSet = $this->getDbTable()->fetchAll($query);<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/problem-using-join-in-zend_db_table/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compile APC-Modul under OS-X</title>
		<link>http://donlarson.de/compile-apc-for-os-x/</link>
		<comments>http://donlarson.de/compile-apc-for-os-x/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 10:10:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=205</guid>
		<description><![CDATA[Da es unter MAC OS-X meist zu Problemen beim APC-Modul kommt, hier ein Weg diesen ordnungsgemäß zu komplilieren: Basis ist hierbei die OS-X Vers. 10.6.5 und die Zend Server Community Edit. letzte Version des APC runterladen In den entpackten Ordnerpfad gehen (Users/USERNAME/Downloads/APC-xx /usr/local/zend/bin/phpize im Terminal ausführen ACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS=&#8221;-arch i386 -g -Os -pipe -no-cpp-precomp&#8221; CCFLAGS=&#8221;-arch i386 [...]]]></description>
			<content:encoded><![CDATA[<p>Da es unter MAC OS-X meist zu Problemen beim APC-Modul kommt, hier ein Weg diesen ordnungsgemäß zu komplilieren:<br />
Basis ist hierbei die OS-X Vers. 10.6.5 und die Zend Server Community Edit.</p>
<ul>
<li>letzte Version des <a href="http://pecl.php.net/package/APC">APC</a> runterladen</li>
<li>In den entpackten Ordnerpfad gehen (Users/USERNAME/Downloads/APC-xx</li>
<li><em>/usr/local/zend/bin/phpize</em> im Terminal ausführen</li>
<li><em>ACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS=&#8221;-arch i386 -g -Os -pipe -no-cpp-precomp&#8221; CCFLAGS=&#8221;-arch i386 -g -Os -pipe&#8221; CXXFLAGS=&#8221;-arch i386 -g -Os -pipe&#8221; LDFLAGS=&#8221;-arch i386 -bind_at_load&#8221; ./configure &#8211;with-php-config=/usr/local/zend/bin/php-config</em></li>
<li><em>make</em></li>
<li><em>sudo make install</em></li>
<li>Mit dem VI-Editor in die PHP.INI folgendes erzänzen:<br />
<em>$ sudo vi /usr/local/zend/etc/php.ini</em></p>
<p><em>[APC]<br />
extension=apc.so<br />
apc.enabled = 1<br />
apc.optimization  = 0<br />
apc.shm_segments = 1<br />
apc.shm_size = 128M<br />
apc.ttl = 7200<br />
apc.user_ttl  = 7200<br />
apc.num_files_hint = 1024<br />
apc.mmap_file_mask = /tmp/apc.XXXXXX<br />
apc.enable_cli = 1<br />
apc.cache_by_default  = 1<br />
apc.max_file_size = 10M<br />
apc.stat = 1<br />
apc.include_once_override = 1</em></li>
<li>Apache Neustarten<br />
<em>$ sudo /usr/local/zend/bin/zendctl.sh restart-apache</em>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/compile-apc-for-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OSX: Cannot rename file .svn directory /entries</title>
		<link>http://donlarson.de/osx-cannot-rename-file-svn-directory-entries/</link>
		<comments>http://donlarson.de/osx-cannot-rename-file-svn-directory-entries/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 11:42:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[SVN]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=198</guid>
		<description><![CDATA[Nach dem normalen Checkout-Prozess wollte ich erneut mein Projekt im Workspace updaten. Hierbei bekam ich folgende Fehlermeldung: Cannot rename file myproject/.svn/tmp/entries&#8217; to myproject/.svn/entries&#8217; Mein erster Schritt war natürlich nach den Schreibrechten im Pfad zu schauen. Beim genaueren betrachten hat der SVN-Projectpfad &#8220;entries&#8221; nur Leserechte. SUDO chmod 777 Aufruf brachte hierbei auch keinen Erfolg, sondern brachte [...]]]></description>
			<content:encoded><![CDATA[<p>Nach dem normalen Checkout-Prozess wollte ich erneut mein Projekt im Workspace updaten. Hierbei bekam ich folgende Fehlermeldung:</p>
<p><em>Cannot rename file myproject/.svn/tmp/entries&#8217; to myproject/.svn/entries&#8217;</em></p>
<p>Mein erster Schritt war natürlich nach den Schreibrechten im Pfad zu schauen. Beim genaueren betrachten hat der SVN-Projectpfad &#8220;entries&#8221; nur Leserechte. SUDO chmod 777 Aufruf brachte hierbei auch keinen Erfolg, sondern brachte einen Fehler &#8220;permission denied&#8221;.</p>
<p>Lösung: OSX nutzt eine spezielle UCHG-Flag als READ-ONLY-FLAG,  die FLAG muss mit &#8220;chflags -R nouchg *&#8221; zurückggestellt werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/osx-cannot-rename-file-svn-directory-entries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Netbeans PortalPack 3.0.2 for Liferay</title>
		<link>http://donlarson.de/netbeans-portalpack-3-0-2-for-liferay/</link>
		<comments>http://donlarson.de/netbeans-portalpack-3-0-2-for-liferay/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 10:28:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=173</guid>
		<description><![CDATA[Liferay ist mit einer der angesagtesten Content-Management-Lösungen die es als Open Source unter der JAVA-Entwicklung gibt. In Deutschland eher weniger verbreitet kann es in anderen Ländern wie der USA oder Indien viele Nutzer verbuchen. Entsprechend gibt es leider sogut wie garkeine oder viele veraltete Dokumentationen in Deutsch über das Entwickeln mit einer IDE + Liferay, [...]]]></description>
			<content:encoded><![CDATA[<p>Liferay ist mit einer der angesagtesten Content-Management-Lösungen die es als Open Source unter der JAVA-Entwicklung gibt. In Deutschland eher weniger verbreitet kann es in anderen Ländern wie der USA oder Indien viele Nutzer verbuchen.</p>
<p>Entsprechend gibt es leider sogut wie garkeine oder viele veraltete Dokumentationen in Deutsch über das Entwickeln mit einer IDE + Liferay, was mich dazu gewogen hat dieses Tutorial zu schreiben.</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/netlife.png" alt="null" /></p>
<p>In den Kapiteln des Tutorials werdet Ihr von der Installation, über das Templating bis hin zur Weiterentwicklung von Portlets begleitet.</p>
<p><span id="more-173"></span><br />
<strong>Kapitel 1 &#8211; Installation</strong></p>
<p>In diesem ersten Kapitel des Tutorials werde ich euch erklären, wie man sich die passende IDE mit dem Portalpack (build JSR168) für das JAVA-CMS &#8220;Liferay&#8221; einrichtet. Alternativ sollte das Portlet in der Lage sein auf einer anderen JSR168 konformen Portlet-Container zu laufen. Für die Einrichtung werden folgende &#8220;Tools&#8221; benötigt, um diesem Tutorial zu folgen:</p>
<ul>
<li>aktuellste JAVA SDK</li>
<li>Netbeans 6.3 Beta</li>
<li>Netbeans Plugin Portalpack 3.0.2</li>
<li>Liferay-Tomcat bundle</li>
</ul>
<p><strong>Schritt 1</strong><br />
Installtion des aktuellen JAVA SDK, welches ihr auf <a href="http://java.sun.com/">SUN.COM</a> findet.</p>
<p><strong>Schritt 2</strong><br />
Nun folgt die IDE (<a href="http://www.netbeans.org">Netbeans</a>), welche Ihr runterladen und installieren müsst</p>
<p><strong>Schritt 3</strong><br />
Für die Entwicklung von Portlets und das Templating vom Liferay wird noch das Plugin &#8220;PortalPack 3.0.2&#8243; benötigt, dieses ladet Ihr entweder auf <a href="http://portalpack.netbeans.org/">portalpack.netbeans.org/</a> (falls es mal nicht OFF sein sollte) oder <a href="http://contrib.netbeans.org/portalpack/pp30/download302.html">contrib.netbeans.org</a> runter und entpackt dies. Im Anschluss startet Ihr Netbeans und fügt das Plugin hinzu. Dies geschieht unter: TOOLS -&gt; PLUGIN -&gt; DOWNLOAD -&gt; ADD PLUGIN und fügt alle in der ZIP enthaltenen Plugins ein und installiert es.</p>
<p><strong>Schritt 4</strong><br />
Unter <a href="http://www.liferay.com/web/guest/downloads/portal">Liferay.com</a> ladet Ihr die aktuelle Version des CMS mit dem Tomcat bundle runter. Dieses entpackt Ihr in ein von euch gewähltes Verzeichnis. Alternativ könnt Ihr zum Beispiel auch Glassfish als Application Server verwenden, hierbei dann das Glassfish bundle runterladen.</p>
<p>Im nächsten Kapitel wollen wir uns dem hinzufügen eines &#8220;Liferay Portal Servers&#8221; im Netbeans widmen.</p>
<p><strong>Kapitel 2 &#8211; Implementierung eines Liferay-Portal-Server</strong></p>
<p>Im ersten Kapitel haben wir uns der Installation der IDE mit Liferay gewidmet, nun wollen wir uns um die Einrichtung des Portal Servers richten. </p>
<p>Unter Services im Netbeans findet Ihr eine Auflistung von Web-Services, Trackers und auch den Servern. Mit einem rechtsklick auf &#8220;Server&#8221; fügt Ihr einen neuen Server hinzu.</p>
<p>Als Serverart wählen wir uns durch das Plugin integrierte &#8220;Liferay Portal Server 5.x&#8221; aus und klicken zum nächsten Schritt. </p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/site1_addserver.png" alt="Serverart hinzufügen" /></p>
<p>Da ich in diesem Tutorial auf einen Tomcat setze, wählen wir diesen als Servertyp und geben den Catalina-Pfad des Tomcats ein, der rest wird automatisch ergänzt. </p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/site2_addserver.png" alt="Servertyp auswählen" /></p>
<p>Im dritten Schritt kann alles standardgemäß belassen werden und klicken auf &#8220;finish&#8221;.</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/site3_addserver.png" alt="" /></p>
<p>Wenn alles geklappt hat können wir beim Aufklappen der Server nun unseren Liferay Portal Server finden und diesen starten. Im nächsten Kapitel werden wir unser erstes kleines Portlet erstellen.</p>
<p><strong>Kapitel 3 &#8211; &#8220;Hello World&#8221; Portlet</strong></p>
<p>Kommen wir nun zum 3. Kapitel, wo wir uns mit dem Portlet von Liferay beschäftigen werden. Ein Portlet ist eine Web-Application welche authentifizierten und personalisierten Zugriff auf integrierte Inhalte von unterschiedlichen Quellen (Aggregation) bietet. Erstellte und bereits vorhandene Portlets geben also den Inhalt für das Portal ansich wieder.</p>
<p>Damit wir unser erstes &#8220;Hello World&#8221; Portlet erstellen können, müssen wir zunächst ein neues &#8220;Projekt&#8221; anlegen. Dies geschieht in der Menüleiste unter &#8220;File -> New Project&#8221;</p>
<p>Als erstes werden wir von einer Auswahl von &#8220;Arten&#8221; von Projekten begrüßt. Da es sich bei uns um ein Web-Projekt handelt, wählen wir diese auch aus</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/addproject_1.png" alt="" /></p>
<p>Im nächsten Schritt müssen wir den Projektnamen definieren und wählen einen Speicherort. </p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/addproject_2.png" alt="" /></p>
<p>Jetzt wählen wir einfach den &#8220;Liveray Portal Server 5.x&#8221; aus und gehen zum 4. und letzten Schritt. Die wahl des Frameworks läuft hierbei recht bescheiden aus. &#8220;Portlet Service&#8221; sollte hierbei fürs erste reichen. Dies angeklickt bietet dieses Framework für uns die notwendige konfiguration. Mit Klick auf &#8220;Create Portlet&#8221; erstellen wir ein neues Portlet und definieren dieses wie im unteren Screenshot-Beispiel.</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/addproject_4.png" alt="" /></p>
<p>Jetzt können wir unser erstes Portlet erstellen und schauen uns links im Projects-Menüfeld unser Portlet an. Die Struktur ist folgendermaßen Aufgebaut:</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/addproject_5.png" alt="" /></p>
<p>In der WEB-INF findet ihr nun die nötigen JSP`s um dem Portlet Inhalt zu verschaffen, sowie die XML´s welche unter anderem für die Registrierung einer neuen Application in Liferay dient. Die &#8220;xxx.view.jsp&#8221; könnt Ihr nun bearbeiten und euer &#8220;Hello world&#8221; ausgeben lassen. Zum Abschluss muss dieses Projekt nun mit &#8220;Run&#8221; oder alternativ &#8220;Build&#8221; und &#8220;Deploy&#8221; der neue Zustand erstellt werden. Um diese Application nun unserem Portal hinzuzufügen, loggen wir uns im Frontend ein und gehen in den Docks (User-Menüauswahl) auf &#8220;Add Application&#8221;. Jetzt finden wir eine große Auswahl bereits vorhandener Portlets und auch unserers ist unter &#8220;User-Portlets&#8221; zu finden.</p>
<p><img src="http://23291.webhosting8.1blu.de/archiv/bauwehner/wp-content/uploads/2009/11/addproject_6.png" alt="" /></p>
<p>Dies schieben wir nun per Drag&#038;Drop in unser Layout, fertig.</p>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/netbeans-portalpack-3-0-2-for-liferay/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony: DoUpdate() with jQuery</title>
		<link>http://donlarson.de/symfony-using-ajax-doupdate/</link>
		<comments>http://donlarson.de/symfony-using-ajax-doupdate/#comments</comments>
		<pubDate>Tue, 24 Aug 2010 07:16:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=144</guid>
		<description><![CDATA[Folgendes Szenario: Wir haben eine tabellarische Listenansicht, welche uns die Werte aus der Datenbank wiedergibt. Wenn dies z.B. eine Sortierungsspalte beinhaltet, macht es sich ganz gut diesen direkt per klick in der Zelle zu ändern statt erst über das Editiermenü zum Formular zu gelangen. Ziel ist es also, in eine Zelle via Mausklick zu klicken [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://donlarson.de/wp-content/uploads/2010/08/symfony_jquery.png" alt="jquery symfony" /></p>
<p>Folgendes Szenario: Wir haben eine tabellarische Listenansicht, welche uns die Werte aus der Datenbank wiedergibt. Wenn dies z.B. eine Sortierungsspalte beinhaltet, macht es sich ganz gut diesen direkt per klick in der Zelle zu ändern statt erst über das Editiermenü zum Formular zu gelangen. Ziel ist es also, in eine Zelle via Mausklick zu klicken wo sich ein Inputfeld öffnet, wir den Wert manipulieren können und dieser gespeichert wird.<br />
<span id="more-144"></span><br />
Wir erstellen uns also ein neues AJAX Modul, welche normal mit einem Action-Controller und einem Indextemplate aufgespalten ist.<br />
Hintergrund ist das hierbei die Werte übergeben und gespeichert werden.</p>
<p><em>actions/actions.class.php</em></p>
<pre class="brush: php;">
class ajaxActions extends sfActions
{
 /**
  * Executes index action
  *
  * @param sfRequest $request A request object
  */
  public function executeIndex(sfWebRequest $request)
  {
    $object = Doctrine::getTable($request-&gt;getParameter('type'))-&gt;findOneById($request-&gt;getParameter('id'));
    $object-&gt;setSort($request-&gt;getParameter('value'));
    $object-&gt;save();
    return $this-&gt;renderText('');
  }
}
</pre>
<p>templates/indexSuccess.php</p>
<p>Wir haben ein 2. Modul, in diesem Fall eine Artikelansicht, welche eine Sortierungsspalte für die korrekte Reinfolge in der Darstellung beinhaltet. Wir verbergen hierbei das Input-Feld und zeigen mittels SPAN-TAG nur den Wert an. Mit Javascript soll hierbei bei klick der SPAN-TAG versteckt und das Inputfeld sichtbar werden.</p>
<p>article/indexSuccess.php</p>
<pre class="brush: php;">
&lt;input type=&quot;hidden&quot; value=&quot;&lt;?php echo $cont['id'] ?&gt;&quot; /&gt;
                  &lt;input type=&quot;hidden&quot; value=&quot;&lt;?php echo $cont['type'] ?&gt;&quot; /&gt;
                  &lt;span&gt;&lt;?php echo $cont['sort'];?&gt;&lt;/span&gt;
</pre>
<p>jQuery Script<br />
Das ist sozusagen der Übermittler, der den Hintergrundprozess steuert und die PHP-Funktionen zum speichern aufruft. Wie im Code gut zu lesen ist werden die manipulierten Werte an das AJAX-Modul übergeben und gespeichert. </p>
<p><em>.siblings()</em> erlauben das suchen von Elementen in der DOM-Struktur des jQuery-Objektes und konstruiert ggf. ein neues Objekt.<br />
Mit <em>$.post(&#8216;<?php echo url_for('ajax/index'); ?>&#8216;, data, function()</em> übergeben wir die manipulierten Daten an das AJAX-Modul, wo diese dann PHP-seitig verarbeitet werden.</p>
<pre class="brush: php;">
function doUpdate (myThis) {

    myThis.siblings('span').html(myThis.val()).show();

    var data      = {};
    data['id']    = myThis.siblings('input').val();
    data['type']  = myThis.siblings('input').next().val();
    data['value'] = myThis.val();

    $.post('&lt;?php echo url_for('ajax/index'); ?&gt;', data, function(){

    });

    $('table td.contentSort span').each(function(){
      if($(this).siblings('input').val() == myThis.siblings('input').val() &amp;&amp; $(this).siblings('input').next().val() == myThis.siblings('input').next().val() )
      {
        var value = myThis.val();
        $(this).text(value);
      }
    });

    myThis.remove();

  };

$('table td.contentSort span').click(function () {
  $(document.createElement('input'))
              .attr('value', $(this).text())
              .attr('type', 'text')
              .prependTo($(this).parent())
              .keydown(function(e){
                if(e.keyCode == 13){
                  doUpdate($(this));
                }
              })
              .blur(function(){
                doUpdate($(this));
              })
              .focus();

  $(this).hide();

});

&lt;/script&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/symfony-using-ajax-doupdate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Use Postgres!</title>
		<link>http://donlarson.de/symfony-use-postgres/</link>
		<comments>http://donlarson.de/symfony-use-postgres/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 10:40:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Other]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=151</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/symfony-use-postgres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Merge embedded Forms</title>
		<link>http://donlarson.de/merge-embedded-forms/</link>
		<comments>http://donlarson.de/merge-embedded-forms/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 15:30:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=93</guid>
		<description><![CDATA[Symfony beinhaltet eine nette Funktion (sfForm::embedForm) , welche Unterformulare in ein anderes Formular einbindet. So können z.B. in der Menüform -&#62; Submenüforms eingebettet werden, wenn sie in Relation zueinander steht. Die Datenbank sieht in diesem Beispiel vor, das ein Submenü eine Menu_id mit Relation zur Tabelle Menu besitzt. Der erste Schritt ist hierbei in der [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://donlarson.de/wp-content/uploads/2010/06/symfony_doctrine.png" alt="Symfony Framework" /></p>
<p>Symfony beinhaltet eine nette Funktion <em>(sfForm::embedForm) </em>, welche Unterformulare in ein anderes Formular einbindet. So können z.B. in der Menüform -&gt; Submenüforms eingebettet werden, wenn sie in Relation zueinander steht.<span id="more-93"></span></p>
<p>Die Datenbank sieht in diesem Beispiel vor, das ein Submenü eine Menu_id mit Relation zur Tabelle Menu besitzt. Der erste Schritt ist hierbei in der Library die MenuForm aufzurufen, um dem Menü mitzuteilen das hierbei noch eine weitere Form eingebunden wird:</p>
<p><strong>Pfad: lib/doctrine/forms/Menu.class.php</strong></p>
<pre class="brush: php;">
class MenuForm extends BaseMenuForm
{
  public function configure(){
    unset(
       $this['created_at'],
       $this['updated_at]
    );
  parent::configure();

  $submenu_form = new SubmenuForm();
  $this-&gt;embedForm('submenu', $submenu_form);
  $this-&gt;WidgetSchema['submenu]-&gt;setLabel('New Submenu');

  }
}
</pre>
<p>In der Methode configure() instanziieren wir uns ein neues Objekt SubmenuForm(). Mit <em>embedForm</em> weisen wir diesem Objekt zu, das es in die Menuform mit eingebettet werden soll. Wer noch ein Label beifügen will, kann dies mit <em>setLabel(&#8216;New Submenu&#8217;)</em> setzen.<br />
Nun rufen wir die SubmenuForm.class im selben Ordner auf und unsetten die Menu_Id, damit wir keine Dropdownauswahl haben, sondern die generierte Menu-id automatisch hinzufügt.</p>
<p><strong>Pfad: lib/doctrine/forms/Submenu.class.php</strong></p>
<pre class="brush: php;">
unset($this['menu_id']);
</pre>
<p>Nun haben wir ein neues Unterformatular im Formular erzeugt. Für den Bearbeitungsprozess muss noch eine Abfrage des Objektes erfolgen:</p>
<p><strong>Pfad: lib/doctrine/forms/Submenu.class.php</strong></p>
<pre class="brush: php;">
 if (!$this-&gt;isNew()){
      foreach ($this-&gt;getObject()-&gt;getSubmenu() as $submenu){
        $submenu_form = new SubmenuForm($submenu);
        $this-&gt;embedForm('seo'.$submenu-&gt;getId(),$submenu_form);
        $this-&gt;widgetSchema['submenu'.$submenu-&gt;getId()]
                -&gt;setLabel('Submenu:'.$submenu-&gt;getId());
      }
    }
</pre>
<p>Der letzte Punkt prüft ob es sich um ein neues Objekt handelt oder eines, was bearbeitet werden soll. Im letzteren Fall wird dem Objekt die ID übergeben und die Felder mit den zu bearbeitenden Daten vorausgefüllt.</p>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/merge-embedded-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>20 nützliche Tools für Frontend/PHP-Entwickler</title>
		<link>http://donlarson.de/20-nutzliche-tools-fur-frontendphp-entwickler/</link>
		<comments>http://donlarson.de/20-nutzliche-tools-fur-frontendphp-entwickler/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 10:54:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=45</guid>
		<description><![CDATA[PHP gehört mit zu den beliebtesten Websprachen und bietet für jegliche Art von Projekten einen professionellen Standard. Die wichtigsten Grundelemente für eine optimale Voraussetzung ein PHP-Projekt umzusetzen, habe ich hierbei einmal aufgelistet: Datenbankverwaltung PHPMyAdmin PHPmyadmin bietet gutes Handling in der Verwaltung und Erweiterung der Datenbanken mit MySQL.Nachteil: Da es bei Imports/Exports meist ausschließlich zu Fehlern [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://donlarson.de/wp-content/uploads/2010/07/php1.png" alt="PHP developer tools" /></p>
<p>PHP gehört mit zu den beliebtesten Websprachen und bietet für jegliche Art von Projekten einen professionellen Standard. Die wichtigsten Grundelemente für eine optimale Voraussetzung ein PHP-Projekt umzusetzen, habe ich hierbei einmal aufgelistet:<span id="more-45"></span></p>
<h1>Datenbankverwaltung</h1>
<hr />
<ul>
<li><strong><a href="http://phpmyadmin.net/">PHPMyAdmin</a></strong><br />
PHPmyadmin bietet gutes Handling in der Verwaltung und Erweiterung der Datenbanken mit MySQL.Nachteil: Da es bei Imports/Exports meist ausschließlich zu Fehlern kommt (sei es das einspielen eines großen SQL-Dumps oder ausgelöst durch Kommentare in den SQL-Anweisungen), empfehle ich dafür weiterhin die altbewährte Shell-Konsole aufzurufen!</p>
<p>Dump erstellen:</p>
<p><code>mysqldump --host=127.0.0.1 --u user -p --port=3306 --database mydb   &gt; mydump.sql</code></p>
<p>Dump einspielen:</p>
<p><code>mysql --host=127.0.0.1 -u user -p --port=3306 mydb  mydump&lt; .sql</code></li>
<li> <strong><a href="http://www.heidisql.com">HeidiSQL for Win</a></strong><br />
Ein vernünftiger MySQL-Client, welches ebenfalls frei zur Verfügung steht. Hierbei ist ähnlich wie bei PHPmyadmin das Problem mit den Imports / Exports.<br />
<strong> </strong></li>
<li> <strong><a href="http://www.sequalpro.com">Sequel Pro for Mac OS X</a></strong><br />
Schönes Tool mit nützlichen Funktionen wie das Suchen von bestimmten Tags in einzelnen Feldern.</li>
</ul>
<h1>Debugging</h1>
<ul>
<li><a href="http://www.php-debug.com/www/" target="_blank">PHP-Debug</a><br />
Prüft die Performance von bestimmten Code-Blöcken und bietet im Gegenteil zu <em>print_r(); </em>oder <em>var_dump();</em> eine optisch gute und übersichtliche Ausgabe</li>
<li><a href="http://sourceforge.net/projects/php-dyn/" target="_blank">PHP Dyn</a><br />
Bietet ebenfalls eine schöne Ausgabe von Code-Blöcken mit Rückgabewerten deiner Funktionen</li>
</ul>
<h1>Web-Server</h1>
<hr />
<ul>
<li><strong><a href="http://www.xampp.de">XAMPP</a></strong><br />
Ein Bundle von allen notwendigen Programmen, welche für die Einrichtung und Wartung eines Webservers notwendig sind. Es erfreut sich an einer großen Community und hat sich als festen Anker etabliert. Enthalten sind neben den vielen PHP-Modulen u.a. auch Apache2, PHP, PHPmyAdmin und OpenSSL.<br />
<strong> </strong></li>
<li> <a href="http://www.zend.com/de/products/server-ce/" target="_blank"><strong>Zend Community Server</strong></a><br />
Neben dem bekannten XAMPP gibt es noch den Zend Community Server, welche viele nützliche Dinge mitliefert. So kann z.B. in der integrierten, webbasierten Administrationsverwaltung Module und Extensions leicht angepasst werden und liefert eigene Komponenten wie Optimizer, Debugger, DataCache mit.</li>
</ul>
<h1>IDE´s und Editoren</h1>
<hr />
<ul>
<li><strong><a href="http://www.netbeans.org">Netbeans</a></strong><br />
Die IDE Netbeans gehört mitlerweile zu den besten Entwicklungsumgebungen, die u.a. auch Programmiersprachen wie C, C++ und vorallem Java abdeckt. Das gute Handling mit Erweiterungen (Bibliotheken, Module, Plugins etc.), Debugging Prozesse, GUI-Builder, UML-Modelling etc. lässt diese IDE zu einem unverzichtbaren Tool werden. Zudem ist in der PHP-Version bereits das Framework Symfony inbegriffen, was nochmal einiges an Arbeit abnehmen dürfte. Zudem ist ein Subversion bereits inbegriffen womit keine größere Konfiguration hierbei nötig wären.</li>
<li> <a href="http://www.eclipse.org/" target="_blank"><strong>Eclipse</strong></a><br />
Ebenfalls ein sehr bekanntes und weit verbreitete IDE zum Entwickeln mit Support verschiedenster Programmoersprachen. Subversion muss allerdings als Extension wie z.B. Subclips eingebunden werden.<br />
<strong> </strong></li>
<li> <strong><a href="http://notepad-plus-plus.org">Notepad++</a></strong><br />
Ein normaler, windowsbasierter &#8220;Texteditor&#8221; welche Syntax hervorhebt, Multi-Ansicht &amp; Autovervollständigung gibt und sehr Ressourcensparsam ist. Unterstützt wichtige Programmiersprachen wie Java, C++, XML, HTML, SQL und natürlich auch PHP.</li>
</ul>
<h1>Qualitätssicherung</h1>
<hr />
<ul>
<li><strong>Unit Tests</strong><br />
Für eine gute Skalierbarkeit und Stabilität bietet PHP Unit Tests das optimale Werkzeug. Hier lassen sich Testszenarien simmulieren und durchspielen, um schneller Fehler entdecken und beheben zu können.</li>
<li><strong><a href="http://simpletest.org">SimpleTest</a></strong><br />
Ebenfalls ein gutes Tool um Testfälle nachzuspielen. Dieses &#8220;Webtest-Framework&#8221; supportet u.a. SSL, Frames, Proxys und Basis-Authentifikationen. Ein Tutorial dazu findet Ihr <a href="http://www.simpletest.org/en/first_test_tutorial.html" target="_blank">hier</a></li>
</ul>
<h1>Versionskontrollen</h1>
<hr />
<ul>
<li><strong>Phing</strong><br />
Ist ein beliebtes Tool, welche für eine bessere Organisation und Pflege Ihrer Version des PHP-Projektes bietet.<br />
<strong> </strong></li>
<li> <strong>xinc</strong><br />
xinc ist eine kontinuierliche Integration Server-Version-Control-System in PHP 5 geschrieben. Es arbeitet gut mit anderen Systemen wie Subversion und Phing zusammen.</li>
</ul>
<h1>In-Browser Tools</h1>
<hr />
<ul>
<li><a href="http://phplangeditor.mozdev.org/" target="_blank">PHPLang Editor</a><br />
Übersetzt Sprachdateien und Variablen in Deinem PHP-Code.<br />
Ein Flash-Tutorial dafür findet Ihr <a href="http://www.claroline.net/tutorial/ple/using_phplangeditor.htm" target="_blank">hier</a>
</li>
<li><strong>FireBug</strong><br />
Diese Mozilla Firefox Extension ermöglicht LIVE-Monitoring und Fehlersuche von Webseiten. Ausgelegt wurde diese speziell für HTML, CSS und JavaScript DOM-Struktur, womit auch u.a. Anfragen und Serverantworten mit genauem Zeitpunkt dokumentiert werden. Ein Muss für jeden Entwickler um die Qualität und die Performance zu sichern.<strong> </strong></li>
</ul>
<ul>
<li><strong>Web-Developer</strong><br />
Ebenfalls eine Mozilla Firefox Extension stellt diese eine Symbolleiste und ein Menü mit zahlreichen nützlichen Werkzeugen für Web-Entwickler bereit.</li>
</ul>
<h1>Sources and Ressources</h1>
<hr />
<ul>
<li><a href="http://mashable.com/2007/09/26/php-toolbox/" target="_blank">PHP-Toolbox</a><br />
Eine gute Sammlung von englischsprachigen Tutorials, Info, Tipps etc.</li>
</ul>
<ul>
<li><a href="http://www.sitepoint.com/blogs/2008/05/13/useful-in-browser-development-tools-for-php/" target="_blank">In-Browser Toolsammlung</a><br />
Nützliche In-Browser Tools für PHP</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/20-nutzliche-tools-fur-frontendphp-entwickler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Doctrine</title>
		<link>http://donlarson.de/symfony-doctrine/</link>
		<comments>http://donlarson.de/symfony-doctrine/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 13:34:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=34</guid>
		<description><![CDATA[Doctrine ist ein Framework zur objektrelationalen Abbildung (ORM), welches eine Schnittstelle zwischen der relationalen Datenbank und der objektorientierten Programmierung darstellt. Mit nur wenigen Anweisungen in einer Konfigurationsdatei und dem Aufruf via Shell lassen sich Models und Datenbankstrukturen automatisch erzeugen. In Symfony ist Doctrine bereits nativ inbegriffen, bei Zend (erst ab Vers. 2.0) oder CakePHP muss [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://donlarson.de/wp-content/uploads/2010/06/symfony_doctrine.png" alt="Symfony Framework" /></p>
<p>Doctrine ist ein Framework zur objektrelationalen Abbildung (ORM), welches eine Schnittstelle zwischen der relationalen Datenbank und der objektorientierten Programmierung darstellt. Mit nur wenigen Anweisungen in einer Konfigurationsdatei und dem Aufruf via Shell lassen sich Models und Datenbankstrukturen automatisch erzeugen. In Symfony ist Doctrine bereits nativ inbegriffen, bei Zend (erst ab Vers. 2.0) oder CakePHP muss dies erst implementiert und konfiguriert werden. <span id="more-34"></span></p>
<p>Doctrine nutzt YAML-Files für die Modelierung des Datenbankschemas und der Models. Entwickler werden schnell Spaß daran finden YAML-Files zu erstellen, da es eine enorme Arbeit abnimmt und recht einfach und übersichtlich neue Anweisungen hinzugefügt werden können.</p>
<p>Ein Beispiel für den Aufbau einer YAML-File<br />
<img src="http://donlarson.de/wp-content/uploads/2010/06/yam_db.png" alt="yam menu" /></p>
<p><em>Erklärung</em>:<br />
YAML ermittelt anhand der Spaces zu welcher Verschachtelung ein Eintrag gehört. Dabei wird je Level immer um 2 Spaces eingerückt.<br />
An diesem Beispiel will ich ein neues Menü-Model generiert haben, welches aus den Feldern &#8220;id, name, link, position und sort&#8221; besteht.</p>
<p>&#8220;Menu&#8221; ist der erste Punkt, quasi der Tabellenname bzw. das Model, was generiert werden soll. Mit der Anweisung &#8220;Timestamable&#8221; setze ich automatisch je 2 Datumsfelder in jede Tabelle, die für neue Einträge (CREATE) und Updates von bestehenden Daten (UPDATE) einen Timestamp setzen. I18n ist ein von Doctrine unterstützter Translater, welcher automatisch eine Kopie der Tabelle erstellt und mit der Zuweisung von allen oder bestimmten Feldern arbeitet und übersetzt. In diesem Fall wollen wir den Namen mit der Zuordnung eines language_codes übersetzt haben.<br />
Anschließend verweisen wir die Felder mit dem Befehl &#8220;columns&#8221;, welche angelegt werden sollen. Nun werden nach und nach alle Felder angelegt mit den entsprechenden individuellen Attributen. </p>
<p>Der nächste Schritt ist unsere Shell-Konsole, hierbei generieren wir unser Datenbankschema und Model aus der YAML-Datei. Die Shell-Konsole aufgerufen und im Hauptverzeichnis gelandet, wird folgender Befehl ausgeführt:<br />
<strong>php symfony doctrine:build &#8211;all &#8211;and-load</strong></p>
<p>Jetzt wird zuerst die Datenbank mit den entsprechenden Fixtures (Default-Daten) erstellt, sowie die Modelklassen und Forms generiert. Fazit: Doctrine nimmt hierbei viel Arbeit ab und generiert anhand der konfigurierten YAML-Datei die Model´s und Tabellen automatisch. Falsche Einrückungen und Relationen bei der Generierung werden sofort angezeigt und können rudimentär anhand der Fehlerausgabe behoben werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/symfony-doctrine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony: Formgenerierung mit Doctrine</title>
		<link>http://donlarson.de/symfony-forms-und-die-shell/</link>
		<comments>http://donlarson.de/symfony-forms-und-die-shell/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 08:12:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://donlarson.de/?p=11</guid>
		<description><![CDATA[Zu den komplexesten Aufgaben eines Entwicklers gehört die Erstellung eines Formulares, welche neue Daten erstellen, bearbeiten, löschen, auflisten und validieren soll. Symfony bietet hierbei eine Schnittstelle, womit die Formulare mittels Doctrine automatisch generiert werden können. Vereinzelte konfigurationen wie Klassenzuweisung, neue Labelsetzung können dann einfach im nachhinein zugewiesen werden. An diesem Beispiel erstelle ich ein neues [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://donlarson.de/wp-content/uploads/2010/06/symfony_doctrine.png" alt="Symfony Framework" /></p>
<p>Zu den komplexesten Aufgaben eines Entwicklers gehört die Erstellung eines Formulares, welche neue Daten erstellen, bearbeiten, löschen, auflisten und validieren soll.<br />
Symfony bietet hierbei eine Schnittstelle, womit die Formulare mittels Doctrine automatisch generiert werden können.<br />
Vereinzelte konfigurationen wie Klassenzuweisung, neue Labelsetzung können dann einfach im nachhinein zugewiesen werden. <span id="more-11"></span></p>
<p>An diesem Beispiel erstelle ich ein neues Modul in der Admin-App und lasse dann mittels Doctrine die Formulare erstellen.<br />
Wichtig ist das schon ein Model existieren muss, ich nutze hierbei das schon von mir generierte Menü-Model.</p>
<p>Die Shell-Konsole geöffnet und im Hauptverzeichnis gelandet, können wir uns die Symfony-Befehle mit &#8220;php symfony&#8221; anzeigen lassen.<br />
Für unser neues Modul &#8220;donlarson&#8221; geben wir also folgenden Befehl ein:</p>
<p><strong>php symfony generate:module admin donlarson</strong></p>
<p><em>Erklärung</em>: generate:modul generiert das Grundmuster eines Moduls mit seinem Controller und View. Im Anschluss erfolgt die Zuweisung der App (admin) und des Modules (donlarson).</p>
<p>Jetzt lassen wir uns gleich die Formulare generieren, dies geht mit folgendem Befehl:</p>
<p><strong>php symfony doctrine:generate-modul &#8211;with-show &#8211;non-verbose-templates admin donlarson Menu</strong></p>
<p><img src="http://donlarson.de/wp-content/uploads/2010/06/sym_form_shell.png" alt="Modul donlarson Aufteilung" /></p>
<p><em>Erklärung</em>:<br />
Wir sagen mit generate-modul das er die Modelklassen darauf ausrichten soll, <em>whit-show </em> für die Einzelansicht.<br />
Zum Schluss wird wieder angegeben in welcher App (admin) , Modul (donlarson) und welche Modelstruktur (Menu) dies ausgerichtet werden soll.</p>
<p>Wenn wir uns jetzt die Modulstruktur genauer anschauen, stellen wir fest das wir ein neues Modul in der Admin-App erstellt bekommen haben. Dies aufgeklappt sehen wir unser View- und Controllermuster.</p>
<p>Was wurde im Modul generiert?:</p>
<p><em>action.class.php</em> (Verarbeitungsprozess)</p>
<ul>
<li>Action-Zuweisungen für die Formularbearbeitung</li>
<li>Action-Zuweisung für die Auflistung und Detailansicht der Daten</li>
</ul>
<p><em>templates/***Success.php</em> (Output vom Verarbeitungsprozess)</p>
<ul>
<li>automatische Auflistung mittels Tabellen der Daten</li>
<li>Referenzierungen auf Detailansicht</li>
<li>Referenzierungen auf Neue Daten erstellen, bearbeiten, löschen</li>
</ul>
<p><img src="http://donlarson.de/wp-content/uploads/2010/06/sym_form_hir.png" alt="Modul donlarson Aufteilung" /></p>
<p>Damit wir die Spezifikationen im Detail bearbeiten können, rufen wir in unserer Baumstruktur die <em>LIB->form->doctrine->Menu.class.php</em> auf.<br />
Nun können beliebige Parameter / Ansichten abgeändert werden, anbei ein paar Beispiele:</p>
<pre class="brush: php;">
class MenuForm extends BaseMenuForm
{
  public function configure()
  {
    parent::configure();

    #Radiobuttons statt Dropdownlist anzeigen lassen

    $this-&gt;widgetSchema['position'] = new sfWidgetFormChoice(array(
      'choices' =&gt; array('top' =&gt; 'top', 'bottom' =&gt; 'bottom'),
      'multiple' =&gt; true,
      'expanded' =&gt; false
     ));

    # Andere Schreibweise
    $this-&gt;widgetSchema['position']-&gt;setOption('multiple', true);

    #Neue Labelzuweisung für LINK
    $this-&gt;widgetSchema['link']-&gt;setLabel('neuer Labelname');

    # Fügt ein neues Feld hinzu
    $this-&gt;widgetSchema['donlarson'] = new sfWidgetFormI18nDateTime(array('culture' =&gt; 'fr_CH'));

  }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://donlarson.de/symfony-forms-und-die-shell/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

