I added a custom mass action to the shipments grid for sending multiple tracking emails at once and the collection part is throwing an error, because I must be missing something.
For reference, I looked at the Magento\Cms\Controller\Adminhtml\Page\MassDisable
class.
So I came up with this:
/app/code/PerunPro/DPD/Controller/Adminhtml/Shipment/MassSendTracking.php
<?php
namespace PerunPro\DPD\Controller\Adminhtml\Shipment;
use Magento\Backend\App\Action\Context;
use Magento\Framework\Controller\ResultFactory;
use Magento\Sales\Api\ShipmentManagementInterface;
use Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory;
use Magento\Ui\Component\MassAction\Filter;
class MassSendTracking extends \Magento\Backend\App\Action
{
/**
* Authorization level of a basic admin session
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Magento_Sales::shipment';
/**
* @var Filter
*/
protected $filter;
/**
* @var CollectionFactory
*/
protected $collectionFactory;
protected $shipmentManagement;
public function __construct(
Context $context,
Filter $filter,
CollectionFactory $collectionFactory,
ShipmentManagementInterface $shipmentManagement
) {
$this->filter = $filter;
$this->collectionFactory = $collectionFactory;
$this->shipmentManagement = $shipmentManagement;
parent::__construct($context);
}
public function execute()
{
$collection = $this->filter->getCollection($this->collectionFactory->create());
// Do stuff
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
return $resultRedirect->setPath('*/*/');
}
}
When I submit the request, I get the following error:
Fatal error: Uncaught TypeError: Argument 2 passed to Magento\Framework\View\Element\UiComponentFactory::argumentsResolver() must be of the type array, null given, called in /var/www/magento/v2_2/vendor/magento/framework/View/Element/UiComponentFactory.php on line 198 and defined in /var/www/magento/v2_2/vendor/magento/framework/View/Element/UiComponentFactory.php on line 164
I am guessing I am missing some stuff in di.xml, because Magento\Sales\Model\ResourceModel\Order\Shipment\CollectionFactory
does not exist, but so doesn't Magento\Cms\Model\ResourceModel\Page\CollectionFactory
which is in Page\MassDisable.
The CMS di.xml has this about it:
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="cms_page_listing_data_source" xsi:type="string">Magento\Cms\Model\ResourceModel\Page\Grid\Collection</item>
<item name="cms_block_listing_data_source" xsi:type="string">Magento\Cms\Model\ResourceModel\Block\Grid\Collection</item>
</argument>
</arguments>
</type>
So I tried with with a wild guess in my own di.xml:
<type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory">
<arguments>
<argument name="collections" xsi:type="array">
<item name="sales_order_shipment_grid_data_source" xsi:type="string">Magento\Sales\Model\ResourceModel\Order\Shipment\Grid\Collection</item>
</argument>
</arguments>
</type>
Which of course has no effect :) Please help.
My module.xml sequence, I thought it would mean it also loads the XML grid info but clearly it doesn't
<sequence>
<module name="Magento_Sales"/>
<module name="Magento_Shipping"/>
</sequence>