Kaufen aus dem Listing via Plugin einschränken

Hallo,

wenn „displayListingBuyButton“ im Shop konfiguriert wurde, ist es ja möglich schon im Listing, Artikel in den Warenkorb zu werfen. Ich möchte über ein Plugin diese Funktion u.U. abschalten können. Ich habe dazu box-basic.tpl entsprechend erweitert:

{extends file='parent:frontend/listing/product-box/box-basic.tpl'}

{block name="frontend_listing_box_article_buy"}
    {if {config name="displayListingBuyButton"} && $PluginConfig.MeineBedingungErfüllt}
        <div class="product--btn-container">
            {if $sArticle.allowBuyInListing}
                {include file="frontend/listing/product-box/button-buy.tpl"}
            {else}
                {include file="frontend/listing/product-box/button-detail.tpl"}
            {/if}
        </div>
    {/if}
{/block}

Das Ganze funktioniert genau für so viele Artikel, wie in den Storefront-Einstellungen für „Artikel pro Seite“ festgelegt wurde (Standard: 12). Danach wird wieder die box-basic.tpl vom Theme abgearbeitet und meine Änderungen sind futsch. Wie erklärt sich dieses Verhalten ?

Wenn ich die Anpassungen direkt in meinem, von Bare abgeleiteten, Theme mache, geht es problemlos.

Gibt es eine Möglichkeit solche Dinge auch via Plugin zu lösen, also auch ohne Theme-Änderungen?

Hallo,

ich habe die Lösung selber gefunden :slightly_smiling_face:. Es liegt am Subscriber-Event. Mit Legacy_Struct_Converter_Convert_List_Product kommt man an alle Artikel im Listing ran:

/**
     * {@inheritdoc}
     */
    public static function getSubscribedEvents()
    {
        return [
            'Enlight_Controller_Action_PostDispatchSecure_Frontend' => 'onPostDispatch',
            'Legacy_Struct_Converter_Convert_List_Product' => 'onListProduct',
            'Theme_Compiler_Collect_Plugin_Less' => 'addLessFiles'
        ];
    }

In onListProduct kann man dann die gewünschten Änderungen, in meinem Fall bzgl. allowBuyInListing, machen:

public function onListProduct(\Enlight_Event_EventArgs $args)
    {
        $article = $args->getReturn();

        $stopBuy = $this->configReader->getByPluginName($this->pluginName, Shopware()->Shop())['active'];
        if ( $article['allowBuyInListing'] and $stopBuy ) $article['allowBuyInListing'] = 0;

        return $article;
    }