관련 제품이 있고 전체 페이지 캐시가 켜져있는 경우 제품 페이지 오류


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에서 in vendor/magento/module-catalog/Block/Product/ProductList/Related.php $this->getItems()은 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;
    } 

감사!


모듈에서 Related.php를 다시 작성 했습니까?
Rakesh Jesadiya

@ 라 케쉬 그냥 모든 걸 욕 했어 마 젠토와 테스트를 제외한 관련 클래스는 없습니다.
Claudiu Creanga

1
이 오류는 캐시가 켜져있을 때만 발생하는 것 같습니다
Stevie G

1
따라서 2 열 레이아웃에서 단일 열 레이아웃으로 제품 뷰를 볼 때이 오류가 발생합니다
Stevie G

답변이 있으시면 질문에 답변하십시오
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

CE 2.1.7에서이 버그를 발견했습니다.

getIdentities ()가 _beforeToHtml () 전에 "종종"호출 되었기 때문에 이것이 90 % 확신합니다. 이는 _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.