Ocultar / mostrar dinamicamente campos da API de campo no Drupal 7

15

Eu criei uma entidade com um formulário 'adicionar novo'. A própria entidade possui um número limitado de variáveis ​​reais. Adicionei a maioria dos dados extras necessários para o uso de campos personalizados (por exemplo, a API do campo).

O que preciso fazer nesta fase é poder ocultar dinamicamente um campo com base no valor de outro. ou seja, se um campo suspenso tiver seu valor definido como Não, outro campo deverá ser oculto, caso contrário, deverá ser mostrado.

Pelo que pude ver, é um pouco fácil adicionar essa funcionalidade aos campos criados usando a API do formulário (por exemplo, através da propriedade AJAX); no entanto, existe alguma maneira de alcançá-lo usando os campos anexados? Não tenho problemas ao usar Javascript personalizado, se é isso que é necessário para resolver isso.

NRaf
fonte
Eu não tenho certeza se drupal.org/project/conditional_fields está pronto para ir para d7 ainda, mas pode valer a pena olhar para
Jukebox

Respostas:

6

O jQuery funciona bem para isso:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);
keithm
fonte
Sim, acabei usando drupal_add_js na página do formulário e acabei fazendo isso no jQuery. Eu só estava me perguntando se havia uma maneira mais 'Drupal' de fazer isso.
NRaf
Eu mencionaria que não sou um grande fã da abordagem Drupal #states à visibilidade, por isso não a sugeri acima.
KeithM
@keithm Você poderia explicar por que você não é fã de estados (a partir de 2015, D7). Estou trabalhando em um projeto em que estamos tentando tomar a decisão de usar #states vs drupal_add_js. Por que você acha que uma é uma escolha melhor do que a outra?
blue928
É uma questão de preferência legítima do programador na minha opinião; minha lógica pode ser diferente da sua. Dito isto, na prática, não gosto de recorrer a outra sintaxe que duplica a funcionalidade encontrada no Javascript / jQuery. Quando tentei #states, também encontrei os casos de uso para os quais ele aparentemente foi projetado como limitativo demais. Quando meu problema se estendeu para fora desses casos de uso, tive que reescrever tudo em Javascript direto de qualquer maneira.
KeithM
20

No Drupal 7, você pode usar $ form em #statesvez do script jQuery personalizado. Exemplo:

  $form['student_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'checkboxes',
    '#options' => drupal_map_assoc(array(t('SAT'), t('ACT'))),
    '#title' => t('What standardized tests did you take?'),
    // This #states rule says that this checkboxes array will be visible only
    // when $form['student_type'] is set to t('High School').
    // It uses the jQuery selector :input[name=student_type] to choose the
    // element which triggers the behavior, and then defines the "High School"
    // value as the one that triggers visibility.
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type"]' => array('value' => 'high_school'),
      ),
    ),
  );

Aqui está um exemplo se você deseja usar #statespara a condição de vários valores:

 $form['student_type'] = array(
    '#type' => 'checkboxes',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'textfield',
    '#title' => t('What standardized tests did you take?'),
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type[high_school]"]' => array('checked' => TRUE),
        ':input[name="student_type[undergraduate]"]' => array('checked' => TRUE),
        ':input[name="student_type[graduate]"]' => array('checked' => FALSE),
      ),
    ),
  );

Veja o form_example/form_example_states.inc módulo from examples para mais detalhes e exemplos.

milkovsky
fonte
Por falar nisso #states, nunca encontrei uma maneira de definir condições de visibilidade mais complexas, como: ocultar o controle A quando o valor do controle B estiver na matriz (x, y, z). Você conhece uma sintaxe para isso?
29512 Artur
11
Veja minha atualização acima
milkovsky:
5

Você deve tentar Campos Condicionais , acho que este módulo é essencial para esta tarefa. Você pode definir dependências entre os campos em uma interface administrativa amigável. Por exemplo, você pode definir o Acampo para ficar visível apenas se o Bcampo tiver o valor " 1234 " ou definir o campo de Ctexto para ficar visível apenas quando o Dcampo estiver marcado ou definir o Ecampo para invisível se Festiver focado etc.

No formulário de upload, essas dependências serão definidas no lado do cliente, na exibição do nó, essas dependências serão definidas no lado do servidor.

Você pode definir essas dependências em admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies .

Campos Condicionais (Fonte da imagem: a página do projeto )

Sk8erPeter
fonte