La configurazione "dipende" dal modello anteriore e dal modello di backend


8

Sto riscontrando difficoltà con la funzionalità "dipende" nella configurazione.

Normalmente, aggiungendo <depends>ad alcune opzioni di configurazione, è nascosto a meno che il valore dell'opzione data corrisponda.

Per esempio:

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

Ovviamente mi mancano alcuni campi, ma hai capito. L'opzione 2 appare solo quando l'opzione 1 ha il valore '1'.

Ora il mio problema è, quando provo ad applicare questo a un'opzione con un modello di backend e frontend, questo a seconda del caso non funziona:

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

Questa opzione non terrà conto dell'opzione 1, è sempre visibile.

Sto sbagliando qualcosa o è un bug o "funziona come previsto"?

Risposte:


8

Se non usi il frontend_modeltuo html per due campi apparirà così

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

Il javascript per mostrare / nascondere il campo dipendente sarà simile a questo

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

E show / hide funzionerà bene perché entrambi gli ID sono presenti in HTML.

Ma se usi frontend_modelil valore per il secondo campo viene visualizzato dal tuo blocco personalizzato module/adminhtml_form_field_teste non contiene l'id del campo dipendente e javascript non sa cosa nascondere.

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

Quindi vai al metodo _toHtml () module/adminhtml_form_field_teste includi l'output dive specifica l'id per esso

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

//your html 
<div id="field id here">
    //your frontend_model html
</div>

Non l'ho ancora testato, ma sembra legittimo. Mi sembra un insetto. Non ho sovrascritto _toHtml nel mio modello personalizzato, ma penso che riscriverò questo metodo per evitare che ciò accada in futuro!
Maikel Koek,

Signore, siete gentiluomini e studiosi. Il wrapping dell'output di frontend_model con '<div id = "'. $ This-> getElement () -> getId (). '">' Funziona assolutamente.
Luke A. Leber,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.