Erreur sur la page du produit lorsque vous avez des produits associés et que le cache de page complète est activé


16

J'obtiens cette erreur sur certains produits qui ont des produits associés:

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

Ce problème se produit uniquement lorsque le cache de page complète est activé . Malheureusement, sa désactivation n'est pas une option car la différence de vitesse est énorme (plus de 2 secondes plus rapide avec le cache de page).

J'ai essayé tout ce que je sais: supprimer notre thème, modules personnalisés, etc.

Environnement: production, 2.1.0, vernis.

Voici la trace complète de la pile:

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";}

Des idées où chercher?

À la ligne 129, la valeur vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()est nulle:

  /**
     * 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;
    } 

Merci!


Avez-vous réécrit Related.php dans votre module?
Rakesh Jesadiya

@Rakesh no. juste tout grpé. Aucune classe connexe à l'exception de celle de magento et des tests.
Claudiu Creanga

1
Il semble que cette erreur se produit uniquement lorsque le cache est
activé

1
Donc, lorsque vous risquez la vue du produit d'une mise en page à 2 colonnes à une mise en page à une seule colonne, cela provoque cette erreur
Stevie G

Veuillez répondre à votre question si vous avez une réponse
Stevie G

Réponses:


2

Dans la même classe ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php), il existe une méthode comme indiqué ci-dessous. C'est là que la collection d'éléments est définie, puis utilisée dans la méthode getItems () que vous appelez. Déboguez ici et confirmez que la collection d'articles obtient des résultats. Comme vous pouvez le voir, certains filtres sont appliqués dans ce code, il est donc possible que les produits ne passent pas par ces filtres.

/**
     * @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;
    }

1

Frappez juste ce bogue dans 2.1.7 CE.

Je suis sûr à 90% que c'est parce que getIdentities () est "souvent" appelée avant _beforeToHtml (). Cela signifie que _prepareData () n'est jamais appelé, donc _itemCollection est vide. Cela a un peu de sens car le cache veut savoir quoi avant de générer le code HTML (et comme indiqué, getIdentites () est lié au cache).

Donc getIdentities doit appeler _prepareData ()

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

et _prepareData () doit se défendre de ne pas s'exécuter deux fois.

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

Alors tout va bien.

Edit: Je viens de trouver ce rapport de bogue fermé https://github.com/magento/magento2/issues/5897 Devrait être corrigé dans la prochaine version.


0

Ce que vous pouvez essayer est d'ajouter ce qui suit à votre fichier de mise en page de modèle où ce bloc de mise en page est défini:

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

Ajoutez-le en haut du bloc comme ceci:

<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>

Le code ci-dessus signifie que vous ne mettez pas en cache ce bloc de disposition.

Si cela fonctionne, cela signifie que la mise en cache ne vous permettra pas de conserver les données ou qu'elle est remplacée par quelque chose d'autre qui la rend vide? (deviner ici)


-4

essayez ce 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();

        }

c'est magento1
Claudiu Creanga

-6

Nous avons rencontré ce problème. Vérifiez si le produit (et non les produits associés) est en rupture de stock. La mise en stock du produit a résolu le problème pour nous.


Cela ne résout cependant pas le problème, cela évite le problème
Stevie G

Ce n'est pas une solution
harri
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.