Magento 2 – Fixing Notice Error: Array to String Conversion

databasemagento2.2.3pluginuicomponent

I've been trying to save Multi Select field values to DB.

I've added the field to sales rule form using ui_component.

<fieldset name="exclude_brands">
    <argument name="data" xsi:type="array">
        <item name="config" xsi:type="array">
            <item name="label" xsi:type="string" translate="true">Exclude Brands</item>
            <item name="collapsible" xsi:type="boolean">true</item>
            <item name="sortOrder" xsi:type="number">15</item>
        </item>
    </argument>
    <field name="start_date" formElement="date">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">sales_rule</item>
            </item>
        </argument>
        <settings>
            <validation>
                <rule name="validate-date" xsi:type="boolean">true</rule>
            </validation>
            <dataType>text</dataType>
            <label translate="true">Start Date</label>
            <visible>true</visible>
            <dataScope>start_date</dataScope>
        </settings>
    </field>
    <field name="end_date" formElement="date">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">sales_rule</item>

            </item>
        </argument>
        <settings>
            <validation>
                <rule name="validate-date" xsi:type="boolean">true</rule>
            </validation>
            <dataType>text</dataType>
            <label translate="true">End Date</label>
            <visible>true</visible>
            <dataScope>end_date</dataScope>
        </settings>
    </field>
    <field name="brand_ids" formElement="select">
        <argument name="data" xsi:type="array">
            <item name="config" xsi:type="array">
                <item name="source" xsi:type="string">sales_rule</item>
            </item>
        </argument>
        <settings>
            <validation>
                <rule name="validate-brands" xsi:type="boolean">true</rule>
            </validation>
            <dataType>varchar</dataType>
            <label translate="true">Brand List</label>
            <dataScope>brand_ids</dataScope>
        </settings>
        <formElements>
            <select>
                <settings>
                    <options class="Vendor\Module\Block\SalesRule\BrandList"/>

                </settings>
            </select>
        </formElements>
    </field>
</fieldset>

To save this field I've created a plugin with after execute method.

<type name="Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Save">
    <plugin name="save_brands" type="Vendor\Module\Model\Plugin\brands" sortOrder="1"/>
</type>

Vendor/Module/Model/Plugin/Brands.php

public function afterexecute(\Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Save $save,$result)
{

    $ruleId =  $save->getRequest()->getParam('rule_id'); 

    $brandIds = implode(',',$save->getRequest()->getParam('brand_ids'));

    try{
        $salesRuleData =  $this->salesRule->load($ruleId);
        $salesRuleData->setStartDate($save->getRequest()->getParam('start_date'));
        $salesRuleData->setEndDate($save->getRequest()->getParam('end_date'));
        $salesRuleData->setBrandIds($brandIds);
        $salesRuleData->save();         
    }
    catch(Exception $e)
    {
        echo $e->getMessage();  
    }

}

Now, issue is field value is saving to DB but, Getting exception like below.

Something went wrong while saving the rule data. Please review the error log.

Check Below Error Log.

(Exception(code: 0): Notice: Array to string conversion in C:\\xampp\\htdocs\\mage2\\vendor\\magento\\zendframework1\\library\\Zend\\Db\\Statement\\Pdo.php on line 228 at C:\\xampp\\htdocs\\mage2\\vendor\\magento\\framework\\App\\ErrorHandler.php:61)"} []

Anyone facing same issues before. Really need help with this.

Thanks in Advance.

Best Answer

I don't know why plugin doesn't work with current scenario.

If anyone tell Why plugin not worked with this scenario ?

So, I used event called adminhtml_controller_salesrule_prepare_save to save my fields value to DB.

Here is full code.

Vendor/Module/etc/adminhtml/events.xml

<event name="adminhtml_controller_salesrule_prepare_save">
    <observer name="save_brands" 
        instance="Vendor\Module\Observer\SaveExcludedBrands" />
</event>

Than, Create observer file within your module.

Vendor/Module/Observer/SaveExcludedBrands.php

public function execute(Observer $observer)
{
    $data = $observer->getRequest()->getPostValue();
    //print_r($data); exit;
    $request = $observer->getEvent()->getRequest();

    $brands = implode(',',$data['brands']);

    $startDate = $this->timeZoneInterface->date($data['start_date'])->format('Y-m-d'); 
    $endDate = $this->timeZoneInterface->date($data['end_date'])->format('Y-m-d');


    $request->setPostValue('brands',$brands);
    $request->setPostValue('start_date',$startDate);
    $request->setPostValue('end_date',$endDate);
}

Now, No exception and notice and its working.