Magento 2 CMS पृष्ठ getList () रिपॉजिटरी विधियाँ अपेक्षित ऑब्जेक्ट को वापस नहीं करती हैं


10

मुझे सभी सीएमएस पृष्ठों को हटाने की आवश्यकता है।

यहाँ कोड है:

नाम स्थान जल्द ही \ Core \ Setup;

Magento \ Cms \ Api \ PageRepositoryInterface का उपयोग करें;
Magento \ Framework \ Api \ SearchCriteriaInterface का उपयोग करें;

वर्ग सीएमएस
{
    / **
     * @वर सर्चक्रिटियाइंटरफेस
     * /
    निजी $ सर्चक्रिटेरिया;
    / **
     * @वर पेजरिपोसिटरीइंटरफेस
     * /
    निजी $ cmsPageRepository;

    / **
     * सेमी कंस्ट्रक्टर।
     * @ अपरम सर्चक्रिटियाइंटरफेस $ सर्चक्रिटेरिया
     * @ पेजम पेजरोसिटरीइंटरफेस $ cmsPageRepository
     * /
    सार्वजनिक समारोह __construct (
        सर्चक्रिटेरियाइंटरफेस $ सर्चक्रिटेरिया,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ यह-> सर्चक्रिटिया = $ सर्चक्रिटेरिया;
        $ यह-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * सभी मौजूदा सीएमएस पृष्ठ हटाएं
     * /
    सार्वजनिक समारोह cleanCmsPages ()
    {
        $ cmsPageCollection = $ यह-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection $ cmsPage के रूप में) {
            $ This-> cmsPageRepository-> हटाने ($ cmsPage);
        }
    }
}

इसलिए, कॉलिंग \Soon\Core\Setup\Cms::cleanCmsPagesको सभी सीएमएस पृष्ठों को हटाना चाहिए।

लेकिन ऐसा करते समय, मुझे यह त्रुटि मिलती है:

Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given

तो मैं $cmsPageअपने में इस्तेमाल किया डंप foreach ($cmsPageCollection as $cmsPage)और यह प्रतीत होता है कि, वास्तव में, $cmsPageएक सरणी है।

मैंने कोड में खुदाई की:

\Magento\Cms\Api\PageRepositoryInterface::getListद्वारा कार्यान्वित किया जाता है \Magento\Cms\Model\PageRepository::getList

फिर \Magento\Cms\Model\PageRepository::getList, हम इस बिट कोड को देख सकते हैं:

            $ पृष्ठ [] = $ इस-> dataObjectProcessor-> buildOutputDataArray (
                $ PageData,
                'Magento \ सी एम \ एपीआई \ Data \ PageInterface'
            );
        }
        $ SearchResults-> setItems ($ पृष्ठों);

यदि मैं सही हूं, तो यह कोड एक सरणी बनाता है जो सरणी को पॉप्युलेट करता है $pages। तो यह कोड समझा सकता है कि $cmsPageएक सरणी क्यों है!

परंतु...

के @returnकथन को पढ़कर \Magento\Cms\Api\PageRepositoryInterface::getListहम देख सकते हैं @return \Magento\Cms\Api\Data\PageSearchResultsInterface

और, तब से @returnबयान पढ़कर \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, हम देख सकते हैं \Magento\Cms\Api\Data\PageInterface[]!

तो $cmsPageमेरे foreachपाश में एक कार्यान्वयन होना चाहिए \Magento\Cms\Api\Data\PageInterfaceजिसके बाद उसे ठीक से पारित किया जा सके \Magento\Cms\Api\PageRepositoryInterface::delete

कौन गलत है?

  1. मुझे जो @api टिप्पणियों और कोड को ठीक से नहीं पढ़ / समझ सकते हैं
  2. मैगेंटो जो अपनी @api कक्षाओं में सही टिप्पणी नहीं देते हैं ... या इंटरफ़ेस को लागू नहीं करता है जैसा कि इसे करना चाहिए।

यह विश्लेषण सीएमएस पेज एपीआई के लिए है, लेकिन सीएमएस ब्लॉक एपीआई पर भी लागू होता है ।


1
यह बग के रूप में दिखता है, किसी ने हाल ही में इसकी सूचना दी: github.com/magento/magento2/issues/7140
Wojtek Naruniec

जवाबों:


2

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

विक्रेता / Magento / मॉड्यूल-सेमी / मॉडल / PageRepository.php

public function deleteById($pageId)
{
    return $this->delete($this->getById($pageId));
}

भंडार संचालन के लिए नहीं है, यह प्रदर्शन को प्रभावित करता है।

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