Конфигурация зависит от передней и задней моделей

8

У меня проблемы с функционалом «зависит» в конфигурации.

Обычно, добавляя <depends>к некоторому параметру конфигурации, он скрыт, если значение данного параметра не совпадает.

Например:

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

Очевидно, мне не хватает некоторых полей, но вы поняли. Вариант 2 появляется только тогда, когда вариант 1 имеет значение «1».

Теперь моя проблема в том, что, когда я пытаюсь применить это к опции с моделью бэкэнда и внешнего интерфейса, эта зависимость не работает:

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

Эта опция не учитывает вариант 1, она всегда видна.

Я делаю что-то не так, или это ошибка, или «работает как задумано»?

Майкель Коек
источник

Ответы:

8

Если вы не используете frontend_modelсвой HTML для двух полей, будет выглядеть так

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

JavaScript для отображения / скрытия зависимого поля будет выглядеть следующим образом

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

И show / hide будет работать нормально, потому что оба идентификатора присутствуют в html.

Но если вы используете frontend_modelзначение для второго поля, отображается вашим пользовательским блоком module/adminhtml_form_field_testи не содержит идентификатор зависимого поля, а javascript просто не знает, что скрывать.

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

Итак, перейдите к методу _toHtml () module/adminhtml_form_field_testи оберните вывод divи укажите для него id

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

//your html 
<div id="field id here">
    //your frontend_model html
</div>
oleksii.svarychevskyi
источник
Пока не проверял, но это звучит правдоподобно. Похоже, ошибка для меня. Я не переписывал _toHtml в своей пользовательской модели, но я думаю, что я собираюсь переписать этот метод, чтобы предотвратить это в будущем!
Майкель Коек
Вы, сэр, джентльмен и ученый. Оборачивание вывода frontend_model с помощью '<div id = "'. $ This-> getElement () -> getId (). '">' Абсолютно работает.
Люк А. Лебер