Fehler auf der Produktseite, wenn Sie verwandte Produkte haben und der Cache für die gesamte Seite aktiviert ist

16

Ich erhalte diesen Fehler bei einigen Produkten mit ähnlichen Produkten:

Warning: Invalid argument supplied for foreach() in vendor/magento/module-catalog/Block/Product/ProductList/Related.php on line 129

Dieses Problem tritt nur auf, wenn der Ganzseiten-Cache aktiviert ist. Leider ist das Deaktivieren nicht möglich, da der Geschwindigkeitsunterschied sehr groß ist (mehr als 2 Sekunden schneller mit Seiten-Cache).

Ich habe alles versucht, was ich weiß: Entfernen unseres Themas, benutzerdefinierter Module usw.

Umwelt: Produktion, 2.1.0, Lack.

Dies ist der vollständige Stack-Trace:

a:4:{i:0;s:190:"Warning: Invalid argument supplied for foreach() in vendor/magento/module-catalog/Block/Product/ProductList/Related.php on line 129";i:1;s:5441:"#0 vendor/magento/module-catalog/Block/Product/ProductList/Related.php(129): Magento\Framework\App\ErrorHandler->handler(2, 'Invalid argumen...', '/home/11396-492...', 129, Array)
#1 var/generation/Magento/Catalog/Block/Product/ProductList/Related/Interceptor.php(37): Magento\Catalog\Block\Product\ProductList\Related->getIdentities()
#2 vendor/magento/module-page-cache/Model/Layout/LayoutPlugin.php(71): Magento\Catalog\Block\Product\ProductList\Related\Interceptor->getIdentities()
#3 vendor/magento/framework/Interception/Interceptor.php(152): Magento\PageCache\Model\Layout\LayoutPlugin->afterGetOutput(Object(Magento\Framework\View\Layout\Interceptor), '    <script>\n  ...')
#4 var/generation/Magento/Framework/View/Layout/Interceptor.php(494): Magento\Framework\View\Layout\Interceptor->___callPlugins('getOutput', Array, Array)
#5 vendor/magento/framework/View/Result/Page.php(243): Magento\Framework\View\Layout\Interceptor->getOutput()
#6 vendor/magento/framework/View/Result/Layout.php(164): Magento\Framework\View\Result\Page->render(Object(Magento\Framework\App\Response\Http\Interceptor))
#7 vendor/magento/framework/Interception/Interceptor.php(74): Magento\Framework\View\Result\Layout->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#8 vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\Framework\View\Result\Page\Interceptor->___callParent('renderResult', Array)
#9 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'renderResult', Object(Magento\Framework\View\Result\Page\Interceptor), Array, 'result-varnish-...')
#10 vendor/magento/module-page-cache/Model/Controller/Result/VarnishPlugin.php(74): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#11 vendor/magento/framework/Interception/Chain/Chain.php(67): Magento\PageCache\Model\Controller\Result\VarnishPlugin->aroundRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Closure), Object(Magento\Framework\App\Response\Http\Interceptor))
#12 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'renderResult', Object(Magento\Framework\View\Result\Page\Interceptor), Array, 'result-builtin-...')
#13 vendor/magento/module-page-cache/Model/Controller/Result/BuiltinPlugin.php(67): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#14 vendor/magento/framework/Interception/Chain/Chain.php(67): Magento\PageCache\Model\Controller\Result\BuiltinPlugin->aroundRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Closure), Object(Magento\Framework\App\Response\Http\Interceptor))
#15 vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'renderResult', Object(Magento\Framework\View\Result\Page\Interceptor), Array, 'aw_layerednav_r...')
#16 app/code/Aheadworks/Layerednav/Model/Plugin/Result.php(75): Magento\Framework\View\Result\Page\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Response\Http\Interceptor))
#17 vendor/magento/framework/Interception/Interceptor.php(142): Aheadworks\Layerednav\Model\Plugin\Result->aroundRenderResult(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Closure), Object(Magento\Framework\App\Response\Http\Interceptor))
#18 var/generation/Magento/Framework/View/Result/Page/Interceptor.php(130): Magento\Framework\View\Result\Page\Interceptor->___callPlugins('renderResult', Array, Array)
#19 vendor/magento/framework/App/Http.php(139): Magento\Framework\View\Result\Page\Interceptor->renderResult(Object(Magento\Framework\App\Response\Http\Interceptor))
#20 vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#21 index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#22 {main}";s:3:"url";s:15:"/pecan-pie.html";s:11:"script_name";s:10:"/index.php";}

Irgendwelche Ideen, wo Sie suchen?

In Zeile 129 vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()ist null:

  /**
     * Return identifiers for produced content
     *
     * @return array
     */
    public function getIdentities()
    {
        $identities = [];
        var_dump($this->getItems());
        foreach ($this->getItems() as $item) {
            $identities = array_merge($identities, $item->getIdentities());
        }
        return $identities;
    } 

Vielen Dank!

Claudiu Creanga
quelle
Haben Sie Related.php in Ihrem Modul umgeschrieben?
Rakesh Jesadiya
@ Rakesh Nr. Hab einfach alles gegriffen. Keine verwandte Klasse außer der von Magento und Tests.
Claudiu Creanga
1
Scheint, als ob dieser Fehler nur auftritt, wenn der Cache eingeschaltet ist
Stevie G
1
Wenn Sie also die Produktansicht von einem zweispaltigen Layout zu einem einspaltigen Layout ändern, tritt dieser Fehler auf
Stevie G,
Bitte beantworten Sie Ihre Frage, wenn Sie eine Antwort haben
Stevie G

Antworten:

2

In derselben Klasse ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php) gibt es eine Methode wie unten gezeigt. Hier wird die Elementauflistung festgelegt und dann in der aufgerufenen Methode getItems () verwendet. Hier debuggen und bestätigen, dass die Artikelsammlung einige Ergebnisse liefert. Wie Sie sehen, werden in diesem Code einige Filter angewendet, sodass die Möglichkeit besteht, dass Produkte diese Filter nicht passieren.

