Модуль и вызов ajax

Я пытаюсь создать вызов ajax для настраиваемого контроллера.

Я слежу за: http://www.atwix.com/magento/ajax-requests-in-magento/ - который дает краткий пример того, как создавать.

Итак, у меня есть следующие файлы:

app/etc/moudles/BM_Sidebar.xml

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

app/code/local/BM/Sidebar/controllers/IndexController.php

class BM_Sidebar_IndexController extends Mage_Core_Controller_Front_Action {

    public function indexAction() {
        echo "test data";
    }
}

app/code/local/BM/Sidebar/controllers/etc/config.xml

<?xml version="1.0"?>
<config>
  <modules>
    <BM_Sidebar>
      <version>0.1.0</version>
    </BM_Sidebar>
  </modules>
  <frontend>
    <routers>
      <sidebar>
        <use>standard</use>
        <args>
          <module>BM_Sidebar</module>
          <frontName>carfilter</frontName>
        </args>
      </sidebar>
    </routers>
    <layout>
      <updates>
        <sidebar>
          <file>sidebar.xml</file>
        </sidebar>
      </updates>
    </layout>
  </frontend>
</config>

Я изо всех сил пытаюсь выработать то, что мне нужно было бы положить в sidebar.xml

Нужно ли создавать класс блоков?

Спасибо

Ответ 1

Как AJAX

  • он всегда начинается с файла config.xml:

    1. объявите свой маршрутизатор: используйте то же имя маршрутизатора, что и содержимое тега frontName

      <frontend>
          <routers>
              <carfilter>
                  <use>standard</use>
                  <args>
                      <module>BM_Sidebar</module>
                      <frontName>carfilter</frontName>
                  </args>
              </carfilter>
          </routers>
      </frontend>
      
    2. объявить файл макета (вы сделали это)

в вашем файле макета вам нужно 2 дескриптора: 1 для состояния init и один для ajax. Ручки соответствуют URL-адресу, с которым вы работаете:

<layout version="0.1.0">
    <carfilter_ajax_index>
        <reference name="head">
            <action method="addItem"><type>skin_js</type><name>js/carfilter.js</name></action>
        </reference>
        <reference name="content">
            <block type="core/template" name="carfilter" as="carfilter" template="carfilter/init.phtml" />
        </reference>
    </carfilter_ajax_index>

    <carfilter_ajax_ajax>
        <remove name="right"/>
        <remove name="left"/>
        <block type="core/template" name="carfilter_ajax" as="carfilter_ajax" template="carfilter/ajax.phtml" output="toHtml" />
    </carfilter_ajax_ajax>
</layout>

note: обратите внимание на атрибут output в объявлении блока для вызова AJAX

создайте свои phtml файлы (те, которые вы указали в файле макета):

  1. init.phtml: создать div, который будет обновлен с результатом AJAX и инициировать объект javascript

    first state
    <div id="div-to-update"></div>
    <script type="text/javascript">
    //<![CDATA[
        new Carfilter('<?php echo $this->getUrl('carfilter/ajax/ajax') ?>', 'div-to-update');
    //]]>
    </script>
    
  2. ajax.phtml: html, который вы хотите показать с помощью AJAX

    var Carfilter = Class.create();
    Carfilter.prototype = {
        initialize: function(ajaxCallUrl, divToUpdate) {
            this.url = ajaxCallUrl;
            this.div = divToUpdate;
            this.makeAjaxCall();
        },
    
        makeAjaxCall: function() {
            new Ajax.Request(this.url, {
                onSuccess: function(transport) {
                    var response = transport.responseText.evalJSON();
                    $(this.div).update(response.outputHtml);
                }.bind(this)
            });
        }
    };
    

контроллер: 2 действия в этом примере, индекс при загрузке страницы и ajax:

<?php

class BM_Sidebar_AjaxController extends Mage_Core_Controller_Front_Action
{

    public function indexAction()
    {
        $this->loadLayout();
        $this->_initLayoutMessages('customer/session');
        $this->getLayout()->getBlock('head')->setTitle($this->__('Page title'));
        $this->renderLayout();
    }

    public function ajaxAction()
    {
        $isAjax = Mage::app()->getRequest()->isAjax();
        if ($isAjax) {
            $layout = $this->getLayout();
            $update = $layout->getUpdate();
            $update->load('carfilter_ajax_ajax'); //load the layout you defined in layout xml file
            $layout->generateXml();
            $layout->generateBlocks();
            $output = $layout->getOutput();
            $this->getResponse()->setHeader('Content-type', 'application/json');
            $this->getResponse()->setBody(Mage::helper('core')->jsonEncode(array('outputHtml' => $output)));
        }
    }

}

И для ответа на ваш вопрос вам необязательно создавать свой собственный блок (в моем примере у меня его нет), но вы, вероятно, захотите иметь необходимые функции в файлах шаблонов в удобном месте

Ответ 2

Вам нужно создать файл sidebar.xml в директории макета шаблона. который укажет на ваш контроллер. Здесь я не могу делиться всей файловой структурой. Но вы можете поделиться им, откуда вы можете загрузить/создать пользовательский модуль.

http://www.webspeaks.in/2010/08/create-your-first-adminbackend-module.html

Надеюсь, это поможет вам!