Pergunta

Eu sei que para criar uma dependência de campos é possível usar o nó

<depends />

Dito isto, tenho tentado várias maneiras de criar uma dependência de grupo, mas não consigo encontrar uma maneira de fazer o Magento usá-la, no código Form.php real que ele menciona

$dependent->fieldset

Então pode estar lá, mas não fui capaz de aproveitá-lo.

Editar:Em uma investigação mais aprofundada, parece que ele apenas percorre os campos para ler as dependências desde Mage_Adminhtml_Block_System_Config_Form::initFields()

foreach ($group->fields as $elements) {

Ainda seria bom saber como conseguir isso

Foi útil?

Solução

Você pode colocar JavaScript na área de comentários.Pode ser algo assim:

<comment><![CDATA[
    <script type="text/javascript">
        document.observe("dom:loaded",function(){
            if($('sections_groups_value').value != some_value){
                 Element.up($('sections_groups')).hide();
            }
        });
        Event.observe('sections_groups_value', 'change', function(){
            if(this.value != some_value){
                Element.up($('sections_groups')).hide();
            }else if(this.value == some_value){
                Element.up($('sections_groups')).show();
            }
        })
    </script>]]>
</comment>

Substitua “sections_groups_value”, “some_value” e “sections_groups” adequadamente.

Outras dicas

Em primeiro lugar, preciso de esclarecimentos sobre o texto abaixo.

Tenho tentado várias maneiras de criar uma dependência de grupo

Você está realmente tentando alcançar dependência de grupo de dependência de campo ?

Para tornar o ponto mais claro, groups e fields são diferentes na configuração do sistema.Grupos significa uma coleção de campos relacionados.

Uma coleção de relacionados fields constituem um group.Uma coleção de grupos relacionados constitui um section e a coleção de tais seções constituem toda a página de configuração do sistema.

Se você está falando sobre dependência de campo, então isso link é um bom ponto de partida.

Se você realmente precisa ver um exemplo em tempo real, você pode dar uma olhada em Mage_Customer módulo.Lá dentro app/code/core/Mage/Customer/etc/system.xml, você pode encontrar a definição para o grupo create_account.Você pode ver que mais de um campo nesse grupo depende de um campo com nome auto_group_assign.Se você seguir a mesma convenção para declarar seus campos personalizados, poderá facilmente conseguir o que realmente deseja.

Isenção de responsabilidade:- A seção a seguir é baseada na minha observação e pode ou não estar correta.Se eu estiver errado, por favor me corrija :-)

De você editar, posso ver que você está na direção certa. Por isso gostaria de dar uma pequena explicação sobre esta parte.

O método que você referenciou é Mage_Adminhtml_Block_System_Config_Form::initFields(). Mage_Adminhtml_Block_System_Config_Form é uma classe usada para constituir o formulário de configuração do sistema. initFields() é um método usado para gerar campos em um determinado grupo.

Se você observar esse método com atenção, poderá encontrar três loops.Abaixo estou mostrando sua estrutura

foreach ($group->fields as $elements) {

    //doing sorting on fields in a specific group and 
    //store sorted array of fields in $elements.

    foreach ($elements as $element) {

        //more more codes

        if ($element->depends) {
            foreach ($element->depends->children() as $dependent) {
            }
        }
    }
}

Aqui primeiro foreach loop coleta campos que vêm dentro de um determinado grupo (ou conjunto de campos).Esta coleção é gerada a partir da configuração xml que é feita através system.xml arquivo.Então coleção de campos que $group->fields contém uma matriz não classificada.Por isso initField() método fazendo uma classificação e mantendo os campos classificados como uma matriz em $elements.Então o segundo foreach loop está novamente percorrendo uma matriz classificada de campos.

Muitas coisas acontecem dentro desse loop.Não vou explicar o que exatamente acontece lá.No entanto, nossa área de interesse é a próxima foreach seção de loop.Antes que este loop seja executado, initFields() método verifica a dependência de um campo if ($element->depends).Assim, a dependência é especificada e itera por esses campos dependentes.($element->depends->children() na verdade, gera uma matriz de campos dependentes.isto é, campos dos quais o campo atual depende).

Espere...iterando por uma coleção de campos dependentes !!!!Significa que, podemos ter vários números de dependência de campo para um campo específico.Neste momento preciso esclarecer que estou me referindo a Magento 1.9.1.Este recurso não está disponível em versões mais antigas, eu acho.(a partir do magento 1.7, a dependência de vários campos é possível, eu acho).

E é isso.É assim que a dependência de campo é processada no magento.Você obterá mais detalhes no link especificado acima.Acabei de deixar o ponto claro.

Para magento 2.1.x, você pode usar o seguinte jQuery para alternar grupos de configuração dependentes:

<comment><![CDATA[
<script type="text/javascript">//<![CDATA[
    require(['jquery'], function(){
        if (jQuery('#field_id').val() == 'value_to_compare') {
            toggleDependantGroups(true);
        }

        jQuery('#field_id').change(function() {
            if (jQuery(this).val() == 'value_to_compare') {
                toggleDependantGroups(true);
            } else {
                toggleDependantGroups(false);
            }
        });

        function toggleDependantGroups(hide=true)
        {
            if (hide) {
                jQuery('#section-id').closest('div.section-config').hide();
                jQuery('#section-id').closest('div.section-config').hide();
                jQuery('#last-visible-section-id').closest('div.section-config').css('border-bottom-width', '0px');
            } else {
            jQuery('#section-id').closest('div.section-config').show();
            jQuery('#section-id').closest('div.section-config').show();
            jQuery('#last-visible-section-id').closest('div.section-config').css('border-bottom-width', '1px');
            }
        }
    });
</script>]]>

Substitua os IDs quando necessário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top