Вызов Ajax не работает


Я пытаюсь вызвать .phtml с помощью вызова ajax, и я последовал этому примеру в stackoverflow, но я либо упускаю какой-то аспект, либо просто делаю это неправильно. Когда запускается ajax, он получает 404, и я попытался просмотреть его непосредственно через браузер, но он не смог его найти. Исходя из этого, я предполагаю, что какой-то аспект файловой структуры, которую я настроил, неверен, но я не могу понять, что именно.

У меня есть контроллер, расположенный по адресу local/CheckoutAjax/controllers/AjaxController.php

    <?php
    class Checkoutajax_AjaxController extends Mage_Core_Controller_Front_Action {

    public function indexAction() {
          $this->loadLayout();
          $this->renderLayout();
      }
   }

В local/CheckoutAjax/etc/config.xml У меня есть следующее

    <?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>

У меня есть это в mytemplate/default/layout/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>

И, наконец, у меня есть в mytemplate/по умолчанию/шаблон/checkoutajax/index.phtml

   <?php
   echo 'this is a test'

Наконец, это вызов 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';
            }
        });

Мы очень признательны за любую помощь.

Author: Community, 2013-10-17

2 answers

Некоторые советы по устранению неполадок:

У вас есть модуль, зарегистрированный в приложении/etc/modules?

Если нет, то это должно быть так:

<?xml version="1.0"?>
<config>
    <modules>
        <ThomasRyan_Checkoutajax>
             <active>true</active>
             <codePool>local</codePool>
        </ThomasRyan_Checkoutajax>
    </modules>
</config>

Это название модуля выглядит неправильным - ожидается, что оно будет разделено подчеркиванием, указывающим на пространство имен - так что не это:

<module>Checkoutajax</module>

Все модули называются Company_Module и т.д. В этом случае Checkoutajax_AjaxController не является допустимым именем класса. Проверьте свой общий журнал ошибок PHP (или журналы Apache), и вы увидите что-то в духе class not exists.

Измените/обновите это на ThomasRyan_Checkoutajax или аналогичное. Все экземпляры Checkoutajax необходимо будет обновить в определении xml модуля.

У имени пользователя также есть проблемы, а именно, оно должно быть в нижнем регистре:

<frontName>Checkoutajax</frontName>

Я не уверен, что Magento использует нижний регистр в имени маршрута.

Обновленный код, затем:

<?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>

И контроллер:

<?php

class ThomasRyan_Checkoutajax_AjaxController extends Mage_Core_Controller_Front_Action {

    public function indexAction() {
        $this->loadLayout();
        $this->renderLayout();
    }
}

Редактировать:

Это всего лишь краткое обновление чтобы объяснить, как маршруты/контроллеры/действия работают в Magento. Допустим, это ваш URL-адрес:

www.yourstore.com/checkoutajax/ajax/index

Это представляет три разные сущности:

  • checkoutajax - это имя маршрута, также называемое frontName в XML-определении модуля
  • ajax здесь представляет имя контроллера. Этот файл контроллера должен иметь имя AjaxController.php и находится в каталоге /controllers вашего модуля.
  • index представляет метод indexAction.

Итак, чтобы визуализируйте:

www.yourstore.com/checkoutajax/ajax/index
---------route--------^
---------controller-------------^
---------action-----------------------^
 7
Author: philwinkle, 2013-10-17 16:14:27

У вас опечатка в имени файла. Файл контроллера должен иметь имя local/CheckoutAjax/controllers/AjaxController.php (без буквы s)

 1
Author: Tobias, 2013-10-17 15:29:42