0

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
 ]);
 }
}
Muhammad Anas
1,4673 gold badges13 silver badges33 bronze badges
asked Mar 25, 2019 at 10:11
5
  • how are you passing the data, as a json? Commented Mar 25, 2019 at 10:30
  • magefms yes inline editor is suposed to do it in json as post, but when i do the getrequest on the controller i get nothing Commented Mar 25, 2019 at 10:39
  • have you tried $this->getRequest()->getPost() ? instead of getParam() Commented Mar 25, 2019 at 10:41
  • since you want to read data passed via POST method Commented Mar 25, 2019 at 10:42
  • Ive tried getPost and $postItems still empty Commented Mar 25, 2019 at 10:52

1 Answer 1

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
 ]);
 }
}
answered Mar 25, 2019 at 10:58
12
  • 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. Commented Mar 25, 2019 at 11:05
  • check updated answer Commented Mar 25, 2019 at 11:14
  • ive modified it but the xml estructure gives this error: Commented Mar 25, 2019 at 11:29
  • market_listing.xml" is invalid: Element 'item': This element is not expected. Line: 49 Commented Mar 25, 2019 at 11:29
  • after <settings> cant be a item or argument i think Commented Mar 25, 2019 at 11:30

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.