Eu tenho uma lista suspensa que exibe vários campos com base no que é escolhido e sei que posso procurar a visibilidade com estados, mas quando tento usar o obrigatório, o * span é exibido, mas na verdade não é obrigatório. O que quero dizer é que, embora seja "obrigatório", posso clicar em enviar e não receber uma mensagem de erro do drupal. Estou fazendo algo errado ou isso está quebrado no Drupal 7.8?
$form['host_info'] = array(
'#type' => 'select',
'#title' => t("Host Connection"),
'#options' => array(
'SSH2' => t('SSH2'),
'Web Service' => t('Web Service'),
),
'#default_value' => t(variable_get('host_info', 'SSH2')),
'#description' => t("Specify the connection information to the host"),
'#required' => TRUE,
);
$form['ssh_host'] = array(
'#type' => 'textfield',
'#title' => t("Host Address"),
'#description' => t("Host address of the SSH2 server"),
'#default_value' => t(variable_get('ssh_host')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
),
);
$form['ssh_port'] = array(
'#type' => 'textfield',
'#title' => t("Port"),
'#description' => t("Port number of the SSH2 server"),
'#default_value' => t(variable_get('ssh_port')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('Web Service')),
),
),
);
7
javascript
Sathariel
fonte
fonte
name
. Deve ser:input[name="host_info"]
.Respostas:
Você precisará validar isso sozinho em uma função de validação personalizada.
Tudo o que é configurado pelo #states acontece 100% no navegador, tudo o que ele faz não é visível para o Drupal quando o formulário é enviado (por exemplo, todos os campos invisíveis do formulário são enviados e validados da mesma maneira se não houvesse #states).
fonte
Você pode usar o necessário assim:
fonte
Muito parecido com a resposta de Felix Eve, apenas este é um trecho para validação de elemento em linha:
Você chama uma função de validação de elemento como o elemento necessário:
Em seguida, a função de validação encontra o campo obrigatório e verifica se possui o valor correto do formulário que revelaria o campo que precisa ser solicitado.
fonte
Há outra maneira de usar a função AFTER_BUILD para o formulário e tornar esse campo opcional. Aqui está um link para o drupal 6.
Adicione isso ao seu código de formulário
Implementar após a construção, testar sua condição de campo personalizado
No meu caso, #states estava adicionando vários *, então eu tenho que evitá-lo e usei o jquery para ocultar e mostrar a extensão que contém *
E
Com base no meu valor custom_field.
fonte
Aqui está um guia detalhado sobre o Drupal 7 no formulário #states .
Esta é a parte importante:
fonte
Acabei de enfrentar o mesmo problema, então era necessário fornecer validação personalizada, no entanto, queria que isso fosse controlado por meio da matriz #states, para não precisar especificar as mesmas regras duas vezes.
Ele funciona extraindo o nome do campo do seletor jQuery (o seletor deve estar no formato
:input[name="field_name"]
ou não funcionará).O código abaixo é testado apenas no cenário específico em que eu o estava usando, no entanto, embora possa ser útil para outra pessoa.
fonte
Consegui fazê-lo desta maneira no Drupal 8:
Não coloque t ('SSH2'). isso colocará a tradução dela lá em vez do valor da opção que é um SSH2 não traduzido.
Eu suspeito que isso funcionaria para o Drupal 7 também.
fonte
Como aninhei campos de formulário e uma caixa de seleção, precisava trabalhar um pouco na resposta de Dominic Woodman. Caso qualquer outra pessoa tenha o mesmo problema:
fonte