Мне нужно удалить все страницы CMS.
Вот код:
Пространство имен Скоро \ Core \ Setup; использовать Magento \ Cms \ Api \ PageRepositoryInterface; использовать Magento \ Framework \ Api \ SearchCriteriaInterface; класс Cms { / ** * @var SearchCriteriaInterface * / private $ searchCriteria; / ** * @var PageRepositoryInterface * / private $ 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 as $ 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, '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
.
Кто не прав?
- Я, кто не может читать / понимать комментарии и код @api должным образом
- Magento, который не дает правильный комментарий в своих классах @api ... или не реализует интерфейс так, как должен.
Этот анализ предназначен для API страницы CMS, но также применим к API блока CMS .
Ответы:
Вы можете создать ошибку на github, если хотите. Но более быстрый способ для вас - использовать модель ресурсов или, если вы хотите, использовать этот метод репозитория deleteById (), где вы можете передать идентификатор сущности.
поставщик / Magento / модуль-К / Модель / PageRepository.php
Хранилища не для массовых операций, это влияет на производительность.
источник