Magento 2: Массовое удаление PHP-кода не работает
Я очень новичок в Magento
, я создал массовое действие для удаления, в котором я пишу этот код /EC/Downloads/view/adminhtml/ui_component/ec_downloads_items.xml
<?xml version="1.0"?>
<listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<listingToolbar name="listing_top">
<settings>
<sticky>true</sticky>
</settings>
<paging name="listing_paging"/>
<filters name="listing_filters"/>
<massaction name="listing_massaction">
<action name="delete">
<settings>
<confirm>
<message translate="true">Delete selected items?</message>
<title translate="true">Delete items</title>
</confirm>
<url path="*/items/MassDelete"/>
<type>delete</type>
<label translate="true">Delete</label>
</settings>
</action>
</massaction>
</listingToolbar>
<columns name="ec_downloads_items_columns">
<selectionsColumn name="ids">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="resizeEnabled" xsi:type="boolean">false</item>
<item name="resizeDefaultWidth" xsi:type="string">55</item>
<item name="indexField" xsi:type="string">downloads_id</item>
<item name="sortOrder" xsi:type="number">10</item>
</item>
</argument>
</selectionsColumn>
<column name="downloads_id">.......</column>
</columns>
</listing>
И этот код в /EC/Downloads/Controller/Adminhtml/Items/MassDelete.php
<?php
namespace EC\Downloads\Controller\Adminhtml\Items;
use Magento\Backend\App\Action;
/**
* Class MassDelete
*/
class MassDelete extends \Magento\Backend\App\Action
{
/**
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function execute()
{
$ids = $this->getRequest()->getParam('downloads_id');
echo $ids;
exit;
if (!is_array($ids) || empty($ids)) {
echo 'Bad';
exit;
$this->messageManager->addError(__('Please select Item.'));
} else {
echo 'Good';
exit;
try {
foreach ($ids as $id) {
$emp = $this->_objectManager->get('EC\Downloads\Model\Downloads')->load($id);
$emp->delete();
}
$this->messageManager->addSuccess(
__('A total of %1 record(s) have been deleted.', count($ids))
);
} catch (\Exception $e) {
$this->messageManager->addError($e->getMessage());
}
}
return $this->resultRedirectFactory->create()->setPath('downloads/index/items');
}
}
Код в /EC/Downloads/Model/ResourceModel/Items.php
<?php
namespace EC\Downloads\Model\ResourceModel;
/**
* Class Items
* @package EC\Downloads\Model\ResourceModel
*/
class Items extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
/**
*
*/
protected function _construct()
{
$this->_init('downloads', 'downloads_id');
}
}
Когда я пытаюсь удалить больше элементов, это не работает, когда я пытаюсь echo|exit
, я обнаружил, что не могу перейти к части удаления, потому что ids
пуста.
4 answers
Все работает нормально. Попробуйте это
Форма компонента пользовательского интерфейса
<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="router_name/index/massdelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete</item>
<item name="message" xsi:type="string" translate="true">Do you want to delete selected row record?</item>
</item>
</item>
</argument>
</action>
Контроллер
<?php
namespace EC\Downloads\Controller\Adminhtml\Index;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use EC\Downloads\Model\ResourceModel\Post\CollectionFactory;
class MassDelete extends \Magento\Backend\App\Action
{
protected $_filter;
protected $serviceFactory;
public function __construct(
Context $context,
Filter $filter,
\EC\Downloads\Model\DownloadsFactory $serviceFactory,
CollectionFactory $collectionFactory
) {
$this->_filter = $filter;
$this->collectionFactory = $collectionFactory;
$this->serviceFactory = $serviceFactory;
parent::__construct($context);
}
public function execute()
{
$collection = $this->_filter->getCollection($this->collectionFactory->create());
$collectionSize = $collection->getSize();
foreach ($collection as $item)
{
$item = $this->serviceFactory->create()->load($item->getDownloadsId());
$item->delete();
}
$this->messageManager->addSuccess(__('A total of %1 element(s) have been deleted.', $collectionSize));
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('downloads/index/items');
}
}
Примечание: КОД ПРОТЕСТИРОВАН
Есть ли в вашей коллекции моделей ресурсов определенный ключ?
namespace Xigen\Data\Model\ResourceModel\Fitment;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
/**
* @var string
*/
protected $_idFieldName = 'fitment_id';
/**
* Define resource model
*
* @return void
*/
protected function _construct()
{
$this->_init(
\Xigen\Data\Model\Fitment::class,
\Xigen\Data\Model\ResourceModel\Fitment::class
);
}
}
Просто для справки вот мой MassDelete.php
namespace Xigen\Data\Controller\Adminhtml\Fitment;
/**
* Mass-Delete Controller.
*/
class MassDelete extends \Magento\Backend\App\Action
{
const ADMIN_RESOURCE = 'Xigen_Data::import';
private $filter;
private $collectionFactory;
/**
* MassDelete constructor.
*
* @param \Magento\Backend\App\Action\Context $context
* @param \Magento\Ui\Component\MassAction\Filter $filter
* @param \Xigen\Data\Model\ResourceModel\Import\CollectionFactory $collectionFactory
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Ui\Component\MassAction\Filter $filter,
\Xigen\Data\Model\ResourceModel\Fitment\CollectionFactory $collectionFactory,
\Xigen\Data\Model\FitmentFactory $fitmentFactory
) {
$this->filter = $filter;
$this->fitmentFactory = $fitmentFactory;
parent::__construct($context);
}
/**
* Execute action.
*
* @return \Magento\Backend\Model\View\Result\Redirect
* @throws \Magento\Framework\Exception\LocalizedException|\Exception
*/
public function execute()
{
$ids = $this->getRequest()->getPost('selected');
if ($ids) {
$collection = $this->fitmentFactory->create()
->getCollection()
->addFieldToFilter('fitment_id', array('in' => $ids));
$collectionSize = $collection->getSize();
$deletedItems = 0;
foreach ($collection as $item) {
try {
$item->delete();
$deletedItems++;
} catch (\Exception $e) {
$this->messageManager->addErrorMessage($e->getMessage());
}
}
if ($deletedItems != 0) {
if ($collectionSize != $deletedItems) {
$this->messageManager->addErrorMessage(
__('Failed to delete %1 fitment item(s).', $collectionSize - $deletedItems)
);
}
$this->messageManager->addSuccessMessage(
__('A total of %1 fitment item(s) have been deleted.', $deletedItems)
);
}
}
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('*/*/');
}
}
Просто для справки, это мой код xml-файла с перечислением ui_component.
<listingToolbar name="listing_top">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="sticky" xsi:type="boolean">true</item>
</item>
</argument>
<bookmark name="bookmarks"/>
<columnsControls name="columns_controls"/>
<filters name="listing_filters"/>
<massaction name="listing_massaction">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="component" xsi:type="string">Magento_Ui/js/grid/tree-massactions</item>
</item>
</argument>
<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="bannerslider/banner/massDelete"/>
<item name="confirm" xsi:type="array">
<item name="title" xsi:type="string" translate="true">Delete Slider</item>
<item name="message" xsi:type="string" translate="true">Are you sure you wan't to delete selected Banners?</item>
</item>
</item>
</argument>
</action>
</massaction>
<paging name="listing_paging"/>
</listingToolbar>
И это контроллер массового удаления.
<?php
namespace A\BannerSlider\Controller\Adminhtml\Banner;
use Magento\Backend\App\Action;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use A\BannerSlider\Model\ResourceModel\Banner\CollectionFactory;
class MassDelete extends Action
{
protected $filter;
protected $collectionFactory;
public function __construct(
Filter $filter,
CollectionFactory $collectionFactory,
Context $context
) {
$this->filter = $filter;
$this->collectionFactory = $collectionFactory;
parent::__construct($context);
}
public function execute()
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
$delete = 0;
foreach ($collection as $item) {
$item->delete();
$delete++;
}
$this->messageManager->addSuccess(__('A total of %1 record(s) have been deleted.', $delete));
$resultRedirect = $this->resultFactory->create(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('*/*/');
}
}
Вставьте свой MassDelete.php с нижеприведенным:
<?php
namespace EC\Downloads\Controller\Adminhtml\Items;
use Magento\Backend\App\Action;
/**
* Class MassDelete
*/
class MassDelete extends \Magento\Backend\App\Action
{
/**
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Ui\Component\MassAction\Filter $filter,
\EC\Downloads\Model\ResourceModel\Items\CollectionFactory $collectionFactory,
\EC\Downloads\Model\ItemFactory $itemFactory
) {
$this->filter = $filter;
$this->itemFactory = $itemFactory;
parent::__construct($context);
}
public function execute()
{
$ids = $this->getRequest()->getPost();
if ($ids) {
$collection = $this->itemFactory->create()
->getCollection()
->addFieldToFilter('downloads_id', array('in' => $ids));
$collectionSize = $collection->getSize();
$deletedItems = 0;
foreach ($collection as $item) {
try {
$item->delete();
$deletedItems++;
} catch (\Exception $e) {
$this->messageManager->addErrorMessage($e->getMessage());
}
}
if ($deletedItems != 0) {
if ($collectionSize != $deletedItems) {
$this->messageManager->addErrorMessage(
__('Failed to delete %1 fitment item(s).', $collectionSize - $deletedItems)
);
}
$this->messageManager->addSuccessMessage(
__('A total of %1 fitment item(s) have been deleted.', $deletedItems)
);
}
}
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('downloads/index/items');
}
}