Configuración 'depende' del modelo frontal y de backend
-
16-10-2019 - |
Pregunta
Tengo dificultades con la funcionalidad de 'depender' en la configuración.
Normalmente, agregando <depends>
Para alguna opción de configuración, está oculto a menos que el valor de la opción dada coincida.
Por ejemplo:
<option_one>
<label>Option 1</label>
...
</option_one>
<option_two>
<label>Option 2</label>
...
<depends><option_one>1</option_one></depends>
</option_two
Obviamente me estoy perdiendo algunos campos, pero entiendes el punto. La opción 2 solo aparece cuando la opción 1 tiene el valor '1'.
Ahora mi problema es que cuando trato de aplicar esto a una opción con un modelo de backend y frontend, esto depende no funciona:
<option_three>
...
<frontend_model>module/adminhtml_form_field_test</frontend_model>
<backend_model>adminhtml/system_config_backend_serialized_array</backend_model>
...
<depends><option_one>1</option_one></depends>
</option_three>
Esta opción no tomará la opción 1 en la cuenta, siempre es visible.
¿Estoy haciendo algo mal, o es un error, o 'funciona como está diseñado'?
Solución
Si no usas frontend_model
Tu HTML para dos campos se verá así
<tr id="row_you_dependency_field_id">
<td class="label"><label for="you_dependency_field_id">Dependency Field</label></td>
<td class="value">
<select id="you_dependency_field_id" name="groups[general][fields][you_dependency_field_id][value]" class=" select">
<option value="1">Yes</option>
<option value="0" selected="selected">No</option>
</select>
</td>
</tr>
<tr id="row_your_dependent_field_id">
<td class="label">
<label for="your_dependent_field_id">Dependent Field</label>
</td>
<td class="value">
<select id="your_dependent_field_id" name="groups[general][fields][your_dependent_field_id][value]" class=" select">
<option value="1">Yes</option>
<option value="0" selected="selected">No</option>
</select>
</td>
</tr>
El JavaScript para mostrar/ocultar el campo dependiente se verá así
new FormElementDependenceController({"your_dependent_field_id":{"you_dependency_field id":"1"}});
Y Show/Hide funcionará bien porque ambas ID están presentes en HTML.
Pero si usas frontend_model
El valor para el segundo campo se presenta por su bloque personalizado module/adminhtml_form_field_test
y no contiene ID del campo dependiente y JavaScript simplemente no sabe qué ocultar.
<tr id="row_you_dependency_field_id">
<td class="label"><label for="you_dependency_field_id">Dependency Field</label></td>
<td class="value">
<select id="you_dependency_field_id" name="groups[general][fields][you_dependency_field_id][value]" class=" select">
<option value="1">Yes</option>
<option value="0" selected="selected">No</option>
</select>
</td>
</tr>
<tr id="row_your_dependent_field_id">
<td class="label">
<label for="your_dependent_field_id">Dependent Field</label>
</td>
<td class="value">
...
//The output of your frontend_model
...
</td>
</tr>
Así que vaya al método _tohtml () de module/adminhtml_form_field_test
y envuelva la salida en div
y especificar ID para ello
$fieldId = $this->getElement()->getId();
//your html
<div id="field id here">
//your frontend_model html
</div>