$sArticles - um weiteren Wert aus Datenbank erweitern und im Frontend nutzen - SQL Select

Hallo Martin,

danke für deine Rückmeldung.

Heißt also, dass dieser Code prinzipiell funktionieren sollte (eingebettet in ein Plugin und mit der entsprechden Hook Registrierung und ohne diesen dummen Rechtschreibfehler). Hatte schon befürchtet, dass man sonst noch etwas dafür schreiben muss, was in der Doku verschwiegen wird. 

VG DST

Moin,

ich bin jetzt soweit, dass mein After Hook auf sGetArticleById fuktioniert und ich auf der Detailseite die Supplier Meta Description ausgeben kann:

  1. in der install()

    /* add after Hook to get article supplier meta data */
    $this->subscribeEvent(
    ‚sArticles::sGetArticleById::after‘,
    ‚afterGetArticleById‘
    );

  2. afterGetArticleById()

    public function afterGetArticleById(Enlight_Hook_HookArgs $arguments)
    {
    $articleId = $arguments->getId();

         /**
          * @return SupplierMetaDescription as $fields
          */
         function getSupplierMetaDescription($sqlArticleId) 
         {
            $sql= "SELECT meta_description FROM s_articles_supplier WHERE articleID = $sqlArticleId";
            $fields = Shopware()->Db()->fetchOne($sql);
          
            return $fields;
         }
      
         $sqlFields = getSupplierMetaDescription($articleId);
      
         $articleData = $arguments->getReturn();
      
         $articleData['supplier_meta_description'] = $sqlFields;
      
         $arguments->setReturn($articleData);
    
     }
    
  3. Wie kann ich nun im Listing für jeden Artikel die Meta in sArticles hinterlegen? Dort wird nämlich kein Eintrag gemacht. (am Plugin Event liegt es nicht)

Was steht denn in $fields?

Hab das jetzt nicht getestet aber ich tippe du brauchst hier ein fetchRow statt einem fetchOne.

Tipp für schnelles Frontend-Debuggen:

echo 'Ausgabe:';
print_r($fields);
echo '';
die('');

 

1 „Gefällt mir“

Hi steinsoftware,

Ich verwende bisher fetchOne um nur einen Wert zubekommen, welcher der ID eindeutig zugeordnet ist. Sprich: auf der Details-Seite bekomme ich so die Hersteller-Meta zu eben jenem Artikel. Verwende ich fetchRow bekomme ich ein array mit der Zuordnung ID -> Meta Description, was ich an der Stelle aber nicht benötige, da ich ja den Wert direkt schin im After-Hook dem richtigen Artikel zuordnen kann… 

Das bringt mich zum eigentlichen Problem: Wie ordne ich nun die richtigen Meta Descriptions dem richtigen Artikel in der sArticles zu. Und ist

$articleId = $arguments->getId();

im Listing ein array mit allen aufkommenden Artikeln auf der Seite? inkl. lazyload?

Brauche ich dazu eine Schleife und iteriere durch die verschiedenen IDs?

Hm…

 

Könnte es sein, dass das mit afterGetArticleById()  im Listing gar nicht funktionieren kann, da die Funktion ja nur die ID eines Artikels zurück gibt?

 

Hallo,

ich möchte nun sGetArticlesByCategory() für die Erweiterung von sArticles verwenden und spiele gerade ein wenig damit herum:

 public function afterGetArticlesByCategory(Enlight_Hook_HookArgs $arguments)
    {
         
        $result = $arguments->getReturn();

        foreach ($result['sArticles'] as $article){ 
          
            $result['sArticles'][$article['articleID']]['bar'] = 'foo';
 
        }
          
        $arguments->setReturn($result);

    }

gibt mir das aus:

 

Allerdings will ich natürlich den neuen Key „bar“ wie alle anderen Werte eines Artikels im Artikel untergeordnet stehen haben. Ich habe verschiedenes ausprobiert, komme aber auch keinen grünen Zweig. Was mache ich falsch?

