เกิดข้อผิดพลาดในหน้าผลิตภัณฑ์เมื่อคุณมีผลิตภัณฑ์ที่เกี่ยวข้องและเปิดใช้งานแคชหน้าเต็ม


16

ฉันได้รับข้อผิดพลาดนี้ในผลิตภัณฑ์บางตัวที่มีผลิตภัณฑ์ที่เกี่ยวข้อง:

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

ขอบคุณ!


คุณเขียน Related.php ในโมดูลของคุณใหม่หรือไม่?
Rakesh Jesadiya

@ ราเคชไม่มี greped เพียงแค่ทุกอย่าง ไม่มีคลาสที่เกี่ยวข้องยกเว้นวีโอไอพีหนึ่งและการทดสอบ
Claudiu Creanga

1
ดูเหมือนว่าข้อผิดพลาดนี้จะเกิดขึ้นเฉพาะเมื่อแคชเปิดอยู่
Stevie G

1
ดังนั้นเมื่อคุณมีโอกาสดูผลิตภัณฑ์จากการจัดวางคอลัมน์ 2 คอลัมน์เป็นเค้าโครงคอลัมน์เดียวมันทำให้เกิดข้อผิดพลาดนี้
Stevie G

กรุณาตอบคำถามของคุณหากคุณมีคำตอบ
Stevie G

คำตอบ:


2

ใน Class เดียวกัน ( vendor/magento/module-catalog/Block/Product/ProductList/Related.php) มีวิธีการที่แสดงด้านล่าง นี่คือตำแหน่งที่มีการตั้งค่าการรวบรวมรายการจากนั้นใช้ในเมธอด getItems () ที่คุณโทรหา แก้ไขจุดบกพร่องที่นี่และยืนยันว่าการรวบรวมรายการได้รับผลลัพธ์บางอย่าง อย่างที่คุณเห็นตัวกรองบางตัวกำลังถูกนำไปใช้ในรหัสนี้ดังนั้นจึงมีโอกาสที่ผลิตภัณฑ์จะไม่ผ่านตัวกรองเหล่านั้น

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

เพียงแค่กดจุดบกพร่องนี้ใน 2.1.7 CE

ฉัน 90% แน่ใจว่าเป็นเพราะ getIdentities () คือ "มักจะ" เรียกก่อน _beforeToHtml () หมายความว่าไม่เคยเรียกใช้ _prepareData () ดังนั้น _itemCollection จึงว่างเปล่า วิธีนี้เหมาะสมเนื่องจากแคชต้องการทราบว่าอะไรคืออะไรก่อนที่จะสร้าง html (และ getIdentites () ที่ระบุไว้เป็นแคชที่เกี่ยวข้อง)

ดังนั้น getIdentities จึงต้องเรียกใช้ _prepareData ()

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

และ _prepareData () ต้องป้องกันตัวเองจากการทำงานสองครั้ง

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

จากนั้นทุกอย่างก็โอเค

แก้ไข: เพิ่งพบรายงานข้อผิดพลาดนี้ปิดhttps://github.com/magento/magento2/issues/5897ควรได้รับการแก้ไขในรุ่นอนาคต


0

สิ่งที่คุณสามารถลองได้คือเพิ่มสิ่งต่อไปนี้ลงในไฟล์รูปแบบเทมเพลตของคุณซึ่งมีการกำหนดบล็อกรูปแบบนี้:

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

เพิ่มไปที่ด้านบนของบล็อกดังนี้:

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

รหัสด้านบนหมายความว่าคุณไม่ได้แคชบล็อกเลย์เอาต์นี้

หากวิธีนี้ใช้งานได้หมายความว่าแคชไม่อนุญาตให้คุณเก็บข้อมูลหรือถูกเขียนทับโดยอย่างอื่นทำให้ว่างเปล่า? (คาดเดาที่นี่)


-4

ลองรหัสนี้:

$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

เราพบปัญหานี้ ตรวจสอบว่าผลิตภัณฑ์ (ไม่ใช่ผลิตภัณฑ์ที่เกี่ยวข้อง) หมดหรือไม่ การวางสินค้าในสต็อกสามารถแก้ไขปัญหาให้เราได้


วิธีนี้ไม่ได้แก้ปัญหา แต่ก็หลีกเลี่ยงปัญหา
Stevie G

นี่ไม่ใช่วิธีการแก้ปัญหา
harri
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.