Produkt mit Standardkategorie

Es beschwerden sich immer mehr Leute, dass in der Produkt Detailseite manchmal keine Kategorie zugeordnet ist.
Das passiert, weil Magento zu einem Produkt mehrere Kategorien haben kann und es manchmal nicht möglich ist, die richtige
Kategorie zum Produkt zu identifizieren.
Diese Problematik könnte unter verschiedenen Situationen passieren, wie z.B.

- Besucher kommt über Suchmaschine
- Cros-sell/Up-sell Produkte
- Featured Produkte (Startseite etc.)

Manchmal sind jedoch Kategorien zugewiesen, obwohl eine Situation wie oben beschrieben passiert ist, wie kann das sein?
Magento merkt sich in der Session die zuletzt besuchte Kategorie zu einem Produkt, wenn nichts gefunden werden kann, wird auf
diese Kategorie zurück gegriffen.
Wenn man also ein Produkt über die Kategorieliste (wo die Verbindung bestand) besucht hatte und später das gleiche Produkt über die
Cros-sell (wo keine Verbindung besteht) Liste besucht, würde eine Verbindung zur Kategorie noch existieren.

Wir versuchen jetzt mit einem kleinen Workaround dieses Problem zu umgehen. Wir werden ein kleines Modul schreiben und uns an der Stelle
reinhängen, wo Magento die Verbindung zwischen Kategorie und Produkt setzt.

Als erstes brauchen wir ein eigenes Modul, wir nehmen jetzt als Beispiel unser Standardmodul: Eigenes Magento Modul schreiben.
Wir definieren eine Model-Ebene zu unserem Modul, um unsere gewünschten Aktionen auszuführen. Im Modulordner legen wir einen “Model” Ordner an und
im “Model” Ordner einen “Catalog” Ordner. In diesen Ordner erstellen wir eine “Observer.php” Datei.
Die Dateistruktur sollte danach so aussehen:

app/code/local/ModCode/NeuesModul/Model/Catalog/Observer.php

Für diejenigen, die sich ein wenig mit Magento oder Design Patterns auskennen, wir der Begriff Event/Observer kein Fremdbegriff sein. Magento hat
dazu eine tolle Möglichkeit geschaffen, ohne die Core-Klassen zu überschreiben, Erweiterungen und Aktionen auszuführen in bestimmten Situationen.
Wir definieren nun in unserem Modul einen Observer für das Event “catalog_controller_product_init”.
Dazu öffnen wir die Datei

app/code/local/ModCode/NeuesModul/etc/config.xml

und ändern den Inhalt:

<?xml version="1.0"?>

<config>
    <modules>
        <ModCode_NeuesModul>
            <version>1.0.0.0</version>
        </ModCode_NeuesModul>
    </modules>
	<global>
		<models>
            <neuesModul>
                <class>ModCode_NeuesModul_Model</class>
            </neuesModul>
		</models>
	</global>
	<frontend>
		<events>
			<catalog_controller_product_init>
				<observers>
					<default_category>
						<type>singleton</type>
						<class>ModCode_NeuesModul_Model_Catalog_Observer</class>
						<method>initDefaultCategory</method>
					</default_category>
				</observers>
			</catalog_controller_product_init>
		</events>
	</frontend>
</config>

Mit diesen Änderungen haben wir jetzt definiert, wo unsere Models sich befinden und mit welcher Klasse/Methode wir auf das Event “catalog_controller_product_init”
reagieren werden.
Wir öffnen nun die Datei

app/code/local/ModCode/NeuesModul/Model/Catalog/Observer.php

und fügen folgenden Inhalt ein:

<?php


class Modcode_NeuesModul_Model_Catalog_Observer extends Mage_Core_Block_Abstract
{
	public function initDefaultCategory($observer)
	{
		$currentCategory = Mage::registry('current_category');
		
		if(!$currentCategory)
		{
			// aktuelles Produkt
			$product = $observer->getProduct();
			
			// alle Kategorie ID's zu dem Produkt
			$categoryIds = $product->getCategoryIds();
			
			// An der Stelle kann jeder selbst entscheiden, welche ID als "default" genommen werden soll
			$maxId = max($categoryIds);
			
			// Kategorie laden, damit alle Daten zur Verfügung stehen
			$currentCategory = Mage::getSingleton('catalog/category')->load($maxId);
			
			// Als jetzige Kategorie registrieren
			Mage::register('current_category', $currentCategory);
		}
	}
}

Wenn an der Stelle, keine registry “current_category” existiert, dann konnte Magento keinerlei Verbindung zwischen Produkt und Kategorie schaffen.
Wir haben jetzt alle Kategorien zu dem Produkt ausgelesen und die letzte Kategorie (von der ID her) als Standard übernommen.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


zwei × = 4

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>