Wenn ich das hinbekomme, habe ich alles um meine Artikel im Listing um die Hersteller Meta Beschreibung zu erweitern.

Kann mir jemand helfen?

 

Du musst das Original-Array referenzieren.

Genau das ist mein Problem… bekomme es nicht hin. Tipp?

Ungetestet:

$result = $arguments->getReturn();

        foreach ($result['sArticles'] as &$article){ 
          
            $article['bar'] = 'foo';
 
        }
          
        $arguments->setReturn($result);

 

1 „Gefällt mir“

Ich werde es testen :wink:

Hallo,

ich habe so schon einmal wie folgt umgesetzt. Aus der Erinnerung, ohne den Quellcode vor mir zu haben. Anstatt eines Hooks, habe ich das PostDispatchEvent auf das Listing genommen. Dort habe ich mir aus dem view die Variable sArticles geholt. Diese in einer foreach(sArticles as key => sArticle) durchgelaufen und den entsprechenden Wert den ich ändern/hinzufügen wollte geändert. Nach der Schleife, dann diese “neue” sArticles dem View wieder zur Verfügung gestellt. Damit ist dann im Listing in jedem Artikel der zusätzliche Wert vorhanden.

public function install()
 {
 
        $this->subscribeEvent(
            'Enlight_Controller_Action_PostDispatch_Frontend_Listing',
            'onPostDispatchListing'
        );
        return true;
}

