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::cleanCmsPagesdeberí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 $cmsPageusado en mi foreach ($cmsPageCollection as $cmsPage)y parece que, de hecho, $cmsPagees una matriz.
Excavé el código:
\Magento\Cms\Api\PageRepositoryInterface::getListes 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 $pagesmatriz. ¡Entonces este código puede explicar por qué $cmsPagees una matriz!
PERO...
Al leer la @returndeclaración de \Magento\Cms\Api\PageRepositoryInterface::getList, podemos ver @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
Y, luego, leyendo la @returndeclaración de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, ¡podemos ver \Magento\Cms\Api\Data\PageInterface[]!
Entonces, $cmsPagein my foreachloop debería ser una implementación a la \Magento\Cms\Api\Data\PageInterfaceque 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