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::cleanCmsPages
dovrebbe 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' $cmsPage
usato nel mio foreach ($cmsPageCollection as $cmsPage)
e sembra che, in effetti, $cmsPage
sia 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' $pages
array. Quindi questo codice può spiegare perché $cmsPage
è un array!
MA...
Leggendo la @return
dichiarazione di \Magento\Cms\Api\PageRepositoryInterface::getList
, possiamo vedere @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
E poi, leggendo la @return
dichiarazione di \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, possiamo vedere \Magento\Cms\Api\Data\PageInterface[]
!
Quindi $cmsPage
nel mio foreach
ciclo dovrebbe essere un'implementazione di \Magento\Cms\Api\Data\PageInterface
cui 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 .