How can i create table in system.xml file is there any way? I had searched around but can't find any solution
want to create like this
Magento Stack Exchange is a question and answer site for users of the Magento e-Commerce platform. It only takes a minute to sign up.
Sign up to join this communityHow can i create table in system.xml file is there any way? I had searched around but can't find any solution
want to create like this
Try like this:
In your system.xml
file:
<group id="your_id" translate="label" type="text" sortOrder="500" showInDefault="1" showInWebsite="1" showInStore="1">
<label>My Label</label>
<field id="id_name" translate="label" sortOrder="410" showInDefault="1" showInWebsite="1" showInStore="1">
<label>Sub Label</label>
<frontend_model>NameSpace\ModuleName\Block\Adminhtml\System\Config\MyClass</frontend_model>
<backend_model>NameSpace\ModuleName\Model\Config\Backend\MyClass</backend_model>
</field>
</group>
Explanation:
NameSpace\ModuleName\Block\Adminhtml\System\Config\MyClass
is responsible for showing you the table as you desire.
NameSpace\ModuleName\Model\Config\Backend\MyClass
is responsible to fill the data or save the data.
Now:
NameSpace\ModuleName\Block\Adminhtml\System\Config\MyClass.php
:
<?php
namespace NameSpace\ModuleName\Block\Adminhtml\System\Config;
class MyClass extends \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
{
/**
* Prepare to render
*
* @return void
*/
protected function _prepareToRender()
{
$this->addColumn('my_column', ['label' => __('Column 1')]);
$this->addColumn('my_column_two', ['label' => __('Column 2')]);
$this->_addAfter = false;
$this->_addButtonLabel = __('Add Tab');
}
}
NameSpace\ModuleName\Model\Config\Backend\MyClass.php
:
<?php
namespace NameSpace\ModuleName\Model\Config\Backend;
class MyClass extends \Magento\Framework\App\Config\Value
{
/**
* Process data after load
*
* @return void
*/
protected function _afterLoad()
{
$value = $this->getValue();
$arr = unserialize($value);
$this->setValue($arr);
}
/**
* Prepare data before save
*
* @return void
*/
public function beforeSave()
{
$value = $this->getValue();
unset($value['__empty']);
$arr = serialize($value);
$this->setValue($arr);
}
}
UPDATE
According to the comments below, you may also use this:
<backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
instead of
<backend_model>NameSpace\ModuleName\Model\Config\Backend\MyClass</backend_model>
$this->getValue();
is not giving you right value. You should log that value and check if the value is serializable.
May 8, 2019 at 6:12
After looking all files and errors this works for me combining two solutions in to one
System.xml
file
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<tab id="wheelslicing" translate="label" sortOrder="10">
<label>Spin wheel slice</label>
</tab>
<section id="slicing" translate="label" sortOrder="130" showInDefault="1" showInWebsite="1" showInStore="1">
<class>separator-top</class>
<label>Slice Setting</label>
<tab>wheelslicing</tab>
<resource>PME_STW::helloworld_config</resource>
<group id="general" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="0" showInStore="0">
<label>General Configuration</label>
<field id="slice1" translate="label" type="text"
sortOrder="1" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Display Text</label>
<comment>This text will display on the frontend.</comment>
</field>
<field id="slice2" translate="label" type="text" sortOrder="1" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Display Text</label>
<comment>This text will display on the frontend.</comment>
</field>
<field id="slice3" translate="label" type="text"
sortOrder="1" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Display Text</label>
<comment>This text will display on the frontend.</comment>
</field>
<field id="availability_map" translate="label" sortOrder="10" showInDefault="1" showInStore="1" showInWebsite="1">
<label>Availability Map</label>
<frontend_model>PME\STW\Block\Adminhtml\Form\Field\AvailabilityMap</frontend_model>
<backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
</field>
</group>
</section>
</system>
In PME\STW\Block\Adminhtml\Form\Field\AvailabilityMap
<?php
namespace PME\STW\Block\Adminhtml\Form\Field;
use \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
use \Magento\Framework\DataObject;
class AvailabilityMap extends AbstractFieldArray
{
protected $optionField;
protected function _prepareToRender()
{
// $this->addColumn('availability_option', [
// 'label' => __('Availability Option'),
// 'renderer' => $this->getOptionField(),
// ]);
$this->addColumn('custom_availability_option', ['label' => __('Wheel Slice Value'), 'class' => 'required-entry']);
$this->addColumn('custom_availability', ['label' => __('Reward'), 'class' => 'required-entry']);
$this->_addAfter = false;
$this->_addButtonLabel = __('Add Correlation');
}
/**
* @return \SR\MagentoCommunity\Block\Adminhtml\Form\Field\OptionField
*/
protected function getOptionField()
{
if (!$this->optionField) {
$this->optionField = $this->getLayout()->createBlock(
OptionField::class,
'',
['data' => ['is_render_to_js_template' => true]]
);
}
return $this->optionField;
}
/**
* Prepare existing row data object
*
* @param DataObject $row
* @return void
*/
protected function _prepareArrayRow(DataObject $row)
{
$availabilityOption = $row->getAvailabilityOption();
$options = [];
if ($availabilityOption) {
$options['option_' . $this->getOptionField()->calcOptionHash($availabilityOption)]
= 'selected="selected"';
}
$row->setData('option_extra_attrs', $options);
}
}
In your phtml file
you will get this in json form decode it and use as u like