I've created a custom ui_component to add an extra field to the product edit page, but when I click save the custom field values are not included in $this->getRequest()->getPostValue()
.
My code looks like this.
/etc/adminhtml/di.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<virtualType name="Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\Pool">
<arguments>
<argument name="modifiers" xsi:type="array">
<item name="customProductModifier" xsi:type="array">
<item name="class" xsi:type="string">Vendor\Module\Ui\Modifier\Product\Form\CustomProductModifier</item>
<item name="sortOrder" xsi:type="number">1</item>
</item>
</argument>
</arguments>
</virtualType>
/ui_component/product_form.xml:
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
<fieldset name="custom_products">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="label" xsi:type="string" translate="true">Label</item>
<item name="sortOrder" xsi:type="number">1</item>
<item name="collapsible" xsi:type="boolean">true</item>
</item>
</argument>
<field name="custom_name" formElement="input">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="formElement" xsi:type="string">checkboxset</item>
<item name="componentType" xsi:type="string">field</item>
<item name="visible" xsi:type="number">1</item>
<item name="sortOrder" xsi:type="number">1</item>
<item name="label" xsi:type="string">Label</item>
<item name="dataScope" xsi:type="string">custom_name</item>
</item>
</argument>
</field>
</fieldset>
</form>
CustomProductModifier.php:
<?php
namespace Vendor\Module\Ui\Modifier\Product\Form;
use Magento\Catalog\Ui\DataProvider\Product\Form\Modifier\AbstractModifier;
use Vendor\Module\Service\HTTPService;
class CustomProductModifier extends AbstractModifier{
public function modifyMeta(array $meta){
$meta['custom_products'] = [
'children' => [
'custom_name' => [
'arguments' => [
'data' => [
'config' => [
'options' => $this->populateValues()
]
]
]
]
]
];
return $meta;
}
public function modifyData(array $data){
return $data;
}
private function populateValues(){
$values = array(
array('value' => 'disabled', 'label' => 'Disabled'),
);
foreach(HTTPService::get_instance()->get_data() as $index => $data){
$values[] = array('value' => $data['title'], 'label' => $data['title']);
}
return $values;
}
}
The tutorial I followed ended here but there must be something missing. I can't find the link right now, I'll update if I do.
EDIT: Well I found the link to the tutorial... http://devdocs.magento.com/guides/v2.2/howdoi/customize_product.html
EDIT 2: After further searching I came across another post where the html 'name' attribute was being set to emtpy when using uicomponents, which was causing the values to not be sent with the form data. It turned out to be a bug which was supposedly fixed in v2.2.2.
In my case the name attribute is not even being included. So instead of name="" I have no name attribute at all. Any suggestions why this is happening?
EDIT 3: Forcing the 'name' attribute by editing the checkbox-set template does not solve the problem, the data is still not sent to the controller.
var fixAttributes = function() { if($('fieldset[data-index="custom_name"]').length <= 0 ){ //wait for knockout js to finish rendering setTimeout(function(){ fixAttributes(); }, 3000); }else{ $('fieldset[data-index="custom_name"]').find('input').each(function(){ $(this).attr('data-form-part', 'product_form'); $(this).attr('name', 'product[custom_name][' + $(this).val() + ']'); }); } };
– GinoT Jan 29 '18 at 14:08