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!
magento-2.1
full-page-cache
related-products
Claudiu Creanga
la source
la source
Réponses:
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.la source
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 ()
et _prepareData () doit se défendre de ne pas s'exécuter deux fois.
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.
la source
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:
Ajoutez-le en haut du bloc comme ceci:
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)
la source
essayez ce code:
la source
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.
la source