Мені потрібно видалити всі сторінки 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.
Хто помиляється?
- Мені, хто не вміє читати / розуміти коментарі та код @api належним чином
- Magento хто не дає правильного коментаря у своїх класах @api ... чи не реалізує інтерфейс як слід.
Цей аналіз призначений для API сторінки CMS, але також застосовується до API блоку CMS .