4

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

8
  • Did you set default configuration for your system config values ?
    – Jaisa
    Commented Feb 5, 2018 at 10:26
  • I too created system congfigurations like your custom module and it works good . Now need to add default configurations.Please provide me a solution
    – Jaisa
    Commented Feb 5, 2018 at 10:27
  • @Sri which version you are using?
    – Bojjaiah
    Commented Feb 5, 2018 at 13:05
  • I am using magento 2.2.2
    – Jaisa
    Commented Feb 7, 2018 at 8:47
  • I need to set default values for my system configuration.
    – Jaisa
    Commented Feb 7, 2018 at 8:47

1 Answer 1

4

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

}
2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.