जब आपके पास संबंधित उत्पाद हों और पूर्ण पृष्ठ कैश हो, तो उत्पाद पृष्ठ पर त्रुटि


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

धन्यवाद!


क्या आपने अपने मॉड्यूल में संबंधित .php को फिर से लिखा है?
राकेश जेसादिया

@ राकेश नं। बस सब कुछ खत्म हो गया। Magento एक और परीक्षणों को छोड़कर कोई संबंधित वर्ग नहीं।
क्लाउडीयू क्रेन्गा

1
लगता है कि यह त्रुटि केवल तब होती है जब कैश चालू हो
Stevie G

1
इसलिए जब आप उत्पाद के दृश्य को 2 कॉलम लेआउट से सिंगल कॉलम लेआउट में मौका देते हैं तो यह इस त्रुटि का कारण बनता है
Stevie G

कृपया अपने प्रश्न का उत्तर दें यदि आपके पास कोई उत्तर है
स्टीव जी

जवाबों:


2

उसी कक्षा में ( 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 सीई में मारा।

मुझे 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();

        }


-6

हम इस समस्या में भाग गए। जांचें कि क्या उत्पाद (संबंधित उत्पाद नहीं) स्टॉक से बाहर है। उत्पाद को स्टॉक में रखने से हमारे लिए समस्या हल हो गई।


यह समस्या को हल नहीं करता है, हालांकि यह समस्या से बचा जाता है
स्टीवी जी

यह कोई हल नहीं है
harri
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.