<?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>Lorem Ipsum Ges.m.b.H. &#187; Blog</title>
	<atom:link href="http://www.loremipsum.at/kategorie/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.loremipsum.at</link>
	<description>Der Onlineauftritt der Lorem Ipsum Medienges.m.b.H.</description>
	<lastBuildDate>Wed, 11 Jan 2012 08:14:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Softphone GreenJ mit neuer Heimat auf GitHub</title>
		<link>http://www.loremipsum.at/blog/news/softphone-greenj-mit-neuer-heimat-auf-github/</link>
		<comments>http://www.loremipsum.at/blog/news/softphone-greenj-mit-neuer-heimat-auf-github/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 08:14:18 +0000</pubDate>
		<dc:creator>Daniel Leeb</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[GreenJ]]></category>
		<category><![CDATA[Open-Source]]></category>
		<category><![CDATA[Softphone]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=3630</guid>
		<description><![CDATA[Letzten Monat haben wir unser Open-Source Softphone GreenJ bereits auf unserer Seite zum Download freigegeben und ihm auch eine eigene Domain &#8211; greenj.org &#8211; spendiert. GreenJ ist eine plattformunabhängige Voice-over-IP Applikation, welche es einem Webentwickler ermöglicht, mittels einer einfachen Schnittstelle, &#8230; <a href="http://www.loremipsum.at/blog/news/softphone-greenj-mit-neuer-heimat-auf-github/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/greenj/" rel="bookmark">GreenJ</a></li>
		<li><a href="http://www.loremipsum.at/produkte/greenj/introduction/" rel="bookmark">Einführung / Introduction</a></li>
		<li><a href="http://www.loremipsum.at/blog/news/upgrade-auf-27-neues-design-online/" rel="bookmark">Upgrade auf 2.7 + neues Design online</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Letzten Monat haben wir unser <strong>Open-Source Softphone GreenJ</strong> bereits auf unserer Seite zum <a href="http://www.loremipsum.at/produkte/greenj/introduction/#downloadde">Download</a> freigegeben und ihm auch eine eigene Domain &#8211; <a href="http://www.greenj.org">greenj.org</a> &#8211; spendiert. GreenJ ist eine plattformunabhängige Voice-over-IP Applikation, welche es einem Webentwickler ermöglicht, mittels einer <a href="http://www.loremipsum.at/produkte/greenj/library/">einfachen Schnittstelle</a>, eine Webseite als Telefonsystem zu erstellen. Unser Programm bietet die nötigen Telefonfunktionen und kann eine beliebige Oberfläche durch den integrierten Browser darstellen. Mehr Informationen sowie Downloads des Programms, Quellcodes und der Dokumentation können in der <a href="http://www.loremipsum.at/produkte/greenj/introduction/">Einführung zu GreenJ</a> gefunden werden.</p>
<p><a href="http://www.loremipsum.at/wp-content/uploads/2011/09/screen_licc.png"><img src="http://www.loremipsum.at/wp-content/uploads/2011/09/screen_licc-300x173.png" alt="A callcenter application in GreenJ" title="Screenshot GreenJ Callcenter" width="300" height="173" class="alignnone size-medium wp-image-3538" /></a></p>
<h3>GreenJ auf GitHub</h3>
<p>Um die Verfügbarkeit noch zu verbessern, befindet sich GreenJ ab sofort als <a href="https://github.com/danleeb/GreenJ">Repository auf GitHub.com</a> und kann auch von dort heruntergeladen werden.</p>
<p>Etwa indem man das GreenJ Repository klont:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ git clone git://github.com/danleeb/GreenJ.git</div></td></tr></tbody></table></div>
<p>In der mitgelieferten Readme, siehe auf GitHub unterhalb der Dateiliste, findet man auch eine kurze Schritt für Schritt Anleitung, um GreenJ unter Ubuntu 11.10 (32-bit Linux) zu kompilieren. Natürlich lässt sich GreenJ auch unter einer anderen Linux Distribution oder unter Windows kompilieren und verwenden. Bei Interesse einfach unsere <a href="http://www.loremipsum.at/produkte/greenj/">GreenJ Produktseite</a> besuchen.</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/greenj/" rel="bookmark">GreenJ</a></li>
		<li><a href="http://www.loremipsum.at/produkte/greenj/introduction/" rel="bookmark">Einführung / Introduction</a></li>
		<li><a href="http://www.loremipsum.at/blog/news/upgrade-auf-27-neues-design-online/" rel="bookmark">Upgrade auf 2.7 + neues Design online</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/news/softphone-greenj-mit-neuer-heimat-auf-github/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Doctrine 2 SQL Profiler in Debugleiste</title>
		<link>http://www.loremipsum.at/blog/code/doctrine-2-sql-profiler-in-debugleiste/</link>
		<comments>http://www.loremipsum.at/blog/code/doctrine-2-sql-profiler-in-debugleiste/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 15:12:17 +0000</pubDate>
		<dc:creator>Daniel Leeb</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Profiler]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Zend]]></category>
		<category><![CDATA[ZF]]></category>
		<category><![CDATA[ZFDebug]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=3608</guid>
		<description><![CDATA[Auch wenn es sich um ein sehr spezielles Thema handelt, möchte ich hier kurz zusammenfassen, wie man einen Doctrine 2 SQL Logger/Profiler in einer Zend Framework Umgebung umsetzen kann. Da die Kombination aus ZF und Doctrine 2 durchaus beliebt zu &#8230; <a href="http://www.loremipsum.at/blog/code/doctrine-2-sql-profiler-in-debugleiste/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/integration-von-doctrine-in-eine-modul-basierte-zend-anwendung/" rel="bookmark">Integration von Doctrine in eine modulbasierte Zend Anwendung</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/rundungsfehler-in-magento-beheben/" rel="bookmark">Rundungsfehler in Magento beheben</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Auch wenn es sich um ein sehr spezielles Thema handelt, möchte ich hier kurz zusammenfassen, wie man einen <strong>Doctrine 2 SQL Logger/Profiler</strong> in einer <strong>Zend Framework</strong> Umgebung umsetzen kann. Da die Kombination aus <a href="http://framework.zend.com/" title="Zend Framework">ZF</a> und <a href="http://www.doctrine-project.org/" title="Doctrine Project">Doctrine 2</a> durchaus beliebt zu sein scheint, zumindest wenn man von Blogeinträgen und Tutorials im Internet ausgeht, könnte dieser Beitrag für manch einen hilfreich sein.<span id="more-3608"></span> Vorweg möchte ich auch noch auf eine praktische Lösung hinweisen, um Doctrine 2.x mit dem Zend Framework 1.x zu verbinden: Und zwar <strong>Bisna von Guilherme Blanco</strong>, zu finden in seinem <a href="https://github.com/guilhermeblanco/ZendFramework1-Doctrine2" title="Bisna GitHub Repository">GitHub Repository</a>. Danach lässt sich Doctrine mittels Zend_Config (ini, xml, etc.) konfigurieren.</p>
<h3>SQL Queries in der ZFDebug-Leiste</h3>
<p>Nach der Integration von Doctrine in unsere neue Webapplikation basierend auf dem Zend Framework fehlte uns noch eine einfache Möglichkeit SQL Queries anzuzeigen. Da wir bereits <strong>ZFDebug</strong> verwenden, lag ein zusätzliches Plugin für die Ausgabe in der Debugleiste für uns nahe. <a href="http://code.google.com/p/zfdebug/" title="ZFDebug auf Google-Code">ZFDebug</a> wurde leider seit Mitte 2009 nicht mehr aktualisiert, funktioniert jedoch immer noch sehr gut, liefert hilfreiche Informationen rund um die Webapplikation und lässt sich sehr einfach erweitern. Daher werde ich hier zeigen, wie man den Doctrine 2 Profiler in einem ZFDebug Plugin verwenden kann.</p>
<h3>Profiler</h3>
<p>Doctrine bietet mit <strong>Doctrine\DBAL\Logging\SQLLogger</strong> bereits ein Interface um einen Logger mit einer Datenbank-Verbindung zu verknüpfen. Wir implementieren dieses Interface mit den beiden Methoden <strong>startQuery()</strong> und <strong>stopQuery()</strong> und speichern einfach alle Queries in ein Array das wir später in der Debugleiste ausgeben werden.</p>
<p><strong>DoctrineExtensions/Profiler/ZFDebugProfiler.php:</strong></p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">namespace</span> DoctrineExtensions\Profiler<span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">class</span> ZFDebugProfiler implements \Doctrine\DBAL\Logging\SQLLogger<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$totalTime</span> <span style="color: #339933;">=</span> <span style="color:#800080;">0.0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$queries</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_curQuery</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> startQuery<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #000088;">$params</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span> <span style="color: #000088;">$types</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> \stdClass<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$sql</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$params</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #990000;">time</span> <span style="color: #339933;">=</span> \<span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> stopQuery<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$executionTime</span> <span style="color: #339933;">=</span> \<span style="color: #990000;">microtime</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #990000;">time</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">totalTime</span> <span style="color: #339933;">+=</span> <span style="color: #000088;">$executionTime</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">queries</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'time'</span> &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$executionTime</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'sql'</span> &nbsp; &nbsp;<span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #004000;">sql</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'params'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_curQuery<span style="color: #339933;">-&gt;</span><span style="color: #004000;">params</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Nun müssen wir Doctrine noch mitteilen, dass unser Profiler verwendet werden soll. Wird Bisna eingesetzt, kann dies ganz einfach in der Konfiguration (hier beispielsweise in einer ini-Datei) erledigt werden:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">resources<span style="color: #339933;">.</span>doctrine<span style="color: #339933;">.</span>dbal<span style="color: #339933;">.</span>connections<span style="color: #339933;">.</span><span style="color: #b1b100;">default</span><span style="color: #339933;">.</span>sqlLoggerClass <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;DoctrineExtensions\Profiler\ZFDebugProfiler&quot;</span></div></td></tr></tbody></table></div>
<p>Im Hintergrund wird der Konfiguration der DBAL-Verbindung eine neue Instanz unseres SQL Loggers übergeben:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$configuration</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Doctrine\DBAL\Configuration<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$configuration</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setSQLLogger</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> DoctrineExtensions\Profiler\ZFDebugProfiler<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$connection</span> <span style="color: #339933;">=</span> Doctrine\DBAL\DriverManager<span style="color: #339933;">::</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$connectionParams</span><span style="color: #339933;">,</span> <span style="color: #000088;">$configuration</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Natürlich lässt sich statt des ZFDebugProfilers auch einfach ein LogProfiler oder FirebugProfiler implementieren, welche die Queries direkt in eine Datei schreiben bzw. im Firebug ausgeben. Wir verwenden unseren Profiler hingegen, um die SQL Queries in einem ZFDebug Plugin aufzulisten.</p>
<h3>ZFDebug Plugin</h3>
<p>Nachdem der SQL Logger an Doctrine übergeben wurde, werden alle SQL Queries, deren Parameter und die Dauer der einzelnen Queries gespeichert. Ausgeben wollen wir das Ganze in unserer ZFDebug Leiste, wir erstellen also zunächst ein Plugin, indem wir das Interface <strong>ZFDebug_Controller_Plugin_Debug_Plugin_Interface</strong> implementieren:</p>
<p><strong>ZFDebug/Controller/Plugin/Debug/Plugin/Doctrine.php:</strong></p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">class</span> ZFDebug_Controller_Plugin_Debug_Plugin_Doctrine implements ZFDebug_Controller_Plugin_Debug_Plugin_Interface<br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_identifier</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'doctrine'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_profilers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span> <span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'profiler'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers <span style="color: #339933;">=</span> <span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'profiler'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getIdentifier<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_identifier<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getTab<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'No Profiler'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers <span style="color: #b1b100;">as</span> <span style="color: #000088;">$profiler</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profilerInfo</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$profiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">queries</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' in '</span> <span style="color: #339933;">.</span> <span style="color: #990000;">round</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$profiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">totalTime</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> &nbsp;<span style="color: #339933;">.</span> <span style="color: #0000ff;">' ms'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' / '</span><span style="color: #339933;">,</span> <span style="color: #000088;">$profilerInfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getPanel<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$html</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'No Profiler'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_profilers <span style="color: #b1b100;">as</span> <span style="color: #000088;">$index</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$profiler</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;h4&gt;Profiler ['</span><span style="color: #339933;">.</span><span style="color: #000088;">$index</span><span style="color: #339933;">.</span><span style="color: #0000ff;">']&lt;/h4&gt;&lt;ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$profiler</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">queries</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$query</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;li&gt;&lt;b&gt;['</span> <span style="color: #339933;">.</span> <span style="color: #990000;">round</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'time'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">1000</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' ms]&lt;/b&gt; '</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">highlightSql</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">htmlspecialchars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'sql'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;br/&gt;&lt;i&gt;bindings:&lt;/i&gt;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listBindings</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;/li&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;/ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$html</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> listBindings<span style="color: #009900;">&#40;</span><span style="color: #000088;">$bindings</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'&lt;ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$bindings</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$binding</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;li&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$binding</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">listBindings</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$binding</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #000088;">$binding</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$html</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">'&lt;/li&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #000088;">$html</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&lt;/ol&gt;'</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> highlightSql<span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$statements</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'UPDATE'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'INSERT'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'FROM'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'WHERE'</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'LEFT JOIN'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'JOIN'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'ORDER BY'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'GROUP BY'</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'OFFSET'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'LIMIT'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'SET'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'VALUES'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/('</span><span style="color: #339933;">.</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'|'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$statements</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">')/'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;b&gt;\1&lt;/b&gt;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Da wir auch ein wenig Wert auf die Formatierung legen, ist der Code des Plugins etwas umfangreicher ausgefallen. Wichtig sind die <strong>getTab()</strong> und <strong>getPanel()</strong> Methoden, welche die HTML Ausgabe für den Titel des Plugins in der Debugleiste und für detaillierte Informationen im Panel beim Ausklappen des Plugins zurückgeben.</p>
<p>Nun muss das Plugin noch in den Optionen von ZFDebug eingetragen werden. Beim Bootstrapping der Applikation erstellen wir das ZFDebug_Controller_Plugin_Debug und registrieren es beim Frontcontroller. Zunächst gehen wir jedoch sicher, dass die Doctrine Ressource bereits existiert und erstellen eine Liste der Profiler aller DBAL-Verbindungen, die wir anschließend unserem Plugin übergeben. In den ZFDebug Optionen tragen wir unter Plugins unsere Klasse <strong>ZFDebug_Controller_Plugin_Debug_Plugin_Doctrine</strong> mit dessen Konfiguration ein:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$container</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getResource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'doctrine'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$profilers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$container</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getConnectionNames</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$connName</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$profiler</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$container</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getConnection</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$connName</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getConfiguration</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getSQLLogger</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$profiler</span> instanceof DoctrineExtensions\Profiler\ZFDebugProfiler<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000088;">$profilers</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$connName</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$profiler</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #000088;">$options</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">'plugins'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'ZFDebug_Controller_Plugin_Debug_Plugin_Doctrine'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0000ff;">'profiler'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$profilers</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$debug</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ZFDebug_Controller_Plugin_Debug<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'frontController'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getResource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'frontController'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerPlugin</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$debug</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Nun lassen sich alle Queries von Doctrine und deren Performance übersichtlich in ZFDebug anzeigen. Zu beachten ist vielleicht, falls man Bisna verwendet, dass durch den Aufruf von $container->getConnection($name)&#8230; die DBAL-Verbindungen tatsächlich gestartet werden. Ansonsten würden sie nicht unbedingt bereits beim Bootstrapping, sondern erst bei der ersten Verwendung gestartet. Da ZFDebug aber sowieso nur im Debug-Modus laufen sollte, muss diesbezüglich nur auf den Unterschied zwischen Debug- und Production-Modus geachtet werden.</p>
<p>Verwendete Versionen:<br />
- Zend Framework 1.11.11<br />
- Doctrine 2.1.5<br />
- ZFDebug 1.5</p>
<p><a href="http://www.loremipsum.at/wp-content/uploads/2011/12/zfdebug.png"><img src="http://www.loremipsum.at/wp-content/uploads/2011/12/zfdebug-300x51.png" alt="" title="ZFDebug-Leiste mit Doctrine 2 Profiler Plugin" width="300" height="51" class="alignnone size-medium wp-image-3614" /></a></p>
<h3>Zend Framework 2</h3>
<p>Da ZF2 wohl noch einige Monate auf sich warten lässt, kann man im Moment leider noch keine vollwertige Webapplikation darauf aufbauen. Spätestens zum Release wird aber eine Umstellung fällig werden, sollte die zweite Version das einhalten was sie momentan verspricht. Es wäre daher interessant zu wissen, ob ZFDebug auch für ZF2 erscheint, was wenn man sich die Projektaktivität ansieht eher zu bezweifeln ist &#8211; oder es vielversprechende Alternativen dazu gibt?</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/integration-von-doctrine-in-eine-modul-basierte-zend-anwendung/" rel="bookmark">Integration von Doctrine in eine modulbasierte Zend Anwendung</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/rundungsfehler-in-magento-beheben/" rel="bookmark">Rundungsfehler in Magento beheben</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/code/doctrine-2-sql-profiler-in-debugleiste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rückmeldungen auf Bewerbungen zur offenen Lehrstelle</title>
		<link>http://www.loremipsum.at/blog/news/ruckmeldungen-auf-bewerbungen-zur-offenen-lehrstelle/</link>
		<comments>http://www.loremipsum.at/blog/news/ruckmeldungen-auf-bewerbungen-zur-offenen-lehrstelle/#comments</comments>
		<pubDate>Thu, 08 Sep 2011 15:26:55 +0000</pubDate>
		<dc:creator>Werner Aschenbrenner</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2766</guid>
		<description><![CDATA[Auch in diesem Zyklus konnten wir uns über mehr Bewerbungen freuen als wir administrativ abarbeiten konnten. Um nervösen Fragen vorzubeugen, ein kleiner Hinweis zur weiteren Vorgehensweise. Alle Bewerber und Bewerberinnen die in die nähere Wahl fallen bekommen bis Mitte nächster &#8230; <a href="http://www.loremipsum.at/blog/news/ruckmeldungen-auf-bewerbungen-zur-offenen-lehrstelle/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/news/bewerbungen-zur-lehrstelle-in-finaler-phase/" rel="bookmark">Bewerbungen zur Lehrstelle in finaler Phase</a></li>
		<li><a href="http://www.loremipsum.at/unternehmen/jobs/lehrstelle/" rel="bookmark">Lehrstelle Informationstechnologie</a></li>
		<li><a href="http://www.loremipsum.at/unternehmen/jobs/lehrstelle-marktkommunikation/" rel="bookmark">Lehrstelle Marktkommunikation</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Auch in diesem Zyklus konnten wir uns über mehr Bewerbungen freuen als wir administrativ abarbeiten konnten.<br />
Um nervösen Fragen vorzubeugen, ein kleiner Hinweis zur weiteren Vorgehensweise. </p>
<p><strong>Alle Bewerber und Bewerberinnen die in die nähere Wahl fallen bekommen bis Mitte nächster Woche von uns eine Rückmeldung</strong> auf die eingesandten Unterlagen.</p>
<p>Absagen werden bis Ende September per Mail zugestellt. </p>
<p>Bis dato haben wir noch keine Gesprächstermine vereinbart, dies erfolgt am Montag &#038; Dienstag.</p>
<p>Im Laufe der kommenden Woche werden dann die Vorstellungsgespräche stattfinden.<br />
Nachdem der Büroumzug mittlerweile vollzogen wurde, werden bereits alle Vorstellungsgespräche im neuen Büro stattfinden.</p>
<p>Auch in diesem Zyklus waren Bewerbungen dabei die nicht elektronisch eingegangen sind sondern schriftlich per Post zugegangen sind. Sollten Sie sich noch bewerben wollen, bitten wir Sie dies per Mail zu tun!</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/news/bewerbungen-zur-lehrstelle-in-finaler-phase/" rel="bookmark">Bewerbungen zur Lehrstelle in finaler Phase</a></li>
		<li><a href="http://www.loremipsum.at/unternehmen/jobs/lehrstelle/" rel="bookmark">Lehrstelle Informationstechnologie</a></li>
		<li><a href="http://www.loremipsum.at/unternehmen/jobs/lehrstelle-marktkommunikation/" rel="bookmark">Lehrstelle Marktkommunikation</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/news/ruckmeldungen-auf-bewerbungen-zur-offenen-lehrstelle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Verschiedene Preise in StoreViews</title>
		<link>http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/</link>
		<comments>http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 09:55:51 +0000</pubDate>
		<dc:creator>Peter Hasitschka</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[price]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2730</guid>
		<description><![CDATA[Magentos Shop-Hierarchie ist in 3 Ebenen aufgebaut: Website &#8211; Store &#8211; StoreView. Letztere wird im Allgemeinen dazu verwendet, um mehrere Sprachen auf einen Shop anzuwenden. Je nach Einstellung können Felder global oder StoreView-spezifisch gesetzt werden. Außerdem kann man ohne Probleme &#8230; <a href="http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/rundungsfehler-in-magento-beheben/" rel="bookmark">Rundungsfehler in Magento beheben</a></li>
		<li><a href="http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/" rel="bookmark">Facebook-Connect in Magento-Shops</a></li>
		<li><a href="http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/" rel="bookmark">Magento: Suche mit kurzer Zeichenlänge</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Magentos Shop-Hierarchie ist in 3 Ebenen aufgebaut: Website &#8211; Store &#8211; StoreView. Letztere wird im Allgemeinen dazu verwendet, um mehrere Sprachen auf einen Shop anzuwenden. Je nach Einstellung können Felder global oder StoreView-spezifisch gesetzt werden. Außerdem kann man ohne Probleme verschiedene Währungen angeben.</p>
<p>Unser Kunde hatte jedoch den Wunsch, für ein spezielles Land eigene Preise festsetzen zu können. Leider bietet Magento out-of-the-box keine Möglichkeit das Preisattribut auf StoreView Ebene zu setzen, sondern nur global.</p>
<p>Abhilfe bietet das Modul <strong>Store Price</strong>[1] von <strong>ZenPrint</strong>. Es wandelt den Preis, der in der Datenbank als Decimal-Attribut gespeichert ist, von einem fixen globalen Attribut in ein frei wählbares um. Es lässt sich über Magento Connect Version 1.0 installieren, bzw. in neueren Magento Versionen problemlos manuell einspielen.</p>
<p>Nach der Installation muss das Attribut unter <strong>System->Configuration->Catalog->Catalog</strong> noch auf die StoreView Ebene gesetzt werden (Siehe Screenshot).</p>
<div id="attachment_2732" class="wp-caption alignright" style="width: 180px"><a href="http://www.loremipsum.at/wp-content/uploads/2011/08/Magento-Config-Store-Price.png"><img class="size-thumbnail wp-image-2732" title="Aktivieren des Store Price Moduls" src="http://www.loremipsum.at/wp-content/uploads/2011/08/Magento-Config-Store-Price-170x89.png" alt="Aktivieren des Store Price Moduls" width="170" height="89" /></a><p class="wp-caption-text">Aktivieren des Store Price Moduls</p></div>
<p>Nun können beim Wechsel des Store Views in der Backend-Produktansicht verschiedene Preise eingegeben werden.</p>
<div class="mceTemp" style="text-align: right;">
<dl id="attachment_2737" class="wp-caption alignright" style="width: 310px;">
<dt class="wp-caption-dt"><a href="http://www.loremipsum.at/wp-content/uploads/2011/08/Magento-be-Store-Price.png"><img class="size-medium wp-image-2737 " title="Store View spezifischer Preis" src="http://www.loremipsum.at/wp-content/uploads/2011/08/Magento-be-Store-Price-300x39.png" alt="Store View spezifischer Preis" width="300" height="39" /></a></dt>
<dd class="wp-caption-dd">Store View spezifischer Preis</dd>
</dl>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>BugFix</strong>: Falls im Frontend die Preise in der Kategorieansicht plötzlich als SpecialPrices erscheinen muss noch schnell ins Template eingegriffen werden:<br />
Unter <strong>app\design\frontend\[path_to_templates]\template\catalog\product\price.phtml</strong> findet man etwa in <strong>Zeile 43</strong> folgenden Code:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$_product</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getProduct</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Diesen erweitert man um eine weitere Zeile, die das Produkt vollständig lädt:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$_product</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;;</span>getProduct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$_product</span> <span style="color: #339933;">=</span> Mage<span style="color: #339933;">::</span><span style="color: #004000;">getModel</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'catalog/product'</span><span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">-&gt;</span><span style="color: #004000;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_product</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getId</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<p>Schlussendlich sind im Frontend für jeden StoreView respektive Sprache verschiedene Preise verfügbar.</p>
<div style="float: left; width: 100%;">
<div style='float:left; width:100%'>
<div id="attachment_2739" class="wp-caption alignleft" style="width: 180px"><a href="http://www.loremipsum.at/wp-content/uploads/2011/08/magento-prod1-storeprice.png"><img class="size-thumbnail wp-image-2739" title="Preis im StoreView 1" src="http://www.loremipsum.at/wp-content/uploads/2011/08/magento-prod1-storeprice-170x91.png" alt="Preis im StoreView 1" width="170" height="91" /></a><p class="wp-caption-text">Preis im StoreView 1</p></div> <div id="attachment_2740" class="wp-caption alignright" style="width: 180px"><a href="http://www.loremipsum.at/wp-content/uploads/2011/08/magento-prod2-storeprice.png"><img class="size-thumbnail wp-image-2740" title="Preis im StoreView 2" src="http://www.loremipsum.at/wp-content/uploads/2011/08/magento-prod2-storeprice-170x92.png" alt="Preis im StoreView 2" width="170" height="92" /></a><p class="wp-caption-text">Preis im StoreView 2</p></div></div>
<p>&nbsp;</p>
<h2>Links:</h2>
<p>[1] <a href="http://www.magentocommerce.com/magento-connect/bott/extension/976/zenprint-store-price">http://www.magentocommerce.com/magento-connect/bott/extension/976/zenprint-store-price</a></p>
</div>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/rundungsfehler-in-magento-beheben/" rel="bookmark">Rundungsfehler in Magento beheben</a></li>
		<li><a href="http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/" rel="bookmark">Facebook-Connect in Magento-Shops</a></li>
		<li><a href="http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/" rel="bookmark">Magento: Suche mit kurzer Zeichenlänge</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magento: Suche mit kurzer Zeichenlänge</title>
		<link>http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/</link>
		<comments>http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 09:05:42 +0000</pubDate>
		<dc:creator>Georg Perrogon</dc:creator>
				<category><![CDATA[Technik]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Datenbank]]></category>
		<category><![CDATA[Magento]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Produktsuche]]></category>
		<category><![CDATA[Suche]]></category>
		<category><![CDATA[Tabelle]]></category>
		<category><![CDATA[Zeichenlänge]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2657</guid>
		<description><![CDATA[Magento bietet allerhand Einstellungen an, auch für die Produktsuche. So lässt sich die Mindestanzahl der Zeichen festlegen, ab der eine Suche möglich sein soll. Eine Produktsuche nach nur einem Buchstaben macht wohl nur in den wenigsten Fällen einen Sinn. Anders &#8230; <a href="http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/die-suche-nach-der-passenden-sip-api/" rel="bookmark">Die Suche nach der passenden SIP-API</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/" rel="bookmark">Magento: Verschiedene Preise in StoreViews</a></li>
		<li><a href="http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/" rel="bookmark">Facebook-Connect in Magento-Shops</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Magento bietet allerhand Einstellungen an, auch für die Produktsuche. So lässt sich die Mindestanzahl der Zeichen festlegen, ab der eine Suche möglich sein soll. Eine Produktsuche nach nur einem Buchstaben macht wohl nur in den wenigsten Fällen einen Sinn.</p>
<p>Anders schaut es hier bei Suchanfragen mit einer Länge von 3 Zeichen aus. Diese können bei manchen Shops schon häufiger auftreten. Nun kann es aber sein, dass trotz richtiger Magentoeinstellung und Vorhandensein mindestens eines passendes Produkts, die Suche bei nur 3 Zeichen zu keinem Ergebnis führt. Daran muss nicht unbedingt Magento schuld sein.</p>
<p>Die Standardeinstellungen eines MySQL-Servers verlangen bei einer Fulltext Suche eine Anfrage mit einer Mindestlänge von 4 Zeichen. Kürzere Anfragen bleiben unbeantwortet. Um dies zu ändern muss man die MySQL config /etc/mysql/my.cnf bearbeitet und die Variable ft_min_word_len hinzugefügt werden, z.B.:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[mysqld]<br />
ft_min_word_len=3</div></td></tr></tbody></table></div>
<p>Nach Neustart des MySQL-Servers kann es notwendig sein, dass in der Datenbank die für die Suche verantwortliche Tabelle gerichtet werden muss:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">repair table catalogsearch_fulltext quick;</div></td></tr></tbody></table></div>
<p>Zu guter Letzt muss noch der Suchindex von Magento neu erstellt werden. Dies kann man gemütlich im Backend erledigen, aber auch über die Konsole gibt ein Skript im Magento-Ordner unter shell:</p>
<div class="codecolorer-container text geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">php indexer.php --reindex catalog_category_product</div></td></tr></tbody></table></div>
<p>Jetzt sollten auch Suchanfragen mit 3 Zeichen Länge zu Ergebnisse führen.</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/die-suche-nach-der-passenden-sip-api/" rel="bookmark">Die Suche nach der passenden SIP-API</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/" rel="bookmark">Magento: Verschiedene Preise in StoreViews</a></li>
		<li><a href="http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/" rel="bookmark">Facebook-Connect in Magento-Shops</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/technik/magento-suche-mit-kurzer-zeichenlange/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Follow-Up zum Grazer Webmontag: Empfehlenswerte WordPress-Plugins</title>
		<link>http://www.loremipsum.at/blog/events/follow-up-zum-grazer-webmontag-empfehlenswerte-wordpress-plugins/</link>
		<comments>http://www.loremipsum.at/blog/events/follow-up-zum-grazer-webmontag-empfehlenswerte-wordpress-plugins/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 17:49:30 +0000</pubDate>
		<dc:creator>Ing. Karl Kowald</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Netzgeflüster]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2651</guid>
		<description><![CDATA[Wie bereits gestern am Grazer Webmontag angekündigt hier eine kurze Zusammenfassung der vorgestellten Plugins: Für die Suchmaschinenoptimierung All in One SEO Pack wpSEO Google XML Sitemaps Das Plugin &#8220;All in One SEO Pack&#8221; ist kostenlos, mit wpSEO kann man jedoch &#8230; <a href="http://www.loremipsum.at/blog/events/follow-up-zum-grazer-webmontag-empfehlenswerte-wordpress-plugins/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/" rel="bookmark">WordPress Adminbar für Usergruppen global deaktivieren</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Wie bereits gestern am Grazer Webmontag angekündigt hier eine kurze Zusammenfassung der vorgestellten Plugins:</p>
<h2>Für die Suchmaschinenoptimierung</h2>
<ul style="float: left; padding: 0 20px 0 0;">
<li><a title="All in One SEO Pack" href="http://wordpress.org/extend/plugins/all-in-one-seo-pack/" target="_blank">All in One SEO Pack</a></li>
<li><a title="wpSEO" href="http://www.wpseo.de/" target="_blank">wpSEO</a></li>
<li><a title="Google XML Sitemaps" href="http://wordpress.org/extend/plugins/google-sitemap-generator/" target="_blank">Google XML Sitemaps</a></li>
</ul>
<p>Das Plugin &#8220;All in One SEO Pack&#8221; ist kostenlos, mit wpSEO kann man jedoch bereits ab knapp 20 € eine schönes Plugin erhalten, das sehr sauber gecodet ist. Für den Einstieg ist der kostenlose Konkurrent jedoch durchaus ausreichend. Google XML Sitemaps sollte auf jedenfall in jede WordPress-Installation. Alleine das zusätzliche Anpingen der Suchmaschinen beschleunigt die Aufnahme neuer Texte in die Ergebnisseiten der Suchmaschinen.</p>
<h2>Caching und Ladezeitoptimierung</h2>
<ul style="float: left; padding: 0 20px 0 0;">
<li><a title="WP Minify" href="http://wordpress.org/extend/plugins/wp-minify/" target="_blank">WP Minify</a></li>
<li><a title="Cachify" href="http://wordpress.org/extend/plugins/cachify/" target="_blank">Cachify</a></li>
<li><a title="WP Super Cache" href="http://wordpress.org/extend/plugins/wp-super-cache/" target="_blank">WP Super Cache</a></li>
<li><a title="W3 Total Cache" href="http://wordpress.org/extend/plugins/w3-total-cache/" target="_blank">W3 Total Cache</a></li>
</ul>
<p>Mittels WP Minify verringert man die Anzahl der Connections pro Seitenaufruf durch zusammenlegen der ausgelagerten Javascript- &amp; Stylesheet-Dateien. Zusätzlich wird durch eine Minimierung der Dateigröße ein weiterer Geschwindigkeitsvorteil erzielt. Die restlichen 3 Plugins sind für Cachings zuständig. Cachify eignet sich hervorragend für Einsteiger in dieser Thematik, bringt damit aber auch den geringsten Funktionsumfang mit sich. WP Super Cache hat bereits mehrere Funktionsvielfalt und ist für Erfahrener Anwender ohne besonderes Know-How bezüglich Webserveroptimierungen udgl. gut geeignet. W3 Total Cache ist der Monsterversuch nicht nur WordPress, sondern auch den dahinter liegenden Webserver zu optimieren. Hierbei wird zusätzlich zu Apache auch noch IIS und Nginx angeboten, wobei bei meinen Tests Probleme mit Nginx aufgetreten sind, es hierbei also noch nicht besonders ausgereift scheint. Zusätzlich bringt es seine eigene Minify-Lösung mit und bietet auch mehrere Möglichkeiten mit einem CDN zu arbeiten. Dieses Plugin ist besonders für erfahrene Entwickler geeignet, da es einen guten Einstieg in die Thematik der Optimierung rund um Webserver, PHP &amp; WordPress bietet, aber leider noch nicht in allen bereich perfekt funktioniert und eventuell im Detail &#8220;angepasst&#8221; werden muss.</p>
<h2>Funktionserweiterungen</h2>
<ul style="float: left; padding: 0 20px 0 0;">
<li><a title="Antispam Bee" href="http://wordpress.org/extend/plugins/antispam-bee/" target="_blank">Antispam Bee</a></li>
<li><a title="AntiVirus" href="http://wordpress.org/extend/plugins/antivirus/" target="_blank">AntiVirus</a></li>
<li><a title="Contact Form 7" href="http://wordpress.org/extend/plugins/contact-form-7/" target="_blank">Contact Form 7</a></li>
<li><a title="Newsletter" href="http://wordpress.org/extend/plugins/newsletter/" target="_blank">Newsletter</a></li>
<li><a title="qTranslate" href="http://wordpress.org/extend/plugins/qtranslate/" target="_blank">qTranslate</a></li>
<li><a title="Statify" href="http://wordpress.org/extend/plugins/statify/" target="_blank">Statify</a></li>
</ul>
<p>Die Antispam Bee ist die kostenlose Alternative zum von WordPress mitausgelieferten Akismet, auch für kommerzielle Seiten kostenlos. AntiVirus hilft beim Auffinden potentieller Eindringlinge, falls das eigene WordPress Theme verseucht sein sollte (kommt vor allem bei kostenlosen Designs ab und an vor). Es behebt das Problem jedoch nicht selbstständig. Mit dem Contact Form 7 kann man spielend einfach Mail-Formulare für den eigenen Blog verbauen. Durch die einfache Handhabung ist kein Hintergrundwissen bezüglich HTML-Formularen notwendig. Das Newsletter-Plugin bietet einen kostenlosen Einstieg ins Newslettergeschäft. Sobald man jedoch einen großen Kundenstamm aufgebaut hat empfiehlt es sich hier auf eine kostenpflichte Software umzusteigen, aber für den Start allemal top. Mittels qTranslate kann man WordPress in mehreren Sprachen verfügbar machen. Da WordPress von seiner internen Struktur für Mehrsprachigkeit leider nicht ausgelegt ist, schränkt man hier teilweise den Funktionsumfang anderer Plugins ein. Sobald man Mehrsprachige Webseiten mit WordPress umsetzen möchte emfpiehlt es sich sehr sorgfältig die benötigten Erweiterungen zu überprüfen ob diese Kompatibel sind. Statify bietet eine &#8220;deutschlandsichere&#8221; Besucherzählung an, sodass man vor Abmahnungen aus Datenschutzgründen geschützt ist. Für österreichische Projekte ist es nicht notwendig vom deutlich umfangreichen Google Analytics wegzugehen.</p>
<h2>Nette Spielereien aus Grafik und Funktion</h2>
<ul style="float: left; padding: 0 20px 0 0;">
<li><a title="CodeColorer" href="http://wordpress.org/extend/plugins/codecolorer/" target="_blank">CodeColorer</a></li>
<li><a title="FancyBox for WordPress" href="http://wordpress.org/extend/plugins/fancybox-for-wordpress/" target="_blank">FancyBox for WordPress</a></li>
<li><a title="wpMAPS" href="http://wordpress.org/extend/plugins/wpmaps/" target="_blank">wpMAPS</a></li>
</ul>
<p>Der CodeColorer bietet eine einfache Möglichkeit für Entwickler Sourcecode visuell angenehm darzustellen. Zusätzlich bietet er auch die Option auf eine Verlinkung der Befehle direkt zu den Hersteller-Hilfedokumenten. Mit der FancyBox for WordPress kann man mittels 1-Click-Install den schönen grafischen Effekt der jQuery-FancyBox in die Seite integrieren. Einzelbilder werden damit ebenso wie ganze Gallerien mit diesem jQuery-Effekt dargestellt. Mit wpMAPS wird einem eine einfache API-basierte Möglichkeit geboten wie man Google Maps auf die eigene Seite integrieren kann. Besonders geeignet für Kontakt- &amp; Impressum-Seiten.</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/" rel="bookmark">WordPress Adminbar für Usergruppen global deaktivieren</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/events/follow-up-zum-grazer-webmontag-empfehlenswerte-wordpress-plugins/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sturm12 Liveticker Rapid Wien vs Sturm Graz</title>
		<link>http://www.loremipsum.at/blog/events/sturm12-liveticker-rapid-wien-vs-sturm-graz/</link>
		<comments>http://www.loremipsum.at/blog/events/sturm12-liveticker-rapid-wien-vs-sturm-graz/#comments</comments>
		<pubDate>Sat, 09 Apr 2011 17:16:37 +0000</pubDate>
		<dc:creator>Ing. Karl Kowald</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2640</guid>
		<description><![CDATA[Ein kleiner Ersatzlink für die Ausfallszeit des Sturm12.at &#8211; Servers: Liveticker: Rapid Wien &#8211; Sturm Graz Verwandte Themen und Beitr&#228;ge Webmontag Graz &#8211; Conversion Camp 2010 Wireframing und Rapid Prototyping im UI-Design Das war die 2. IMS in Wien <a href="http://www.loremipsum.at/blog/events/sturm12-liveticker-rapid-wien-vs-sturm-graz/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/cro/webmontag-graz-conversion-camp-2010/" rel="bookmark">Webmontag Graz &#8211; Conversion Camp 2010</a></li>
		<li><a href="http://www.loremipsum.at/wissen/ressourcen/wireframing-und-rapid-prototyping-im-ui-design/" rel="bookmark">Wireframing und Rapid Prototyping im UI-Design</a></li>
		<li><a href="http://www.loremipsum.at/blog/events/das-war-die-2-ims-in-wien/" rel="bookmark">Das war die 2. IMS in Wien</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Ein kleiner Ersatzlink für die Ausfallszeit des Sturm12.at &#8211; Servers:</p>
<p><iframe src="http://www.coveritlive.com/index2.php/option=com_altcaster/task=viewaltcast/altcast_code=6425acbcf8/height=550/width=500" scrolling="no" height="550px" width="500px" frameBorder="0" allowTransparency="true" ><a href="http://www.coveritlive.com/mobile.php/option=com_mobile/task=viewaltcast/altcast_code=6425acbcf8" >Liveticker: Rapid Wien &#8211; Sturm Graz</a></iframe></p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/cro/webmontag-graz-conversion-camp-2010/" rel="bookmark">Webmontag Graz &#8211; Conversion Camp 2010</a></li>
		<li><a href="http://www.loremipsum.at/wissen/ressourcen/wireframing-und-rapid-prototyping-im-ui-design/" rel="bookmark">Wireframing und Rapid Prototyping im UI-Design</a></li>
		<li><a href="http://www.loremipsum.at/blog/events/das-war-die-2-ims-in-wien/" rel="bookmark">Das war die 2. IMS in Wien</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/events/sturm12-liveticker-rapid-wien-vs-sturm-graz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress 3.1 Pluginbugfixing bei Kategorielinks</title>
		<link>http://www.loremipsum.at/blog/code/wordpress-3-1-pluginbugfixing-bei-kategorielinks/</link>
		<comments>http://www.loremipsum.at/blog/code/wordpress-3-1-pluginbugfixing-bei-kategorielinks/#comments</comments>
		<pubDate>Thu, 24 Feb 2011 21:43:58 +0000</pubDate>
		<dc:creator>Ing. Karl Kowald</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Bugfix]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Plugins]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2627</guid>
		<description><![CDATA[Seit gestern wird WordPress 3.1 als stable ausgeliefert, jedoch scheinen einige Plugin-Anbieter ihre Software nicht damit vorabgetestet zu haben, denn bei einigen treten seltsame Fehler auf, betreffend der mod_rewrite-Funktion für sprechende URL&#8217;s und Kategorielinks Kategorielinks verweisen auf Artikel oder 404-Fehlerseite &#8230; <a href="http://www.loremipsum.at/blog/code/wordpress-3-1-pluginbugfixing-bei-kategorielinks/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-3-0-upgrade-sinnvoll/" rel="bookmark">WordPress 3.0 &#8211; Upgrade sinnvoll?</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Seit gestern wird WordPress 3.1 als stable ausgeliefert, jedoch scheinen einige Plugin-Anbieter ihre Software nicht damit vorabgetestet zu haben, denn bei einigen treten seltsame Fehler auf, betreffend der mod_rewrite-Funktion für sprechende URL&#8217;s und Kategorielinks<span id="more-2627"></span></p>
<h2>Kategorielinks verweisen auf Artikel oder 404-Fehlerseite</h2>
<p>Ob man ein Plugin mit solch einen Fehler hat bemerkt man eigentlich sehr einfach. Klickt man auf einen Kategorielink und wird automatisch auf einen Artikel der Kategorie oder eine 404 Fehlerseite weitergeleitet, anstatt in der schönen Kategorieübersicht zu landen hat man ein nicht kompatibles Plugin dabei.</p>
<h2>1 Zeile auskommentieren als Sofortmaßnahme</h2>
<p>Erstaunlicherweise lässt sich das in den meisten Fällen jedoch recht einfach lösen. Einfach nach folgender Zeile suchen:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$wp_rewrite</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">flush_rules</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p><strong>Diese Zeile</strong> einfach <strong>auskommentieren oder löschen</strong> und schon funktionieren die Kategorielinks wieder korrekt. <strong>Trotz</strong> dieses <strong>Eingriffs funktionieren</strong> die <strong>Plugins</strong> alle noch <strong>korrekt</strong> (bisher 3 Plugins auf diese Art bearbeitet). Dies ist zwar keine sinnvolle Dauerlösung, jedoch werden in den nächsten Tagen und Wochen die meisten Pluginentwickler adequate, getestete Lösungen via Updates nachreichen.</p>
<h2>Betroffene Plugins via Linux-Shell finden</h2>
<p>Betreiber von Blogs mit sehr vielen Plugins können mit diesem Aufruf in der Linuxshell rasch und effizient herausfinden in welche Plugins von diesem Problem betroffen sind.</p>
<div class="codecolorer-container c geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">grep <span style="color: #339933;">-</span>rl <span style="color: #ff0000;">'flush_rules'</span> <span style="color: #339933;">/</span>pathtowordpress<span style="color: #339933;">/</span>wp<span style="color: #339933;">-</span>content<span style="color: #339933;">/</span>plugins<span style="color: #339933;">/</span></div></td></tr></tbody></table></div>
<p>Mit diesem Aufruf erhält man eine Liste betroffener Dateien zurück, dort muss nur noch der entsprechende Eintrag auskommentiert werden.</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-3-0-upgrade-sinnvoll/" rel="bookmark">WordPress 3.0 &#8211; Upgrade sinnvoll?</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/code/wordpress-3-1-pluginbugfixing-bei-kategorielinks/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress Adminbar für Usergruppen global deaktivieren</title>
		<link>http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/</link>
		<comments>http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 19:30:25 +0000</pubDate>
		<dc:creator>Ing. Karl Kowald</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Technik]]></category>
		<category><![CDATA[AdminBar]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2618</guid>
		<description><![CDATA[Seit heute ist WordPress in der Version 3.1 veröffentlicht. Mit diesem Release kam unter anderem ein Feature namens Adminbar, für Benutzer von wordpress.com bereits eine bekannte Kopfleiste im Frontend von WordPress um schneller Backendfunktionen auch im Frontend nutzen zu können. &#8230; <a href="http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-3-0-upgrade-sinnvoll/" rel="bookmark">WordPress 3.0 &#8211; Upgrade sinnvoll?</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Seit heute ist WordPress in der Version 3.1 veröffentlicht. Mit diesem Release kam unter anderem ein Feature namens Adminbar, für Benutzer von wordpress.com bereits eine bekannte Kopfleiste im Frontend von WordPress um schneller Backendfunktionen auch im Frontend nutzen zu können.</p>
<h2>Adminbar für registrierte Benutzer global deaktivieren</h2>
<p>Grundsätzlich eine sinnvolle Sache für Admins und Redakteure, jedoch für registrierte Leser meist unnötig und nicht ins Designkonzept passend. Mit einem kleinen aber feinen Eintrag in der functions.php des aktivierten Designs kann man dem aber Abhilfe schaffen &#8211; alternativ kann man das natürlich auch via Plugin aktivieren:</p>
<div class="codecolorer-container php geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>current_user_can<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'edit_posts'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
add_filter<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'show_admin_bar'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'__return_false'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>Mit diesen Zweizeiler kann man auf einfachste Weise die Adminbar für gewisse Usergruppen deaktivieren. In diesem Beispiel gilt das nur für registrierte Benutzer, da diese die einzige Gruppe ist, die keine Artikel editieren kann.</p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">edit_posts</div>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/produkte/wordpress-plugins/" rel="bookmark">WordPress Plugins</a></li>
		<li><a href="http://www.loremipsum.at/blog/sem/neues-wordpress-plugin-affiliando-vergleichsrechner-1-0/" rel="bookmark">Neues WordPress Plugin: Affiliando Vergleichsrechner 1.0</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/wordpress-3-0-upgrade-sinnvoll/" rel="bookmark">WordPress 3.0 &#8211; Upgrade sinnvoll?</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/code/wordpress-adminbar-fur-usergruppen-global-deaktivieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook-Connect in Magento-Shops</title>
		<link>http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/</link>
		<comments>http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 10:09:13 +0000</pubDate>
		<dc:creator>Peter Hasitschka</dc:creator>
				<category><![CDATA[Datenschutz]]></category>
		<category><![CDATA[Soziale Netze]]></category>
		<category><![CDATA[Usability]]></category>
		<category><![CDATA[Connect]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Login]]></category>
		<category><![CDATA[Magento]]></category>

		<guid isPermaLink="false">http://www.loremipsum.at/?p=2422</guid>
		<description><![CDATA[Seit Dezember 2008 bietet Facebook eine interessante Lösung für den Login-Prozess auf Internetseiten an. Dabei können User mittels des Facebook-Connect-Buttons sich mit einem Klick auf Seiten registrieren bzw. einloggen. Da Magento auch einen Checkout-Prozess mit einem User-Login anbietet, lag es &#8230; <a href="http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/">weiterlesen <span class="meta-nav">&#187;</span></a><div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/" rel="bookmark">Magento: Verschiedene Preise in StoreViews</a></li>
		<li><a href="http://www.loremipsum.at/blog/soziale-netze/facebook-places-vs-foursquare/" rel="bookmark">Facebook Places vs. Foursquare</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/permanenter-zugriff-fur-die-facebook-app/" rel="bookmark">Permanenter Zugriff für die Facebook-App</a></li>
	</ul></div>
]]></description>
			<content:encoded><![CDATA[<p>Seit Dezember 2008 bietet Facebook eine interessante Lösung für den Login-Prozess auf Internetseiten an. Dabei können User mittels des Facebook-Connect-Buttons sich mit einem Klick auf Seiten registrieren bzw. einloggen.<br />
Da Magento auch einen Checkout-Prozess mit einem User-Login anbietet, lag es nahe eine Facebook-Connect Lösung auch für Shops zu implementieren.</p>
<p>Um Facebook connect realisieren zu können, muss man vorab den technischen Ablauf verstehen: Im Grunde befindet sich zwischen der eigenen Seite und Facebook als Schnittstelle im Login-Prozess der Access-Token. Dieser wird von Facebook zurückgegeben, wenn dort die Authorisierung der entsprechenden Seite erfolgt ist. Da die Intentität des Users durch sein Login bei Facebook bestätigt ist, kann mittels des Tokens die UserID von Facebook abgefragt werden, und anstatt eines User-Passwort Tupels für den Login auf unserer Seite benutzt werden. </p>
<p>Um einen gültigen Access-Token zu bekommen muss der User natürlich bestätigen, dass er der jeweiligen Seite seine ID und optional weitere Informationen zur Verfügung stellen will. Facebook identifiziert die Seite über eine vom Seitenbetreiber erstellte Facebook-App. Diese hat insofern keinen spannenden Inhalt da sie ausschließlich speichert, welche Informationen des Users abgefragt werden sollen, und welche Seite dafür gültig sein soll.</p>
<div id="attachment_2587" class="wp-caption alignright" style="width: 180px"><a href="http://loremipsum.at/wp-content/uploads/2011/02/facebook-connect.jpg"><img class="size-thumbnail wp-image-2587" title="Facebook-Connect" src="http://www.loremipsum.at/wp-content/uploads/2011/02/facebook-connect-170x87.jpg" alt="Facebook-Connect" width="170" height="87" /></a><p class="wp-caption-text">Facebook-Connect</p></div>
<p>Beim Klicken auf den Facebook-Connect-Button wird der User um Bestätigung aufgefordert, die entsprechende Anwendung (die auf unsere Seite weiterleitet) mit den entsprechenden Rechten (Lesen von Posts, Bildern, schreiben von Posts, etc.) zu authorisieren. Ist die Authorisierung erfolgt wird der User auf die angegebene Landing-Page weitergeleitet. Mit dem nun erhalteten Access-Token kann die Seite einen Registrierungs- bzw. Login Prozess durchführen. In unserem Falle speichern wir Magento-User-Ids und Facebook Ids in einer Tabelle und können mittels LoginById() &#8211; Methode des Session-Models einen Login durchführen, sobald eine gültige Facebook-Id zurückkommt.<br />
Sobald der Facebook-User einmal die Anwendung authorisiert hat, wird dieser Schritt übersprungen, wodurch ein One-Click-Login möglich ist.</p>
<p>Die Grundmotivation für den Einbau von Facebook-Connect in unseren Shop war es neben der generellen Connect-Idee, die kurz zuvor von Facebook gestartete Freigabe von Adressen und Telefonnummern der User zu nutzen. Dies wäre insofern praktisch gewesen, dass dem Magento-User eine Registrierung mit notwendiger Adresseingabe erspart geblieben wäre, da diese direkt von seinem Facebook-Account gelesen worden wären. Leider wurde die Bekanntgabe von Facebook von manchen Medien falsch aufgefasst und als weiterer drastische Einbuße von Datenschutz interpretiert, wodurch sich Facebook gezwungen sah, diese beiden User-Informations-Freigaben wieder zu deaktivieren. Dadurch konnten wir dem User die Dateneingabe im Registrationsprozess nicht abnehmen, jedoch bleibt noch immer der Vorteil des schnellen einloggen und registrierens.<br />
Auch ein Verschmelzen von bereits existierenden Magento-Accounts wurde implementiert. Der User kann im Nachhinein seinen Account mit Facebook-Connect verbinden.</p>
<div class="related"> 						<span class="hash">Verwandte Themen und Beitr&auml;ge</span>  						<ul>
		<li><a href="http://www.loremipsum.at/blog/code/magento-verschiedene-preise-in-storeviews/" rel="bookmark">Magento: Verschiedene Preise in StoreViews</a></li>
		<li><a href="http://www.loremipsum.at/blog/soziale-netze/facebook-places-vs-foursquare/" rel="bookmark">Facebook Places vs. Foursquare</a></li>
		<li><a href="http://www.loremipsum.at/blog/code/permanenter-zugriff-fur-die-facebook-app/" rel="bookmark">Permanenter Zugriff für die Facebook-App</a></li>
	</ul></div>
]]></content:encoded>
			<wfw:commentRss>http://www.loremipsum.at/blog/datenschutz/facebook-connect-in-magento-shops/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

