J'ai besoin de supprimer toutes les pages CMS.
Voici le code:
espace de noms Soon \ Core \ Setup; utilisez Magento \ Cms \ Api \ PageRepositoryInterface; utilisez Magento \ Framework \ Api \ SearchCriteriaInterface; classe Cms { / ** * @var SearchCriteriaInterface * / private $ searchCriteria; / ** * @var PageRepositoryInterface * / private $ cmsPageRepository; / ** * Constructeur Cms. * @param SearchCriteriaInterface $ searchCriteria * @param PageRepositoryInterface $ cmsPageRepository * / fonction publique __construct ( SearchCriteriaInterface $ searchCriteria, PageRepositoryInterface $ cmsPageRepository ) { $ this-> searchCriteria = $ searchCriteria; $ this-> cmsPageRepository = $ cmsPageRepository; } / ** * Supprimer toutes les pages CMS existantes * / fonction publique cleanCmsPages () { $ cmsPageCollection = $ this-> cmsPageRepository -> getList ($ this-> searchCriteria) -> getItems (); foreach ($ cmsPageCollection as $ cmsPage) { $ this-> cmsPageRepository-> delete ($ cmsPage); } } }
Ainsi, l'appel \Soon\Core\Setup\Cms::cleanCmsPages
devrait supprimer toutes les pages CMS.
Mais ce faisant, j'obtiens cette erreur:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
J'ai donc vidé le $cmsPage
utilisé dans mon foreach ($cmsPageCollection as $cmsPage)
et il semble que, en effet, $cmsPage
est un tableau.
J'ai fouillé dans le code:
\Magento\Cms\Api\PageRepositoryInterface::getList
est implémenté par \Magento\Cms\Model\PageRepository::getList
.
Ensuite \Magento\Cms\Model\PageRepository::getList
, nous pouvons voir ce morceau de code:
$ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray ( $ pageData, 'Magento \ Cms \ Api \ Data \ PageInterface' ); } $ searchResults-> setItems ($ pages);
Si j'ai raison, ce code crée un tableau qui remplit le $pages
tableau. Donc, ce code peut expliquer pourquoi $cmsPage
un tableau!
MAIS...
En lisant la @return
déclaration de \Magento\Cms\Api\PageRepositoryInterface::getList
, nous pouvons voir @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
Et puis, en lisant la @return
déclaration de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, nous pouvons voir \Magento\Cms\Api\Data\PageInterface[]
!
Donc, $cmsPage
dans ma foreach
boucle doit être une implémentation \Magento\Cms\Api\Data\PageInterface
qui peut ensuite être correctement transmise à \Magento\Cms\Api\PageRepositoryInterface::delete
.
Qui a tort?
- Moi qui ne peux pas lire / comprendre correctement les commentaires et le code @api
- Magento qui ne donne pas le bon commentaire dans ses classes @api ... ou n'implémente pas l'interface comme il se doit.
Cette analyse concerne l'API CMS Page, mais s'applique également à l' API CMS Block .