Configuration « dépend » avec le modèle avant et arrière-plan
-
16-10-2019 - |
Question
Je vais avoir des difficultés avec la fonctionnalité « dépend » dans la configuration.
Normalement, l'ajout <depends>
à une option de configuration, il est masqué, à moins de valeur correspond à l'option donnée.
Par exemple:
<option_one>
<label>Option 1</label>
...
</option_one>
<option_two>
<label>Option 2</label>
...
<depends><option_one>1</option_one></depends>
</option_two
Il est évident que je manque des champs, mais vous obtenez le point. Option 2 apparaît uniquement lorsque l'option 1 a la valeur '1'.
Maintenant, mon problème est, lorsque je tente d'appliquer à une option avec un modèle de back-end et frontend, ce en fonction ne fonctionne pas:
<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>
Cette option ne prendra pas l'option 1 en compte, il est juste toujours visible.
Ai-je fait quelque chose de mal, ou est-ce un bug ou «fonctionne comme prévu?
La solution
Si vous n'utilisez pas frontend_model
votre code html pour deux champs ressemblera à ceci
<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>
Le javascript pour afficher / masquer champ dépendant ressemblera à ceci
new FormElementDependenceController({"your_dependent_field_id":{"you_dependency_field id":"1"}});
Et montrer / cacher fonctionnera bien parce que les deux ids sont présents en html.
Mais si vous utilisez frontend_model
la valeur pour le deuxième champ est rendu par votre module/adminhtml_form_field_test
de bloc personnalisé et ne contient pas id du champ dépendant et javascript ne sait tout simplement pas quoi se cacher.
<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>
Alors passez à la méthode _toHtml () de module/adminhtml_form_field_test
et envelopper la sortie dans div
et indiquer l'identifiant il
$fieldId = $this->getElement()->getId();
//your html
<div id="field id here">
//your frontend_model html
</div>