Estou criando um tipo de conteúdo de painéis do CTools (ou seja, aquela coisa que você insere nos painéis ao adicionar conteúdo, não um tipo de nó) e estou tentando usar o #ajax
atributo de um item de formulário para definir alguns valores padrão. Veja o código abaixo.
A my_module_content_type_edit_form($form, &$form_state)
propósito, tudo isso está dentro da chamada do tipo de conteúdo .
$form['link_type'] = array(
'#type' => 'radios',
'#title' => t('Link Type'),
'#ajax' => array(
'callback' => 'my_module_set_target'
),
'#default_value' => empty($conf['link_type']) ? '_blank' : $conf['link_type'],
'#options' => array('none'=>t('No Link'), 'internal'=>t('Internal Link'), 'external'=>t('External Link'), 'document'=>t('Document Link')),
);
Meu retorno de chamada é o seguinte.
function my_module_set_target($form, $form_state) {
watchdog("Test", "Testing callback", array(), WATCHDOG_ALERT);
$form['link_target']['#default_value'] = '_parent';
return $form['link_target']['#default_value'];
}
Independentemente de o retorno que estou sugerindo realmente funcionar, watchdog()
nem funciona.
Eu sei que o CTools faz algumas coisas estranhas com o AJAX, mas não pode ser tão estranho assim. Você tem alguma idéia de como eu faria o que estou querendo fazer?
Obrigado!
Como alternativa: como definir um valor padrão com base no valor de uma opção de formulário anterior?
Eu descobri como fazer isso, mas é um pouco hacky - você cria novos campos de formulário para cada fork de dependência. Em seguida, é possível mesclar os valores hook_content_type_edit_form_submit()
, usando o que corresponder ao valor escolhido para o componente que inicialmente bifurcou tudo.
Estou deixando a pergunta em aberto porque eu (e, francamente, todos os programadores com os quais estou trabalhando) realmente deseja uma boa maneira de usar o AJAX dentro desses formulários de edição do tipo de conteúdo do Painel.
Atualização: parece que você também não pode fazer coisas com #attached.
$form['link'][$i] = array(
'#type' => 'fieldset',
'#title' => t('Link #@num', array('@num' => $i)),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#attached' => array(
'js' => array(
'alert("Yay.");', 'inline'
),
)
);
ctools_add_js();
ou drupal_add_js();
no final de hook_content_type_edit_form();
. Se você está apenas fazendo coisas simples relacionadas à interface do usuário, parece que essa é a melhor opção (pelo menos até alguém responder adequadamente a essa pergunta).