public function onPostDispatchListing(Enlight_Event_EventArgs $arguments)
{
        /**@var $controller Shopware_Controllers_Frontend_Listing*/
        $controller = $arguments->getSubject();
 
       

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

    ($sArticles as $key => $sArticle){

        
        $sArticles[$key][$id]['foo']= $bar;

    }
  

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

 

 Beste Grüße

Jens

 

Hallo,

ich habe das ganze mittlerweile zum Laufen gebracht :wink:

Dein Ansatz @jsdevelopment‍ unterscheides sich von meinem ein bisschen.

Ich habe ein Event

Enlight_Controller_Action_PostDispatch

für das Plugin. Dazu habe ich in der install noch einen After Hook auf sGetArticleById, um in der Artikeldetailsseite den neuen Wert zur Verfügung zu stellen und einen weiteren After Hook auf sGetArticlesByCategory um im Listing den neuen Wert zur Verfügung zustellen.

Passt das so? Oder ist das grundlegend falsch?

@dst schrieb:

Hallo,

ich habe das ganze mittlerweile zum Laufen gebracht :wink:

Dein Ansatz @jsdevelopment‍ unterscheides sich von meinem ein bisschen.

Ich habe ein Event

Enlight_Controller_Action_PostDispatch

für das Plugin. Dazu habe ich in der install noch einen After Hook auf sGetArticleById, um in der Artikeldetailsseite den neuen Wert zur Verfügung zu stellen und einen weiteren After Hook auf sGetArticlesByCategory um im Listing den neuen Wert zur Verfügung zustellen.

Passt das so? Oder ist das grundlegend falsch?

Hallo,

woran lag es denn am Ende bzw. kannst du die Lösung evtl. auch veröffentlichen? Oder per PN zusenden?

Beste Grüße

Sebastian

Am Ende lag es an dem & Zeichen an der foreach Schleife, was aus der Zuweisung einen Pointer gemacht hat. Den Code hat steinsoftware ja gepostet

Hallo,

ich muss das Thema hier auch mal aufgreifen. Ich habe bisher mit dem subscribe auf Widgets Listing einen weiteren Wert aus der Datenbank jedem Artikel im Listing zugewiesen. Das hat bis SW 5.3 auch super geklappt, sodass auch bei nachgeladenen Elementen der zusätzliche Wert im Template assigned und im Listing je Artikel genutzt werden konnte.

 

Das hier hat bis 5.3 funktioniert:

$this->subscribeEvent(
    'Enlight_Controller_Action_PostDispatchSecure_Widgets_Listing',
    'addXY'
);

public function addXY(Enlight_Event_EventArgs $arguments)
    {

		$subject = $arguments->getSubject();

        $view = $subject->View();

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

        if(is_array($sArticles)) {
            foreach ($sArticles as &$article) {
                $sqlArticleId = $article['articleID'];
                $sql = "SELECT xy FROM s_articles_details WHERE articleID = $sqlArticleId";
                $fields = Shopware()->Db()->fetchOne($sql);
                $article['xy'] = $fields;
            }
            unset($article);
        }

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

    }

 

Mit der Version 5.3 funktioniert das nun nicht mehr. Ich habe bisher herausgefunden, dass ich auf ein weiteres Event subscriben muss, bzw. auf die Action davon um auch für die nachgeladenen Elemente den neuen Wert zur Verfügung zu stellen. Folgender subscribe Funktioniert für alle nachgeladenen Objekte:

$this->subscribeEvent(
    'Enlight_Controller_Action_Widgets_Listing_listingCount',
    'addXY'
);

Leider komme ich aber nun mit obigem Code nicht mehr an die Elemente. Der zusätzliche Wert wird nicht assigned und ich kann mir auch nicht den view bzw. $sArticles ausgeben lassen. Folgender Code erzeugt einen Fehler in der Console: Uncaught TypeError: Cannot read property ‘trim’ of undefined

public function addXY(Enlight_Event_EventArgs $arguments)
    {

		$subject = $arguments->getSubject();

		$view = $subject->View();

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

		echo 'Ausgabe:';
		print_r($sArticles);
		echo '';
		die('');

	}

 

 

Hat jemand eine Idee oder Rat?

 

 

// Edit: Mir ist auch aufgefallen, dass bei 5.3 keine Template Vars mehr ausgeben werden, nach dem im Infinite Scrolling des Listings die weiteren Artikel geladen wurden:

@mdsw schrieb:

Hallo,

ich muss das Thema hier auch mal aufgreifen. Ich habe bisher mit dem subscribe auf Widgets Listing einen weiteren Wert aus der Datenbank jedem Artikel im Listing zugewiesen. Das hat bis SW 5.3 auch super geklappt, sodass auch bei nachgeladenen Elementen der zusätzliche Wert im Template assigned und im Listing je Artikel genutzt werden konnte.

 

Das hier hat bis 5.3 funktioniert:

$this->subscribeEvent(
‚Enlight_Controller_Action_PostDispatchSecure_Widgets_Listing‘,
‚addXY‘
);

public function addXY(Enlight_Event_EventArgs $arguments)
{

$subject = $arguments->getSubject();

$view = $subject->View();

$sArticles = $view->getAssign(‚sArticles‘);

if(is_array($sArticles)) {
foreach ($sArticles as &$article) {
$sqlArticleId = $article[‚articleID‘];
$sql = „SELECT xy FROM s_articles_details WHERE articleID = $sqlArticleId“;
$fields = Shopware()->Db()->fetchOne($sql);
$article[‚xy‘] = $fields;
}
unset($article);
}

$view->assign(‚sArticles‘, $sArticles);

}

 

Mit der Version 5.3 funktioniert das nun nicht mehr. Ich habe bisher herausgefunden, dass ich auf ein weiteres Event subscriben muss, bzw. auf die Action davon um auch für die nachgeladenen Elemente den neuen Wert zur Verfügung zu stellen. Folgender subscribe Funktioniert für alle nachgeladenen Objekte:

$this->subscribeEvent(
‚Enlight_Controller_Action_Widgets_Listing_listingCount‘,
‚addXY‘
);

Leider komme ich aber nun mit obigem Code nicht mehr an die Elemente. Der zusätzliche Wert wird nicht assigned und ich kann mir auch nicht den view bzw. $sArticles ausgeben lassen. Folgender Code erzeugt einen Fehler in der Console: Uncaught TypeError: Cannot read property ‚trim‘ of undefined

public function addXY(Enlight_Event_EventArgs $arguments)
{

$subject = $arguments->getSubject();

$view = $subject->View();

$sArticles = $view->getAssign(‚sArticles‘);

echo ‚Ausgabe:‘;
print_r($sArticles);
echo ‚‘;
die(‚‘);

}

 

 

Hat jemand eine Idee oder Rat?

 

 

// Edit: Mir ist auch aufgefallen, dass bei 5.3 keine Template Vars mehr ausgeben werden, nach dem im Infinite Scrolling des Listings die weiteren Artikel geladen wurden:

imageimage

 

Generelles Vorgehen: Es gibt ein Event für jeden Controller, getrennt nach Frontend, Backend und Api. Wenn man also die Controller Action nicht weiß, dann macht man den Browser Debugger auf und sieht nach welche Request oder welche XHR das gewünschte Ergebnis liefert. Jeden Shopware Controller findest Du unter engine/Shopware/Controllers.

Ein Event auf eine spezielle Action gibt es nicht, nur auf einen Controller selbst, das kannst Du jedoch in der Methode ganz leicht mit einem if abprüfen:

container = $container;
    }

    final protected function getPath()
    {
        if (empty($this->path)) {
            $paths = explode(DIRECTORY_SEPARATOR, __DIR__ );
            unset($paths[count($paths) - 1]);
            $this->path = implode(DIRECTORY_SEPARATOR, $paths);
        }

        return $this->path;
    }
}


