2

I have added input box in admin's system.xml along with other fields as below:

<field id="mapping" translate="label comment tooltip" sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="0">
  <label>Exclude Days</label>
    <frontend_model>VENDOR\DeliveryCountdown\Block\Adminhtml\System\Config\Form\Field\excludeDays</frontend_model>
       <backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>
         <comment>
           <![CDATA[Add bank holidays that are not included in delivery / cut off times.]]>
          </comment>
            <tooltip>Delivery and cuttoff not include these days.</tooltip>
</field>

This display in admin as:

enter image description here

I can add many input boxes by clicking ADD button. Below is code to receive input dates of above form:

$offDays = $this->scopeConfig->getValue('deliverycountdown/general/mapping', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);

But output is as below:

a:3:{s:17:"_1509434435073_73";

a:2:{s:6:"field1";s:4:"AAAA";s:6:"field2";s:10:"2017-11-01";}s:18:"_1509434856288_288";

a:2:{s:6:"field1";s:4:"BBBB";s:6:"field2";s:10:"2017-11-03";}s:18:"_1509434861359_359"; a:2:{s:6:"field1";s:4:"CCCC";s:6:"field2";s:10:"2017-11-06";} }

It would great help to get dates from this file (i think JSON).

Or guide me another way if thats possible to add fields in admin and get at front-end block file.

2

For grids controls in system configuration using backend model

<backend_model>Magento\Config\Model\Config\Backend\Serialized\ArraySerialized</backend_model>

which serialize array data on save and unserialize before passing to view model.

You need to use \Magento\Framework\Serialize\SerializerInterface::unserialize (for test you can use unserialize) to get original field value with serialized backend model.

Note, that in Magento 2.2 json serializer using as default serializer, so if you will work with low level unserialize then you module will throw exception in 2.2.


$offDays = $this->scopeConfig->getValue('deliverycountdown/general/mapping', \Magento\Store\Model\ScopeInterface::SCOPE_STORE);
print_r(unserialize($offDays));
  • Where to add this : \Magento\Framework\Serialize\SerializerInterface::unserialize – Sharma Nov 3 '17 at 9:13
  • add Magento\Framework\Serialize\SerializerInterface as argument in constructor and use $this->serializer->unserialize($offDayas); – Max Nov 3 '17 at 9:42
  • My construct in magento 2.1.9 as below==== public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Framework\Stdlib\DateTime\DateTime $date // For date and time functions ) { $this->date = $date; $this->scopeConfig = $scopeConfig; parent::__construct( $context ); } =========== Please guide – Sharma Nov 3 '17 at 12:33
  • add ` \Magento\Framework\Serialize\SerializerInterface $serializer` after $date argument and $this->serializer = $serializer; in constructor body – Max Nov 3 '17 at 12:54
  • I had tried the same in my module but PHPSTORM highlight error as : Serialize namespace not defined. Site dont load in browser – Sharma Nov 3 '17 at 13:00
0

I done it with following string functions and its working fine.

    $offDaysString='a:9:{s:17:"_1509434435073_73";
a:2:{s:6:"field1";s:4:"AAAA";s:6:"field2";s:10:"2017-11-01";}s:18:"_1509434856288_288";
a:2:{s:6:"field1";s:4:"BBBB";s:6:"field2";s:10:"2017-11-03";}s:18:"_1509434861359_359";
a:2:{s:6:"field1";s:4:"CCCC";s:6:"field2";s:10:"2017-11-06";}s:18:"_1509435862561_561";
a:2:{s:6:"field1";s:5:"DDDDD";s:6:"field2";s:10:"2017-11-09";}s:18:"_1509435867703_703";
a:2:{s:6:"field1";s:12:"EEEEEEEEEEEE";s:6:"field2";s:10:"2017-11-12";}s:17:"_1509435870047_47";
a:2:{s:6:"field1";s:12:"FFFFFFFFFFFF";s:6:"field2";s:10:"2017-11-14";}s:18:"_1509435872376_376";
a:2:{s:6:"field1";s:14:"GGGGGGGGGGGGGG";s:6:"field2";s:10:"2017-11-16";}s:18:"_1509435874879_879";
a:2:{s:6:"field1";s:12:"HHHHHHHHHHHH";s:6:"field2";s:10:"2017-11-17";}s:18:"_1509435877463_463";
a:2:{s:6:"field1";s:13:"IIIIIIIIIIIII";s:6:"field2";s:10:"2017-11-20";}}' ; 


        $needle = 's:10:"';
        $count = substr_count($offDaysString, $needle);

        $position = 0;
        for ($i = 0; $i < $count; $i++) {

            $pos = strpos($offDaysString, $needle, $position);
            $position = $pos + 6;// length of this - s:10:
            $startPoint[] = $position;
            $Offdates[] = substr($offDaysString, $startPoint[$i], 10); // 10 = 2017-11-20

        }

        print_r($Offdates); 

For me, above code working fine and i put it in function in block file and called in template file displayed dates.

If anyone get a better to receive values on front-end block then post answer. Thanks

  • you must not use parsing of serialized values, see my answer – Max Nov 3 '17 at 8:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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