I metodi di repository getList () della pagina CMS di Magento 2 non restituiscono l'oggetto previsto


10

Devo eliminare tutte le pagine CMS.

Ecco il codice:

spazio dei nomi Presto \ Core \ Setup;

usa Magento \ Cms \ Api \ PageRepositoryInterface;
usa Magento \ Framework \ Api \ SearchCriteriaInterface;

classe Cms
{
    / **
     * @var SearchCriteriaInterface
     * /
    private $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    private $ cmsPageRepository;

    / **
     * Cms costruttore.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    funzione pubblica __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Elimina tutte le pagine CMS esistenti
     * /
    funzione pubblica cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> getList ($ this-> Criteri di ricerca)
            -> getItems ();

        foreach ($ cmsPageCollection come $ cmsPage) {
            $ This-> cmsPageRepository-> delete ($ cmsPage);
        }
    }
}

Pertanto, la chiamata \Soon\Core\Setup\Cms::cleanCmsPagesdovrebbe eliminare tutte le pagine CMS.

Ma quando lo faccio, ottengo questo errore:

Argument 1 passed to Magento\Cms\Model\PageRepository::delete() must implement interface Magento\Cms\Api\Data\PageInterface, array given

Quindi ho scaricato l' $cmsPageusato nel mio foreach ($cmsPageCollection as $cmsPage)e sembra che, in effetti, $cmsPagesia un array.

Ho scavato nel codice:

\Magento\Cms\Api\PageRepositoryInterface::getListè implementato da \Magento\Cms\Model\PageRepository::getList.

Quindi \Magento\Cms\Model\PageRepository::getList, possiamo vedere questo bit di codice:

            $ pages [] = $ this-> dataObjectProcessor-> buildOutputDataArray (
                $ PageData,
                'Magento \ Cms \ Api \ Data \ PageInterface'
            );
        }
        $ SearchResults-> setItems ($ pagine);

Se ho ragione, questo codice crea un array che popola l' $pagesarray. Quindi questo codice può spiegare perché $cmsPageè un array!

MA...

Leggendo la @returndichiarazione di \Magento\Cms\Api\PageRepositoryInterface::getList, possiamo vedere @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

E poi, leggendo la @returndichiarazione di \Magento\Cms\Api\Data\PageSearchResultsInterface::getItems, possiamo vedere \Magento\Cms\Api\Data\PageInterface[]!

Quindi $cmsPagenel mio foreachciclo dovrebbe essere un'implementazione di \Magento\Cms\Api\Data\PageInterfacecui quindi può essere passata correttamente \Magento\Cms\Api\PageRepositoryInterface::delete.

Chi ha torto?

  1. Io che non riesco a leggere / comprendere i commenti e il codice di @api correttamente
  2. Magento che se non dà il giusto commento nelle loro classi @api ... o non implementa l'interfaccia come dovrebbe.

Questa analisi è per l'API della pagina CMS ma si applica anche all'API del blocco CMS .


1
Sembra un bug, qualcuno l'ha segnalato di recente: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Risposte:


2

Se lo desideri, puoi creare un problema con i bug su github. Ma il modo più veloce per te è usare il modello di risorsa o se vuoi usare questo metodo di repository deleteById () dove puoi passare l'id dell'entità.

vendor / Magento / module-cms / Modello / PageRepository.php

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

I repository non sono destinati a operazioni in blocco, ciò influisce sulle prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.