Magento 2 CMS Sayfa getList () veri havuzu yöntemleri beklenen nesneyi döndürmüyor


10

Tüm CMS sayfalarını silmem gerekiyor.

İşte kod:

ad alanı Yakında \ Core \ Setup;

Magento \ Cms \ Api \ PageRepositoryInterface kullanın;
Magento \ Framework \ Api \ SearchCriteriaInterface kullanın;

Cms sınıfı
{
    / **
     * @var SearchCriteriaInterface
     * /
    private $ searchCriteria;
    / **
     * @var PageRepositoryInterface
     * /
    private $ cmsPageRepository;

    / **
     * Cms yapıcı.
     * @param SearchCriteriaInterface $ searchCriteria
     * @param PageRepositoryInterface $ cmsPageRepository
     * /
    kamu işlevi __construct (
        SearchCriteriaInterface $ searchCriteria,
        PageRepositoryInterface $ cmsPageRepository
    )
    {
        $ this-> searchCriteria = $ searchCriteria;
        $ this-> cmsPageRepository = $ cmsPageRepository;
    }

    / **
     * Mevcut tüm CMS sayfalarını silin
     * /
    genel işlev cleanCmsPages ()
    {
        $ cmsPageCollection = $ this-> cmsPageRepository
            -> GetList ($ this-> searchCriteria)
            -> getItems ();

        foreach ($ cmsPageCollection $ $ cmsPage olarak) {
            $ This-> cmsPageRepository-> silmek ($ cmsPage);
        }
    }
}

Bu nedenle, arama \Soon\Core\Setup\Cms::cleanCmsPagestüm CMS sayfalarını silmelidir.

Ancak bunu yaparken şu hatayı alıyorum:

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

Bu yüzden $cmsPagekullanılan benim terk ve foreach ($cmsPageCollection as $cmsPage)gerçekten $cmsPagebir dizi gibi görünüyor .

Ben kodu kazdık:

\Magento\Cms\Api\PageRepositoryInterface::getListtarafından uygulanmaktadır \Magento\Cms\Model\PageRepository::getList.

Sonra \Magento\Cms\Model\PageRepository::getList, bu kod parçasını görebiliriz:

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

Doğruysam, bu kod diziyi dolduran bir dizi oluşturur $pages. Yani bu kod neden $cmsPagebir dizi olduğunu açıklayabilir !

FAKAT...

Okuyarak @returntablosu \Magento\Cms\Api\PageRepositoryInterface::getListgörebiliriz @return \Magento\Cms\Api\Data\PageSearchResultsInterface.

Ve sonra @returnifadesini okuyarak \Magento\Cms\Api\Data\PageSearchResultsInterface::getItemsgörebiliriz \Magento\Cms\Api\Data\PageInterface[]!

Böylece $cmsPagebenim foreachdöngü içinde \Magento\Cms\Api\Data\PageInterfacedaha sonra düzgün bir şekilde geçirilebilir bir uygulama olmalıdır \Magento\Cms\Api\PageRepositoryInterface::delete.

Kim yanlış?

  1. @Api yorumları ve kodunu düzgün okuyamayan / anlayamayan ben
  2. @Api sınıflarında doğru yorumu vermeyen ya da arayüzü gerektiği gibi uygulamayan Magento.

Bu analiz CMS Sayfa API'sı içindir, ancak CMS Blok API'sı için de geçerlidir .


1
Hata gibi görünüyor, birisi yakın zamanda bildirdi: github.com/magento/magento2/issues/7140
Wojtek Naruniec

Yanıtlar:


2

İsterseniz github'da hata sorunu oluşturabilirsiniz. Ancak sizin için daha hızlı bir yol, kaynak modelini kullanmak veya varlık kimliğini iletebileceğiniz deleteById () depo yöntemini kullanmaktır.

satıcı / Magento / modül cm / Modeli / PageRepository.php

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

Depolar toplu işlem için değildir, bu performansı etkiler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.