İlgili ürünleriniz varsa ve tam sayfa önbelleği açıkken ürün sayfasında hata


16

İlgili ürünleri içeren bazı ürünlerde bu hatayı alıyorum:

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

Bu sorun, yalnızca tam sayfa önbelleği açık olduğunda oluşur . Ne yazık ki devre dışı bırakmak bir seçenek değil çünkü hız farkı çok büyük (sayfa önbelleği ile 2 saniyeden daha hızlı).

Bildiğim her şeyi denedim: temamızı, özel modülleri vb.

Çevre: üretim, 2.1.0, vernik.

Bu tam yığın izlemesi:

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

Nereye bakacağına dair bir fikrin var mı?

129 numaralı satırda vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()boş:

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

Teşekkürler!


Modülünüzde Related.php'yi yeniden mi yazdınız?
Rakesh Jesadiya

@Rakesh no. sadece her şeyi mahvetti. Macenta ve testler dışında ilgili sınıf yok.
Claudiu Creanga

1
Bu hata yalnızca önbellek açıkken ortaya çıkıyor
Stevie G

1
Dolayısıyla, 2 sütun düzeninden tek bir sütun düzenine ürün görünümü şansı verdiğinizde, bu hataya neden olur
Stevie G

Cevabınız varsa lütfen sorunuza cevap verin
Stevie G

Yanıtlar:


2

Aynı Class ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php) içinde aşağıda gösterilen bir yöntem vardır. Bu, öğe koleksiyonunun ayarlandığı ve aradığınız getItems () yönteminde kullanıldığı yerdir. Burada hata ayıklayın ve öğe koleksiyonunun bazı sonuçlar aldığını doğrulayın. Gördüğünüz gibi bu kodda bazı filtreler uygulanmaktadır, bu nedenle ürünlerin bu filtrelerden geçmeme ihtimali vardır.

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

Sadece 2.1.7 CE bu hatayı vurmak.

% 90 eminim çünkü getIdentities () "bebe _beforeToHtml () 'den önce çağırılır. Bu, _prepareData () işlevinin asla çağrılmadığı anlamına gelir; bu nedenle _itemCollection boştur. Önbellek, html oluşturmadan önce ne olduğunu bilmek istediğinden biraz mantıklıdır (ve belirtildiği gibi getIdentites () önbellekle ilgilidir).

Bu nedenle getIdentities'in _prepareData () öğesini çağırması gerekir

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

ve _prepareData () işlevinin iki kez çalışmasını engellemesi gerekir.

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

Sonra her şey yolunda.

Düzenleme: Sadece bu kapalı hata raporu bulundu https://github.com/magento/magento2/issues/5897 Gelecekteki sürümde düzeltilmelidir.


0

Deneyebileceğiniz şey, bu mizanpaj bloğunun tanımlandığı şablon mizanpaj dosyanıza aşağıdakileri eklemektir:

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

Bloğun üstüne şöyle ekleyin:

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

Yukarıdaki kod, bu düzen bloğunu önbelleğe almadığınız anlamına gelir.

Bu işe yararsa, önbelleğe almanın verileri tutmanıza izin vermeyeceği veya boş bırakan başka bir şey tarafından üzerine yazılmayacağı anlamına gelir? (burada tahmin)


-4

bu kodu deneyin:

$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();

        }

magento1
Claudiu Creanga

-6

Biz bu problemle karşılaştık. Ürünün (ilgili ürünler değil) stokta olup olmadığını kontrol edin. Ürünü stoka koymak bizim için sorunu çözdü.


Bu sorunu çözmez, sorunu önler
Stevie G

Bu bir çözüm değil
harri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.