Question

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:

enter image description here

These Values saved from database:

enter image description here

Was it helpful?

Solution

Finally I have achieved by updating Customer.php file from Helper class

<?php

namespace Learning\Custom\Helper;

class Customer
{


    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;
    }

    protected function fixValue($value)
    {
        return !empty($value) ? $value : "";
    }

    /**
     * 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_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_put_contents('magento2.txt',print_r(unserialize($value),true));
       // $this->loggerInterface->debug(unserialize($value));

      if (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 $val) {
            $resultId = $this->mathRandom->getUniqueHash('_');
            $result[$resultId] = ['header' => $this->fixValue($val)];
        }
        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;
            }
            $val = $this->fixValue($row['header']);
            $result = $val;
        }
        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 $val) {
                $value = $val;
        }


        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)
    {
        //$this->loggerInterface->debug($value);

        $value = $this->unserializeValue($value);

        //$this->loggerInterface->debug($value);

        if ($this->isEncodedArrayFieldValue($value)) {
            unset($value['__empty']);
            $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;
    }

}
Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top