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 .
Réponses:
Vous pouvez créer un problème de bogue sur github si vous le souhaitez. Mais le moyen le plus rapide pour vous est d'utiliser le modèle de ressource ou si vous voulez utiliser cette méthode de référentiel deleteById () où vous pouvez passer l'id de l'entité.
fournisseur / magento / module-cms / Model / PageRepository.php
Les référentiels ne sont pas destinés à un fonctionnement en bloc, cela affecte les performances.
la source