In creating a grid with editable columns by a inline editor; and the editor sends nothing to the controller i don't know where the problem is. Its appearing always: {"messages":["Please correct the data sent."],"error":true} cause the editor send a empty array to the controller i leave the code here:
listing.xml
<columns name="spinner_columns">
<settings>
<editorConfig>
<param name="selectProvider" xsi:type="string">test_market_listing.test_market_listing.spinner_columns.ids</param>
<param name="enabled" xsi:type="boolean">true</param>
<param name="indexField" xsi:type="string">entity_id</param>
<param name="clientConfig" xsi:type="array">
<item name="saveUrl" xsi:type="url" path="sellermania/market/inlineEdit"/>
<item name="validateBeforeSave" xsi:type="boolean">false</item>
</param>
</editorConfig>
<childDefaults>
<param name="fieldAction" xsi:type="array">
<item name="provider" xsi:type="string">test_market_listing.test_market_listing.spinner_columns_editor</item>
<item name="target" xsi:type="string">startEdit</item>
<item name="params" xsi:type="array">
<item name="0" xsi:type="string">${ $.$data.rowIndex }</item>
<item name="1" xsi:type="boolean">true</item>
</item>
</param>
</childDefaults>
</settings>
<selectionsColumn name="ids" sortOrder="10">
<settings>
<indexField>entity_id</indexField>
</settings>
</selectionsColumn>
<column name="entity_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">textRange</item>
<item name="sorting" xsi:type="string">asc</item>
<item name="label" xsi:type="string" translate="true">ID</item>
</item>
</argument>
</column>
<column name="code">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="editor" xsi:type="array">
<item name="editorType" xsi:type="string">text</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">false</item>
</item>
</item>
<item name="filter" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Code</item>
</item>
</argument>
</column>
<column name="store_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Store ID</item>
</item>
</argument>
</column>
</columns>
And here the controller code:
<?php
namespace test\test\Controller\Adminhtml\Market;
class InlineEdit extends \Magento\Backend\App\Action
{
protected $jsonFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $jsonFactory
) {
parent::__construct($context);
$this->jsonFactory = $jsonFactory;
}
public function execute()
{
$error = false;
$messages = [];
$resultJson = $this->jsonFactory->create();
$postItems = $this->getRequest()->getParam('items', []);
if (!($this->getRequest()->getParam('isAjax') && count($postItems))) {
return $resultJson->setData([
'messages' => [__('Please correct the data sent.')],
'error' => true,
]);
}
foreach (array_keys($postItems) as $modelid) {
$model = $this->_objectManager->create('test\test\Model\Marketplace')->load($modelid);
try {
$model->setData(array_merge($model->getData(), $postItems[$modelid]));
$model->save();
} catch (\Exception $e) {
$messages[] = "[Entity ID: {$modelid}] {$e->getMessage()}";
$error = true;
}
}
return $resultJson->setData([
'messages' => $messages,
'error' => $error
]);
}
}
1 Answer 1
Try this, use \Magento\Framework\App\Request\Http, and get post contents using its request instance injected in the constructor:
EDIT: Modify your listing.xml to be like this:
<columns name="spinner_columns">
<settings>
<item name="editorConfig" xsi:type="array">
<item name="selectProvider" xsi:type="string">test_market_listing.test_market_listing.spinner_columns.ids</item>
<item name="enabled" xsi:type="boolean">true</item>
<item name="indexField" xsi:type="string">entity_id</item>
<item name="clientConfig" xsi:type="array">
<item name="saveUrl" xsi:type="url" path="sellermania/market/inlineEdit"/>
<item name="validateBeforeSave" xsi:type="boolean">false</item>
</item>
</item>
<item name="childDefaults" xsi:type="array">
<item name="fieldAction" xsi:type="array">
<item name="provider" xsi:type="string">test_market_listing.test_market_listing.spinner_columns_editor</item>
<item name="target" xsi:type="string">startEdit</item>
<item name="params" xsi:type="array">
<item name="0" xsi:type="string">${ $.$data.rowIndex }</item>
<item name="1" xsi:type="boolean">true</item>
</item>
</item>
</item>
</settings>
<selectionsColumn name="ids" sortOrder="10">
<settings>
<indexField>entity_id</indexField>
</settings>
</selectionsColumn>
<column name="entity_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">textRange</item>
<item name="sorting" xsi:type="string">asc</item>
<item name="label" xsi:type="string" translate="true">ID</item>
</item>
</argument>
</column>
<column name="code">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="editor" xsi:type="array">
<item name="editorType" xsi:type="string">text</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">false</item>
</item>
</item>
<item name="filter" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Code</item>
</item>
</argument>
</column>
<column name="store_id">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="filter" xsi:type="string">text</item>
<item name="dataType" xsi:type="string">text</item>
<item name="label" xsi:type="string" translate="true">Store ID</item>
</item>
</argument>
</column>
</columns>
Controller:
<?php
namespace test\test\Controller\Adminhtml\Market;
class InlineEdit extends \Magento\Backend\App\Action
{
/** @var \Magento\Framework\App\Request\Http */
protected $request;
protected $jsonFactory;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\App\Request\Http $request,
\Magento\Framework\Controller\Result\JsonFactory $jsonFactory
) {
parent::__construct($context);
$this->request = $request;
$this->jsonFactory = $jsonFactory;
}
public function execute()
{
$error = false;
$messages = [];
$resultJson = $this->jsonFactory->create();
$postItems = $this->request->getContent();
$postData = json_decode($postItems);
if (isset($postData)) {
return $resultJson->setData([
'messages' => [__('Please correct the data sent.')],
'error' => true,
]);
}
foreach (array_keys($postData) as $modelid) {
$model = $this->_objectManager->create('test\test\Model\Marketplace')->load($modelid);
try {
$model->setData(array_merge($model->getData(), $postItems[$modelid]));
$model->save();
} catch (\Exception $e) {
$messages[] = "[Entity ID: {$modelid}] {$e->getMessage()}";
$error = true;
}
}
return $resultJson->setData([
'messages' => $messages,
'error' => $error
]);
}
}
-
Warning: array_keys() expects parameter 1 to be array, null given. So $postItems is still empty; dont know why im not getting the edit parameters of the column.Juan Alvarez– Juan Alvarez2019年03月25日 11:05:35 +00:00Commented Mar 25, 2019 at 11:05
-
check updated answerfmsthird– fmsthird2019年03月25日 11:14:56 +00:00Commented Mar 25, 2019 at 11:14
-
ive modified it but the xml estructure gives this error:Juan Alvarez– Juan Alvarez2019年03月25日 11:29:21 +00:00Commented Mar 25, 2019 at 11:29
-
market_listing.xml" is invalid: Element 'item': This element is not expected. Line: 49Juan Alvarez– Juan Alvarez2019年03月25日 11:29:31 +00:00Commented Mar 25, 2019 at 11:29
-
after <settings> cant be a item or argument i thinkJuan Alvarez– Juan Alvarez2019年03月25日 11:30:53 +00:00Commented Mar 25, 2019 at 11:30
$this->getRequest()->getPost()? instead ofgetParam()