In my custom module have config section values are saving but not rendering. Could you please let me know where I went wrong?
My code is:
system.xml
<field id="customer_header" translate="label" sortOrder="3" showInDefault="1" showInWebsite="0" showInStore="0">
<label>Soap Header</label>
<frontend_model>Learning\Custom\Block\Adminhtml\Form\Field\Customer</frontend_model>
<backend_model>Learning\Custom\Model\System\Config\Backend\Customer</backend_model>
</field>
Learning\Custom\Block\Adminhtml\Form\Field\Customer.php
<?php
namespace Learning\Custom\Block\Adminhtml\Form\Field;
class Customer extends \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
{
/**
* @param \Magento\Backend\Block\Template\Context $context
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
array $data = []
) {
parent::__construct($context, $data);
}
/**
* Initialise form fields
*
* @return void
*/
protected function _construct()
{
parent::_construct();
}
protected function _prepareToRender()
{
$this->addColumn('header', ['label' => __('Header')]);
$this->_addAfter = true;
$this->_addButtonLabel = __('Add Header');
}
}
Learning\Custom\Model\System\Config\Backend\Customer.php
<?php
namespace Learning\Custom\Model\System\Config\Backend;
/**
* Backend for serialized array data
*/
class Customer extends \Magento\Framework\App\Config\Value
{
/**
* Custom Class
*
* @var \Learning\Custom\Helper\Customer
*/
protected $_custom = null;
//protected $loggerInterface;
/**
* @param \Magento\Framework\Model\Context $context
* @param \Magento\Framework\Registry $registry
* @param \Magento\Framework\App\Config\ScopeConfigInterface $config
* @param \Learning\Custom\Helper\Customer $_custom
* @param \Magento\Framework\Model\Resource\AbstractResource $resource
* @param \Magento\Framework\Data\Collection\AbstractDb $resourceCollection
* @param array $data
*/
public function __construct(
\Magento\Framework\Model\Context $context,
\Magento\Framework\Registry $registry,
\Magento\Framework\App\Config\ScopeConfigInterface $config,
\Learning\Custom\Helper\Customer $_custom,
\Magento\Framework\Model\Resource\AbstractResource $resource = null,
\Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
//\Psr\Log\LoggerInterface $loggerInterface,
array $data = []
) {
parent::__construct($context, $registry, $config, $resource, $resourceCollection, $data);
$this->_custom = $_custom;
//$this->loggerInterface =$loggerInterface;
}
/**
* Process data after load
*
* @return void
*/
protected function _afterLoad()
{
$value = $this->getValue();
$value = $this->_custom->makeArrayFieldValue($value);
$this->setValue($value);
//$this->loggerInterface->debug('');
}
/**
* Prepare data before save
*
* @return void
*/
public function beforeSave()
{
$value = $this->getValue();
$value = $this->_custom->makeStorableArrayFieldValue($value);
$this->setValue($value);
}
}
Learning\Custom\Helper\Customer.php
<?php
namespace Learning\Custom\Helper;
class Customer
{
/**
* Min sale qty config path
*/
const XML_PATH = 'custom_customer/custom_customer_nav_api/customer_soap_header';
/**
* Core store config
*
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $scopeConfig;
/**
* @var \Magento\Framework\Math\Random
*/
protected $mathRandom;
protected $loggerInterface;
/**
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param \Magento\Framework\Math\Random $mathRandom
* @param \Psr\Log\LoggerInterface $loggerInterface
*/
public function __construct(
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Magento\Framework\Math\Random $mathRandom,
\Psr\Log\LoggerInterface $loggerInterface
) {
$this->scopeConfig = $scopeConfig;
$this->mathRandom = $mathRandom;
$this->loggerInterface = $loggerInterface;
}
/**
* Generate a storable representation of a value
*
* @param int|float|string|array $value
* @return string
*/
protected function serializeValue($value)
{
//$this->loggerInterface->debug($value);
if (is_numeric($value)) {
$data = (float) $value;
return (string) $data;
} elseif (is_array($value)) {
return serialize($value);
} else {
return '';
}
}
/**
* Create a value from a storable representation
*
* @param int|float|string $value
* @return array
*/
protected function unserializeValue($value)
{
//file_get_contents('magento2.txt',print_r($value,true));
if (is_numeric($value)) {
return [$value];
} elseif (is_string($value) && !empty($value)) {
return unserialize($value);
} else {
return [];
}
}
/**
* Check whether value is in form retrieved by _encodeArrayFieldValue()
*
* @param string|array $value
* @return bool
*/
protected function isEncodedArrayFieldValue($value)
{
if (!is_array($value)) {
return false;
}
unset($value['__empty']);
foreach ($value as $row) {
if (!is_array($row)
|| !array_key_exists('header', $row)
) {
return false;
}
}
return true;
}
/**
* Encode value to be used in \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
*
* @param array $value
* @return array
*/
protected function encodeArrayFieldValue(array $value)
{
$result = [];
foreach ($value as $qty) {
$resultId = $this->mathRandom->getUniqueHash('_');
$result[$resultId] = ['header' => $qty];
}
return $result;
}
/**
* Decode value from used in \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
*
* @param array $value
* @return array
*/
protected function decodeArrayFieldValue(array $value)
{
$result = [];
unset($value['__empty']);
foreach ($value as $row) {
if (!is_array($row)
|| !array_key_exists('header', $row)
) {
continue;
}
$qty = $row['header'];
$result = $qty;
}
return $result;
}
/**
* @param null $store
* @return array|mixed
*/
public function getConfigValue( $store = null)
{
$value = $this->scopeConfig->getValue(
self::XML_PATH,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$store
);
$value = $this->unserializeValue($value);
if ($this->isEncodedArrayFieldValue($value)) {
$value = $this->decodeArrayFieldValue($value);
}
$result = null;
foreach ($value as $qty) {
$value = $qty;
}
return $value;
}
/**
* Make value readable by \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
*
* @param string|array $value
* @return array
*/
public function makeArrayFieldValue($value)
{
$value = $this->unserializeValue($value);
if (!$this->isEncodedArrayFieldValue($value)) {
$value = $this->encodeArrayFieldValue($value);
}else{
$value = "";
}
return $value;
}
/**
* Make value ready for store
*
* @param string|array $value
* @return string
*/
public function makeStorableArrayFieldValue($value)
{
if ($this->isEncodedArrayFieldValue($value)) {
$value = $this->decodeArrayFieldValue($value);
}
$value = $this->serializeValue($value);
return $value;
}
}
System Configuration File:
These Values saved from database: