Linstenansicht / Kategorieansicht / Listings um die Eigenschaften erweitern

Hallo zusammen,

bin im Forum noch nicht auf eine Antwort gestossen, deswegen hier mein Problem:

In den Listings werden leider keine Daten zu den Eigenschaften der einzlnen Artikeln mit in das “sArticles” Array gespeichert.

Ich möchte die Listenansicht zu einer Kategorie mit den Daten einer Eigenschaft erweitern. Entsprechend den bei dem Artikel gespeicherten Werten sollen dann in der Listenansicht Icons mit in der Box zu dem Produktbild ausgegeben werden.

Das ganze sollte natürlich Updatesicher sein. Ich hatte schon versucht den Einstieg über ein Event ‘Shopware_Modules_Articles_sGetArticlesByCategory_Start’ bzw. ‘Shopware_Modules_Articles_sGetArticlesByCategory_FilterResult’, aber ich komme dort nicht an die Daten (mangels Wissen zur Shopware Programmierung). Ich habe auch etwas von Hooks gelesen. Wie kann ich die Daten erweitern und zurückgeben um dann im Template darauf zugreifen zu können?

Eine Ausgabe der ‘Enlight_Event_EventArgs’ Variablen bzw. mittels ‘->getSubject()’ läuft leider immer in das php memory_limit.

Hat jemand einen Ansatz für mich?

Vielen Dank.

Ungetestet und abgespeckt, aber das habe ich mal irgendwann so verwendet:

subscribeEvents();
        } catch (Exception $e) {
            return array(
                'success' => false,
                'message' => $e->getMessage()
            );
        }
        
        return true;
    }
    
    private function subscribeEvents()
    {
        $this->subscribeEvent(
            'Shopware_Modules_Articles_sGetArticlesByCategory_FilterResult',
            'onShopware_Modules_Articles_sGetArticlesByCategory_FilterResult'
        );
    }
    
    public function onShopware_Modules_Articles_sGetArticlesByCategory_FilterResult(Enlight_Event_EventArgs $arguments)
    {
        $sArticle = $arguments->getReturn();
        $articleId = $sArticle['articleID'];
        
        $sArticle['attr'] = $this->getArticleAttributes($articleId);
        
        return $sArticle;
    }
    
    private function getArticleAttributes($articleId)
    {
        $attributes = Shopware()->Db()->fetchAll(
            "SELECT * FROM s_articles_attributes WHERE s_articles_attributes.articleID = ?",
            [$articleId]
        );
        
        if ($attributes) {
            return $attributes[0];
        }
        
        return null;
    }
}

Der Weg, wie ich die Artikelattribute abhole, dürfte auch etwas überholt sein. Dafür gibt es mittlerweile mit Sicherheit Objektmethoden. Letztendlich sollte dann aber jeder Artikel im Template eine weitere Eigenschaft attr mit allen Attributen haben.

Hi Supermonster,

vielen Dank für deine Antwort. Konnte mit deinem Quellcode eine entsprechende Adaption für die Listenansicht mit mehreren Artikeln vornehmen.

Es gibt auch eine Methode zur Ermittlung der Eigenschaften / Properties: “Shopware()->Modules()->Articles()->sGetArticleProperties($articleID);”

	public function appendFilterValues(Enlight_Event_EventArgs $args)
	{
		$categoryID = $args->getId();
		
		// Kategorie 164 steht fuer die Praemierten Weine
		// fuer diese sollen die ausgewaehlten Speiseempfehlungen ermittelt werden
		if($categoryID == 164) {
			$returnVals = $args->getReturn();
		
			foreach($returnVals["sArticles"] as $key => $value) {
				$returnVals["sArticles"][$key]['sProperties'] = Shopware()->Modules()->Articles()->sGetArticleProperties($value['articleID']);
			}
		}
		return $returnVals;
	}

 

1 Like

Ah, perfekt. Muss ich das nächste Mal nicht danach suchen!

Nur zur Info, ich hatte das Thema auch mal gelöst und angegangen und hatte dabei den Listing Service dekoriert von Shopware. 

Ist eine andere Möglochkeit an die Artikeleigenschaften.

Ergebnis ist dasselbe, steht dann nachher alles im Atteribut kschmidExtendListing drin.

Ein Beispielaufruf kann hier eingesehen werden. 

https://forum.shopware.com/discussion/37027/option-einer-eigenschaft-bei-einem-artikel-im-kategorie-listing#latest

Liebe Grüße

Kevin

1 Like