Я получаю эту ошибку на некоторых продуктах, которые имеют связанные продукты:
Warning: Invalid argument supplied for foreach() in vendor/magento/module-catalog/Block/Product/ProductList/Related.php on line 129
Эта проблема возникает, только если включен полный кеш страниц . К сожалению, отключить его нельзя, так как разница в скорости огромна (более чем на 2 секунды быстрее с кэшем страниц).
Я перепробовал все, что знаю: удаление нашей темы, пользовательских модулей и т. Д.
Окружающая среда: производство, 2.1.0, лак.
Это полная трассировка стека:
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";}
Есть идеи где искать?
В строке 129 в vendor/magento/module-catalog/Block/Product/ProductList/Related.php
$this->getItems()
нуль:
/**
* 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;
}
Благодарность!
magento-2.1
full-page-cache
related-products
Клаудиу Крянгэ
источник
источник
Ответы:
В том же классе (
vendor/magento/module-catalog/Block/Product/ProductList/Related.php
) есть метод, показанный ниже. Это где коллекция элементов устанавливается и затем используется в методе getItems (), который вы вызываете. Отладьте здесь и убедитесь, что коллекция элементов получает некоторые результаты. Как вы можете видеть, некоторые фильтры применяются в этом коде, поэтому есть вероятность, что продукты не проходят через эти фильтры.источник
Просто нажмите на эту ошибку в 2.1.7 CE.
Я на 90% уверен, что это потому, что getIdentities () "часто" вызывается перед _beforeToHtml (). Это означает, что _prepareData () никогда не вызывается, поэтому _itemCollection пуст. Это имеет смысл, потому что кеш хочет знать, что перед тем, как он генерирует html (и, как отмечалось, getIdentites () связан с кешем).
Так что getIdentities должен вызывать _prepareData ()
и _prepareData () должен защищаться от запуска дважды.
Тогда все хорошо.
Изменить: только что нашел этот закрытый отчет об ошибке https://github.com/magento/magento2/issues/5897 Должен быть исправлен в следующем выпуске.
источник
Вы можете попробовать добавить следующее в файл макета шаблона, где определен этот блок макета:
Добавьте его в начало блока примерно так:
Приведенный выше код означает, что вы не кэшируете этот блок макета.
Если это работает, это означает, что кэширование не позволит вам сохранить данные или они будут перезаписаны чем-то другим, что сделает их пустыми? (угадывая здесь)
источник
попробуйте этот код:
источник
Мы столкнулись с этой проблемой. Проверьте, нет ли товара (не сопутствующих товаров) на складе. Поставка товара на складе решила проблему для нас.
источник