วิธีการเก็บข้อมูลหน้า Magento 2 CMS หน้า getList () ไม่ส่งคืนวัตถุที่คาดหวัง


10

ฉันต้องการลบหน้า CMS ทั้งหมด

นี่คือรหัส:

เนมสเปซเร็ว ๆ นี้ \ Core \ Setup;

ใช้ Magento \ Cms \ Api \ PageRepositoryInterface
ใช้ Magento \ Framework \ Api \ SearchCriteriaInterface

ระดับซม
{
    / **
     * @var SearchCriteriaInterface
     * /
    เกณฑ์ $ ส่วนตัว
    / **
     * @var PageRepositoryInterface
     * /
    $ cmsPageRepository ส่วนตัว

    / **
     * ตัวสร้างซม.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    ฟังก์ชั่นสาธารณะ __ โครงสร้าง (
        SearchCriteriaInterface $ searchCriteria
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * ลบหน้า CMS ที่มีอยู่ทั้งหมด
     * /
    ฟังก์ชั่นสาธารณะ cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection เป็น $ cmsPage) {
            $ this-> cmsPageRepository-> ลบ ($ cmsPage);
        }
    }
}

ดังนั้นการโทร\Soon\Core\Setup\Cms::cleanCmsPagesควรลบหน้า CMS ทั้งหมด

แต่เมื่อทำเช่นนั้นฉันได้รับข้อผิดพลาดนี้:

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เราจะเห็นรหัสนี้:

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ pageData,
                'วีโอไอพี \ ซม \ Api \ 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. Magento ผู้ที่ไม่ได้ให้ความเห็นที่ถูกต้องในคลาส @api ของพวกเขา ... หรือไม่ได้ใช้อินเทอร์เฟซตามที่ควร

การวิเคราะห์นี้มีไว้สำหรับ CMS Page API แต่ยังใช้กับ CMS Block API


1
ดูเหมือนว่ามีข้อผิดพลาดบางคนรายงานเมื่อเร็ว ๆ นี้: github.com/magento/magento2/issues/7140
Wojtek Naruniec

คำตอบ:


2

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

ผู้ขาย / วีโอไอพี / โมดูล ซ.ม. / รุ่น / PageRepository.php

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

ที่เก็บไม่ได้มีไว้สำหรับการทำงานเป็นกลุ่มซึ่งจะส่งผลต่อประสิทธิภาพ

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