<?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>Schrottcode</title>
	<atom:link href="http://www.schrottcode.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.schrottcode.de</link>
	<description>MY POINT OF VIEW</description>
	<lastBuildDate>Wed, 03 Nov 2010 10:22:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Magento Plugins entwickeln</title>
		<link>http://www.schrottcode.de/magento-plugins-entwickeln/</link>
		<comments>http://www.schrottcode.de/magento-plugins-entwickeln/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 11:21:53 +0000</pubDate>
		<dc:creator>Runnerle</dc:creator>
				<category><![CDATA[Magento]]></category>

		<guid isPermaLink="false">http://www.schrottcode.de/?p=16</guid>
		<description><![CDATA[Plugins erweitern die Funktionalität von Magento und machen das Shopsystem noch mächtiger. Leider habe ich bis dato sehr wenige brauchbare Quellen im Internet gefunden die sich hinreichend mit der Thematik der Pluginerstellung in Magento auseinandergesetzt haben. Aus diesem Grund möchte ich hier eine Anleitung zur Verfügung stellen, die von Grund auf die erstellung von Plugins [...]]]></description>
			<content:encoded><![CDATA[<p>Plugins erweitern die Funktionalität von Magento und machen das Shopsystem noch mächtiger. Leider habe ich bis dato sehr wenige brauchbare Quellen im Internet gefunden die sich hinreichend mit der Thematik der Pluginerstellung in Magento auseinandergesetzt haben.</p>
<p>Aus diesem Grund möchte ich hier eine Anleitung zur Verfügung stellen, die von Grund auf die erstellung von Plugins für Magento klärt. Diese Anleitung soll durch die erstellung eines simpelen Plugins, dass ein Produktbild in der Comparesidebar anzeigt plastischer dargestellt werden.</p>
<p><span id="more-16"></span></p>
<h2>Teil 1: Die Ordnerstruktur</h2>
<p>Bevor es daran geht unser Plugin zu schreiben müssen wir erst ein paar Ordner anlegen, die uns als Grundgerüst dienen. Als erstes navigieren wir in den Ordner "app/code/local/".<span style="color: #333333; font-size: 11px;"> </span></p>
<p><span style="color: #333333; font-size: 10px;">( Falls ihr euch fragt was die anderen Ordner in "App/code/" bedeuten: Magento basiert auf Modulen, die im grunde nichts anderes sind als Plugins. Diese Module sind in verschiedene Kategorien aufgeteilt. Zum einen gibt es den Ordner "core" in dem alle Module liegen die Magento von Haus aus mitbringt. Im ordner "community" befinden sich alle Module die per Magento connect installiert wurden. Im Ordner "local" sind alle Module die selbst auf den FTP hochgeladen wurden, wie zum Beispiel gekaufte oder selbstgeschriebene Erweiterungen. )</span></p>
<p>Dort legen wir zunächst einen Ordner an, in den wir nun alle von geschriebenen Plugins plazieren werden. Dieser Ordner bekommt normalerweise entweder den Firmennamen oder auch seinen Nachnamen, damit es nicht zu Kollisionen mit anderen Programmierern kommt. Wir nennen unseren Ordner Testweise "Schrottcode".</p>
<p>Nun legen wir im Ordner "Schrottcode" den Ordner "CompareSidebarImages" an. Dieser Ordner beinhaltet den größten Teil unseres Plugins. Da wir ein Plugin schreiben,<a href="http://www.schrottcode.de/wp-content/uploads/2010/08/ordner-struktur.png" rel="lightbox[16]"><img class="alignright size-full wp-image-118" title="ordner-struktur" src="http://www.schrottcode.de/wp-content/uploads/2010/08/ordner-struktur.png" alt="" width="219" height="126" /></a> dass Bilder in der Compare Sidebar anzeigt ist der name ganz treffend gewählt.</p>
<p>Ist auch das erledigt, legen wir im Ordner "CompareSidebarImages" weitere 2 Ordner an. Diese lauten "etc" und  "Helper". Bis jetzt sollte eure Ordnerstruktur aussehen wie im rechten Bild.<br />
Nun haben wir die Ordner Struktur für die Logik unseres Plugins. Das heißt in diesen Ordnern wird sich später unser code befinden. Nun brauchen wir aber noch Ordner in dem wir unsere Ausgaben präsentieren können.</p>
<p>Zunächst navigieren wir in den Template Ordner  "app/design/frontend/default/<span style="text-decoration: underline;"><em>default</em></span>/template". Dort legen wir nun den Ordner "comparesidebarimages" an. Darin werden wir später unsere Views platzieren. Ich habe hier das Standardtheme ausgewählt, solltet Ihr jedoch ein anderes Layout verwenden, müsst ihr natürlich einen anderen Pfad verwenden.</p>
<p>Nun sind alle Ordner erstellt um mit unserem ersten Plugin zu beginnen.</p>
<h2>Teil 2: Konfiguration</h2>
<p>Da wir jetzt alle für unser Plugin benötigten Ordner erstellt haben, können wir mit dem nächsten Schritt beginnen, der Konfiguration. Das heißt wir zeigen Magento wo es unser Plugin finden kann, welche Ressourcen unser Plugin nutzen wird, sowie einige Grundeinstellungen.</p>
<p>Beginnen wir damit im Ordner "app/code/local/Schrottcode/CompareSidebarImages/etc/". Dort legen wir nun eine Datei mit dem Namen "config.xml" an. Wer zu diesem Zeitpunkt noch nicht mit XML vertraut ist sollte vorher mal <a href="http://de.selfhtml.org/xml/" target="_blank">hier</a> vorbeischauen.</p>
<p>Ich poste zunächst einmal den Inhalt der Datei, bevor wir diesen Schritt für Schritt durchgehen.</p>
<p><strong style="font-size: 11px;">app/code/local/Schrottcode/CompareSidebarImages/etc/config.xml</strong></p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;config&gt;
	&lt;modules&gt;
		&lt;Schrottcode_CompareSidebarImages&gt;
			&lt;version&gt;1.0&lt;/version&gt;
		&lt;/Schrottcode_CompareSidebarImages&gt;
	&lt;/modules&gt;
	&lt;global&gt;
		&lt;helpers&gt;
			&lt;comparesidebarimages&gt;
				&lt;class&gt;Schrottcode_CompareSidebarImages_Helper&lt;/class&gt;
			&lt;/comparesidebarimages&gt;
		&lt;/helpers&gt;
	&lt;/global&gt;
	&lt;frontend&gt;
		&lt;layout&gt;
			&lt;updates&gt;
				&lt;comparesidebarimages&gt;
					&lt;file&gt;comparesidebarimages.xml&lt;/file&gt;
				&lt;/comparesidebarimages&gt;
			&lt;/updates&gt;
		&lt;/layout&gt;
	&lt;/frontend&gt;
&lt;/config&gt;
</pre>
<p>Mit der ersten Zeile wird das XML Dokument deklariert. Darauf folgt der config tag, in dem die Konfiguration des Plugins stattfindet.</p>
<pre class="brush: xml;">
	&lt;modules&gt;
		&lt;Schrottcode_CompareSidebarImages&gt;
			&lt;version&gt;1.0&lt;/version&gt;
		&lt;/Schrottcode_CompareSidebarImages&gt;
	&lt;/modules&gt;
</pre>
<p>Im Modules Tag definieren wir unser Plugin. Das Schrottcode_CompareSidebarImages sagt Magento, dass es sich um das Plugin im Ordner Schrottcode/CompareSidebarImages handelt.</p>
<p><span style="color: #333333; font-size: 10px;">( Magento setzt auf dem Zend Framework auf, dieses verwendet eine besondere art der Klassen und Ordnerverwaltung. Der Unterstrich steht für ein /. Zum Beispiel liegt die PHP Klasse "Mage_Catalog_Block_Product" im Ordner "Mage/Catalog/Block/Product.php". )</span></p>
<p>Mit der Angabe des Versions Tags, kann der User im Adminbereich sehen welche Version er besitzt wenn er nach möglichen Updates sucht.</p>
<pre class="brush: xml;">
	&lt;global&gt;
		&lt;helpers&gt;
			&lt;comparesidebarimages&gt;
				&lt;class&gt;Schrottcode_CompareSidebarImages_Helper&lt;/class&gt;
			&lt;/comparesidebarimages&gt;
		&lt;/helpers&gt;
	&lt;/global&gt;
</pre>
<p>Im Global Tag wird definiert wo das Plugin seine Dateien findet. Zum Beispiel liegen die Helper im Ordner<br />
"Schrottcode_CompareSidebarImages_Helper" ( "Schrottcode/CompareSidebarImages/Helper" ).<br />
In komplexeren Plugins werden auch Controller und Installationsdateien benötigt. Auch diese Ordner würden dann hier angegeben werden.</p>
<pre class="brush: xml;">
	&lt;frontend&gt;
		&lt;layout&gt;
			&lt;updates&gt;
				&lt;comparesidebarimages&gt;
					&lt;file&gt;comparesidebarimages.xml&lt;/file&gt;
				&lt;/comparesidebarimages&gt;
			&lt;/updates&gt;
		&lt;/layout&gt;
	&lt;/frontend&gt;
</pre>
<p>Im Frontend Tag definieren wir in welcher Datei Magento suchen soll um die benötigten Informationen für die Präsentation zu finden. Dazu aber später mehr.</p>
<p>Und das wars auch schon für unsere erste Konfigurationsdatei. Nun müssen wir Magento noch sagen das unser Plugin existiert und wo es liegt. Dazu navigieren wir in den Ordner "app/etc/modules". Dort legen wir die Datei "Schrottcode_CompareSidebarImages.xml" an. Folgendes kommt in die Datei:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;config&gt;
	&lt;modules&gt;
		&lt;Schrottcode_CompareSidebarImages&gt;
			&lt;active&gt;true&lt;/active&gt;
			&lt;codePool&gt;local&lt;/codePool&gt;
		&lt;/Schrottcode_CompareSidebarImages&gt;
	&lt;/modules&gt;
&lt;/config&gt;
</pre>
<p>Hier werden 2 dinge definiert. Zum einen wird das Plugin aktiviert und zum anderen wird der codePool bestimmt. Der CodePool ist nichts anderes als der Ordner in dem wir unser Plugin speichern. Zur Auswahl steht local und community. der core Ordner ist für Magentoeigene Module bestimmt. Der wird genutzt um unser Plugin per Magento connect zu verbreiten.<br />
<a href="http://www.schrottcode.de/wp-content/uploads/2010/08/fist-test-compare-plugin.png" rel="lightbox[16]"><img class="alignleft size-medium wp-image-71" title="CompareSidebarImages Backend" src="http://www.schrottcode.de/wp-content/uploads/2010/08/fist-test-compare-plugin-300x84.png" alt="" width="300" height="84" /></a><br />
Das war es auch schon, wenn wir uns nun in unserem Magento Backend einloggen und zu "System/Konfiguration/Erweitert" navigieren und etwas herunterscrollen sehen wir unser Plugin.</p>
<p>Jetzt wo Magento unser Plugin kennt, und unser Plugin weiß wo seine Dateien liegen, können wir anfangen unser Plugin zu schreiben.</p>
<h2>Teil 3: Das Plugin schreiben</h2>
<p>Noch ein kleines Vorwort zu unserem Plugin. Wir wollen, dass ein Artikel der der Compare Sidebar hinzugefügt wurde zusätzlich zur Produktbeschreibung auch ein Produktbild zeigt. Am elegantesten erreichen wir das in dem wir die Grundfunktionalität des existierenden Compare Sidebar Modules erweitern. Das Originale Modul holt nur den Produktnamen aus der Datenbank, wir werden dies dahingehend ändern, dass wir auch das Produktbild laden um es darstellen zu können.</p>
<p>Die Originale Funktion "getItemCollection" steht in der "Compare.php" im Ordner "app/code/core/Mage/Catalog/Helper/Product". Diese müssen wir nun mit unserem eigenen Plugin überschreiben. Dazu legen wir im Ordner "Helper" unseres Plugins die Datei "Compare.php" an. Folgendes schreiben wir in die Datei:</p>
<pre class="brush: php;">
class Schrottcode_CompareSidebarImages_Helper_Compare extends Mage_Catalog_Helper_Product_Compare
{

	public function getItemCollection()
    {
        if (!$this-&gt;_itemCollection) {
            $this-&gt;_itemCollection =
				Mage::getResourceModel('catalog/product_compare_item_collection')
					-&gt;useProductItem(true)
					-&gt;setStoreId(Mage::app()-&gt;getStore()-&gt;getId());

            if (Mage::getSingleton('customer/session')-&gt;isLoggedIn()) {
                $this-&gt;_itemCollection
					-&gt;setCustomerId(Mage::getSingleton('customer/session')
						-&gt;getCustomerId());
            }
            else {
                $this-&gt;_itemCollection
					-&gt;setVisitorId(Mage::getSingleton('log/visitor')
						-&gt;getId());
            }

            Mage::getSingleton('catalog/product_visibility')
                -&gt;addVisibleInSiteFilterToCollection($this-&gt;_itemCollection);

            $this-&gt;_itemCollection-&gt;addAttributeToSelect('name')
                -&gt;addUrlRewrite()
                -&gt;load();
        }
        return $this-&gt;_itemCollection;
    }
}
</pre>
<p>Gehen wir das mal durch. Unsere Klasse heißt "Schrottcode_CompareSidebarImages_Helper_Compare". Wie wir wissen bestimmen wir damit den aufenthaltsort der Klasse ( "Schrottcode/CompareSidebarImages/Helper/Compare.php" ). Unsere Klasse erweitert die bestehende Klasse "Mage_Catalog_Helper_Product_Compare". Das bedeutet, uns stehen alle Funktionen der alten Compare Klasse zur verfügung mit dem unterschied, dass wir nun gezielt Methoden hinzufügen und überschreiben können ohne die Originaldatei anrühren zu müssen.</p>
<p>Als nächstes wurde die Funktion "getItemCollection()" erstellt. Diese habe ich einfach aus der Originalklasse herauskopiert und in unsere Datei eingefügt. Nun können wir diese Funktion so verändern, dass Sie auch Bilder mit aus der Datenbank ausließt.</p>
<p>Dazu müssen wir Zeile 26 etwas ändern. Dort werden die Produkte ausgelesen die in der Compare Sidebar sind. Unser Bild wird geladen in dem wir den Aufruf von "-&gt;addAttributeToSelect('image')" ergänzen. Danach sollte es dann so aussehen</p>
<pre class="brush: php;">
    $this-&gt;_itemCollection-&gt;addAttributeToSelect('name')
                -&gt;addAttributeToSelect('image')
                -&gt;addUrlRewrite()
                -&gt;load();
</pre>
<p>Das wars jetzt auch schon, jetzt müssen wir uns nurnoch um die Ausgabe kümmern.</p>
<h2>Teil 4: Die Ausgabe</h2>
<p>Ich fasse nocheinmal schnell zusammen; Wir haben jetzt die Funktionalität des Compare Sidebar Modules erweitert, indem wir es in unserem Plugin die Funktion angepasst haben, die nun das Bild ausließt. Nun müssen wir Magento noch sagen das er unser Plugin verwenden soll anstatt das Original.</p>
<p>Dazu haben wir 2 Möglichkeiten, entweder wir ändern die Original Template Datei und erweitern diese so das Sie das Bild anzeigt, oder wir machen unsere eigene Ausgabe Datei die das Original unberührt lässt. Wir besprechen hier die 2te Variante.</p>
<p>Dazu erstellen wir im Ordner "app/design/frontend/default/[Euer Theme]/template/comparesidebarimages" den wir am anfang angelegt haben die Datei "sidebar.phtml". Diese Datei soll unsere Version der Compare Sidebar erhalten. Dazu kopieren wir den Inhalt der Original "sidebar.phtml" in unsere Datei um diese zu ändern. Die Originaldatei befindet sich im Ordner "app/design/frontend/default/[Euer Theme]/template/catalog/product/compare".</p>
<p>Nachdem wir das erledigt haben, können wir die Datei anpassen. In Zeile 39 - 45 befindet sich die Ausgabe der Produkte die momentan in der Compare Sidebar sind. Und dort wollen wir auch unsere Änderung vornehmen. Hier einmal der Originalausschnitt.</p>
<pre class="brush: php;">
        &lt;?php foreach($this-&gt;helper('catalog/product_compare')-&gt;getItemCollection() as $_index=&gt;$_item): ?&gt;
            &lt;li class=&quot;item&quot;&gt;
                &lt;input type=&quot;hidden&quot; class=&quot;compare-item-id&quot; value=&quot;&lt;?php echo $_item-&gt;getId() ?&gt;&quot; /&gt;
                &lt;a href=&quot;&lt;?php echo $this-&gt;helper('catalog/product_compare')-&gt;getRemoveUrl($_item) ?&gt;&quot; title=&quot;&lt;?php echo $this-&gt;__('Remove This Item') ?&gt;&quot; class=&quot;btn-remove&quot; onclick=&quot;return confirm('&lt;?php echo $this-&gt;__('Are you sure you would like to remove this item from the compare products?') ?&gt;');&quot;&gt;&lt;?php echo $this-&gt;__('Remove This Item') ?&gt;&lt;/a&gt;
                &lt;p class=&quot;product-name&quot;&gt;&lt;a href=&quot;&lt;?php echo $this-&gt;getProductUrl($_item) ?&gt;&quot;&gt;&lt;?php echo $this-&gt;htmlEscape($_item-&gt;getName()) ?&gt;&lt;/a&gt;&lt;/p&gt;
            &lt;/li&gt;
        &lt;?php endforeach; ?&gt;
</pre>
<p>Leider sieht der Code hier ein wenig chaotisch aus, aber es sollte trotzdem klar sein was da passiert. Mit der foreach Schleife wird die Produktzusammenstellung abgerufen und anschließend ausgegeben. Jedes Produkt besteht aus 3 Punkten. Einem hidden Feld, dass die Id des Produktes enthält, einen Link um das Produkt von der Liste zu entfernen und einen Link zum Produkt. Ich habe mich dazu entschieden das Bild zwischen dem löschen link und dem Link zum Produkt zu plazieren.</p>
<p>Nun müssen wir dafür sorgen, dass unser Helper verwendet wird anstatt der Originale Helper der das Bild nicht mit ausließt. Dazu ändern wir den Kopf der foreach Schleife folgendermaßen ab. Aus</p>
<pre class="brush: php;">
$this-&gt;helper('catalog/product_compare')
</pre>
<p>machen wir</p>
<pre class="brush: php;">
$this-&gt;helper('comparesidebarimages/compare')
</pre>
<p>Damit wird nun unser Plugin Helper verwendet was es uns ermöglicht das Bild auszulesen.</p>
<p>Um das Bild auszulesen verwenden wir folgenden Befehl:</p>
<pre class="brush: php;">
&lt;img src=&quot;&lt;?php echo $this-&gt;helper('catalog/image')-&gt;init($_item, 'image')-&gt;resize( 100, 100 ); ?&gt;&quot; /&gt;
</pre>
<p>Dieses Snippet verwendet den Image Helper von Magento um den Pfad des Bildes zu holen und es anschließend noch zu verkleinern ( sofern dies notwendig ist ). Ich habe hier 100px Höhe und Breite festgelegt. Dieses Snippet kann nun überall innerhalb der foreach Schleife eingebaut werden. Ich habe mich dazu entschieden es zwischen den Löschen Link und dem Link zum Produkt anzeigen zu lassen.<br />
Unsere fertige foreach Schleife sieht dann so aus</p>
<pre class="brush: php;">
        &lt;?php foreach($this-&gt;helper('comparesidebarimages/compare')-&gt;getItemCollection() as $_index=&gt;$_item): ?&gt;
            &lt;li class=&quot;item&quot;&gt;
                &lt;input type=&quot;hidden&quot; class=&quot;compare-item-id&quot; value=&quot;&lt;?php echo $_item-&gt;getId() ?&gt;&quot; /&gt;
                &lt;a href=&quot;&lt;?php echo $this-&gt;helper('catalog/product_compare')-&gt;getRemoveUrl($_item) ?&gt;&quot; title=&quot;&lt;?php echo $this-&gt;__('Remove This Item') ?&gt;&quot; class=&quot;btn-remove&quot; onclick=&quot;return confirm('&lt;?php echo $this-&gt;__('Are you sure you would like to remove this item from the compare products?') ?&gt;');&quot;&gt;&lt;?php echo $this-&gt;__('Remove This Item') ?&gt;&lt;/a&gt;
               &lt;img src=&quot;&lt;?php echo $this-&gt;helper('catalog/image')-&gt;init($_item, 'image')-&gt;resize( 100, 100 ); ?&gt;&quot; /&gt;
			   &lt;p class=&quot;product-name&quot;&gt;&lt;a href=&quot;&lt;?php echo $this-&gt;getProductUrl($_item) ?&gt;&quot;&gt;&lt;?php echo $this-&gt;htmlEscape($_item-&gt;getName()) ?&gt;&lt;/a&gt;&lt;/p&gt;
            &lt;/li&gt;
        &lt;?php endforeach; ?&gt;
</pre>
<p>Kommen wir zu unserer letzten Aufgabe. Wir müssen nun dafür sorgen, dass Magento unsere "sidebar.phtml" läd anstatt dem Original. Dazu bringen wir jetzt die Layout Dateien ins Spiel, diese finden sich im Ordner "app/design/frontend/default/[Euer Theme]/layout/".</p>
<p>Die Layoutdateien sind ebenso wie die Konfigurationsdateien in XML geschrieben. Mit Ihnen wird der komplette aufbau des Shops gesteuert. In Teil 1 dieses Posts haben wir bereits unsere "layout update" Datei definiert, nun legen die "comparesidebarimages.xml" im layout Ordner an und füllen Sie mit folgendem Inhalt:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;layout version=&quot;0.1.0&quot;&gt;
	&lt;default&gt;
		&lt;reference name=&quot;catalog.compare.sidebar&quot;&gt;
			&lt;action method=&quot;setTemplate&quot;&gt;
				&lt;template&gt;comparesidebarimages/sidebar.phtml&lt;/template&gt;
			&lt;/action&gt;
		&lt;/reference&gt;
	&lt;/default&gt;
&lt;/layout&gt;
</pre>
<p>Da die Syntax der Layoutdateien sehr viele Befehle umfasst und nicht immer ganz leicht zu verstehen ist, möchte ich an dieser Stelle nicht wei<a href="../wp-content/uploads/2010/08/layout-top.png" rel="lightbox[16]"><img class="alignright" title="Compare Sidebar mit Produktbild" src="../wp-content/uploads/2010/08/layout-top.png" alt="" width="195" height="262" /></a>ter darauf eingehen und die Layout Dateien lieber in einem separaten Beitrag behandeln. Für den Moment ist es nur wichtig zu verstehen, dass wir mit diesem Code das Original durch unsere "sidebar.phtml" ersetzen.</p>
<p>So, das wars! Nun können wir unser Plugin testen. Wir wählen einen Artikel aus und fügen diesen der Compare Sidebar hinzu. Wenn alles Stimmt wird das Ergebnis ähnlich dem sein, dass ihr im rechten Bild seht.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.schrottcode.de/magento-plugins-entwickeln/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

