<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>Magento-Blog von Andreas von Studnitz</title>
		<link>http://www.avs-webentwicklung.de/</link>
		<description>In diesem Blog soll mein Wissen zum Thema Magento archiviert und präsentiert werden.</description>
		<language>de</language>
		<image>
			<title>Magento-Blog von Andreas von Studnitz</title>
			<url>http://www.avs-webentwicklung.de/typo3conf/ext/tt_news/ext_icon.gif</url>
			<link>http://www.avs-webentwicklung.de/</link>
			<width>18</width>
			<height>16</height>
			<description>In diesem Blog soll mein Wissen zum Thema Magento archiviert und präsentiert werden.</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Tue, 03 Apr 2012 16:58:00 +0200</lastBuildDate>
		
		
		<item>
			<title>Magento-Module deaktivieren - the right way</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-module-deaktivieren-the-right-way.html</link>
			<description>Das Deaktivieren von nicht benötigten Magento-Kern-Modulen spart Ressourcen und beschleunigt das...</description>
			<content:encoded><![CDATA[<h3>Wie man Module nicht deaktiviert</h3>
<b>1. System -&gt; Konfiguration -&gt; Erweitert -&gt; Modulausgaben deaktivieren<br /></b>Wie der Name schon sagt: hierüber werden keine Module deaktiviert, sondern nur Modulausgaben. Sprich, die Layoutanpassungen greifen nicht mehr, aber das Modul bleibt aktiv. Observer und Rewrites funktionieren z.B. weiterhin.
<b>2. Bearbeitung bzw. Löschen der XML-Dateien unter app/etc/modules/<br /></b>Im Prinzip ist dieser Weg richtig: die zu einem Modul gehörige Datei kann gelöscht werden. Alternativ kann der Wert &quot;active&quot; auf &quot;false&quot; gestellt werden.<br />Aber: diese Methode übersteht das nächste Update nicht, sofern es sich um Kerndateien handelt.
<b>3. Einsatz eines Moduls zum Deaktivieren von Modulen<br /></b>Siehe 2. Das Modul macht üblicherweise nichts anderes, als die XML-Dateien zu modifizieren. Auch diese Änderungen sind nach dem nächsten Update weg.
<h3>Wie man Module deaktiviert</h3>
Man kann sich das Fakt zunutze machen, dass alle XML-Dateien in app/etc/modules/ eingelesen werden. Intern werden Sie zu einer großen XML-Struktur zusammengefügt. Dabei überschreiben später geladene Dateien die Informationen aus früher geladenen. Die Reihenfolge ist wie folgt:
1. Mage_All.xml<br />2. Mage_*.xml<br />3. *.xml (alphabetisch)
Wenn die eigene Datei jetzt zuletzt geladen wird, überschreibt sie alle vorherigen Definitionen.<br />Leider gibt es im Magento-Core Module wie Phoenix_Moneybookers, die häufig nicht benötigt werden und (auch aus Sicherheitsgründen) deaktiviert werden sollten, aber nicht dem Namespace &quot;Mage&quot; zugeordnet sind. Um auch solche Fälle abzudecken, sollte die eigene Datei möglichst weit hinten im Alphabet stehen, um zuletzt geladen zu werden. Als Dateiname bietet sich dabei z.B. ZZZ_MageDeactivator.xml an. 
Im Folgenden ein Extrembeispiel einer solchen Datei, welche Module deaktiviert werden können, so dass das System dennoch läuft (hier für die Enterprise Edition, kann aber problemlos auch in der Community Edition benutzt werden):
<pre>&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />&lt;config&gt;<br />&nbsp;&nbsp;&nbsp; &lt;modules&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Newsletter&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Newsletter&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Usa&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Usa&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_PaypalUk&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_PaypalUk&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_GoogleCheckout&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_GoogleCheckout&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Poll&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Poll&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Tag&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Tag&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_ProductAlert&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_ProductAlert&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Bundle&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Bundle&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Authorizenet&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Authorizenet&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Centinel&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Centinel&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Compiler&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Compiler&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Downloadable&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Downloadable&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_LoadTest&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_LoadTest&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_Ogone&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_Ogone&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Mage_XmlConnect&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Mage_XmlConnect&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Phoenix_Moneybookers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Phoenix_Moneybookers&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_AdminGws&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_AdminGws&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Banner&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Banner&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_CatalogEvent&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_CatalogEvent&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_CatalogPermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_CatalogPermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Checkout&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Checkout&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_CustomerBalance&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_CustomerBalance&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_GiftCard&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_GiftCard&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_GiftCardAccount&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_GiftCardAccount&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_GiftRegistry&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_GiftRegistry&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Invitation&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Invitation&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Pbridge&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Pbridge&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_PricePermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_PricePermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_PromotionPermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_PromotionPermissions&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Reminder&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Reminder&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Reward&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Reward&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_Staging&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_Staging&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Enterprise_WebsiteRestriction&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;false&lt;/active&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Enterprise_WebsiteRestriction&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/modules&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&lt;/config&gt;</pre>
Natürlich sollte der Inhalt der Datei immer an die eigenen Anforderungen angepasst werden.]]></content:encoded>
			
			
			<pubDate>Tue, 03 Apr 2012 16:58:00 +0200</pubDate>
			<enclosure url="http://www.avs-webentwicklung.de/uploads/media/ZZZ_MageDeactivator.xml" length ="3006" type="application/xml" />
		</item>
		
		<item>
			<title>Magento: German Setup - die Alternative zu Market Ready Germany u.a.</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-german-setup-die-alternative-zu-market-ready-germany-ua.html</link>
			<description>German Setup ist ein Magento-Modul, das Magento-Shops für den Deutschen Markt vorbereitet....</description>
			<content:encoded><![CDATA[German Setup wurde vom <b>Team FireGento</b> entwickelt und ist frei zum Download verfügbar:
<ul><li><link http://www.magentocommerce.com/magento-connect/german-setup-6623.html _blank external-link-new-window "Opens external link in new window">German Setup bei MagentoConnect</link></li><li><link https://github.com/firegento/firegento-germansetup _blank external-link-new-window "Opens external link in new window">German Setup bei github</link></li></ul>
Das Modul beherrscht die Grundeinstellung z.B. der Steuern, und der Email-Templates und verschiedene kleine Ergänzungen.
<h3>Wer oder was ist FireGento?</h3>
<img style="padding-top: 10px; padding-bottom: 10px; padding-left: 10px; float: right;" src="fileadmin/images/FireGento.png" height="128" width="150" alt="" />FireGento ist ein Zusammenschluss mehrerer Firmen und freier Entwickler mit dem Ziel, kostenfreie Module für Magento zu entwickeln. Aktuell sind dies neben German Setup hauptsächlich das Modul namens FireGento (beschrieben im <link http://www.webguys.de/magento/turchen-09-magento-debuggen-mit-firegento/ _blank external-link-new-window "Opens external link in new window">WebGuys Adventskalender</link>) und das <link https://github.com/firegento/firegento-customer _blank external-link-new-window "Opens external link in new window">Customer-Modul</link> zum Deaktivieren von Kunden und Beschränken der Login-Versuche.
Das Kernteam zur Entwicklung der derzeitigen Version von German Setup bestand aus:
<ul><li>Ingo Hillebrand, code-x / WebGuys</li><li>Steffen Meuser, Flagbit</li><li>Gerrit Pechmann, aijko</li><li>Rouven Rieker, ITABS</li><li>Michael Türk, Flagbit</li><li>Andreas von Studnitz, Freelancer.</li></ul>
Der Kick-Off zur Modulentwicklung fand auf dem FooCamp, organisiert von Damian Luszczymak, im November 2011 statt. 
<h3>Zielsetzung</h3>
Das Ziel bei der Entwicklung von German Setup für Magento war, eine Alternative zu derzeitigen Lösungen wie <link http://www.magentocommerce.com/magento-connect/market-ready-germany.html _blank external-link-new-window "Opens external link in new window">Market Ready Germany</link> und <link http://www.magentocommerce.com/magento-connect/german-shop-3384.html _blank external-link-new-window "Opens external link in new window">German Shop</link> zu schaffen. Die Funktionalitäten sind ähnlich:
<ul><li>Voreinstellungen für Steuern etc. für Deutsche Shops<img style="padding-bottom: 10px; padding-left: 10px; float: right; padding-top: 10px;" src="fileadmin/images/ScreenShot733.png" height="88" width="214" alt="" /></li><li>Vorkonfigurierte Seitenelemente wie Impressum, AGB, Versandkosten etc. mit Links im Shop-Footer</li><li>Anpassung der Preisdarstellung (&quot;inkl. x% MwSt. zzgl. Versandkosten&quot;), hier mithilfe eines Templates</li><li>Angepasste Email-Templates</li><li>Aktivierung und Konfiguration von Bestellbedingungen (AGB, Widerruf)</li><li>Automatische Generierung von Meta-Daten</li></ul>
Dazu kommt:
<ul><li>Steuerklassen für den Versand in die ganze EU (und damit weltweit, da für Versand außerhalb üblicherweise keine Steuer berechnet wird)</li><li>Eine Liste von uns empfohlener freier Module zur Ergänzung der integrierten Funktion</li><li>Kompatibilität zu Magento CE 1.4 bis 1.6.2 (sowie 1.7 alpha) ohne Anpassungen, wahrscheinlich auch zur Enterprise Edition (noch nicht getestet)</li><li>Installierbar auch zu einem späteren Zeitpunkt</li></ul>
<h3>Was German Setup nicht macht</h3>
German Setup verzichtet auf einige Funktionalität und v.a. auch auf einige Unarten der Konkurrenten. Dadurch ist es deutlich schlanker und stabiler. Es lässt sich außerdem problemlos deinstallieren. Folgendes macht German Setup nicht:
<ul><li>German Setup ist keine Modulsammlung, sondern ein einziges Modul</li><li>Es enthält keine Zahlungsmodule oder sonstigen Module von Drittanbietern</li><li>German Setup bietet keine Vorzertifizierung für Trusted Shops. Eine Zertifizierung, wenn gewünscht, muss individuell erfolgen - einige Bedingungen zur Zertifizierung werden von German Setup allerdings erfüllt</li><li>Keine Rewrites oder Klassen in app/code/local, die Core-Klassen überlagern</li><li>German Setup überschreibt vorhandene Daten nicht automatisch, sondern nur auf Wunsch.</li></ul>
<h3>Im Detail</h3>
Nach der Installation von German Setup (Cache leeren nicht vergessen) macht einen eine Meldung im Kopfbereich des Magento-Backends auf die nächsten Schritte aufmerksam.
<img src="fileadmin/images/ScreenShot730.png" height="67" width="400" alt="" />
&nbsp;Bei Klick auf den Link erreicht man das Formular zur Einrichtung der einzelnen Punkte. Dies findet man auch im Menü über System -&gt; German Setup -&gt; Setup.
<img src="fileadmin/images/ScreenShot731.png" height="87" width="200" alt="" />

Das Formular sieht anschließend wie folgt aus:
<link fileadmin/images/ScreenShot732.png 950x400 download "Initiates file download"><img src="fileadmin/images/ScreenShot732_400.png" height="160" width="400" alt="" /></link>
Hier lassen sich, einzeln oder gesammelt, die folgenden Einstellungen treffen:
<ul><li>Erstellen von CMS-Seiten und statischen Blöcken für Versandkosten, Impressum, AGB etc.</li><li>Einrichten von Bestellbedingungen (bedingt o.g. statische Blöcke)</li><li>Erstellen von Standard-Email-Templates (Bearbeitung anschließend unter System -&gt; Transaktions-Emails)</li><li>Steuereinstellungen einrichten</li><li>In diesem Zusammenhang: Anpassung von bestehenden Steuerklassen. Hiermit kann man jeweils alle Produkte einer alten Steuerklasse einer neuen Steuerklasse zuweisen.</li></ul>

]]></content:encoded>
			
			
			<pubDate>Mon, 13 Feb 2012 21:29:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Verbergen anderer Versandarten bei Versandkostenfreiheit - the right way</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-verbergen-anderer-versandarten-bei-versandkostenfreiheit-the-right-way.html</link>
			<description>In Magento kann Versandkostenfreiheit ab x Euro eingestellt werden. Hierfür gibt es eine eigene...</description>
			<content:encoded><![CDATA[Im Magento-Standard geht dies leider nicht. Im Internet kursieren einige Lösungen dazu, die häufig nur das Template anpassen, in anderen Fälle Blöcke oder Models &quot;rewriten&quot;. All diese Lösungen sind qualitativ nicht hochwertig, da es bei Rewrites Konflikte geben kann (und erfahrungsgemäß auch immer wieder gibt) und im Template höchstens die Ausgabe entfernt wird, und nicht an der Quelle in den Prozess eingegriffen wird. Dazu kommt, dass Templates häufig auch von Themes überschrieben werden.
Mit Erfahrung und manchmal etwas Suchen lässt sich für sehr viele Anforderungen eine Lösung ohne Rewrites finden, so auch hier, wenn auch diese nicht offensichtlich ist.&nbsp;
Der Ansatz ist, die Collection <b>Mage_Sales_Model_Resource_Quote_Address_Rate_Collection</b> zu überwachen. Hierfür wird das Event <b>core_collection_abstract_load_after</b> überwacht, das nach dem Laden beliebiger Collections anschlägt. Folgender Code muss also in die config.xml eines eigenen Moduls:
<pre>&lt;frontend&gt;<br />    ...<br />    &lt;events&gt;<br />        &lt;core_collection_abstract_load_after&gt;<br />            &lt;observers&gt;<br />                &lt;mymodule_collection_load_after&gt;<br />                    &lt;type&gt;singleton&lt;/type&gt;<br />                    &lt;class&gt;mymodule/observer&lt;/class&gt;<br />                    &lt;method&gt;afterLoadCollection&lt;/method&gt;<br />                &lt;/mymodule_collection_load_after&gt;<br />            &lt;/observers&gt;<br />        &lt;/core_collection_abstract_load_after&gt;<br />    &lt;/events&gt;<br />&lt;/frontend&gt;</pre>
Die Methode <b>afterLoadCollection</b> in der genannten Klasse (z.B. unter app/code/local/MyCompany/MyModule/Model/Observer.php) sieht dann wie folgt aus:
<pre>/**<br />&nbsp;* If Freeshipping method is allowed, disallow all other shipping methods<br />&nbsp;*<br />&nbsp;* @param Varien_Event_Observer $observer<br />&nbsp;* @return void<br />&nbsp;*/<br />public function afterLoadCollection($observer)<br />{<br />&nbsp;&nbsp;&nbsp; $collection = $observer-&gt;getCollection();<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; if (!$collection instanceof Mage_Sales_Model_Resource_Quote_Address_Rate_Collection) return;<br /><br />&nbsp;&nbsp;&nbsp; if (!$this-&gt;_isFreeshippingIncluded($collection)) return;<br /><br />&nbsp;&nbsp;&nbsp; $shippingAddress = Mage::getSingleton('checkout/session')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;getQuote()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;getShippingAddress();<br /><br />&nbsp;&nbsp;&nbsp; $shippingAddress-&gt;setLimitCarrier('freeshipping');<br />}<br /><br />/** <br />&nbsp;* Checks if freeshipping method is included in collection fo available shipping methods<br />&nbsp;* <br />&nbsp;* @param Mage_Sales_Model_Resource_Quote_Address_Rate_Collection $rateCollection<br />&nbsp;* @return boolean <br />&nbsp;*/<br />protected function _isFreeshippingIncluded($rateCollection)<br />{<br />&nbsp;&nbsp;&nbsp; foreach ($rateCollection as $rate) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** @var $rate Mage_Sales_Model_Quote_Address_Rate */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($rate-&gt;getMethod() == 'freeshipping') {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return false;<br />}</pre>
Es werden also nur Collections vom Typ <b>Mage_Sales_Model_Resource_Quote_Address_Rate_Collection</b> überwacht. Anschließend wird überprüft, ob die Methode &quot;freeshipping&quot; enthalten ist. Nur wenn dies der Fall ist, wird auf die Versandadresse die Methode <b>setLimitCarrier </b>angewendet, die die verfügbaren Versandarten einschränkt.
]]></content:encoded>
			
			
			<pubDate>Mon, 06 Feb 2012 20:44:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Import von Kategorieverknüpfungen zu Produkten</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-import-von-produkten-in-kategorien.html</link>
			<description>Über die ImportExport-Schnittstelle lassen sich schnell viele Produkte importieren. Häufig sollen...</description>
			<content:encoded><![CDATA[Im <link http://www.webguys.de/magento/turchen-19-produktimport-mit-der-importexport-schnittstelle/ _blank external-link-new-window "Opens external link in new window">Webguys-Adventskalender</link> habe ich bereits beschrieben, wie Kategoriezuordnungen importiert werden: über das Feld <b>_category</b>.
Dieses Feld akzeptiert den Namen der Kategorie, wobei die Namen der übergeordneten Kategorien ebenfalls vorne angehängt werden. In den Beispieldaten wird eine Kategorie z.B. wie folgt repräsentiert:
Electronics/Cameras/Digital Cameras
Ein Problem gibt es jetzt, wenn es in einem Shop zwei Websites (oder Stores) gibt mit getrennten Root-Kategorien. Ist darin jetzt die gleiche Struktur abgebildet (es reicht, wenn es in beiden Shops auf oberster Ebene jeweils eine Kategorie &quot;Neuheiten&quot; oder &quot;Angebote&quot; gibt), haben beide Kategorien den gleichen Pfad. Magento kann daher nicht mehr eindeutig unterscheiden, welcher gemeint ist, das Produkt kann der falschen Website zugeordnet werden. In einem Kundenprojekt ist genau dies jetzt geschehen, was der Anlass für eine genauere Analyse war.
Es gibt zwei Lösungsansätze für dieses Problem:
<ol><li>Es wird noch der <b>Name der Basiskategorie</b> vorne angehängt, also z.B. &quot;Root Catalog/Electronics/Cameras/Digital Cameras&quot;</li><li>Man verwendet die <b>Kategorie-ID</b></li></ol>
Für beide Lösungsansätze werden Erweiterungen des ImportExport-Moduls nötig. In der Klasse <b>Mage_ImportExport_Model_Import_Entity_Product</b> muss dafür die Methode <b>_initCategories()</b> wie folgt überschrieben werden:
<pre>/**<br /> * Initialize categories text-path to ID hash.<br /> *<br /> * @return Mage_ImportExport_Model_Import_Entity_Product<br /> */<br />protected function _initCategories()<br />{<br />    $collection = Mage::getResourceModel('catalog/category_collection')-&gt;addNameToResult();<br />    /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */<br />    foreach ($collection as $category) {<br />        $structure = explode('/', $category-&gt;getPath());<br />        $pathSize  = count($structure);<br />        if ($pathSize &gt; 2) {<br />            $path = array();<br />            $this-&gt;_categories[implode('/', $path)] = $category-&gt;getId();<br />            for ($i = 2; $i &lt; $pathSize; $i++) {<br />                $path[] = $collection-&gt;getItemById($structure[$i])-&gt;getName();<br />            }<br />        <br />            // additional options for category referencing: name starting from base category, or category id<br />            $this-&gt;_categories[implode('/', $path)] = $category-&gt;getId();<br />            array_shift($path);<br />            $this-&gt;_categories[implode('/', $path)] = $category-&gt;getId();<br />            $this-&gt;_categories[$category-&gt;getId()] = $category-&gt;getId();<br />        }<br />    }<br />    return $this;<br />}       </pre>
Die bestehende Funktionalität wird hierbei nicht überschrieben, das heißt, es werden lediglich weitere Möglichkeiten der Angabe von Kategorien hinzugefügt. 
Achtung: selbstverständlich wird hierfür nicht die Core-Klasse überschrieben! Es sollte ein Rewrite der Klasse in einem eigenen Modul erfolgen.
In meinem Modul <link http://www.avs-webentwicklung.de/nc/blog/artikel/magento-import-mit-der-neuen-schnellen-import-schnittstelle-fuer-produkte-und-kunden.html _blank external-link-new-window "Opens external link in new window">FastSimpleImport</link>, das ich bereits in meinem Blog beschrieben habe, habe ich diese Funktionalität bereits eingebaut. Es befindet sich mittlerweile auf GitHub (<link https://github.com/avstudnitz/AvS_FastSimpleImport _blank external-link-new-window "Opens external link in new window">FastSimpleImport bei GitHub</link>), ich freue mich auch über Beiträge anderer Entwickler dazu und bin offen für Erweiterungsvorschläge.]]></content:encoded>
			
			
			<pubDate>Thu, 02 Feb 2012 15:18:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Verbesserte Benachrichtigungen im Admin-Bereich</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-verbesserte-benachrichtigungen-im-admin-bereich.html</link>
			<description>Ein kostenloses Modul zum schnelleren Entfernen von Admin-Benachrichtigungen. Siehe Screenshots!</description>
			<content:encoded><![CDATA[Nach dem Login im Admin-Bereich begrüßt einen häufig erstmal ein Fenster mit neuen Meldungen zu Updates oder ähnlichem. Mich hat schon immer geärgert, dass man anschließend viermal klicken muss, um alle aufgelaufenen Benachrichtigungen als gelesen zu markieren oder zu löschen. Gerade wenn man mit mehreren Entwicklungsinstanzen von Magento arbeitet, kann das nervig werden, meiner Erfahrung nach aber ignoireren auch viele Shopbetreiber die Meldungen und klicken Sie einfach weg, ohne sie zu entfernen oder als gelesen zu markieren.
<br />Zur Vereinfachung der Handbhabung habe ich ein kleines Modul geschrieben. Es fügt Links zum Entfernen oder als Gelesen Markieren in das Popup-Fenster und in die obere Zeile mit den Benachrichtigungen ein. Das sieht dann wie folgt aus:
<img src="fileadmin/images/adminnotificationadvanced_1.png" width="443" height="96" alt="" />
<img src="uploads/RTEmagicC_adminnotificationadvanced_2_01.png.png" width="300" height="115" alt="" />

Das Modul ist kostenlos und kann <link fileadmin/modules/AvS_AdminNotificationAdvanced-0.1.0.tgz - download "Initiates file download">hier heruntergeladen</link> werden. Es funktioniert ab Version 1.4 bis 1.6.1 einschließlich und wahrscheinlich auch auf der Professional und Enterprise Edition.]]></content:encoded>
			
			
			<pubDate>Tue, 15 Nov 2011 17:07:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Import mit der neuen, schnellen Import-Schnittstelle für Produkte und Kunden</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-import-mit-der-neuen-schnellen-import-schnittstelle-fuer-produkte-und-kunden.html</link>
			<description>Die seit Magento CE 1.5 verfügbare neue Importfunktion beschleunigt den Import von Produkten und...</description>
			<content:encoded><![CDATA[Seit der Magento-Version 1.5 (Community Edition) bzw. 1.10 (Enterprise und Professional Edition) gibt es ein neues Schnittstellen-Modul namens ImportExport. Dieses importiert und exportiert Produkte und Kundendaten. Während der alte Import kaum über eine Geschwindigkeit von wenigen Produkten pro Sekunde hinaus kommt, sind mit dem neuen Modul auch mehrere hundert Produkte pro Sekunde machbar (siehe z.B. der <link http://romanzenner.com/blog/magento-1-5-import/ _blank external-link-new-window "Opens external link in new window">Beitrag von Roman Zenner</link>). 
Über die Admin-Oberfläche sind die Funktionen zum Import und Export über System -&gt; Import/Export zugänglich und relativ intuitiv bedienbar. Für einen regelmäßigen Import sollte die Schnittstelle jedoch über ein Modul bedienbar sein. 
In seinen Vorträgen bei der <link http://netzarbeiter.com/media/MagentoImagine/ImportExport.pdf _blank external-link-new-window "Opens external link in new window">Magento Imagine 2011</link> und bei <link http://www.meet-magento.de/rueckblick/meet-magento-5/programm/vinai-kopp-programm-meet-magento-511.html _blank external-link-new-window "Opens external link in new window">Meet Magento #5.11</link> hat <link http://netzarbeiter.de/ _blank external-link-new-window "Opens external link in new window">Vinai Kopp</link> sehr ausführlich die Verwendung des Moduls mit eigenen Import-Adaptern präsentiert. Wer sich näher mit der Technik beschäftigen möchte, sollte sich auf jeden Fall das <link http://www.meet-magento.de/rueckblick/meet-magento-5/mitschnitte-businessforum.html _blank external-link-new-window "Opens external link in new window">Video des Vortrags in Leipzig</link> (drittletzter Vortrag auf der Seite) ansehen. 
Das ImportExport-Modul hat im Standard-Funktionsumfang jedoch einen großen Nachteil: es erwartet eine Datei zum Import. Möchte man stattdessen Inhalte aus einer Datenbank, einem Webservice oder einer anderen Schnittstelle verwenden, muss ein alternativer Source-Adapter implementiert werden. 
Leider ist das nicht so einfach wie gewünscht, da sich die entsprechende Basis-Klasse nicht einfach wie gewünscht ableiten lässt, dank der &quot;schönen&quot; folgenden Klassendeklaration:
<pre>abstract class Mage_ImportExport_Model_Import_Adapter_Abstract <br />    implements SeekableIterator <br />{ <br />    <b>final </b>public function __construct($source)<br />    {...}<br />    ... <br />}</pre>
Diese Klasse ist die Basis für eigene Source-Adapter, die definieren, wo die Daten herkommen und in welcher Form sie vorliegen. An anderer Stelle wird ein Objekt der Klasse Mage_ImportExport_Model_Import_Adapter_Abstract als Source-Adapter erwartet.
Es sind also weitere Änderungen notwendig. Damit nicht jeder Entwickler sich in die Materie einarbeiten muss, habe ich ein kleines Modul entwickelt, das sich&nbsp;<link https://github.com/avstudnitz/AvS_FastSimpleImport _blank - "Initiates file download">bei Github herunterladen</link> lässt. Es beruht darauf, dass die Daten als Array vorliegen - in ein Array kann man eigentlich immer beliebige Daten konvertieren.
Das Modul lässt sich in einem eigenen Modul beispielsweise wie folgt nutzen, nachdem mein Modul installiert wurde:
<pre>$data = array(<br />    array(<br />        'sku' =&gt; '1234567',<br />        '_type' =&gt; 'simple',<br />        '_attribute_set' =&gt; 'Default',<br />        '_product_websites' =&gt; 'base',<br />        'name' =&gt; 'Default',<br />        'price' =&gt; 0.99,<br />        'description' =&gt; 'Default',<br />        'short_description' =&gt; 'Default',<br />        'weight' =&gt; 0,<br />        'status' =&gt; 1,<br />        'visibility' =&gt; 4,<br />        'tax_class_id' =&gt; 2,<br />        'qty' =&gt; 76,<br />    ),<br />);<br />Mage::getSingleton('fastsimpleimport/import')<br />    -&gt;processProductImport($data); </pre>
Die einzelnen Elemente des übergebenen Arrays repräsentieren dabei jeweils ein Produkt bzw. eine Ausprägung eines Produktes. Werden mehrere Elemente im äußeren Array übergeben, werden mehrere Produkte bzw. Ausprägungen eines Produktes angelegt bzw. angepasst.
Im Beispiel sind alle Pflichtfelder angegeben. Weitere mögliche Felder sind z.B. alle Attributcodes. Es ist aber auch möglich, z.B. Inhalte für bestimmte StoreViews, Varienten von konfigurierbaren Produkte oder Staffelpreise anzugeben, hierfür werden jeweils weitere Zeilen pro Produkt verwendet. Wichtig ist hierbei, dass der Array-Index 'sku' existiert, er muss aber keinen Wert beinhalten.
Die möglichen Varianten kann man leicht herausfinden, indem man ein Produkt wie gewünscht im Magento-Backend anlegt und anschließend exportiert. Den Aufbau der resultierenden CSV-Datei kann man in das zu importierende Array 1:1 übernehmen.

Der Import von Kundendaten läuft analog. Der nötige Befehl lautet
<pre>Mage::getSingleton('fastsimpleimport/import')<br />    -&gt;processCustomerImport($data);</pre>
Der Hauptschlüssel ist das Feld &quot;email&quot; statt &quot;sku&quot;. Weitere notwendige Felder lassen sich durch ausprobieren herausfinden (das Modul wirft eine entsprechende Exception) oder durch die Analyse einer Export-Datei.

<b><link https://github.com/avstudnitz/AvS_FastSimpleImport _blank external-link-new-window "Opens external link in new window">Download bei GitHub</link></b>]]></content:encoded>
			
			
			<pubDate>Mon, 19 Sep 2011 21:52:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Fehler beim Index-Aufbau - Sofortmaßnahmen</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/magento-fehler-beim-index-aufbau-sofortmassnahmen.html</link>
			<description>Indizes sorgen in Magento öfter für Ärger - speziell wenn der Neuaufbau mit einem undefinierten...</description>
			<content:encoded><![CDATA[Die Indizes beschleunigen Magento deutlich - leider sorgen sie auch öfter für Probleme.&nbsp;
<img src="fileadmin/images/indexfehler.png" height="38" width="400" alt="" />
Eine vernünftige Fehlermeldung, mit der man auf Fehlersuche gehen könnte, gibt es im Administrationsbereich leider nicht. Es gibt aber dennoch eine Möglichkeit, eine Fehlermeldung zu erhalten: über die Shell bzw. Konsole, sofern man darauf Zugriff hat. Das Indexer-Skript befindet sich im Verzeichnis /shell/ direkt unterhalb des Magento-Hauptverzeichnis und wird, je nach Serverkonfiguration, wie folgt aufgerufen:
<pre>php indexer.php</pre>
Den Status der Indizes erhält man über:
<pre>php indexer.php --status</pre>
Der Indizierungsprozess wird angestoßen über den Aufruf
<pre>php indexer.php --reindex</pre>
Soll nur ein Index angestoßen werden, kann man als Parameter noch den Code des Index angeben, z.B.
<pre>php indexer.php --reindex catalog_category_product</pre>
Den passenden Code erhält man über die Datenbanktabelle &quot;index_process&quot;.
Eine Fehlermeldung wird hierbei ausgegeben, mit der man auf Fehlersuche gehen kann.

Häufig liegt das Problem in inkosistenten Daten in der Datenbank. Aktuelles Beispiel: der folgende Fehler mit dem Index &quot;Kategorie Artikel&quot;.
<i>SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`catalog_category_product_index`, CONSTRAINT `FK_CATALOG_CATEGORY_PROD_IDX_CATEGORY_ENTITY` FOREIGN KEY (`category_id`) REFERENCES `catalog_category_entity` (`entity_id`)</i>
Der Fehler sagt aus, dass eine so genannte Constraint, eine zwingende Beziehung zwischen den Daten zweier Datenbanktabellen, verletzt ist. In diesem Fall ist es eine Kategorie-Id in der Verknüpfungstabelle <i>catalog_category_product</i>, für die keine passende Kategorie in der Tabelle <i>catalog_category_entity</i> mehr existiert. Hier hilft folgende SQL-Abfrage, die in der Shell oder z.B. in phpMyAdmin eingegeben werden kann:
<pre>SELECT cp.category_id<br />FROM catalog_category_product cp<br />LEFT JOIN catalog_category_entity c ON cp.category_id = c.entity_id<br />WHERE ISNULL( c.entity_id )</pre>
Ergebnis dieser Abfrage sind die IDs der fehlenden Kategorien. Die zugehörigen Datensätze in catalog_category_product können bedenkenlos gelöscht werden.
Analog funktioniert das auch, falls nicht Kategorien, sondern Produkte nicht (mehr) vorhanden sind:
<pre>SELECT cp.product_id<br />FROM `catalog_category_product` cp<br />LEFT JOIN catalog_product_entity p ON cp.product_id = p.entity_id<br />WHERE ISNULL( p.entity_id )</pre>
Anschließend lässt sich der Index üblicherweise problemlos wieder aufbauen.

Vielen Dank auch an <link http://icyapp.de/ _blank - "Opens external link in new window">Damian Luszczymak</link>, der den Anstoß hierzu gegeben hat.]]></content:encoded>
			
			
			<pubDate>Wed, 24 Aug 2011 16:37:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Magento: Versandkosten im Warenkorb anzeigen</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/versandkosten-im-warenkorb-anzeigen.html</link>
			<description>Zur Anzeige der Versandkosten im Warenkorb gibt es ein einfaches Magento-Modul.</description>
			<content:encoded><![CDATA[Wer hat sich nicht schon darüber geärgert, dass die Versandkosten in Magento erst angezeigt werden, wenn der Bestellprozess bereits weit fortgeschritten ist? 
Magento berechnet die zur Verfügung stehenden Versandarten und die zugehörigen Versandkosten auf Basis der Lieferadresse. So hat ein Kunde in Deutschland üblicherweise andere Konditionen als einer in den USA. 
Viele deutsche  Shops vertreiben ihre Produkte allerdings ausschließlich oder größtenteils nach Deutschland. So wäre es doch eine feine Sache, wenn die Versandkosten bereits im Warenkorb angezeigt würden - für (fast) alle Kunden sind sie sowieso gleich und beruhen nur auf den Artikeln im Warenkorb. Hierfür gibt es ein Magento-Modul, das genau das macht:
<b>PRWD_AutoShipping</b> (Details und Download unter <link http://www.magentocommerce.com/magento-connect/Rob+Knight/extension/1384/prwd-auto-shipping _blank external-link-new-window>http://www.magentocommerce.com/magento-connect/Rob+Knight/extension/1384/prwd-auto-shipping</link>).
Es wählt automatisch die erste (und damit günstigste) verfügbare Versandart für das eingestellte Land aus, solang noch keine Versandadresse eingetragen ist.
Zur Inbetriebnahme muss es in der Konfiguration unter Verkäufe =&gt; Auto Shipping aktiviert werden, und man muss das Standard-Land angeben, für das die Versandkostenberechnung durchgeführt werden soll.
<img clickenlarge="1" src="fileadmin/images/prwd_autoshipping.png" width="400" height="104" alt="" />
Auch wenn bei den Kompatibilitätsangaben &quot;1.3&quot; angegeben ist, funktioniert das Modul einwandfrei unter Magento CE&nbsp;1.5 und EE 1.10.
]]></content:encoded>
			
			
			<pubDate>Mon, 20 Jun 2011 15:44:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Details zu Magento 2</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/details-zu-magento-2.html</link>
			<description>Auf dem Magento Developers Paradise Anfang Juni 2011 auf Ibiza wurden erste Details zur kommenden...</description>
			<content:encoded><![CDATA[Magento 2 wird momentan als Nachfolger von Magento entwickelt. Es handelt sich um ein sehr umfangreiches Refactoring von Magento, wird einige Strukturen und angeblich alle Funktionalitäten übernehmen, wird aber nicht kompatibel zu Magento 1 sein.
Die Veröffentlichung von Magento 2 ist momentan für <b>Mitte bis Ende 2012</b> geplant.
Folgende Ziele wurden genannt:
<ul><li>Klare Prozesse und Transparenz</li><li>Verbesserte Produktqualität</li><li>Verbesserte Performance und Skalierbarkeit</li><li>Verbesserte Sicherheit</li><li>Verringerte Lernkurve (Zitat Yoav Kutner: nicht mehr 6 Monate, sondern 3 Monate)</li></ul>
<h3>Verwendete Basistechnologien</h3>
<ul><li><b>PHP ab Version 5.3</b></li><li><b>Zend Framework in der Version 1.x</b>. (Die aktuell in der Entwicklung befindliche Version 2 wird aufgrund der Erfahrungen zum jetzigen Stand nicht eingesetzt, da sie noch nicht stabil genug ist. Es gab bei der Entwicklung von Magento 1 größere Probleme mit der unfertigen Version von ZF 1.0. Möglicherweise wird zu einem späteren Zeitpunkt aber die Entscheidung für einen Umstieg getroffen.)</li><li><b>JQuery</b> als Javascript-Bibliothek</li><li>Unterstützung verschiedener relationaler Datenbanken. Zum jetzigen Stand sind dies <b>MySQL, MSSQL und Oracle</b>. Es ist gut möglich, dass auch <b>Postgre </b>dazu kommt.</li></ul>
<h3>Entwicklungsmethoden</h3>
Die internen Entwicklungsmethoden ändern sich gegenüber Magento 1 deutlich. Dies dürfte sich in einer höheren Softwarequalität niederschlagen.
Im Einzelnen sind dies:
<ul><li><b>Scrum</b></li><li><b>Automatisiertes Testen</b> (Unit Tests mit PHPUnit, Integration Tests z.B. für die verschiedenen Datenbank-Setups, Funktionale Tests mit Selenium, Performance-Tests mit JMeter). Aktuell gibt es bereits 2.000 Unit Tests, die in 2,5 Minuten durchlaufen werden können.</li><li><b>Continuous Integration</b></li><li>Verwendung der Software-Entwicklungs-Tools von <b>Atlassian</b>:</li></ul>
<img src="fileadmin/images/mdp11/atlassian.png" width="400" height="296" alt="" />
<ul><li>Öffentliches <b>Code Repository</b></li></ul>
Vor der Veröffentlichung von neuem Code müssen zunächst einige Akzeptanzkriterien erfüllt werden:
<ul><li>Interne und externe <b>Dokumentation</b></li><li>Existenz von <b>Tests</b></li><li>Durchführung eines <b>Code Review</b>s</li></ul>
Als <b>Ziele </b>der Entwicklung wurden genannt:
<ul><li>Transparenz</li><li>Modularität</li><li>Qualität</li><li>Performance</li><li>WEB Api</li><li>Dokumentation</li></ul>
Momentan besteht das Entwicklungsteam aus 6 Personen. Es ist damit zu rechnen, dass es in Zukunft noch weiter aufgestockt werden wird.
<h3>Geänderte Modulstruktur</h3>
Magento 2 wird auch wieder in Form von Modulen aufgebaut sein. Hierbei wird auf die <b>Code Pools</b> (local, community, core) voraussichtlich verzichtet werden, sodass sich <b>alle Module in einem Verzeichnis</b> befinden werden. Dies hat hauptsächlich Performance-Gründe, sodass z.B. auf die Compiler-Funktion von Magento verzichtet werden kann.
Auch wird die <b>Verzeichnisstruktur </b>auf oberster Ebene schlanker gemacht (aktueller Stand):
<img src="fileadmin/images/mdp11/directory_structure.png" width="400" height="288" alt="" />
Für den Webserver freigegeben werden muss in Zukunft nur noch das Verzeichnis &quot;pub&quot;. 
Module werden in Zukunft wie folgt aufgebaut sein:
<img src="fileadmin/images/mdp11/directory_structure_2.png" width="400" height="244" alt="" />
An der Basisstruktur ändert sich wenig, bemerkenswert ist allerdings der Ordner &quot;<b>view</b>&quot;. Er enthält alle Template-Dateien, die zu einem Modul gehören. Auch die <b>Skin-Dateien</b> werden sich in Zukunft im Modulverzeichnis befinden und bei Bedarf automatisch in den Ordner &quot;pub&quot; kopiert. Das Modul ist damit eine weitere, letzte, Fallback-Ebene für Template und Skin. Damit werden in Zukunft ausnahmslos <b>alle Moduldateien in einem Ordner</b> zu finden sind, was in vielen Punkten eine große Erleichterung sein wird.
Für Themes wird es in Zukunft ein umfangreicheres <b>Fallback-System</b> geben, das selbst definiert werden kann. So sind mehr als die aktuell möglichen drei Ebenen verfügbar.
<h3><b>Modulentwicklung</b></h3>
Im Bereich Modulentwicklung wird sich ebenfalls einiges tun.
<ul><li>Die <b>Konfiguration </b>wird verschlankt. So müssen Models oder Blocks z.B. nicht mehr definiert werden. Auch besteht die Überlegung, auf die Definition von Event-Observern per XML zu verzichten und stattdessen die Zuordnung rein anhand von passenden Methoden-Namen vorzunehmen.</li></ul>
<img src="fileadmin/images/mdp11/config_changes.png" width="400" height="220" alt="" />
<ul><li>Ob das <b>EAV-Modell</b> weiterhin eingesetzt wird, ist noch nicht endgültig geklärt. Nach aktuellem Stand soll die Funktionalität optional sein und je nach Wünschen des Betreibers bzw. Betreuers aktiviert oder deaktiviert werden können.</li><li>Die Module sollen unabhängiger voneinander werden, sodass man z.B. das Wishlist-Modul oder das Checkout-Modul einfacher deaktivieren oder ersetzen kann (&quot;<b>Loose Coupling</b>&quot;)</li><li>Das Framework soll alle <b>Sicherheitslücken </b>der OWASP-Top-10-Liste verhindern.</li></ul>
<h3>Design</h3>
Das Erstellen eines Templates soll in Zukunft einfacher möglich sein. So wird es einen <b>GUI-Design-Editor</b> geben. Dieser soll ermöglichen:
<ul><li>Verwaltung von Seitentypen</li><li>Verwaltung von Seitenlayouts</li><li>Positionsierung von Blocks</li><li>Anpassung des Look&amp;Feel</li></ul>
Auch sonstige Erweiterungen sind im Gespräch. Nähere Informationen hierzu wird es wohl erst in Zukunft geben.
<h3>Sonstiges</h3>
<ul><li>Auch wenn es keine Rückwärtskompatibilität zu Magento 1 geben wird, ist doch ein &quot;<b>Migration Path</b>&quot; angekündigt, der die Migration erleichtern soll.</li><li>Auch Magento 2 wird voraussichtlich als <b>OpenSource</b>-Projekt veröffentlicht werden. Laut Yoav Kutner ist hierzu wohl noch keine finale Entscheidung gefallen, aber er sieht keinen Grund, der dagegen sprechen würde.</li><li>Es soll eine Funktion zum vollständigen Aktivieren und Deaktivieren von Modulen geben</li><li>Die Web-API wird ausgebaut. So sollen neben SOAP und XML-RPC in Zukunft auch <b>JSON-RPC</b> und <b>REST</b> unterstützt werden.</li><li><b>Übersetzungen </b>werden in Zukunft sprachabhängig möglich sein. Auch können unterschiedliche Übersetzungen für Frontend und Backend angegeben werden.</li><li>Magento 2 wird &quot;fast alle&quot; Features von Magento 1.x haben.</li><li>Aktuell ist die Performance der Entwicklungsversion von Magento 2 bereits 20% höher als die der aktuellen Version von Magento 1.x.</li></ul>
<h3></h3>
<h3>Meine Meinung</h3>
In meinen Augen macht Magento Inc. einen guten Schritt nach vorn mit der Entwicklung von Magento 2. Inhaltlich sollen viele interessante Ideen&nbsp;umgesetzt werden, und einige Probleme mit der alten Version sollen ausgemerzt werden. Wirklich schlechte Ideen sind mir nicht aufgefallen (auch wenn ich als Entwickler einem GUI-Design-Editor eher skeptisch gegenüber stehe).
Strategisch ist die Entwicklung von Magento 2 ein wichtiger Schritt in die Zukunft, da sich der 1.x-Zweig sicherlich irgendwann totlaufen wird und an der einen oder anderen technischen Schwierigkeit krankt, was z.B. die Performance angeht. Meiner Meinung nach ist die Entwicklung von Magento 2 ein klares Indiz dafür, dass Magento auch nach der Übernahme durch Ebay bei seiner Linie bleibt und eine starke eigenständige Software mit Magento 2 bestehen bleiben wird.
Da Magento Inc. die selbst gesetzten Zeitpläne bisher immer einigermaßen gehalten hat (mit Ausnahme von Aussagen wie &quot;2009 wird das Jahr der Dokumentation&quot;), bin ich auch diesmal optimistisch, dass wir bis Ende nächsten Jahres eine neue, stabile Magento-Version in Händen halten werden.

Alle Informationen beruhen auf den Vorträgen von Yoav Kutner und Dmitriy Soroka vom <b>Magento Developers Paradise</b> auf Ibiza (05.-07.06.2011).
<h3></h3>]]></content:encoded>
			
			
			<pubDate>Thu, 16 Jun 2011 08:54:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Warnung bei überschriebenen Konfigurations-Optionen: kostenloses Magento-Modul</title>
			<link>http://www.avs-webentwicklung.de/nc/blog/artikel/warnung-bei-ueberschriebenen-konfigurations-optionen-kostenloses-magento-modul.html</link>
			<description>Ab sofort sieht man auf den ersten Blick, wenn eine Konfigurationseinstellung auf einer niedrigeren...</description>
			<content:encoded><![CDATA[Diese niedrigeren Ebenen können untergeordnete Websites oder StoreViews sein. Ist dort ein Wert geändert, sieht man das normalerweise nicht.
Nach Installation der Extension wird ein kleines Ausrufezeichen neben entsprechenden Konfigurationsoptionen dargestellt:
<link fileadmin/modules/AvS_ScopeHint.png 900x500 download><img src="uploads/RTEmagicC_AvS_ScopeHint.png.png" width="407" height="222" alt="" /></link>
In Kürze wird das Modul auch auf MagentoConnect verfügbar sein. Es läuft unter Magento 1.4.x aufwärts, auf 1.3.x ist es noch nicht getestet.
Aktuell kann das Modul über den unten stehenden Link heruntergeladen werden. Zum Installieren verwendet man ab Magento 1.5. den Download-Manager von Magento, alternativ kann das Archiv entpackt und über die Magento-Installation gelegt werden, die Verzeichnisstruktur ist korrekt.
Gern nehme ich Verbesserungsvorschläge zu dem Modul entgegen.

Download:
Magento-Modul <link fileadmin/modules/AvS_ScopeHint-0.1.0.tgz - download>AvS_ScopeHint 0.1.0</link> (tgz-Archiv)]]></content:encoded>
			
			
			<pubDate>Mon, 23 May 2011 20:43:00 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>
