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.