Мне нужно удалить все страницы 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 .