Ajax Call no funciona
-
16-10-2019 - |
Pregunta
Estoy tratando de llamar a .phtml a través de una llamada de Ajax y seguí este Ejemplo en StackOverflow, pero me falta algún aspecto o simplemente lo hago mal. Cuando se ejecuta el AJAX, obtiene un 404 e intenté verlo directamente a través del navegador y no pude encontrarlo. Según esto, supongo que algún aspecto de la estructura del archivo que configuré está mal, pero no puedo entender qué exactamente.
Tengo controlador ubicado en local/checkoutajax/controladores/ajaxcontroller.php
<?php
class Checkoutajax_AjaxController extends Mage_Core_Controller_Front_Action {
public function indexAction() {
$this->loadLayout();
$this->renderLayout();
}
}
En local/checkoutajax/etc/config.xml tengo lo siguiente
<?xml version="1.0"?>
<config>
<modules>
<Checkoutajax>
<version>0.1.0</version>
</Checkoutajax>
</modules>
<frontend>
<routers>
<Checkoutajax>
<use>standard</use>
<args>
<module>Checkoutajax</module>
<frontName>Checkoutajax</frontName>
</args>
</Checkoutajax>
</routers>
<layout>
<updates>
<checkoutajax>
<file>checkoutajax.xml</file>
</checkoutajax>
</updates>
</layout>
</frontend>
</config>
Tengo esto en mytemplate/predeterminado/diseño/checkoutajax.xml
<?xml version="1.0"?>
<layout>
<checkoutajax_ajax_index>
<block type="checkout/checkoutajax" name="root" output="toHtml" template="checkoutajax/index.phtml" />
</checkoutajax_ajax_index>
</layout>
y finalmente tengo en mytemplate/default/plantplate/checkoutajax/index.phtml
<?php
echo 'this is a test'
Finalmente esta es la llamada de Ajax
JQuery.ajax({
url: "/checkoutajax/ajax/index",
type: "POST",
data: data,
success: function(data) {
$j('#results').html(data);
document.getElementsByClassName('minicart-content')[0].style.display = 'block';
}
});
Toda ayuda es muy apreciada.
Solución
Algunos consejos de solución de problemas:
¿Tiene un módulo registrado en la aplicación/etc/módulos?
Si no, debería ser tal:
<?xml version="1.0"?>
<config>
<modules>
<ThomasRyan_Checkoutajax>
<active>true</active>
<codePool>local</codePool>
</ThomasRyan_Checkoutajax>
</modules>
</config>
Este nombre de módulo parece incorrecto, se espera que se separe con un bajo espacio que indica el espacio de nombres, por lo que no es esto:
<module>Checkoutajax</module>
Todos los módulos se nombran como Company_Module
, etc. Checkoutajax_ajaxController no es un nombre de clase válido. Verifique su registro general de errores de PHP (o registros de Apache) y debería ver algo en el sentido de class not exists
.
Cambiar/actualizar esto a ThomasRyan_Checkoutajax
o similar. Todas las instancias de checkoutajax deberán actualizarse en la definición XML del módulo.
El nombre del frente también tiene problemas, a saber, debe ser en minúsculas:
<frontName>Checkoutajax</frontName>
No estoy seguro de si Magento obliga a los minúsculas en el nombre de rutina.
El código actualizado, entonces:
<?xml version="1.0"?>
<config>
<modules>
<ThomasRyan_Checkoutajax>
<version>0.1.0</version>
</ThomasRyan_Checkoutajax>
</modules>
<frontend>
<routers>
<Checkoutajax>
<use>standard</use>
<args>
<module>ThomasRyan_Checkoutajax</module>
<frontName>checkoutajax</frontName>
</args>
</Checkoutajax>
</routers>
<layout>
<updates>
<checkoutajax>
<file>checkoutajax.xml</file>
</checkoutajax>
</updates>
</layout>
</frontend>
</config>
Y el controlador:
<?php
class ThomasRyan_Checkoutajax_AjaxController extends Mage_Core_Controller_Front_Action {
public function indexAction() {
$this->loadLayout();
$this->renderLayout();
}
}
Editar:
Esta es solo una actualización rápida para explicar cómo funcionan las rutas/controladores/acciones en Magento. Digamos que esta es su URL:
www.yourstore.com/checkoutajax/ajax/index
Esto representa tres entidades diferentes:
checkoutajax
es el nombre de la ruta, también llamadofrontName
En la definición del módulo XMLajax
Aquí representa el nombre del controlador. Este archivo de controlador debe llamarse AjaxController.php y ubicado en el/controllers
directorio de su módulo.index
representa elindexAction
método.
Entonces, para visualizar:
www.yourstore.com/checkoutajax/ajax/index
---------route--------^
---------controller-------------^
---------action-----------------------^
Otros consejos
Tiene un error tipográfico en su nombre de archivo. El archivo del controlador debe nombrarse local/checkoutajax/controladores/ajaxcontroller.php (sin una S)