dependência de campo system.xml

16

Assim, você pode definir no system.xmlarquivo de um módulo uma dependência entre os campos, adicionando uma <depends>tag em um dos campos.

<field1>
    ....
</field1>
<field2>
    ....
    <depends>
       <field1>1</field1>
    </depends>
</field2>

O código acima significa que field2será mostrado quando o valor de field1for 1. Quero saber como / se posso dizer ao Magento para mostrar field2se o valor de field1é 1OR 2?

Marius
fonte

Respostas:

29

Tente o seguinte:

<depends>
    <field separator="|">
        <value>1|2|3</value>
    </field>
</depends>
Alexander
fonte
Você sabe que isso funciona, ou você está apenas divulgando isso?
benmarks
1
Cara ... eu não sei como, mas isso realmente funciona. Agora eu tenho vergonha e desculpe por todas as minhas palavrões que eu disse aos caras que implementaram a seção de configuração. Por algum motivo, $dependent['separator']retorna o valor do atributo separator. Para quem já votou positivamente, vote por favor (duas vezes se possível). Funciona perfeitamente. Obrigado. cc @benmarks
Marius
1
Este trabalho! = É uma boa ideia. Eu acho que não há necessidade de pedir desculpas por suas palavras :-D
benmarks
7

[EDITAR]

Eu estava errado na minha resposta abaixo. Não vou excluí-lo (ainda) porque recebi 7 votos positivos sobre isso :). Mas eu estou editando para que todos tenham a chance de retirar seu voto (até mesmo o voto negativo, porque eu mereço).

Resposta original

Ha! .. eu encontrei.
Resposta curta: você não pode!
Resposta longa : você deve conseguir fazer isso se alguém souber a diferença entre uma matriz e um objeto.
Em teoria, isso deve funcionar

<field1>
    ....
</field1>
<field2>
    ....
    <depends>
       <field1>
           <value>1|2</value>
           <separator>|</separator>
       </field1>
    </depends>
</field2>

Mas no código que lida com a dependência, Mage_Adminhtml_Block_System_Config_Form::initFieldsna linha 366 existe esse código

if (isset($dependent['separator'])) {
    $dependentValue = explode((string)$dependent['separator'], $dependentValue);
}

$dependenté sempre um objeto, portanto $dependent['separator']nunca é definido.
Se eu mudar o código acima para

if (isset($dependent->separator)) {
    $dependentValue = explode((string)$dependent->separator, $dependentValue);
}

tudo funciona sem problemas.
Eu acho que não posso mudar o núcleo apenas por uma extensão, então eu tenho que criar 2 campos em vez de 1, um para cada valor field1ou criar um js personalizado que lida com isso e adicioná-lo à página de configuração.

Marius
fonte
2
Droga. Eu conheço esse tipo de erro :-) Espero que você tenha denunciado? Great insight!
Fabian Blechschmidt 24/10/2013
1
Oh cara, que é uma ótima investigação, você tem certeza de que não é Sherlock? +1 por denunciá-lo.
David Manners
2
@DavidManners elementary my dear watson
Marius