Ich muss alle CMS-Seiten löschen.
Hier ist der Code:
Namespace Soon \ Core \ Setup;
Verwenden Sie Magento \ Cms \ Api \ PageRepositoryInterface.
Verwenden Sie Magento \ Framework \ Api \ SearchCriteriaInterface.
Klasse Cms
{
/ **
* @var SearchCriteriaInterface
* /
private $ searchCriteria;
/ **
* @var PageRepositoryInterface
* /
private $ cmsPageRepository;
/ **
* Cms-Konstruktor.
* @param SearchCriteriaInterface $ searchCriteria
* @param PageRepositoryInterface $ cmsPageRepository
* /
öffentliche Funktion __construct (
SearchCriteriaInterface $ searchCriteria,
PageRepositoryInterface $ cmsPageRepository
)
{
$ this-> searchCriteria = $ searchCriteria;
$ this-> cmsPageRepository = $ cmsPageRepository;
}}
/ **
* Löschen Sie alle vorhandenen CMS-Seiten
* /
öffentliche Funktion cleanCmsPages ()
{
$ cmsPageCollection = $ this-> cmsPageRepository
-> getList ($ this-> searchCriteria)
-> getItems ();
foreach ($ cmsPageCollection als $ cmsPage) {
$ this-> cmsPageRepository-> delete ($ cmsPage);
}}
}}
}}
Ein Aufruf \Soon\Core\Setup\Cms::cleanCmsPagessollte also alle CMS-Seiten löschen.
Dabei erhalte ich folgende Fehlermeldung:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Also habe ich das $cmsPagein meinem verwendete verwendet foreach ($cmsPageCollection as $cmsPage)und es scheint tatsächlich $cmsPageein Array zu sein.
Ich habe mich in den Code vertieft:
\Magento\Cms\Api\PageRepositoryInterface::getListwird implementiert von \Magento\Cms\Model\PageRepository::getList.
Dann \Magento\Cms\Model\PageRepository::getListkönnen wir in diesem Code sehen:
$ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
$ pageData,
'Magento \ Cms \ Api \ Data \ PageInterface'
);
}}
$ searchResults-> setItems ($ pages);
Wenn ich richtig bin, erstellt dieser Code ein Array, das das $pagesArray auffüllt. Dieser Code kann also erklären, warum $cmsPagees sich um ein Array handelt!
ABER...
Durch das Lesen der @returnAussage von \Magento\Cms\Api\PageRepositoryInterface::getListkönnen wir sehen @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
Und wenn wir dann die @returnAussage von lesen \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, können wir sehen \Magento\Cms\Api\Data\PageInterface[]!
Das $cmsPagein meiner foreachSchleife sollte also eine Implementierung sein, an \Magento\Cms\Api\Data\PageInterfacedie dann richtig übergeben werden kann \Magento\Cms\Api\PageRepositoryInterface::delete.
Wer ist falsch?
- Ich, der @ api Kommentare und Code nicht richtig lesen / verstehen kann
- Magento, der in seinen @ api-Klassen nicht den richtigen Kommentar abgibt ... oder die Schnittstelle nicht so implementiert, wie sie sollte.
Diese Analyse gilt für die CMS-Seiten-API, gilt jedoch auch für die CMS- Block- API.