/**
     * @return $this
     */
    protected function _prepareData()
    {
        $product = $this->_coreRegistry->registry('product');
        /* @var $product \Magento\Catalog\Model\Product */

        $this->_itemCollection = $product->getRelatedProductCollection()->addAttributeToSelect(
            'required_options'
        )->setPositionOrder()->addStoreFilter();

        if ($this->moduleManager->isEnabled('Magento_Checkout')) {
            $this->_addProductAttributesAndPrices($this->_itemCollection);
        }
        $this->_itemCollection->setVisibility($this->_catalogProductVisibility->getVisibleInCatalogIds());

        $this->_itemCollection->load();

        foreach ($this->_itemCollection as $product) {
            $product->setDoNotUseCategoryId(true);
        }

        return $this;
    }
Siju Joseph
quelle
1

Schlagen Sie einfach diesen Fehler in 2.1.7 CE.

Ich bin zu 90% sicher, dass dies daran liegt, dass getIdentities () "oft" vor _beforeToHtml () aufgerufen wird. Dies bedeutet, dass _prepareData () niemals aufgerufen wird, sodass _itemCollection leer ist. Dies ist ein wenig sinnvoll, da der Cache wissen möchte, was passiert, bevor er den HTML-Code generiert (und wie erwähnt ist getIdentites () cachebezogen).

GetIdentities muss also _prepareData () aufrufen

public function getIdentities()
{
    $this->_prepareData();

und _prepareData () muss sich davor schützen, zweimal ausgeführt zu werden.

protected function _prepareData()
{
    if($this->_itemCollection)
        return $this;

Dann ist alles in Ordnung.

Bearbeiten: Habe gerade diesen geschlossenen Fehlerbericht gefunden https://github.com/magento/magento2/issues/5897 Sollte in zukünftigen Versionen behoben sein.

Chris Lingwood
quelle
0

Sie könnten versuchen, Ihrer Vorlagenlayoutdatei, in der dieser Layoutblock definiert ist, Folgendes hinzuzufügen:

<action method="unsetData"><key>cache_lifetime</key></action>
<action method="unsetData"><key>cache_tags</key></action>

Fügen Sie es wie folgt oben in den Block ein:

<module_index_index>
     <action method="unsetData"><key>cache_lifetime</key></action>
     <action method="unsetData"><key>cache_tags</key></action>
     // the actions that are defined
</module_index_index>

Der obige Code bedeutet, dass Sie diesen Layoutblock nicht zwischenspeichern.

Wenn dies funktioniert, bedeutet dies, dass Sie die Daten durch das Caching nicht behalten können, oder dass sie durch etwas anderes überschrieben werden, das sie leer macht? (hier raten)

Myron
quelle
-4

Versuchen Sie diesen Code:

$model = Mage::getModel('catalog/product');
$product = $model->load($product_id);

// Get all related product ids of $product.
$allRelatedProductIds = $product->getRelatedProductIds();

foreach ($allRelatedProductIds as $id) {
            $relatedProduct = $model->load($id);

            // get Product's name
            echo $relatedProduct->getName();

            // get product's short description
            echo $relatedProduct->getShortDescription();

            // get Product's Long Description
            echo $relatedProduct->getDescription();

            // get Product's Regular Price
            echo $relatedProduct->getPrice();

            // get Product's Special price
            echo $relatedProduct->getSpecialPrice();

            // get Product's Url
            echo $relatedProduct->getProductUrl();

            // get Product's image Url
            echo $relatedProduct->getImageUrl();

        }
Vibhanshu Sharma
quelle
das ist magento1
Claudiu Creanga
-6

Wir sind auf dieses Problem gestoßen. Überprüfen Sie, ob das Produkt (nicht die verwandten Produkte) nicht vorrätig ist. Das Produkt auf Lager zu haben, löste das Problem für uns.

cooljoe
quelle
Dies löst das Problem nicht, es vermeidet das Problem
Stevie G
Dies ist keine Lösung
harri