Necesito eliminar todas las páginas de CMS.
Aquí está el código:
espacio de nombres Soon \ Core \ Setup; use Magento \ Cms \ Api \ PageRepositoryInterface; use Magento \ Framework \ Api \ SearchCriteriaInterface; clase Cms { / ** * @var SearchCriteriaInterface * / private $ searchCriteria; / ** * @var PageRepositoryInterface * / private $ cmsPageRepository; / ** * Constructor de cms. * @param SearchCriteriaInterface $ searchCriteria * @param PageRepositoryInterface $ cmsPageRepository * / función pública __construct ( SearchCriteriaInterface $ searchCriteria, PageRepositoryInterface $ cmsPageRepository ) { $ this-> searchCriteria = $ searchCriteria; $ this-> cmsPageRepository = $ cmsPageRepository; } / ** * Eliminar todas las páginas CMS existentes * / función pública cleanCmsPages () { $ cmsPageCollection = $ this-> cmsPageRepository -> getList ($ this-> searchCriteria) -> getItems (); foreach ($ cmsPageCollection como $ cmsPage) { $ this-> cmsPageRepository-> delete ($ cmsPage); } } }
Por lo tanto, las llamadas \Soon\Core\Setup\Cms::cleanCmsPages
deberían eliminar todas las páginas de CMS.
Pero al hacerlo, me sale este error:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Entonces dejé el $cmsPage
usado en mi foreach ($cmsPageCollection as $cmsPage)
y parece que, de hecho, $cmsPage
es una matriz.
Excavé el código:
\Magento\Cms\Api\PageRepositoryInterface::getList
es implementado por \Magento\Cms\Model\PageRepository::getList
.
Luego \Magento\Cms\Model\PageRepository::getList
, podemos ver este bit de código:
$ páginas [] = $ this-> dataObjectProcessor-> buildOutputDataArray ( $ pageData, 'Magento \ Cms \ Api \ Data \ PageInterface' ); } $ searchResults-> setItems ($ páginas);
Si estoy en lo correcto, este código crea una matriz que llena la $pages
matriz. ¡Entonces este código puede explicar por qué $cmsPage
es una matriz!
PERO...
Al leer la @return
declaración de \Magento\Cms\Api\PageRepositoryInterface::getList
, podemos ver @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
Y, luego, leyendo la @return
declaración de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, ¡podemos ver \Magento\Cms\Api\Data\PageInterface[]
!
Entonces, $cmsPage
in my foreach
loop debería ser una implementación a la \Magento\Cms\Api\Data\PageInterface
que luego se pueda pasar correctamente \Magento\Cms\Api\PageRepositoryInterface::delete
.
Quien esta equivocado
- Yo que no puedo leer / entender los comentarios y el código de @api correctamente
- Magento que si no da el comentario correcto en sus clases @api ... o no implementa la interfaz como debería.
Este análisis es para la API de página de CMS, pero también se aplica a la API de bloque de CMS .
Respuestas:
Puede crear un problema de error en github si lo desea. Pero la forma más rápida para usted es usar el modelo de recursos o si desea usar este método de repositorio deleteById () donde puede pasar la identificación de la entidad.
vendor / magento / module-cms / Model / PageRepository.php
Los repositorios no son para operación masiva, esto afecta el rendimiento.
fuente