class MySubscriber extends BaseSubscriber
{
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatch_Frontend_Detail' => 'onPostDispatchDetail'
        ];
    }

    /**
     * A function that gives you the controller, view and request object from the EventArgs object
     *
     * Call it using
     * list($controller, $view, $request) = self::getEverythingfromArgs($args);
     *
     * @param \Enlight_Event_EventArgs $args
     * @return array
     */
    protected static function getEverythingFromArgs(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var \Enlight_Controller_Action $controller
         */
        $controller = $args->getSubject();

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

        /**
         * @var $request \Zend_Controller_Request_Http
         */
        $request = $controller->Request();

        return array($controller, $view, $request);
    }

    public function onPostDispatchDetail(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var \Enlight_Controller_Action $controller
         * @var \Enlight_View_Default $view
         * @var $request \Zend_Controller_Request_Http
         */
        list($controller, $view, $request) = self::getEverythingFromArgs($args);

        if (strtolower($request->getActionName()) === 'index') {
            // Action: index
            // [...]
        }
    }
}

 Der Übersicht halber habe ich mal alles in eine Datei gepackt. Geht so natürlich nicht! (PSR-0 und PSR-4!!!). Mein obiges Beispiel setzt außerdem eine services.xml voraus und mindestens Shopware 5.2.

Aber so kannst Du dich auf eine bestimmte Action von einem bestimmten Controller abonnieren. Es gibt natürlich noch andere Eventarten, zum Beispiel Filter- oder Speicherevents.

Und bitte: FAQ – Häufig gestellte Fragen · PHP.de Wissenssammlung

Dass Deine Events nicht mehr ganz so funktionieren, mag daran liegen, dass Shopware nach und nach von der alten Core Klasse sArticles weg geht. Es ist auch gut so, dass nach und nach auf Doctrine, bzw. DBAL umgestellt wird.

Hallo @derwunner‍

schon mal vielen Dank für deine Antwort. 

Den subscribe auf das Event des Nachladens der Artikel bekomme ich hin, auch habe ich das richtige Event meiner Meinung nach mit Enlight_Controller_Action_Widgets_Listing_listingCount gefunden, da die restlichen Teile meines Codes (eine zusätzliche Badge an den Artikeln) nur mit diesem Event / dieser Action auch auf die nachgeladenen Objekte angewendet wird (mit Enlight_Controller_Action_Widgets_Listing geht es nicht mehr ). Der übrige Teil meines Codes, in welchem ich mir sArticles aus dem view hole und mit einem zusätzlichen Wert wieder an den view übergebe funktioniert nicht.

listingCount ist also die Action dabei und bei einer Action kann ich nicht auf den view zugreifen und mir die Artikel holen und den zusätzlichen Wert assignen? Oder verstehe ich dich falsch?

