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'
),
)
);
fonte
ctools_add_js();
oudrupal_add_js();
no final dehook_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).Respostas:
Resposta curta: você deve usar #ajax ['caminho'].
Resposta longa:
Ter um retorno de chamada ajax não ajuda, pois o ctools cria seus formulários de maneira diferente. O retorno de chamada feito pelo system / ajax não pode encontrar a definição completa do formulário, portanto, não pode encontrar um elemento para processar a solicitação do ajax. O uso de #ajax [path] apenas aciona um item de menu.
Você pode verificar por si mesmo descartando o formulário ao usar #ajax [retorno de chamada]
Modifiquei o simplecontext_content_type_edit_form adicionando o widget de preenchimento automático do usuário e seu campo, os quais funcionam :)
Agora que você usa o caminho #ajax, precisa adicionar um item de menu como eu queria
Uma dica sobre #attached [js]: os js inline devem ser key => value como:
Eu usei o Firebug para verificar o valor resultante e não o efeito resultante. Espero que isso ajude a resolver seu problema.
fonte
Eu tive um problema semelhante, no qual queria incluir um tipo de elemento de mídia em um plug-in de tipo de conteúdo do CTools, que também usa o ajax para selecionar uma imagem.
Ele usa sua própria configuração de 'caminho' do ajax, em vez da configuração de 'retorno de chamada', mas ao selecionar uma imagem, o formulário foi reconstruído sem o elemento de mídia completamente.
Rastreei isso pelo fato de que drupal_rebuild_form não pôde encontrar nem a função wrapper de formulário CTools nem a função de formulário de configurações reais. Então eu o corrigi adicionando essas linhas de código ao formulário de configurações do ctools:
Talvez esteja faltando algo óbvio por que os arquivos de inclusão não foram carregados, mas incluí-los manualmente corrigiu o problema para mim.
fonte
do meu lado, tive que escrever uma função de wrapper de formulário no arquivo .module e incluir o painel manualmente (onde o conteúdo do formulário original é definido) assim:
Agora, durante a chamada ajax, o Drupal pode recuperar meu formulário para que eu possa usar a API de formulário padrão AJAX.
fonte