Você pode usar o Ajax para fazer isso. O Drupal 7 agora tem um bom suporte ao Ajax. Na sua primeira lista de seleção (cidade), você precisará adicionar informações do Ajax. Em seguida, a segunda lista de seleção pode ser preenchida com base nas informações da primeira. Você também pode ocultar a segunda lista de seleção até que uma opção na primeira seja selecionada, e eu explicarei como fazer isso daqui a pouco. Primeiro, para configurar o formulário básico:
$form['city'] = array(
'#type' => 'select',
'#title' => t('City'),
'#options' => $options,
'#ajax' => array(
'event' => 'change',
'wrapper' => 'squadron-wrapper',
'callback' => 'mymodule_ajax_callback',
'method' => 'replace',
),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
Esta é apenas a configuração básica dos elementos. Agora você precisará de uma maneira de determinar quais opções devem estar no esquadrão. Primeiro, você precisa identificar seu retorno de chamada do Ajax na lista de seleção 'cidade'. Na maioria dos casos, você pode simplesmente retornar o elemento que envolve o elemento ajax, neste caso $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Agora, quando a lista de seleção 'cidade' mudar, ela reconstruirá a parte do esquadrão-invólucro. O valor da sua 'cidade' agora estará em $ form_state ['values']. Portanto, quando o formulário é reconstruído, precisamos determinar quais opções dar à lista de seleção com base no valor de 'cidade'.
// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
case 'default':
// Set default options.
break;
case 'losangeles':
// Set up $squadron_options for los angeles.
break;
}
// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
}
Muito obrigado a jordojuice acima. Com a ajuda dele, consegui encontrar uma solução. Também me referi ao exemplo em http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . Acabei usando o código abaixo, que funcionava em um módulo personalizado. Por alguma razão, não consegui encontrar nenhum dos meus valores nos valores $ form_state, mas consegui encontrá-los no formato $. Finalmente, quando testei, recebi uma mensagem de erro informando que Drupal havia detectado uma escolha ilegal no menu suspenso. Cheguei a esse ponto comentando a linha 1290 em form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
O código final que usei foi:
fonte
coloque a linha de código ou seja,
$nodes[''] = '- None -';
depoisem ur
sappers_squadron_squadrons function
e isso resolverá seu erroform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
fonte
A causa raiz de "Uma escolha ilegal foi detectada. Entre em contato com o administrador do site". é que a sequência vazia com o valor 0 adicionado por
$nodes[]="";
é inválida para o campo field_squadron.Consulte Programação e desenvolvimento avançados do PHP , mas lembre-se de que os sinalizadores DANGEROUS_SKIP_CHECK e validados estão obsoletos no D7 .
Depois de remover essa linha, o erro desapareceu.
fonte
Use o módulo limite de opção do campo Referência
fonte