Los métodos del repositorio getList () de la página CMS de Magento 2 no devuelven el objeto esperado

10

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

  1. Yo que no puedo leer / entender los comentarios y el código de @api correctamente
  2. 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 .

Hervé Guétin
fuente
1
Parece un error, alguien lo informó recientemente: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Respuestas:

2

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

public function deleteById($pageId)
{
    return $this->delete($this->getById($pageId));
}

Los repositorios no son para operación masiva, esto afecta el rendimiento.

Саша Осадчий
fuente