Eu preciso excluir todas as páginas do CMS.
Aqui está o código:
espaço para nome Soon \ Core \ Setup;
use Magento \ Cms \ Api \ PageRepositoryInterface;
use Magento \ Framework \ Api \ SearchCriteriaInterface;
classe Cms
{
/ **
* @var SearchCriteriaInterface
* /
private $ searchCriteria;
/ **
* @var PageRepositoryInterface
* /
private $ cmsPageRepository;
/ **
* Construtor Cms.
* @param SearchCriteriaInterface $ searchCriteria
* @param PageRepositoryInterface $ cmsPageRepository
* /
função pública __construct (
SearchCriteriaInterface $ searchCriteria,
PageRepositoryInterface $ cmsPageRepository
)
{
$ this-> searchCriteria = $ searchCriteria;
$ this-> cmsPageRepository = $ cmsPageRepository;
}
/ **
* Exclua todas as páginas existentes do CMS
* /
função pública cleanCmsPages ()
{
$ cmsPageCollection = $ this-> cmsPageRepository
-> getList ($ this-> searchCriteria)
-> getItems ();
foreach ($ cmsPageCollection como $ cmsPage) {
$ this-> cmsPageRepository-> delete ($ cmsPage);
}
}
}
Portanto, a chamada \Soon\Core\Setup\Cms::cleanCmsPagesdeve excluir todas as páginas do CMS.
Mas ao fazer isso, recebo este erro:
Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given
Então eu joguei o $cmsPageusado no meu foreach ($cmsPageCollection as $cmsPage)e parece que, de fato, $cmsPageé uma matriz.
Eu procurei no código:
\Magento\Cms\Api\PageRepositoryInterface::getListé implementado por \Magento\Cms\Model\PageRepository::getList.
Então \Magento\Cms\Model\PageRepository::getList, podemos ver este pedaço de código:
$ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
$ pageData,
'Magento \ Cms \ Api \ Data \ PageInterface'
);
}
$ searchResults-> setItems ($ páginas);
Se eu estiver correto, esse código cria uma matriz que preenche a $pagesmatriz. Portanto, este código pode explicar por que $cmsPageé uma matriz!
MAS...
Ao ler a @returndeclaração de \Magento\Cms\Api\PageRepositoryInterface::getList, podemos ver @return \Magento\Cms\Api\Data\PageSearchResultsInterface.
E, então, lendo a @returndeclaração de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, podemos ver \Magento\Cms\Api\Data\PageInterface[]!
Portanto, o loop $cmsPageno meu foreachloop deve ser uma implementação da \Magento\Cms\Api\Data\PageInterfacequal pode ser passado corretamente para \Magento\Cms\Api\PageRepositoryInterface::delete.
Quem esta errado?
- Eu que não consigo ler / entender os comentários e códigos da @api corretamente
- Magento que se não dá o comentário certo em suas classes @api ... ou não implementa a interface como deveria.
Essa análise é para a API da página do CMS, mas também se aplica à API do bloco do CMS .