Ich stecke leider nicht tief genug in der Programmierung drin und hatte gedacht, dass es mit leichten Änderungen des obigen Codes gemacht wäre. Dein Vorschlag mit einem zusätzlichen Subscriber kann ich leider nicht auf meine Situation adaptieren. Ich arbeite in erster Linie an Designs mit LESS, jQuery, SMARTY und HTML. Docrtine usw. sind da leider noch eher fremd für mich. Foot-in-Mouth

Bei deinem Vorschlag habe ich leider nicht verstanden, warum und wie ich eigenen eigenen subscriber erstelle…

Also, seit Shopware 5.2 gibt es eine neue Plugin Struktur, die meiner Meinung nach sauberer ist. Ich verwende auch nur noch die. Im Prinzip ist das recht ähnlich, weswegen vermutlich auch noch nicht an vielen Stellen die Dokumentation aktualisiert wurde. Anstatt von extra subscribeEvent aufzurufen, hast Du jetzt eine Methode, die auf einmal alle Events zurück gibt, die Du in Deinem Plugin brauchst.

Die Plugins nach der neuen Struktur liegen unter custom/plugins. Dort trägt jedes Plugin einen Namen. Es ist mehr oder weniger Konvention, dass ein Plugin Namen mit dem Firmen-Namen losgeht und mit dem eigentlichen Namen weitergeht (getrennt durch Großbuchstaben). Also zum Beispiel „Musterfirma“: MusterfirmaFarbvarianten.

Der korrekte Pfad zum Plugin wäre demnach custom/plugins/MusterfirmaFarbvarianten. Der Namespace des Plugins würde auch MusterfirmaFarbvarianten lauten. Anstatt der Bootstrap.php Datei hast Du nun eine MusterfirmaFarbvarianten.php Datei (gleicher Klassenname, gleicher Namespace) im Stammordner des Plugins:

custom/plugins/MusterfirmaFarbvarianten.php:

Die Datei custom/plugins/MusterfirmaFarbvarianten/Resources/services.xml:

Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/BaseSubscriber.php:

container = $container;
    }

    final protected function getPath()
    {
        if (empty($this->path)) {
            $paths = explode(DIRECTORY_SEPARATOR, __DIR__ );
            unset($paths[count($paths) - 1]);
            $this->path = implode(DIRECTORY_SEPARATOR, $paths);
        }

        return $this->path;
    }

    /**
     * A function that gives you the controller, view and request object from the EventArgs object
     *
     * Call it using
     * list($controller, $view, $request) = self::getEverythingfromArgs($args);
     *
     * @param \Enlight_Event_EventArgs $args
     * @return array
     */
    protected static function getEverythingFromArgs(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var \Enlight_Controller_Action $controller
         */
        $controller = $args->getSubject();

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

        /**
         * @var $request \Zend_Controller_Request_Http
         */
        $request = $controller->Request();

        return array($controller, $view, $request);
    }
}

Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/AssetsCompiler.php:

 'onCollectLessFiles',
            'Theme_Compiler_Collect_Plugin_Javascript' => 'onCollectJavaScriptFiles'
        ];
    }

    public function onCollectLessFiles()
    {
        return new LessDefinition(
            [],
            [
                $this->getPath() . '/Resources/Views/frontend/_public/src/less/all.less'
            ]
        );
    }

    public function onCollectJavaScriptFiles()
    {
        $jsFiles = array(
            $this->getPath() . '/Resources/Views/frontend/_public/src/js/main.js',
        );

        return new ArrayCollection($jsFiles);
    }
}

Die Datei custom/plugins/MusterfirmaFarbvarianten/Subscriber/PluginFrontend.php:

 'onPostDispatchDetail'
        ];
    }

    public function onPostDispatchDetail(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var \Enlight_Controller_Action $controller
         * @var \Enlight_View_Default $view
         * @var $request \Zend_Controller_Request_Http
         */
        list($controller, $view, $request) = self::getEverythingFromArgs($args);

        if (strtolower($request->getActionName()) === 'index') {
            // Action: index
            // [...]
        }
    }
}

