- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I would like to display sub options when a parent option was selected.
Example:
Dropdown 1:
Display all attributes available as options
When selected "manufacturer"
Dropdown 2:
Display options under manufacturer, such as "Toyota", "Ford", "Isuzu"
Would you give me suggestions? Should we use custom js code?
Solved! Go to Solution.
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Just realised that when the field is not visible it doesn't define the field.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: Ui Component - display sub options when parent option is selected
Hello tvgarden
Please find below solution
<field name="field1"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Namespace\ModuleName\Model\Config\Source\Options</item> <item name="config" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Parent Option</item> <item name="component" xsi:type="string">Namespace_ModuleName/js/form/element/options</item> <item name="visible" xsi:type="boolean">true</item> <item name="dataType" xsi:type="string">number</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">item</item> <item name="dataScope" xsi:type="string">field1</item> <item name="sortOrder" xsi:type="number">210</item> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">true</item> </item> </item> </argument> </field> <field name="field2Depend1"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Field 1</item> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">input</item> <item name="source" xsi:type="string">item</item> <item name="sortOrder" xsi:type="number">220</item> <item name="breakLine" xsi:type="boolean">true</item> <item name="visibleValue" xsi:type="string">2</item> <item name="visible" xsi:type="boolean">false</item> </item> </argument> </field> <field name="field3Depend1"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Field 2</item> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">input</item> <item name="source" xsi:type="string">item</item> <item name="sortOrder" xsi:type="number">230</item> <item name="breakLine" xsi:type="boolean">true</item> <item name="visibleValue" xsi:type="string">0</item> <item name="visible" xsi:type="boolean">false</item> </item> </argument> </field>
- The child elements visibility is set by default as false;
- The visibleValue - is field1 value when element should be visible;
Namespace\ModuleName\Model\Config\Source\Options
namespace Namespace\ModuleName\Model\Config\Source; use Magento\Framework\Option\ArrayInterface; class Options implements ArrayInterface { /** * @return array */ public function toOptionArray() { $options = [ 0 => [ 'label' => 'Please select', 'value' => 0 ], 1 => [ 'label' => 'Option 1', 'value' => 1 ], 2 => [ 'label' => 'Option 2', 'value' => 2 ], 3 => [ 'label' => 'Option 3', 'value' => 3 ], ]; return $options; } }
app/code/Namespace/ModuleName/view/adminhtml/web/js/form/element/options.js
define([ 'underscore', 'uiRegistry', 'Magento_Ui/js/form/element/select', 'Magento_Ui/js/modal/modal' ], function (_, uiRegistry, select, modal) { 'use strict'; return select.extend({ /** * On value change handler. * * @param {String} value */ onUpdate: function (value) { console.log('Selected Value: ' + value); var field1 = uiRegistry.get('index = field2Depend1'); if (field1.visibleValue == value) { field1.show(); } else { field1.hide(); } var field2 = uiRegistry.get('index = field3Depend1'); if (field2.visibleValue == value) { field2.show(); } else { field2.hide(); } return this._super(); }, }); });
Kindly find below link of original answer
Url: https://magento.stackexchange.com/questions/132020/magento-2-1-how-do-i-create-form-component-field-...
Hope it will help you to solve this problem then please accept as solution
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: Ui Component - display sub options when parent option is selected
Thank you very much for the code.
I have tried it and it displays field 1, but when an option's chosen it gives an error.
Uncaught TypeError: Cannot read property 'visibleValue' of undefined at UiClass.onUpdate (options.js:20) at UiClass.onUpdate (wrapper.js:109) at Function.notifySubscribers (knockout.js:1103) at Function.observable.valueHasMutated (knockout.js:1300) at observable (knockout.js:1285) at Object.writeValueToProperty (knockout.js:2337) at HTMLSelectElement.valueUpdateHandler (knockout.js:4477) at HTMLSelectElement.dispatch (jquery.js:5226) at HTMLSelectElement.elemData.handle
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: Ui Component - display sub options when parent option is selected
<field name="field1"> <argument name="data" xsi:type="array"> <item name="options" xsi:type="object">Magebull\MultiSlider\Model\Config\Source\Options</item> <item name="config" xsi:type="array"> <item name="label" xsi:type="string" translate="true">Parent Option</item> <item name="component" xsi:type="string">Magebull_MultiSlider/js/form/element/options</item> <item name="visible" xsi:type="boolean">true</item> <item name="dataType" xsi:type="string">number</item> <item name="formElement" xsi:type="string">select</item> <item name="source" xsi:type="string">item</item> <item name="dataScope" xsi:type="string">field1</item> <item name="sortOrder" xsi:type="number">210</item> <item name="validation" xsi:type="array"> <item name="required-entry" xsi:type="boolean">true</item> </item> </item> </argument> </field> <field name="field2Depend1"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Field 1</item> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">input</item> <item name="source" xsi:type="string">item</item> <item name="sortOrder" xsi:type="number">220</item> <item name="breakLine" xsi:type="boolean">true</item> <item name="visibleValue" xsi:type="string">2</item> <item name="visible" xsi:type="boolean">false</item> </item> </argument> </field> <field name="field3Depend1"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Field 2</item> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">input</item> <item name="source" xsi:type="string">item</item> <item name="sortOrder" xsi:type="number">230</item> <item name="breakLine" xsi:type="boolean">true</item> <item name="visibleValue" xsi:type="string">0</item> <item name="visible" xsi:type="boolean">false</item> </item> </argument> </field>
Field Name
name="field1"
name="field2Depend1"
name="field3Depend1"
This soruce model files for name="field1"
Magebull\MultiSlider\Model\Config\Source\Options
Js file
Magebull_MultiSlider/js/form/element/options
define([ 'underscore', 'uiRegistry', 'Magento_Ui/js/form/element/select', 'Magento_Ui/js/modal/modal' ], function (_, uiRegistry, select, modal) { 'use strict'; return select.extend({ /** * On value change handler. * * @param {String} value */ onUpdate: function (value) { console.log('Selected Value: ' + value); var field1 = uiRegistry.get('index = field2Depend1'); if (field1.visibleValue == value) { field1.show(); } else { field1.hide(); } var field2 = uiRegistry.get('index = field3Depend1'); if (field2.visibleValue == value) { field2.show(); } else { field2.hide(); } return this._super(); }, }); });
var field1 = uiRegistry.get('index = field2Depend1');
var field2 = uiRegistry.get('index = field3Depend1');
Bold text is field name that why you got js error.
Hope it will help to solve the problem then please accept as solution and kudos.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: Ui Component - display sub options when parent option is selected
Thanks for your reply, but I'm still not getting it.
What exactly should I change on bold texts?
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Re: Ui Component - display sub options when parent option is selected
@tvgarden wrote:Thanks for your reply, but I'm still not getting it.
What exactly should I change on bold texts?
Hello tvgarden
You have to give the same name "field2Depend1" in js as per field name
<field name="field2Depend1"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="label" xsi:type="string">Field 1</item> <item name="dataType" xsi:type="string">text</item> <item name="formElement" xsi:type="string">input</item> <item name="source" xsi:type="string">item</item> <item name="sortOrder" xsi:type="number">220</item> <item name="breakLine" xsi:type="boolean">true</item> <item name="visibleValue" xsi:type="string">2</item> <item name="visible" xsi:type="boolean">false</item> </item> </argument> </field>
var field1 = uiRegistry.get('index = field2Depend1');
var field2 = uiRegistry.get('index = field3Depend1');
After change in js please run static content and make sure your change reflect into pub js because it's working in my system.
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content