Исключение в Magento2 во время действия MassDelete

У меня есть исключение, когда я выбрал несколько записей в сетке и пытается удалить их. Вот это исключение:

1 исключение (я): Исключение № 0 (InvalidArgumentException): Amiddio\News\Model\News не распространяется \Magento\Framework\DataObject

Версия Magento 2.1.8

Приложение \ код \ Amiddio \ Новости \ вид \adminhtml\ui_component\news_grid_listing.xml

<argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="sticky" xsi:type="boolean">true</item>
        </item>
    </argument>
    <massaction name="listing_massaction">
        <action name="delete">
            <argument name="data" xsi:type="array">
                <item name="config" xsi:type="array">
                    <item name="type" xsi:type="string">delete</item>
                    <item name="label" xsi:type="string" translate="true">Delete</item>
                    <item name="url" xsi:type="url" path="news/actions/massDelete"/>
                    <item name="confirm" xsi:type="array">
                        <item name="title" xsi:type="string" translate="true">Delete items</item>
                        <item name="message" xsi:type="string" translate="true">Are you sure you want to delete selected items?</item>
                    </item>
                </item>
            </argument>
        </action>
    </massaction>

Приложение \ код \ Amiddio \ Новости \ и т.д. \di.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
        <arguments>
            <argument name="collections" xsi:type="array">
                <item name="news_grid_listing_data_source" xsi:type="string">Amiddio\News\Model\ResourceModel\News\Grid\Collection</item>
            </argument>
        </arguments>
    </type>
</config>

Приложение \ код \ Amiddio \ Новости \ Model \ news.php

namespace Amiddio\News\Model;

use Magento\Framework\Model\AbstractModel;

class News extends AbstractModel
{

    protected function _construct()
    {
        $this->_init('Amiddio\News\Model\ResourceModel\News');
    }

}

Приложение \ код \ Amiddio \ Новости \Model\ResourceModel\ news.php

namespace Amiddio\News\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class News extends AbstractDb
{
    protected function _construct()
    {
        $this->_init('amiddio_news', 'news_id');
    }
}

Приложение \ код \ Amiddio \ Новости \Model\ResourceModel\ Новости \Collection.php

namespace Amiddio\News\Model\ResourceModel\News;

class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{

    protected function _construct()
    {
        $this->_init(' Amiddio\News\Model\News', 'Amiddio\News\Model\ResourceModel\News');
    }

}

Приложение \ код \ Amiddio \ Новости \Model\ResourceModel\ Новости \ Сетка \Collection.php

namespace Amiddio\News\Model\ResourceModel\News\Grid;

use Amiddio\News\Model\ResourceModel\News\Collection as GridCollection;
use Magento\Framework\Search\AggregationInterface;
use Magento\Framework\Api\Search\SearchResultInterface;
use Magento\Framework\View\Element\UiComponent\DataProvider\Document;
use Amiddio\News\Model\ResourceModel\News;
use Magento\Framework\Api\SearchCriteriaInterface;

class Collection extends GridCollection implements SearchResultInterface
{
    protected $aggregations;

    protected function _construct()
    {
        $this->_init(Document::class, News::class);
    }

    public function getAggregations()
    {
        return $this->aggregations;
    }

    public function setAggregations($aggregations)
    {
        $this->aggregations = $aggregations;
    }

    public function getAllIds($limit = null, $offset = null)
    {
        return $this->getConnection()->fetchCol($this->_getAllIdsSelect($limit, $offset), $this->_bindParams);
    }

    public function getSearchCriteria()
    {
        return null;
    }

    public function setSearchCriteria(SearchCriteriaInterface $searchCriteria = null)
    {
        return $this;
    }

    public function getTotalCount()
    {
        return $this->getSize();
    }

    public function setTotalCount($totalCount)
    {
        return $this;
    }

    public function setItems(array $items = null)
    {
        return $this;
    }
}

Приложение \ код \ Amiddio \ Новости \Controller\Adminhtml\ Действия \MassDelete.php

namespace Amiddio\News\Controller\Adminhtml\Actions;

use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Amiddio\News\Model\ResourceModel\News\CollectionFactory;

/**
 * Class MassDelete
 */
class MassDelete extends \Magento\Backend\App\Action
{
    /**
     * @var Filter
     */
    protected $filter;

    /**
     * @var CollectionFactory
     */
    protected $collectionFactory;

    /**
     * @param Context $context
     * @param Filter $filter
     * @param CollectionFactory $collectionFactory
     */
    public function __construct(Context $context, Filter $filter, CollectionFactory $collectionFactory)
    {
        $this->filter = $filter;
        $this->collectionFactory = $collectionFactory;

        parent::__construct($context);
    }

    /**
     * Execute action
     *
     * @return \Magento\Backend\Model\View\Result\Redirect
     * @throws \Magento\Framework\Exception\LocalizedException|\Exception
     */
    public function execute()
    {
        $collection = $this->filter->getCollection($this->collectionFactory->create());
        $collectionSize = $collection->getSize();

        foreach ($collection as $page) {
            $page->delete();
        }

        $this->messageManager->addSuccess(__('A total of %1 record(s) have been deleted.', $collectionSize));

        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        return $resultRedirect->setPath('news/index/');
    }
}

Я новичок в Magento 2, и я пытаюсь решить эту проблему уже несколько дней. Может быть, у кого-то была такая проблема, и он / она знает решение?!

Большое спасибо за любую помощь!

2 ответа

В вашей модели новостей (app\code\Amiddio\News\Model\News.php) ваш класс должен реализовывать IdentityInterface.

менять:

Класс Новости расширяет AbstractDb{ ...

чтобы:

использовать Magento\Framework\DataObject\IdentityInterface;

Класс News расширяет AbstractDb реализует IdentityInterface{ ....

Я нашел ошибку в моем коде. В файле "...ResourceModel\News\Collection.php" у меня есть место перед "Amiddio\News\Model\News".

Проблема решена.

Другие вопросы по тегам