Du kannst natürlich auch alle Events in die Datei custom/plugins/MusterfirmaFarbvarianten/MusterfirmaFarbvarianten.php packen, aber das wird recht schnell unübersichtlich. Deswegen gibt es die Möglichkeit, diese auszulagern. Und damit Shopware weiß, wo diese Subscriber liegen, gibt es unter Resources/services.xml eine Datei, die das beschreibt. Diese muss auch zwingend in diesem Pfad vorhanden sein, weil Shopware danach sucht. Bei allen anderen Ordnernamen und/-oder Unterordner bist Du frei.

Doctrime ist Objektrelationales Mapping Framework, das heißt Du hast PHP Klassen wie Datenbanktabellen. Weiterhin hat Doctrine eine Abstraktionsschicht geschaffen, die es möglich macht datenbankübergreifenden SQL zu schreiben, oder besser gesagt anhand ähnlich klingender Methoden generieren zu lassen. Das Paket hierzu nennt sich DBAL (Database Abstraction Layer).

Man kann mit Doctrine Datenbankunabhängige Queries schreiben, was die darunter liegende Datenbank austauschbar macht. Leider ist das bei Shopware nicht so. Für Shopware muss es MySQL sein. Außerdem entsprechen auch nicht ganz die gemappten PHP Klassen den entsprechenden Tabellen. Also in den Details, wie zum Beispiel Schlüsselbeziehungen. Das würde jetzt aber zu weit führen und deswegen möchte ich nicht weiter darauf eingehen. Wurde hier auch schon öfters im Forum diskutiert.

 

 

MFG

 

derwunner

1 „Gefällt mir“

Hallo @derwunner‍

die neue Plugin-Struktur habe ich mir schon mal angesehen, sieht an und für sich auch sehr schlüssig aus. Insofern kann ich deinen Code jetzt nachvollziehen mit der service.xml und so weiter - das habe ich jetzt verstanden Thumb-Up Daher schon mal Danke! 

Aktuell arbeite ich noch mit der alten Plugin-Struktur und habe alles in einer Bootstrap.php - das ist jetzt erst mal veraltet, würde ich dann in Step 2 auf die neue Plugin-Struktur gerne umschreiben. Das setzt aber voraus, dass ich anhand der alten Struktur erst mal verstehe, warum mein Event sich nicht so verhält wie ich das wünsche. Ich will mich nach und nach an das Problem rantasten, deswegen gerne anhand der alten Struktur das Problem lösen, bevor ich mir durch die Umstellung neue knifflige Sachen einhandele.

Mein aktuelles Problem ist allerdings nicht der Umstieg auf die neue Plugin-Struktur, sondern das Unverständnis, weshalb ich mit meinem Event _Enlight_Controller_Action_Widgets_Listing _nicht mehr durch folgenden Code an die nachgeladenen Artikel herankomme und denen den Wert aus der Datenbank geben kann: 

public function addXY(Enlight_Event_EventArgs $arguments)
    {

		$subject = $arguments->getSubject();

        $view = $subject->View();

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

        if(is_array($sArticles)) {
            foreach ($sArticles as &$article) {
                $sqlArticleId = $article['articleID'];
                $sql = "SELECT xy FROM s_articles_details WHERE articleID = $sqlArticleId";
                $fields = Shopware()->Db()->fetchOne($sql);
                $article['xy'] = $fields;
            }
            unset($article);
        }

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

    }

 

 

Meine Fragen wären daher, unabhängig von der Plugin-Struktur und am liebsten erst mal an der alten Plugin-Struktur erklärt:

  1. Warum komme ich bei _Enlight_Controller_Action_Widgets_Listing_listingCount _nicht mehr mit 

$subject = $arguments->getSubject();        $view = $subject->View();        $sArticles = $view->getAssign(‘sArticles’); an die Artikel des View()

Warum gibt es in Firebug nur noch einen json-String für die nachgeladenen Artikel im Inifnite-Scrolling statt wie früher eine neue Instanz von sArticles?

Was muss ich an meiner Funktion addXY ändern, damit dieser wieder mit dem Event funktioniert, welches die bei Infinite Scrolling nachgeladenen Elemente betrifft?

 

