Kesalahan pada halaman produk ketika Anda memiliki produk terkait dan cache halaman penuh diaktifkan

16

Saya mendapatkan kesalahan ini pada beberapa produk yang memiliki produk terkait:

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

Masalah ini hanya terjadi ketika cache halaman penuh dihidupkan . Sayangnya menonaktifkannya bukan opsi karena perbedaan kecepatan sangat besar (lebih dari 2 detik lebih cepat dengan cache halaman).

Saya mencoba semua yang saya tahu: menghapus tema kami, modul khusus dll.

Lingkungan: produksi, 2.1.0, pernis.

Ini adalah jejak tumpukan lengkap:

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

Ada ide ke mana harus mencari?

Pada baris 129 in vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()adalah nol:

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

Terima kasih!

Claudiu Creanga
sumber
Sudahkah Anda menulis ulang Related.php di modul Anda?
Rakesh Jesadiya
@Rakesh no. hanya menangkap semuanya. Tidak ada kelas terkait kecuali magento satu dan tes.
Claudiu Creanga
1
Sepertinya kesalahan ini hanya terjadi ketika cache diaktifkan
Stevie G
1
Jadi ketika Anda berkesempatan melihat produk dari tata letak 2 kolom ke tata letak satu kolom itu menyebabkan kesalahan ini
Stevie G
Harap jawab pertanyaan Anda jika Anda punya jawaban
Stevie G

Jawaban:

2

Di Kelas yang sama ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php) ada metode seperti yang ditunjukkan di bawah ini. Di sinilah koleksi item diatur dan kemudian digunakan dalam metode getItems () yang Anda panggil. Debug di sini dan konfirmasikan bahwa koleksi item mendapatkan beberapa hasil. Seperti yang Anda lihat beberapa filter sedang diterapkan dalam kode ini, jadi ada kemungkinan produk tidak melewati filter tersebut.

/**
     * @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
sumber
1

Tekan saja bug ini di 2.1.7 CE.

Saya 90% yakin ini karena getIdentities () "sering" dipanggil sebelum _beforeToHtml (). Ini berarti _prepareData () tidak pernah dipanggil sehingga _itemCollection kosong. Ini masuk akal karena cache ingin tahu whats what sebelum menghasilkan html (dan seperti dicatat getIdentites () berhubungan dengan cache).

Jadi getIdentities perlu menelepon _prepareData ()

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

dan _prepareData () perlu mempertahankan diri dari menjalankan dua kali.

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

Maka semuanya baik-baik saja.

Sunting: Baru saja menemukan laporan bug yang ditutup ini https://github.com/magento/magento2/issues/5897 Harus diperbaiki di rilis mendatang.

Chris Lingwood
sumber
0

Apa yang dapat Anda coba adalah menambahkan yang berikut ini ke file tata letak template Anda di mana blok tata letak ini didefinisikan:

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

Tambahkan ke bagian atas blok seperti ini:

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

Kode di atas berarti Anda tidak melakukan caching blok tata letak ini.

Jika ini berhasil, artinya caching tidak memungkinkan Anda menyimpan data atau ditimpa oleh hal lain yang membuatnya kosong? (menebak di sini)

Myron
sumber
-4

coba kode ini:

$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
sumber
ini magento1
Claudiu Creanga
-6

Kami mengalami masalah ini. Periksa apakah produk (bukan produk terkait) kehabisan stok. Menempatkan produk dalam stok memecahkan masalah bagi kami.

cooljoe
sumber
Namun ini tidak menyelesaikan masalah, itu menghindari masalah
Stevie G
Ini bukan solusi
harri