La configuration «dépend» du modèle avant et arrière

8

Je rencontre des difficultés avec la fonctionnalité «dépend» de la configuration.

Normalement, en ajoutant <depends>à une option de configuration, il est masqué sauf si la valeur de l'option donnée correspond.

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

Évidemment, il me manque certains champs, mais vous obtenez le point. L'option 2 n'apparaît que lorsque l'option 1 a la valeur «1».

Maintenant, mon problème est que lorsque j'essaie de l'appliquer à une option avec un modèle backend et frontend, cela 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 tiendra pas compte de l'option 1, elle est juste toujours visible.

Suis-je en train de faire quelque chose de mal, ou est-ce un bug, ou «fonctionne comme prévu»?

Maikel Koek
la source

Réponses:

8

Si vous n'utilisez pas frontend_modelvotre 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 le champ dépendant ressemblera à ceci

new FormElementDependenceController({"your_dependent_field_id":{"you_dependency_field id":"1"}});

Et show / hide fonctionnera bien car les deux identifiants sont présents en html.

Mais si vous utilisez frontend_modella valeur pour le deuxième champ est rendu par votre bloc personnalisé module/adminhtml_form_field_testet ne contient pas l'id du champ dépendant et javascript ne sait tout simplement pas quoi 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>

Donc, allez à la méthode _toHtml () module/adminhtml_form_field_testet enveloppez la sortie dans divet spécifiez l'id pour cela

$fieldId = $this->getElement()->getId();

//your html 
<div id="field id here">
    //your frontend_model html
</div>
oleksii.svarychevskyi
la source
Je n'ai pas encore testé cela, mais cela semble légitime. Ça ressemble à un bug pour moi. Je n'ai pas écrasé _toHtml dans mon modèle personnalisé, mais je pense que je vais réécrire cette méthode pour éviter que cela ne se reproduise à l'avenir!
Maikel Koek
Vous, Monsieur, êtes un gentleman et un savant. Envelopper la sortie du frontend_model avec '<div id = "'. $ This-> getElement () -> getId (). '">' Fonctionne absolument.
Luke A. Leber