Hoffe meine Frage wird dadurch etwas deutlicher, sonst einfach nachfragen, wenn was fehlt  Smile

@mdsw schrieb:

 

Meine Fragen wären daher, unabhängig von der Plugin-Struktur und am liebsten erst mal an der alten Plugin-Struktur erklärt:

  1. Warum komme ich bei _Enlight_Controller_Action_Widgets_Listing_listingCount _nicht mehr mit 

$subject = $arguments->getSubject();        $view = $subject->View();        $sArticles = $view->getAssign(‚sArticles‘); an die Artikel des View()

Warum gibt es in Firebug nur noch einen json-String für die nachgeladenen Artikel im Inifnite-Scrolling statt wie früher eine neue Instanz von sArticles?

Was muss ich an meiner Funktion addXY ändern, damit dieser wieder mit dem Event funktioniert, welches die bei Infinite Scrolling nachgeladenen Elemente betrifft?

 

Hoffe meine Frage wird dadurch etwas deutlicher, sonst einfach nachfragen, wenn was fehlt  Smile

  1. Bin ich mir nicht ganz sicher, wie gesagt, kann an der Umstellung liegen. Ich kann Dir jedenfalls die Lösung präsentieren, wie Du das alles in einem Query machst: Für das Listing in Shopware gibt es das SearchBundle. Das ist eine Abstraktionsschicht, mit der die Queries beschrieben werden. Denn die Queries müssen sowohl unter MySQL als auch unter Elasticsearch laufen.

Demnachst musst bei Doctrine eine weitere Condition anhängen. Was nicht ganz sauber und eigentlich nicht der Zweck dafür ist, aber wir simulieren hier quasi eine weitere WHERE Bedingung. Damit bekommen wir das ganze Query Objekt mitgegeben und wir können via ->addSelect weitere Spalten selektieren, die wir wollen:

 'onCreateListingCriteria',
            'Shopware_SearchBundle_Create_Listing_Criteria' => 'onCreateListingCriteria',
            'Shopware_SearchBundleDBAL_Collect_Condition_Handlers' => 'registerListingConditionHandler',
        ];
    }

    public function onCreateListingCriteria(\Enlight_Event_EventArgs $args)
    {
        /**
         * @var Shopware\Bundle\SearchBundle\Criteria $criteria
         */
        $criteria = $args->get('criteria');

        $customCondition = new CustomListingCondition();

        $criteria->addCondition($customCondition);
    }

    public function registerListingConditionHandler(\Enlight_Event_EventArgs $args)
    {
        return new CustomListingHandler();
    }
}



addSelect('spalte');
// var_dump($query->getSQL());die('test');
    }
}

Wenn Du sehen willst, was hinten raus für ein Query heraus kommt, dann kommentiere einfache meine Zeile mit dem die wieder ein. Bei mir sah der so aus:

SELECT FROM s_articles product INNER JOIN s_articles_details variant ON variant.id = product.main_detail_id
                 AND variant.active = 1
                 AND product.active = 1
INNER JOIN s_core_tax tax ON tax.id = product.taxID
INNER JOIN s_articles_categories_ro productCategory ON productCategory.articleID = product.id
            AND productCategory.categoryID IN (:category) LEFT JOIN s_articles_avoid_customergroups avoidCustomerGroup ON avoidCustomerGroup.articleID = product.id
             AND avoidCustomerGroup.customerGroupId IN (:customerGroupIds) INNER JOIN s_articles_attributes productAttribute ON productAttribute.articledetailsID = variant.id
WHERE avoidCustomerGroup.articleID IS NULL

Musst es halt dementsprechend auf die alte Plugin Struktur umgestellt werden. Wollte beim Beispiel von oben bleiben.

  1. Keine Ahnung, wie bekommst Du das überhaupt da rein? Ich benutze bisher nur die Smarty {debug} Anweisung, welche recht hässlich ist, bzw. den var_dump filter auf einzelne Variablen.

  2. Siehe 1.