Artikeldetails im Listing bekommen

Guten Tag,

ich versuche mich gerade an der Plugin-Programmierung in Shopware. Ist eigentlich nur was relativ kleines, aber ich komme nicht weiter.

Ich möchte gerne alle verfügbaren Varianten eines Artikels als String in der Kategorieübersicht/im Listing anzeigen. Dazu habe ich mir ein kleines Plugin geschrieben, welches ins Listing eingreifen und mir die Varianten liefern soll, da diese standardmäßig nicht in der Artikel-Variable enthalten sind.

Leider erhalte ich aber nicht das gewünschte Ergebnis und ich denke es liegt daran, dass ich zum falschen Event subscribe.

ich habe in meiner install()-Funktion folgendes:

$this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing',
            'onPostDispatchListing'

Wenn ich nun in meiner onPostDispatchListing-Funktion versuche, das Ergebnis zu bekommen, bekomme ich gar nichts.

Mit $article = $args->getReturn(); funktioniert es nicht und mit $article = $args->get(‚subject‘); bekomme ich folgende Fehlermeldung:

Fatal error : Cannot use object of type Shopware_Proxies_ShopwareControllersFrontendListingProxy as array in /engine/Shopware/Plugins/Local/Frontend/SpsListingVariants/Bootstrap.php on line 30
503 Service Unavailable

Ich denke mal, dass ich in diesem Event die Artikel gar nicht bekomme. Kann mir jemand von euch sagen, welches Event das Richtige ist, um die einzelnen Artikel zu bekommen und da die Varianten-Infos einzuspeisen?

Ich danke euch!

Hallo,

mit get subject nehmen Sie das Listing Controller nicht die Artikels.

normaleweise mache ich wieso:

        /**@var $controller */
		$controller = $arguments->getSubject();
 
		/**
		 * @var $request Zend_Controller_Request_Http
		 */
		$request = $controller->Request();
 
		/**
		 * @var $response Zend_Controller_Response_Http
		 */
		$response = $controller->Response();
		

		/**
		 * @var $view Enlight_View_Default
		 */
		$view = $controller->View();

mit diese Code haben Sie alles wichtige Varieble.

dann Können Sie einfach die sArticles varieble nehmen:

$sArticles= $view->getAssign('sArticles');

/*
 machen Sie was Sie möchten

*/

$view->assign('sArticles', $sArticles);

Viele Grüße,

Ahmad.

1 „Gefällt mir“

Vielen Dank für die schnelle Antwort!

Jetzt bekomme ich schonmal keinen Fehler mehr, leider aber auch nicht das gewünschte Ergebnis…

Das hier ist meine Bootstrap.php:

subscribeEvent(
            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing',
            'onPostDispatchListing'
        );

        $this->createConfig();

        return true;
    }

    public function onPostDispatchListing(Enlight_Event_EventArgs $args)
    {
        $controller = $args->getSubject();

        $request = $controller->Request();

        $response = $controller->Response();

        $view = $controller->View();

        $view->addTemplateDir(
            __DIR__. '/Views'
        );

        $sArticles = $view->getAssign('sArticles');

        foreach ($sArticles as $article) {
            $configgroup = $this->getArticleConfigurator($article['articleID']);
            $article['sArticleConfig'] = $configgroup;
        }

        $view->assign('sArticles', $sArticles);
    }

    private function getArticleConfigurator($articleID)
    {
        $sql = "SELECT DISTINCT acg.id, 
								acg.name as group_name, 
								acg.description, 
								aco.name
				FROM s_articles_details ad
				LEFT JOIN s_article_configurator_option_relations acor ON ad.id = acor.article_id
				LEFT JOIN s_article_configurator_options aco ON acor.option_id = aco.id
				LEFT JOIN s_article_configurator_groups acg ON aco.group_id = acg.id
				WHERE ad.articleID = ?
				ORDER BY acg.id";

        $variantarticles = Shopware()->Db()->fetchAll($sql, array($articleID));

        if (empty($variantarticles))
            return false;

        foreach ($variantarticles as $vak => $vav){
            $groupkey = $vav['id'];
            $tmparray[$groupkey]['groupname'] = $vav['group_name'];
            $tmparray[$groupkey]['groupdesc'] = $vav['description'];
            $tmparray[$groupkey]['values'][] = $vav['name'];
        }

        return $tmparray;
    }

    private function createConfig()
    {

    }
}

Jetzt müsste ich bei jedem Artikel eine Eigenschaft “sArticleConfig” haben, welche bei Variantenartikeln ein Array mit den Varianten enthält.
Leider taucht dieses neue Array aber nicht auf, wenn ich in meiner box-basic.tpl ein @print_r auf sArticle mache.

Haben Sie da auch noch eine Idee?

änderen Sie diese Line:

foreach ($sArticles as &$article) {

Viele Grüße

1 „Gefällt mir“

Danke dir!! Das funktioniert jetzt super!

Du scheinst dich in dem Bereich wirklich auszukennen, daher frage ich einfach mal: Hast du vielleicht auch noch eine Lösung, wie das auch mit Infinite Scrolling funktioniert? Beim nachladen der nächsten Artikel fehlt diesen Artikeln das Array wieder.

Ich habe als zweites Event jetzt folgendes genommen:

**Enlight\_Controller\_Action\_PostDispatchSecure\_Widgets\_Listing**

Leider wird dort trotzdem kein Array ausgegeben. Wird hier kein Artikel-Array mitgeliefert im Subject oder habe ich was falsch gemacht?

ich weiß nicht genau.

aber proiere mal 

**Enlight\_Controller\_Action\_Widgets\_Listing\_** ajaxListing

 ob nicht funktionert

 Shopware\_Controllers\_Widgets\_Listing::ajaxListingAction::after

Viele Grüße,

Ahmad.