Методи сховища Magento 2 CMS Page getList () не повертають очікуваного об'єкта


10

Мені потрібно видалити всі сторінки CMS.

Ось код:

Простір імен незабаром \ Core \ Setup;

використовувати Magento \ Cms \ Api \ PageRepositoryInterface;
використовувати Magento \ Framework \ Api \ SearchCriteriaInterface;

клас Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    приватні $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    приватний $ cmsPageRepository;

    / **
     * Конструктор Cms
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    публічна функція __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Видаліть усі існуючі CMS сторінки
     * /
    громадська функція cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection як $ cmsPage) {
            $ this-> cmsPageRepository-> delete ($ 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 (
                $ pageДані,
                'Magento \ Cms \ 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 ... чи не реалізує інтерфейс як слід.

Цей аналіз призначений для API сторінки CMS, але також застосовується до API блоку CMS .


1
Це виглядає як помилка, хтось повідомив про це нещодавно: github.com/magento/magento2/isissue/7140
Wojtek Naruniec

Відповіді:


2

Ви можете створити помилку на Github, якщо хочете. Але більш швидким способом для вас є використання моделі ресурсів або, якщо ви хочете використовувати цей метод репозиторію deleteById (), де ви можете передати ідентифікатор сутності.

vendor / magento / module-cms / Model / PageRepository.php

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

Репозиторії не для масової роботи, це впливає на продуктивність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.