After fiddling around for a while i figured out that the data persister is the way to go.
Below is my data provider and save controller which demonstrated setting and getting the data persister.
<?php
namespace Blah\OrderResources\Model;
use Blah\OrderResources\Model\ResourceModel\OrderResources\CollectionFactory;
use Magento\Framework\App\Request\DataPersistorInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Registry;
class DataProvider extends \Magento\Ui\DataProvider\AbstractDataProvider
{
protected $collection;
/**
* @var DataPersistorInterface
*/
protected $dataPersistor;
/**
* @var array
*/
protected $loadedData;
protected $_requestInterface;
protected $_registry;
/**
* DataProvider constructor.
*
* @param string $name
* @param string $primaryFieldName
* @param string $requestFieldName
* @param CollectionFactory $resourcesCollectionFactory
* @param DataPersistorInterface $dataPersistor
* @param RequestInterface $requestInterface
* @param Registry $registry
* @param array $meta
* @param array $data
*/
public function __construct(
$name,
$primaryFieldName,
$requestFieldName,
CollectionFactory $resourcesCollectionFactory,
DataPersistorInterface $dataPersistor,
RequestInterface $requestInterface,
Registry $registry,
array $meta = [],
array $data = []
) {
$this->collection = $resourcesCollectionFactory->create();
$this->dataPersistor = $dataPersistor;
parent::__construct($name, $primaryFieldName, $requestFieldName, $meta, $data);
$this->_requestInterface = $requestInterface;
$this->_registry = $registry;
$this->meta = $this->prepareMeta($this->meta);
}
/**
* Prepares Meta
*
* @param array $meta
* @return array
*/
public function prepareMeta(array $meta)
{
return $meta;
}
/**
* Get data
*
* @return array
*/
public function getData()
{
if (isset($this->loadedData)) {
return $this->loadedData;
}
$this->dataPersistor->set('current_order_id', $this->_registry->registry(
'current_order_id'
));
return $this->loadedData;
}
}
Controller
<?php
namespace Blah\OrderResources\Controller\Adminhtml\Form;
use Magento\Backend\Model\Session;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Registry;
use Blah\OrderResources\Api\OrderResourcesRepositoryInterface;
use Blah\OrderResources\Api\Data\OrderResourcesInterface;
use Blah\OrderResources\Api\Data\OrderResourcesInterfaceFactory;
use Blah\OrderResources\Model\Uploader;
use Blah\OrderResources\Model\UploaderPool;
use Blah\OrderResources\Model\OrderResourcesFactory;
use Blah\OrderResources\Controller\Adminhtml\Form;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Backend\Model\View\Result\ForwardFactory;
use Magento\Framework\Stdlib\DateTime\Filter\Date;
use Magento\Framework\Reflection\DataObjectProcessor;
use Magento\Framework\Api\DataObjectHelper;
use Magento\Framework\App\Request\DataPersistorInterface;
class Save extends Form
{
/**
* @var DataObjectProcessor
*/
protected $_dataObjectProcessor;
/**
* @var \Magento\Framework\Api\DataObjectHelper
*/
protected $_dataObjectHelper;
/**
* @var UploaderPool
*/
protected $_uploaderPool;
protected $_dataPersistor;
public function __construct(
Context $context,
PageFactory $resultPageFactory,
ForwardFactory $resultForwardFactory,
OrderResourcesFactory $orderResourcesFactory,
OrderResourcesRepositoryInterface $orderResourcesRepository,
Registry $registry,
Date $dateFilter,
DataObjectProcessor $dataObjectProcessor,
DataObjectHelper $dataObjectHelper,
UploaderPool $uploaderPool,
DataPersistorInterface $dataPersistor
) {
$this->_orderResourcesFactory = $orderResourcesFactory;
$this->_dataObjectProcessor = $dataObjectProcessor;
$this->_dataObjectHelper = $dataObjectHelper;
$this->_uploaderPool = $uploaderPool;
$this->_dataPersistor = $dataPersistor;
parent::__construct(
$context, $resultPageFactory, $resultForwardFactory,
$orderResourcesFactory, $orderResourcesRepository, $registry
);
}
/**
* run the action
*
* @return \Magento\Backend\Model\View\Result\Redirect
*/
public function execute()
{
$orderResource = null;
$data = $this->getRequest()->getPostValue();
$orderId = $this->_dataPersistor->get('current_order_id');
$resultRedirect = $this->resultRedirectFactory->create();
try {
$orderResource = $this->_orderResourcesFactory->create();
$file = $this->getUploader('file')->uploadFileAndGetName('file', $data);
$data['path'] = $file;
$data['order_id'] = $orderId;
$data['resource_id'] = null;
$this->_dataObjectHelper->populateWithArray($orderResource, $data, OrderResourcesInterface::class);
$this->_orderResourcesRepository->save($orderResource);
$this->messageManager->addSuccessMessage(__('You saved the order resource'));
if ($this->getRequest()->getParam('back')) {
$resultRedirect->setPath('sales/order/view/', ['order_id' => $orderId]);
} else {
$resultRedirect->setPath('sales/order/view/',['order_id' => $orderId]);
}
} catch (LocalizedException $e) {
$this->messageManager->addErrorMessage($e->getMessage());
if ($orderResource != null) {
$this->storeOrderResourceDataToSession(
$this->_dataObjectProcessor->buildOutputDataArray(
$orderResource,
OrderResourcesInterface::class
)
);
}
$resultRedirect->setPath('sales/order/view/',['order_id' => $orderId]);
} catch (\Exception $e) {
echo $e->getMessage();
$this->messageManager->addErrorMessage(__('There was a problem saving the order resource'));
if ($orderResource != null) {
$this->storeOrderResourceDataToSession(
$this->_dataObjectProcessor->buildOutputDataArray(
$orderResource,
OrderResourcesInterface::class
)
);
}
$resultRedirect->setPath('sales/order/view/',['order_id' => $orderId]);
}
return $resultRedirect;
}
/**
* @param $type
* @return Uploader
* @throws \Exception
*/
protected function getUploader($type)
{
return $this->_uploaderPool->getUploader($type);
}
protected function storeOrderResourceDataToSession($orderResourceData)
{
$this->_getSession()->setOrderResourceData($orderResourceData);
}
}