Magento 2: Обратите внимание на ошибку - Преобразование массива в строку
Я пытался сохранить Значения полей множественного выбора в БД.
Я добавил поле в форму правила продаж, используя 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>
Чтобы сохранить это поле, я создал плагин с после выполнения метода .
<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();
}
}
Теперь проблема в том, что значение поля сохраняется в БД, но возникает исключение, как показано ниже.
Что-то пошло не так при сохранении данных правила. Пожалуйста, просмотрите журнал ошибок.
Проверьте Ниже Журнал Ошибок.
(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)"} []
Любой, кто сталкивался с такими же проблемами раньше. Действительно нужна помощь в этом.
Заранее благодарю.
2 answers
Я не знаю, почему плагин не работает с текущим сценарием.
Если кто-нибудь скажет, почему плагин не работал с этим сценарием?
Итак, я использовал событие с именем adminhtml_controller_salesrule_prepare_save
, чтобы сохранить значение моих полей в БД .
Вот полный код.
Vendor/Module/etc/adminhtml/events.xml
<event name="adminhtml_controller_salesrule_prepare_save">
<observer name="save_brands"
instance="Vendor\Module\Observer\SaveExcludedBrands" />
</event>
Затем создайте файл наблюдателя в своем модуле.
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);
}
Теперь нет исключение и уведомление и его работа.
Можете ли вы попробовать это
public function afterexecute(\Magento\SalesRule\Controller\Adminhtml\Promo\Quote\Save $save,$result)
{
$ruleId = $save->getRequest()->getParam('rule_id');
$brandIds = implode(',',$save->getRequest()->getParam('brands'));
try{
$salesRuleData = $this->salesRule->load($ruleId);
$salesRuleData->setStartDate($save->getRequest()->getParam('start_date'));
$salesRuleData->setEndDate($save->getRequest()->getParam('end_date'));
$salesRuleData->setBrands($brandIds);
$salesRuleData->save();
}
catch(Exception $e)
{
echo $e->getMessage();
}
}