Estoy desarrollando un componente personalizado para Joomla! 3.x y desea hacer una llamada AJAX dentro de él para recuperar algunos datos. ¿Cuál es la forma correcta de hacerlo?
component
ajax
development
joomla-3.x
Dmitry Rekun
fuente
fuente
Respuestas:
Abstracto
Casi no hay una forma realmente oficial de lidiar con esto, depende mucho de la complejidad y de cuánto desee confiar en el patrón MVC para hacer el trabajo.
A continuación se presentan algunas posibles soluciones que deberían funcionar en Joomla 2.5 y 3.x. El código no se presenta para un trabajo de copiar y pegar, sino más bien como una idea general.
Antes de Joomla! 3.2 lo único que necesita para usar los ejemplos a continuación es a
component
. Después de Joomla 3.2 (para tareas de menor complejidad) puede manejar la solicitud de módulos y complementos.Respuesta HTML genérica (siguiendo MVC heredado)
Su URL para la tarea debe tener este aspecto:
index.php?option=com_similar&task=abc&format=raw
Abc
Entonces, cree el controlador que usará la vista, digamos , que contendrá el archivo view.raw.html (idéntico a un archivo de vista normal).A continuación tiene el código para generar una respuesta HTML sin procesar:
/controller.php
/views/abc/view.raw.php
/views/abc/tmpl/default.php
Nota: Esta es la solución que usaría si tuviera que devolver HTML (es más limpio y sigue la lógica de Joomla). Para devolver datos JSON simples, consulte a continuación cómo colocar todo en el controlador.
Subcontroladores
Si realiza su solicitud de Ajax a un subcontrolador , como:
index.php?option=com_similar&controller=abc&format=raw
De lo que debe ser el nombre de su subcontrolador (para la vista sin formato)
abc.raw.php
.Esto significa también que tendrá / puede tener 2 subcontroladores llamados Abc.
Si devuelve JSON, puede tener sentido usar
format=json
yabc.json.php
. En Joomla 2.5. Tuve algunos problemas para que esta opción funcionara (de alguna manera el resultado estaba dañado), así que utilicé raw.Respuesta JSON válida (siguiente MVC nuevo / heredado)
Si necesita generar una respuesta JSON válida , consulte la página de documentos Generar salida JSON
En general, pondría este código en el controlador (llamará a un modelo que devolverá los datos que codifica, un escenario muy común). Si necesita llevarlo más lejos, también puede crear una vista JSON (view.json.php), similar al ejemplo en bruto.
Seguridad
Ahora que la solicitud de Ajax está funcionando, no cierre la página todavía. Lee abajo.
No olvide verificar las falsificaciones de solicitudes.
JSession::checkToken()
ven a la mano aquí. Lea la documentación sobre cómo agregar CSRF anti-spoofing a los formulariosSitios multilingües
Puede suceder que si no envía el nombre del idioma en la solicitud, Joomla no traducirá las cadenas de idioma que desea.
Considere agregar de alguna manera el parámetro lang a su solicitud (como
&lang=de
).Joomla! Interfaz Ajax
¡Nuevo en Joomla 3.2! - le permitió realizar solicitudes de manejo sin construir un componente
Joomla! Interfaz Ajax : Joomla ahora proporciona una forma ligera de manejar la solicitud de Ajax en un complemento o módulo. Es posible que desee utilizar Joomla! Interfaz Ajax si aún no tiene un componente o si necesita realizar solicitudes desde un módulo que ya tiene.
fuente
JRequest
? Está en desuso, ¿debería ser simplemente$this->input
porque uso v3.x?JRequest
. GraciasValid JSON Response
sección.Esta es una respuesta tardía para esta pregunta muy bien respondida, pero quería agregar esta solución de corte directo para aquellos que solo necesitan una forma simple de acceder a los datos de sus componentes con una llamada AJAX.
Con todas las versiones de Joomla, las posibilidades de terceros y los hacks que encontré durante varios días de búsqueda en Google, este fue el enfoque más simple que pude encontrar, y los comentarios son DEFINITIVAMENTE apreciados.
execute
a mi controlador principal existenteURL para llamar / ejecutar la tarea:
www.mysite.com/index.php?option=com_example&task=ForAjax.mytaskname
Controlador principal modificado \ com_example \ controller.php
Nuevo subcontrolador \ com_example \ controllers \ forajax.php
Salida JSON representada
fuente
La respuesta de Valentin es buena, pero es un poco compleja si todo lo que necesita hacer es agregar 1 o 2 llamadas ajax a un componente que ya está construido. Es perfectamente posible salirse con no hacer por separado
controller.raw.php
oview.raw.php
archivos.Para hacer esta llamada ajax
En el
job
subcontroladorfuente
La respuesta de Valentin es buena.
Prefiero un controlador json que maneje la codificación y el manejo de errores para esto. Creé una clase base json:
Este controlador se extiende por la clase de controlador que hace el trabajo, algo como esto:
y llamas a la solicitud así:
El hash de token se genera mediante JSession :: getFormToken (). Entonces, la llamada completa completa podría verse así:
El segundo parámetro se establece en "falso" para que podamos usar esto en llamadas de JavaScript sin reescritura xml.
fuente
JResponseJson
clase para manejarlo?Si está 100% seguro de que no hay ningún complemento de terceros que agregue ninguna salida de Javascript, un json_encode puro funciona bien.
Pero ... por ejemplo, JomSocial agrega "" a todo el sitio.
Entonces ... un truco útil, envuelva json_encode con etiquetas y proceselo en el lado de Javascript.
fuente
Puede acceder a un controlador directamente utilizando el nombre del controlador en la tarea:
llamará a: controller.raw.php (el retorno es sin formato)
llamará a: controller.php (el retorno es html si no lo usa
die;
)fuente