Devo eliminare tutte le pagine CMS.
Ecco il codice:
spazio dei nomi Presto \ Core \ Setup;
usa Magento \ Cms \ Api \ PageRepositoryInterface;
usa Magento \ Framework \ Api \ SearchCriteriaInterface;
classe Cms
{
/ **
* @var SearchCriteriaInterface
* /
private $ searchCriteria;
/ **
* @var PageRepositoryInterface
* /
private $ cmsPageRepository;
/ **
* Cms costruttore.
* @param SearchCriteriaInterface $ searchCriteria
* @param PageRepositoryInterface $ cmsPageRepository
* /
funzione pubblica __construct (
SearchCriteriaInterface $ searchCriteria,
PageRepositoryInterface $ cmsPageRepository
)
{
$ this-> searchCriteria = $ searchCriteria;
$ this-> cmsPageRepository = $ cmsPageRepository;
}
/ **
* Elimina tutte le pagine CMS esistenti
* /
funzione pubblica cleanCmsPages ()
{
$ cmsPageCollection = $ this-> cmsPageRepository
-> getList ($ this-> Criteri di ricerca)
-> getItems ();
foreach ($ cmsPageCollection come $ cmsPage) {
$ This-> cmsPageRepository-> delete ($ cmsPage);
}
}
}
Pertanto, la chiamata \Soon\Core\Setup\Cms::cleanCmsPagesdovrebbe eliminare tutte le pagine CMS.
Ma quando lo faccio, ottengo questo errore:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Quindi ho scaricato l' $cmsPageusato nel mio foreach ($cmsPageCollection as $cmsPage)e sembra che, in effetti, $cmsPagesia un array.
Ho scavato nel codice:
\Magento\Cms\Api\PageRepositoryInterface::getListè implementato da \Magento\Cms\Model\PageRepository::getList.
Quindi \Magento\Cms\Model\PageRepository::getList, possiamo vedere questo bit di codice:
$ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
$ PageData,
'Magento \ Cms \ Api \ Data \ PageInterface'
);
}
$ SearchResults-> setItems ($ pagine);
Se ho ragione, questo codice crea un array che popola l' $pagesarray. Quindi questo codice può spiegare perché $cmsPageè un array!
MA...
Leggendo la @returndichiarazione di \Magento\Cms\Api\PageRepositoryInterface::getList, possiamo vedere @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
E poi, leggendo la @returndichiarazione di \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, possiamo vedere \Magento\Cms\Api\Data\PageInterface[]!
Quindi $cmsPagenel mio foreachciclo dovrebbe essere un'implementazione di \Magento\Cms\Api\Data\PageInterfacecui quindi può essere passata correttamente \Magento\Cms\Api\PageRepositoryInterface::delete.
Chi ha torto?
- Io che non riesco a leggere / comprendere i commenti e il codice di @api correttamente
- Magento che se non dà il giusto commento nelle loro classi @api ... o non implementa l'interfaccia come dovrebbe.
Questa analisi è per l'API della pagina CMS ma si applica anche all'API del blocco CMS .