Ответ 1
Как AJAX
-
он всегда начинается с файла config.xml:
-
объявите свой маршрутизатор: используйте то же имя маршрутизатора, что и содержимое тега
frontName
<frontend> <routers> <carfilter> <use>standard</use> <args> <module>BM_Sidebar</module> <frontName>carfilter</frontName> </args> </carfilter> </routers> </frontend>
-
объявить файл макета (вы сделали это)
-
в вашем файле макета вам нужно 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 файлы (те, которые вы указали в файле макета):
-
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>
-
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)));
}
}
}
И для ответа на ваш вопрос вам необязательно создавать свой собственный блок (в моем примере у меня его нет), но вы, вероятно, захотите иметь необходимые функции в файлах шаблонов в удобном месте