Die Konfiguration hängt vom Front- und Backend-Modell ab


8

Ich habe Probleme mit der "abhängigen" Funktionalität in der Konfiguration.

Normalerweise wird eine <depends>Konfigurationsoption ausgeblendet, sofern der Wert der angegebenen Option nicht übereinstimmt.

Zum Beispiel:

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

Natürlich fehlen mir einige Felder, aber Sie verstehen es. Option 2 wird nur angezeigt, wenn Option 1 den Wert '1' hat.

Mein Problem ist nun, wenn ich versuche, dies auf eine Option mit einem Backend- und Frontend-Modell anzuwenden, funktioniert dies abhängig davon nicht:

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

Diese Option berücksichtigt Option 1 nicht, sondern ist immer sichtbar.

Mache ich etwas falsch oder ist das ein Fehler oder funktioniert es wie geplant?

Antworten:


8

Wenn Sie frontend_modelIhr HTML nicht für zwei Felder verwenden, sieht es so aus

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

Das Javascript zum Anzeigen / Ausblenden des abhängigen Felds sieht folgendermaßen aus

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

Und show / hide funktioniert einwandfrei, da beide IDs in HTML vorhanden sind.

Wenn Sie jedoch frontend_modelden Wert für das zweite Feld verwenden, wird dieser von Ihrem benutzerdefinierten Block gerendert module/adminhtml_form_field_testund enthält keine ID des abhängigen Felds. Javascript weiß einfach nicht, was zu verbergen ist.

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

Gehen Sie also zur _toHtml () -Methode von module/adminhtml_form_field_testund verpacken Sie die Ausgabe in divund geben Sie die ID dafür an

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

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

Habe das noch nicht getestet, aber es klingt echt. Scheint mir ein Fehler zu sein. Ich habe _toHtml in meinem benutzerdefinierten Modell nicht überschrieben, aber ich denke, ich werde diese Methode neu schreiben, um dies in Zukunft zu verhindern!
— Maikel Koek

Sie, Sir, sind ein Gentleman und ein Gelehrter. Das Umschließen der Ausgabe des Frontend-Modells mit '<div id = "'. $ This-> getElement () -> getId (). '">' Funktioniert absolut.
— Luke A. Leber
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.