Fragestellung in unserer Agentur bei einem mit Shopware 5 erstellten Webshop: Wie bringt man die EAN der Variantenartikel eines Hauptartikel in die Variantenauswahl? Ziel war es hier, die EAN als Zusatz-Identifier der jeweiligen Option hinzuzufügen, der dann über eine automatisierte Größenauswahl angesteuert werden sollte. D.h.: Wähle ich über einen Größenrechner eine bestimmte Größe aus, wird diese über die zugehörige EAN selektiert (jQuery) und damit der zugehörige Variantenartikel geladen. Übertragbar auch auf die etwas allgemeinere Fragestellung: Wie füge ich Eigenschaften von Haupt- oder Variantenartikeln oder beliebige Zusatzinformationen auf der Produktdetailseite meines Shopware 5 Onlineshops ein?

 

 Wir haben hierfür ein kleines Plugin geschrieben, welches uns die Zusatzinformationen bereitstellt auf der Artikeldetailseite. Wir verwenden hier den Event

 

onPostDispatchDetail

 

aus

 

Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail

 

Hierzu deklarieren wir in der Datei (Bezeichnung Herstellerkürzel / Plugin frei wählbar, Pluginstruktur wir immer)

 

custom/plugins/EcoProductDetailOptionIds/Resources/services.xml

 

unseren Service wie folgt:

 

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>

        <service id="eco.product_detail_option_ids.subscriber.frontend"

                 class="EcoProductDetailOptionIds\Subscriber\Frontend">

                                               <argument>%eco_product_detail_option_ids.plugin_dir%</argument>

                                               <argument type="service" id="dbal_connection" />

            <tag name="shopware.event_subscriber" />

        </service>

    </services>

</container>

 

So erstellen wir dann die Datei

 

/web/stageware1/custom/plugins/EcoProductDetailOptionIds/Subscriber

 

mit folgendem Inhalt:

 

<?php

namespace EcoProductDetailOptionIds\Subscriber;

use Enlight\Event\SubscriberInterface;

use Enlight_Event_EventArgs;

use Doctrine\DBAL\Driver\Connection;

use Doctrine\DBAL\Query\QueryBuilder;

/**

 * @package EcoProductDetailOptionIds\Subscriber

 */

class Frontend implements SubscriberInterface

{

    public static function getSubscribedEvents()

    {

        return [

            'Enlight_Controller_Action_PostDispatchSecure_Frontend_Detail' => 'onPostDispatchDetail',

        ];

    }

                /**

     * @var \Doctrine\DBAL\Connection

     */

    private $connection;

               

    /**

     * @var string $pluginPath

     */

    protected $pluginPath;

    public function __construct(

        $pluginPath,

                               Connection $connection

    ) {

        $this->pluginPath = $pluginPath;

                               $this->connection = $connection;

    }

    public function onPostDispatchDetail(\Enlight_Event_EventArgs $args)

    {

                              

        $controller = $args->getSubject();

        $view = $controller->View();

        $vars = $view->getAssign();

        $sArticle = $vars['sArticle'];

                              

        if (!$sArticle || !isset($sArticle['sConfigurator']) || count($sArticle['sConfigurator']) > 1) {

            return;

        }

                               $ergebnis = $this->connection->createQueryBuilder()

                                                                               ->select('articlesdetails.id, articlesdetails.ean')

                                                                               ->from('s_articles_details', 'articlesdetails')

                                                                               ->join('articlesdetails', 's_article_configurator_option_relations', 'rel', 'rel.article_id = articlesdetails.id')

                                                                               ->addSelect('rel.option_id AS option_id')

                                                                               ->where('articlesdetails.articleID = :articlesId')

                                                                               ->setParameter('articlesId', $sArticle['articleID'])

                                                                               ->execute()

                                                                               ->fetchAll(\PDO::FETCH_ASSOC);

                               foreach ($ergebnis as $ergvalue) {

                                               $ergebnis_array[$ergvalue['option_id']] = $ergvalue['ean'];

                               }

                               foreach ($sArticle['sConfigurator'][0]['values'] as $ecokey => $ecovalue) {

                                               $ecovalue['EANId']='';

                                               if (isset($ergebnis_array[($ecovalue['optionID'])])) $ecovalue['EANId']=$ergebnis_array[($ecovalue['optionID'])];

                                               $sArticle['sConfigurator'][0]['values'][$ecokey] = $ecovalue;

                               }

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

                              

    }

}

 

Wir lesen also mit Hilfe der Artikel-ID des Hauptprodukts und den Tabellen 

 

s_articles_details

 

und

 

s_article_configurator_option_relations

 

die zugehörigen Variantenartikel sowie die zugehörige EAN aus und ordnen diese den jeweiligen Optionen zu, die wir dann im Template in

 

themes/Frontend/IRGENDEINTHEMENAME/frontend/detail/config_variant.tpl

 

über den Index "EANId" ausspielen können. Fertig! Gesehen in unserer Webagentur in einem Webshop mit Shopware 5.6.