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::cleanCmsPagesdevrait 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 $cmsPageutilisé dans mon foreach ($cmsPageCollection as $cmsPage)et il semble que, en effet, $cmsPageest un tableau.
J'ai fouillé dans le code:
\Magento\Cms\Api\PageRepositoryInterface::getListest 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 $pagestableau. Donc, ce code peut expliquer pourquoi $cmsPageun tableau!
MAIS...
En lisant la @returndéclaration de \Magento\Cms\Api\PageRepositoryInterface::getList, nous pouvons voir @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
Et puis, en lisant la @returndéclaration de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, nous pouvons voir \Magento\Cms\Api\Data\PageInterface[]!
Donc, $cmsPagedans ma foreachboucle doit être une implémentation \Magento\Cms\Api\Data\PageInterfacequi 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 .