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::cleanCmsPages
sollte 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 $cmsPage
in meinem verwendete verwendet foreach ($cmsPageCollection as $cmsPage)
und es scheint tatsächlich $cmsPage
ein Array zu sein.
Ich habe mich in den Code vertieft:
\Magento\Cms\Api\PageRepositoryInterface::getList
wird implementiert von \Magento\Cms\Model\PageRepository::getList
.
Dann \Magento\Cms\Model\PageRepository::getList
kö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 $pages
Array auffüllt. Dieser Code kann also erklären, warum $cmsPage
es sich um ein Array handelt!
ABER...
Durch das Lesen der @return
Aussage von \Magento\Cms\Api\PageRepositoryInterface::getList
können wir sehen @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
Und wenn wir dann die @return
Aussage von lesen \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, können wir sehen \Magento\Cms\Api\Data\PageInterface[]
!
Das $cmsPage
in meiner foreach
Schleife sollte also eine Implementierung sein, an \Magento\Cms\Api\Data\PageInterface
die 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.
Antworten:
Sie können ein Fehlerproblem auf Github erstellen, wenn Sie möchten. Eine schnellere Möglichkeit für Sie ist jedoch die Verwendung des Ressourcenmodells oder die Verwendung dieser Repository-Methode deleteById (), bei der Sie die ID der Entität übergeben können.
vendor / magento / module-cms / Model / PageRepository.php
Repositorys sind nicht für den Massenbetrieb vorgesehen. Dies wirkt sich auf die Leistung aus.
quelle