Estou desenvolvendo um componente personalizado para o Joomla! 3.xe deseja fazer uma chamada AJAX dentro dele para recuperar alguns dados. Qual é a maneira correta de fazer isso?
component
ajax
development
joomla-3.x
Dmitry Rekun
fonte
fonte
Respostas:
Abstrato
Quase não existe uma maneira oficial de lidar com isso, depende muito da complexidade e do quanto você deseja confiar no padrão MVC para fazer o trabalho.
Abaixo estão algumas soluções possíveis que devem funcionar no Joomla 2.5 e 3.x. O código não é apresentado para um trabalho de copiar e colar, mas como uma idéia geral.
Antes do Joomla! 3.2 a única coisa que você precisa para usar os exemplos abaixo é a
component
. Após o Joomla 3.2 (para tarefas menos complexas), você pode lidar com solicitações de módulos e plugins.Resposta HTML genérica (após MVC herdado)
Seu URL para a tarefa precisa ter a seguinte aparência:
index.php?option=com_similar&task=abc&format=raw
Você criou o controlador que usará a visualização, digamos
Abc
, que conterá o arquivo view.raw.html (idêntico a um arquivo de visualização normal).Abaixo você tem o código para gerar uma resposta HTML bruta:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Nota: Esta é a solução que eu usaria se tivesse que retornar HTML (é mais limpo e segue a lógica do Joomla). Para retornar dados JSON simples, veja abaixo como colocar tudo no controlador.
Subcontroladores
Se você fizer sua solicitação do Ajax para um subcontrolador , como:
index.php?option=com_similar&controller=abc&format=raw
Do que o nome do seu subcontratado (para a visualização bruta) precisa ser
abc.raw.php
.Isso significa também que você terá / poderá ter 2 subcontroladores chamados Abc.
Se você retornar JSON, pode fazer sentido usar
format=json
eabc.json.php
. No Joomla 2.5. Eu tive alguns problemas para que essa opção funcionasse (de alguma forma, a saída foi corrompida), então usei raw.Resposta JSON válida (após o MVC novo / legado)
Se você precisar gerar uma resposta JSON válida , consulte a página de documentos Gerando saída JSON
Você geralmente colocaria esse código no controlador (você chamará um modelo que retornará os dados que você codifica - um cenário muito comum). Se você precisar ir além, também poderá criar uma visualização JSON (view.json.php), semelhante ao exemplo bruto.
Segurança
Agora que a solicitação do Ajax está funcionando, não feche a página ainda. Leia abaixo.
Não se esqueça de procurar falsificações de pedidos.
JSession::checkToken()
venha a calhar aqui. Leia a documentação em Como adicionar anti-spoofing CSRF aos formuláriosSites multilíngues
Pode acontecer que, se você não enviar o nome do idioma na solicitação, o Joomla não traduzirá as seqüências de caracteres desejadas.
Considere anexar de alguma forma o parâmetro lang à sua solicitação (como
&lang=de
).Joomla! Interface Ajax
Novo no Joomla 3.2! - permitiu que você fizesse solicitações de manipulação sem criar um componente
Joomla! Interface Ajax - O Joomla agora oferece uma maneira leve de lidar com a solicitação do Ajax em um plug-in ou módulo. Você pode querer usar o Joomla! Interface Ajax se você ainda não possui um componente ou se precisa fazer solicitações de um módulo que já possui.
fonte
JRequest
? Ele está obsoleto, deve ser simplesmente$this->input
desde que eu uso a v3.x?JRequest
. ObrigadoValid JSON Response
seção.Esta é uma resposta tardia para esta pergunta muito bem respondida, mas eu queria adicionar esta solução simples para aqueles que precisam apenas de uma maneira simples de acessar os dados de seus componentes com uma chamada AJAX.
Com todas as versões do Joomla, possibilidades de terceiros e hacks que eu encontrei ao longo de vários dias pesquisando no Google, essa foi a abordagem mais simples que eu pude criar - e o feedback é DEFINATAMENTE apreciado.
execute
ao meu controlador principal existenteURL para chamar / executar a tarefa:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Controlador principal modificado \ com_example \ controller.php
Novo subcontrolador \ com_example \ controllers \ forajax.php
Saída JSON renderizada
fonte
A resposta do Valentin é boa, mas é um pouco complexa, se tudo o que você precisa fazer é adicionar 1 ou 2 chamadas ajax a um componente que já foi criado. É perfeitamente possível evitar não criar arquivos
controller.raw.php
ouview.raw.php
arquivos separados .Para fazer esta chamada ajax
No
job
subcontroladorfonte
A resposta de Valentin é boa.
Eu prefiro um controlador json que lida com a codificação e manipulação de erros para isso, criei uma classe base json:
Esse controlador é estendido pela classe do controlador que faz o trabalho, algo como isto:
e você chama a solicitação assim:
O hash do token é gerado por JSession :: getFormToken (). Portanto, a chamada completa completa pode ser assim:
O segundo parâmetro é definido como "false" para que possamos usá-lo em chamadas javascript sem reescrever xml.
fonte
JResponseJson
classe para lidar com isso?Se você tem 100% de certeza de que não há um plug-in thrid-party que adicione qualquer saída Javascript, um json_encode puro funciona.
Mas ... por exemplo, o JomSocial adiciona "" a todo o site.
Então ... um truque útil, envolva json_encode com tags e processe-o no lado do Javascript.
fonte
Você pode acessar um controlador diretamente usando o nome do controlador na tarefa:
chamará: controller.raw.php (o retorno é bruto)
chamará: controller.php (o retorno é html se você não usar
die;
)fonte