Tengo un campo seleccionado que tiene algunas opciones. Uno de ellos tendrá algunos campos que dependen del valor, otro campo estará oculto. Copié y extendí el componente js para mi campo, pero no funcionó o lo hice de manera incorrecta. ¿El componente Ui es compatible con esta función? ¿Cómo puedo lograr esto?
A continuación se muestra lo que he hecho:
<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">Field name</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="component" xsi:type="string">Pathto/js/form/element/options</item>
<item name="validation" xsi:type="array">
<item name="required-entry" xsi:type="boolean">true</item>
</item>
</item>
</argument>
</field>
<field name="field2Depend1"></field>
<field name="field3Depend1"></field>
jsComponent js/form/element/options
:
define([
'underscore',
'uiRegistry',
'Magento_Ui/js/form/element/select',
'Magento_Ui/js/modal/modal'
], function (_, uiRegistry, select) {
'use strict';
return select.extend({
onChange: function () {
this.enableDisableFields();
},
/**
* Enable/disable fields on Coupons tab
*/
enableDisableFields: function () {
// code check field
}
});
});
fuente
initialize
método en tu caso porque ui-element no tiene ningúnonLoad
método. Usted puede obtener cualquier valor de campo en cualquier lugar del registro utilizando la clave de índice de entrada:uiRegistry.get('index = field1')
. En caso de que tenga más preguntas, diríjase a mí en skype (sarj1989), será más fácil comunicarse en ruso.La solución sugerida por Magentix arrojará un error de vez en cuando al usar initialize. Depende del tiempo que le tome a su navegador renderizar los componentes. Para solucionarlo, puede usar setTimeout.
Vea el código a continuación:
fuente
Esta es una vieja pregunta con múltiples respuestas que funcionan, sin embargo, he descubierto una solución usando lo que Magento proporciona (a partir de 2.1.0) sin la necesidad de extender componentes. Como varias preguntas se han marcado como duplicadas y dirigidas aquí, pensé que sería beneficioso proporcionar alguna información sobre esta opción.
Todos los componentes de la interfaz de usuario del elemento de formulario que se extienden
Magento_Ui/js/form/element/abstract.js
tienen unaswitcherConfig
configuración disponible para fines tales como ocultar / mostrar elementos, así como otras acciones. Elswitcher
componente se puede encontrar en Magento_Ui / js / form / switcher para los curiosos. Puede encontrar ejemplos de su uso en sales_rule_form.xml y catalog_rule_form.xml . Por supuesto, si ya está utilizando su propio componente personalizado, todavía puede usarlo siempre que su componente finalmente se extienda, loabstract
que parece ser el caso en función del código de ejemplo proporcionado en la pregunta.Ahora para un ejemplo más específico para responder la pregunta original.
En
Namespace/ModuleName/view/adminhtml/ui_component/your_entity_form.xml
sólo hay que añadir lo siguiente a los de camposettings
que realiza el control (es decir, el campo que determina qué campos están ocultos / visibles). En su ejemplo esto seríafield1
.Vamos a desglosarlo un poco. El
switcher
componente contiene una matriz derules
lo que estamos construyendo aquí. Cada uno<rule>
tiene un nombre que es un número en este ejemplo. Este nombre es la clave / índice de matriz para este elemento. Estamos usando números como índices de matriz.Las cadenas también deberían funcionar, pero no he probado esta teoría. ACTUALIZACIÓN : como mencionó @ChristopheFerreboeuf en los comentarios, las cadenas no funcionan aquí. Estas son matrices y deberían comenzar con0
, no con cadenas o 1.Dentro de cada uno
rule
pasamos dos argumentos.value
- Este es el valor delfield1
cual debería desencadenar elactions
definido a continuación.actions
- Aquí tenemos otra matriz. Estas son las acciones que se activarán cuando se cumplan las condiciones de esta regla. Nuevamente,action
el nombre de cada uno es solo el índice / clave de la matriz de ese elemento.Ahora cada uno
action
tiene dos argumentos también (con un tercero opcional).target
- Este es el elemento que deseas manipular bajo esta acción. Si no está familiarizado con cómo se componen los nombres de elementos ui_component en Magento, puede consultar el artículo de Alan Storm . Básicamente es algo como{component_name}.{component_name}.{fieldset_name}.{field_name}
en este ejemplo.callback
- Aquí está la acción a tomar sobre lo mencionado anteriormentetarget
. Esta devolución de llamada debe ser una función que esté disponible en el elemento de destino. Nuestro ejemplo usahide
yshow
. Aquí es donde puede comenzar a ampliar la funcionalidad disponible. Elcatalog_rule_form.xml
ejemplo que mencioné anteriormente se usasetValidation
si desea ver un ejemplo diferente.<params>
a cualquieraaction
que lo solicite. Puedes ver esto también en elcatalog_rule_form.xml
ejemplo.Finalmente el último elemento adentro
switcherConfig
es<enabled>true</enabled>
. Esto debería ser bastante sencillo, es un booleano para habilitar / deshabilitar la funcionalidad del conmutador que acabamos de implementar.Y ya hemos terminado. Entonces, usando el ejemplo anterior, lo que debería ver es el campo que se
field2Depend1
muestra si elige una opción con valor2
activadofield1
, y sefield3Depend1
muestra si elige una opción con valor3
.He probado este ejemplo usando solo
hide
yshow
en un campo obligatorio y parece tener en cuenta la visibilidad para la validación. En otras palabras, sifield2Depend1
se requiere, solo se requerirá cuando sea visible. No es necesario realizar más configuraciones para que eso funcione.Espero que esto brinde ayuda para cualquiera que busque una solución más lista para usar.
fuente
Hay muchas respuestas para esta pregunta, pero la mayoría de ellas hacen suposiciones sobre si el uiRegistry está completamente cargado, o lo usan
setTimeout
para borrar la pila de llamadas, y esperan el próximo bucle de eventos (que en mi opinión sigue siendo la forma incorrecta de hágalo, ya que no puede estar seguro de cuándo se han cargado los otros componentes de la interfaz de usuario, corríjame si me equivoco).En primer lugar, por supuesto, agregue su componente JS personalizado a la configuración del campo (vea otras respuestas para más detalles):
Luego, aquí está el componente de interfaz de usuario personalizado que oculta o muestra los campos dependientes, con comentarios para explicar lo que está sucediendo.
fuente
Si tiene un error como
Field is Undefined
cuando se inicializa la visibilidad del campo, usesetTimeout()
para cargar los campos dependientes:fuente
uiRegistry.get('q', function(field) { ... }));
Componente personalizado con init:
fuente
setTimeout()
defieldDepend()
porque dependía no se ha cargado todavía.En caso de que alguien tenga problemas con la solución de Erfan , debe pasar la ruta completa a los campos
dependentFieldNames
, por ejemplo:No estoy seguro de por qué form_name tiene que ser 2 veces, pero esto me ha funcionado.
Para depurar esto puse
console.log(query);
en lastatic/adminhtml/Magento/backend/en_US/Magento_Ui/js/lib/registry/registry.js
línea 223 (la función get () justo antesthis._addRequest(query, callback)
)fuente
Hay algunas maneras para manejar dependencias de campo, por sencilla Sí / No desplegable, una casilla de verificación o un conmutador, puede utilizar los
imports
oexports
las propiedades de vínculos de Magento 2. La solución se discute en detalle aquí: campos dependientes en forma de componentes de interfaz de usuario en Magento 2 sin Javascript para campos booleanos :Para manejar otro tipo de valores, como la dependencia de una lista de valores en un menú desplegable o, aunque es poco probable, un valor de un campo de entrada, puede usar el
switcherConfig
. Verifique los campos dependientes en formularios de componentes ui en Magento 2 sin Javascript para obtener información.Las 2 reglas anteriores, manejan casi todo usando la configuración XML. Para reglas más complejas, puede usar JavaScript también.
Cada campo en el formulario de componente de IU es un componente que puede ampliarse utilizando el
component
atributo para<field component="path to your js" ...>...</field>
. Luego puede usar el campodata.config
para pasar más información al componente, en caso de que el componente sea genérico y se reutilice en varios lugares, combinado con la propiedad de enlaceimports
oexports
para pasar valores a observables o métodos.Para obtener más información sobre las propiedades de enlace, puede consultar las propiedades de enlace de los componentes de la interfaz de usuario
fuente