A configuração 'depende' do modelo de front-end e back-end

8

Estou tendo dificuldades com a funcionalidade 'depende' na configuração.

Normalmente, adicionando <depends>a alguma opção de configuração, ela fica oculta, a menos que o valor da opção especificada corresponda.

Por exemplo:

<option_one>
    <label>Option 1</label>
    ...
</option_one>
<option_two>
    <label>Option 2</label>
    ...
    <depends><option_one>1</option_one></depends>
</option_two

Obviamente, estou perdendo alguns campos, mas você entendeu. A opção 2 aparece apenas quando a opção 1 possui o valor '1'.

Agora, meu problema é que, quando tento aplicar isso a uma opção com um modelo de back-end e front-end, isso depende não 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 opção não leva em consideração a opção 1, é sempre sempre visível.

Estou fazendo algo errado, ou isso é um bug ou 'funciona como planejado'?

Maikel Koek
fonte

Respostas:

8

Se você não usar frontend_modelseu html em dois campos, será semelhante a este

<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>

O javascript para mostrar / ocultar o campo dependente será parecido com este

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

E show / hide funcionará bem porque os dois IDs estão presentes em html.

Mas se você usar frontend_modelo valor para o segundo campo é renderizado por seu bloco personalizado module/adminhtml_form_field_teste não contém o ID do campo dependente e o javascript simplesmente não sabe o que 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>

Então, vá para o método _toHtml () module/adminhtml_form_field_teste envolva a saída dive especifique o ID para ela

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

//your html 
<div id="field id here">
    //your frontend_model html
</div>
oleksii.svarychevskyi
fonte
Ainda não testou isso, mas parece legítimo. Parece um inseto para mim. Não substitui _toHtml no meu modelo personalizado, mas acho que vou reescrever esse método para impedir que isso aconteça no futuro!
Maikel Koek
O senhor é um cavalheiro e um estudioso. Agrupar a saída do frontend_model com '<div id = "'. $ This-> getElement () -> getId (). '">' Absolutamente funciona.
22716 Luke A. Leber