Kategorieattribute in den Einkaufswelten

Wie bekommt man die Katagorieattribute in die Templates der Einkaufswelten?

In der Templatedatei widgets/emotion/index.tpl benötige ich die Kategorieattribute (Tabelle s_categories_attributes). (eigentlich nur attribut 5). Offensichtlich stehen sie in den Einkaufswelten aber zunächst aber nicht zur Verfügung. Und ich schaffe es auch nicht per Plugin. Wie kann ich sie dem Template zur Verfügung stellen?
Liebe Grüße

Kerstin

Du kannst dich in PostDispatch der Einkaufswelten einschreiben (Enlight_Controller_Action_PostDispatchSecure_Widgets_Emotion).

Und dann die Kategoriattribute holen (z.B. in $categoryAttributes).

Am Ende dann folgendes probieren um die Variable in das widget zu bringen:

if (empty($emotions[0]['template'])) {
			$view->loadTemplate('widgets/emotion/index.tpl');
		} else {
			$view->loadTemplate('widgets/emotion/' . $emotions[0]['template']['file']);
		}

		$view->assign('myCategoryAttributes', $categoryAttributes, true);

 

subscribeEvent(
            'Enlight_Controller_Action_PostDispatchSecure_Widgets_Emotion',
            'onPostDispatchFrontend'
        );
    }
	
    public function onPostDispatchFrontend(Enlight_Event_EventArgs $arguments)
    {
		$view = $arguments->getSubject()->View();
		$emotions = $view->getAssign('emotions');	 

		if (empty($emotions[0]['template'])) {
			$view->loadTemplate('widgets/emotion/index.tpl');
		} else {
			$view->loadTemplate('widgets/emotion/' . $emotions[0]['template']['file']);
		}
		$categoryAttributes = "TEST";
		$view->assign('tt_myCategoryAttributes', $categoryAttributes, true);
			  
    }
    
    public function install()
    {
        try
        {
            $this->installSubscribeEvents(); // Event-Registrierung
            return array(
                'success' => true,
                'invalidateCache' => array( "frontend", "backend", "config" ) 
                 // Bewirkt im Plugin-Manager Abfrage, ob cache geleert werden soll
            );
        }
        catch ( Exception $e )
        {
           return array(
                'success' => false,
                'message' => $e->getMessage()
            );
        }        
    }
}

Danke. Ich habe es mal probiert, aber es will nicht so recht klappen. Hier die Bootstrap.php. Was könnte denn falsch sein?

(Es wird erstmal der Wert TEST übergeben, der kommt aber nicht an).

Es gibt auch kein $emotions[0][‚Template‘].

So, der Informationsfluss vom Plugin zum Template funktioniert jetzt.

Allerdings kennt die mit “Enlight_Controller_Action_PostDispatchSecure_Widgets_Emotion” aufgerufene Funktion “onPostDispatchFrontend” die Kategorie scheinbar auch nicht, so dass ich die Kategorieattribute nicht übergeben kann :frowning:

Gibt es da eine Möglichkeit?

Liebe Grüße

Kerstin

Tja das ist nicht so einfach anscheinend.

Wenn du eine Einkaufswelt nur für eine einzige Kategorie benutzt, dann ist das noch ok. In $view->sEmotions ist eine Liste aller Kategorien die der Einkaufswelt zugeordnet werden. Wenn dir das nicht reicht musst du dich da „reinverkopfen“.

In engine/Shopware/Controllers/Widgets/Emotion.php steht in der indexAction noch ein

 $this->View()->assign('categoryId', (int)$this->Request()->getParam('categoryId'));

eigentlich müsste man also durch $view->categoryId auch auf die KategorieId zugreifen können. Geht aber wohl nicht die Variable ist (bei mir auf jeden Fall leer). Habe mal im Theme probiert die Variable im Controller-Aufruf hinzuzufügen so dass sie auch im Request zur Verfügung steht. Hat aber beim ersten Versuch nicht funktioniert…

Vielen Dank. Bei mir ist categoryId auch leer bzw. immer 0.

In $view->sEmotions ist eine Liste aller Kategorien die der Einkaufswelt zugeordnet werden.

Mir würde zur Not auch die Liste reichen. Wie kann man denn dieses array erhalten? sEmotions[???]

Viele Grüße

Kerstin

Na mach doch einfach ein

echo ' Emotions:';
print_r($view->sEmotions);
echo '';
die('');

nachdem du dir die View geholt hast (Deine $view Variable) und lade das Listing im Frontend. (Vorsicht mit dem Parameter ?p=1 welcher die Einkaufswelten nicht anzeigt.)

Da hier mehrere Einkaufswelten pro Listing erscheinen können ist sEmotions ein array welches alle Einkaufswelten beinhaltet. Da musst du dir noch die richtige raussuchen. Müsste dann aber eigentlich in ‘categories’ sein. Also z.B. für die erste Einkaufswelt:

$categories = $view->sEmotions[0]['categories'];
$category = $categories[0];
$categoryId = $category['id']

Da sind die Attribute jedoch nicht dabei. Die müsstest du dir separat über die id nachladen - per Datenbankabfrage oder besser Doctrine - oder vorher schon eingreifen und sie dort mit verfügbar machen.

Nochmal zur Erinnerung: Dieser Weg ist sehr eingeschränkt in der Nutzbarkeit und funktioniert nur, wenn jede Einkaufswelt auch nur einer Kategorie zugeordnet ist.

1 „Gefällt mir“

Ganz vielen Dank für die Mühe!! 

Nochmal zur Erinnerung: Dieser Weg ist sehr eingeschränkt in der Nutzbarkeit und funktioniert nur, wenn jede Einkaufswelt auch nur einer Kategorie zugeordnet ist.

Ich würde ja auch lieber die richtige Kategorie-ID haben, aber die scheint ja nicht ohne weiteres verfügbar zu sein :frowning: Ich habe auch keine Idee mehr wie ich das machen sollte. In dem speziellen Fall ist es aber ok. Ganz konkret steuere ich mit attribute5, dass die Einkaufswelt keinen Rand haben soll. Für rezise muss dann die baseWidth verändert werden. Und wenn eine Einkaufswelt so angelegt ist, dann in allen Kategorien.

Mir ist nicht ganz klar, wofür eigentlich sEmotions steht. Ist ja ein array, aber es scheint nur sEmotions[0] zu geben ? Sind das alle Einkaufswelten der Kategorie ?

Werde das jetzt mal testen und mich noch einmal melden.Liebe Grüße

Kerstin