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::cleanCmsPages
deve 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 $cmsPage
usado 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 $pages
matriz. Portanto, este código pode explicar por que $cmsPage
é uma matriz!
MAS...
Ao ler a @return
declaração de \Magento\Cms\Api\PageRepositoryInterface::getList
, podemos ver @return \Magento\Cms\Api\Data\PageSearchResultsInterface
.
E, então, lendo a @return
declaração de \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems
, podemos ver \Magento\Cms\Api\Data\PageInterface[]
!
Portanto, o loop $cmsPage
no meu foreach
loop deve ser uma implementação da \Magento\Cms\Api\Data\PageInterface
qual 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 .
Respostas:
Você pode criar um problema de bug no github, se quiser. Mas a maneira mais rápida para você é usar o modelo de recursos ou se você quiser usar este método de repositório deleteById (), no qual você pode passar o ID da entidade.
fornecedor / magento / module-cms / Model / PageRepository.php
Repositórios não são para operação em massa, isso afeta o desempenho.
fonte