1

I'm very new to Magento, i created a Mass Action for Delete i write this code in /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>

and this code in /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');
 }
}

code in /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');
 }
}

When i try to delete more items it's not working, when i try to echo|exit, i found that i dosen't go to the delete part coz ids is empty.

asked May 21, 2019 at 12:15
6
  • Can you please add more code of ui_component xml file? Commented May 21, 2019 at 12:22
  • @KazimNoorani Updated.... Commented May 21, 2019 at 12:27
  • Please check my answer. Might help you. Commented May 21, 2019 at 12:32
  • Is it helpful ? Commented May 21, 2019 at 12:38
  • I can't see the <item> tag name provider and <dataSource> tag process and make the UI component work with this data. Commented May 22, 2019 at 9:33

4 Answers 4

0

It's working fine. Try this

UI component Form

 <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>

Controller

<?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');
 } 
}

Note: CODE TESTED

answered May 22, 2019 at 7:08
5
  • Getting this error: Exception #0 (Zend_Db_Statement_Exception): SQLSTATE[42S22]: Column not found: 1054 Unknown column '' in 'where clause', query was: SELECT COUNT(*) FROM downloads AS main_table WHERE (`` IN('7')) Exception #1 (PDOException): SQLSTATE[42S22]: Column not found: 1054 Unknown column '' in 'where clause' @ARUNPRABAKARANM Commented May 22, 2019 at 11:11
  • 2
    Yeah I need to add this line in Model\ResourceModel\Module\Collection.php ... protected $_idFieldName = 'downloads_id'; Commented May 22, 2019 at 11:27
  • Did you get an error till now? Commented May 22, 2019 at 14:02
  • Yes bro...! no doubt .... :) Commented May 24, 2019 at 9:51
  • Bro @ARUNPRABAKARANM please help me out magento.stackexchange.com/questions/276387/… Commented May 28, 2019 at 13:51
0

Does your resourceModel collection have a key defined?


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
 );
 }
}

Just for reference here is my 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('*/*/');
 }
}
answered May 21, 2019 at 12:20
2
  • Question updated with RersourceModel @DominicXigen Commented May 21, 2019 at 12:22
  • coulden't understand this.... ! Commented May 21, 2019 at 12:29
0

Just for reference, this is my code of ui_component listing xml file.

<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>

And this is massDelete Controller.

<?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('*/*/');
 }
}
answered May 21, 2019 at 12:30
0

Paste your MassDelete.php with below one:

 <?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');
 }
 }
answered May 21, 2019 at 12:41
5
  • not working.... Commented May 21, 2019 at 12:55
  • ->addFieldToFilter('downloads_id', array('in' => $ids)); getting error in this line... Commented May 21, 2019 at 12:55
  • Exception #0 (Exception): Warning: PDO::quote() expects parameter 1 to be string, object given in /var/www/html/mg.local/vendor/magento/zendframework1/library/Zend/Db/Adapter/Pdo/Abstract.php on line 296 Commented May 21, 2019 at 12:56
  • Are you getting $ids? Commented May 21, 2019 at 13:00
  • yes... like this: id => 1 and 3: Zend\Stdlib\Parameters Object ( [storage:ArrayObject:private] => Array ( [selected] => Array ( [0] => 1 [1] => 3 ) [filters] => Array ( [placeholder] => true ) [namespace] => ec_downloads_items [form_key] => TfQNKpKNTlflHLwE ) ) Commented May 21, 2019 at 13:07

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.