Lỗi trên trang sản phẩm khi bạn có sản phẩm liên quan và bộ đệm toàn bộ trang bị bật


16

Tôi gặp lỗi này trên một số sản phẩm có sản phẩm liên quan:

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

Vấn đề này chỉ xảy ra khi bộ đệm toàn bộ trang được bật. Thật không may, vô hiệu hóa nó không phải là một tùy chọn vì sự khác biệt về tốc độ là rất lớn (nhanh hơn 2 giây với bộ đệm trang).

Tôi đã thử mọi thứ mà tôi biết: xóa chủ đề của chúng tôi, các mô-đun tùy chỉnh, v.v.

Môi trường: sản xuất, 2.1.0, véc ni.

Đây là dấu vết ngăn xếp đầy đủ:

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

Ý tưởng đâu ra mà tìm?

Tại dòng 129 in vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()là null:

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

Cảm ơn!


Bạn đã viết lại Rel.php trong mô-đun của bạn?
Rakesh Jesadiya

@Rakesh không. chỉ gre tất cả mọi thứ. Không có lớp liên quan ngoại trừ một magento và kiểm tra.
Claudiu Creanga

1
Có vẻ như lỗi này chỉ xảy ra khi bật bộ đệm
Stevie G

1
Vì vậy, khi bạn có cơ hội xem sản phẩm từ bố cục 2 cột sang bố cục một cột, nó sẽ gây ra lỗi này
Stevie G

Vui lòng trả lời câu hỏi của bạn nếu bạn có câu trả lời
Stevie G

Câu trả lời:


2

Trong cùng một Class ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php) có một phương thức như dưới đây. Đây là nơi bộ sưu tập mục được đặt và sau đó được sử dụng trong phương thức getItems () mà bạn đang gọi. Gỡ lỗi ở đây và xác nhận bộ sưu tập vật phẩm đang nhận được một số kết quả. Như bạn có thể thấy một số bộ lọc đang được áp dụng trong mã này, do đó, có khả năng các sản phẩm không đi qua các bộ lọc đó.

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

Chỉ cần gặp lỗi này trong 2.1.7 CE.

Tôi chắc chắn 90% điều này là do getIdentities () thường được gọi trước _b BeforeToHtml (). Điều này có nghĩa là _prepareData () không bao giờ được gọi vì vậy _itemCollection trống. Điều này có một chút ý nghĩa bởi vì bộ đệm muốn biết những gì trước khi nó tạo ra html (và như đã lưu ý getIdentites () có liên quan đến bộ đệm).

Vì vậy, getIdentities cần gọi _prepareData ()

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

và _prepareData () cần tự bảo vệ mình khỏi chạy hai lần.

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

Sau đó mọi thứ đều ổn.

Chỉnh sửa: Chỉ cần tìm thấy báo cáo lỗi đóng này https://github.com/magento/magento2/issues/5897 Nên được sửa trong bản phát hành trong tương lai.


0

Những gì bạn có thể thử là thêm phần sau vào tệp bố cục mẫu của bạn nơi khối bố cục này được xác định:

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

Thêm nó vào đầu khối như vậy:

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

Đoạn mã trên có nghĩa là bạn không lưu trữ khối bố cục này.

Nếu điều này hoạt động có nghĩa là bộ nhớ đệm sẽ không cho phép bạn giữ dữ liệu hoặc nó bị ghi đè bởi một cái gì đó làm cho nó trống? (đoán ở đây)


-4

thử mã này:

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

        }

đây là magento1
Claudiu Creanga

-6

Chúng tôi gặp vấn đề này. Kiểm tra xem sản phẩm (không phải sản phẩm liên quan) đã hết hàng. Đưa sản phẩm vào kho đã giải quyết vấn đề cho chúng tôi.


Điều này không giải quyết được vấn đề mặc dù, nó tránh được vấn đề
Stevie G

Đây không phải là một giải pháp
harri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.