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.

¿Fue útil?

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 llamado frontName En la definición del módulo XML
  • ajax 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 el indexAction 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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top