我怎样才能使Magento ajax调用块,从控制器操作


How can i make Magento ajax call to blocks, from controllers action

如何获得以下输出:

<block type="page/template_links" name="top.links" as="topLinks"/>

在控制器操作内?

事实上,我必须显示 AJAX 的链接。

$this->getLayout()->getBlock('top.links')->toHtml()

请尝试这个,我已经检查了它并且它正在工作。

如果我理解正确,您可以在操作函数中执行此操作:

$linksBlock = $this->getLayout()->createBlock('page/template_links');
echo $linksBlock->toHtml();

要通过 ajax 调用获取内容,请添加以下 js 脚本:

new Ajax.Updater('your_container', '/your_controller/your_action');

虽然提供的赞成答案确实回答了这个问题,但它们都忽略了常见的情况,即加载AJAX的块所采取的某些特定操作将阻止Magento重定向按预期工作。

采取以下情况:

  • 通过 AJAX 加载的块
  • 块具有"添加到购物车"按钮(可能由getAddUrl($product)助手生成)
  • 系统配置>> 结帐>>购物车>>"添加产品后重定向到购物车" == 否

在这种情况下,单击"添加到购物车"后,Magento将尝试使用CartController.php _goBack()方法重定向用户。这会导致您之前通过 AJAX 加载的块呈现在页面上,而不是用户实际重定向到他们所在的页面。


若要防止这种情况发生,请向加载块的 AJAX 请求添加一个附加参数'your_param',并为其指定值 Mage::helper('core/url')->getCurrentUrl()(或您可能想要的任何其他值)。如:

jQuery.ajax({
    url: '<?php echo $yourUrl ?>',
    page: '<?php echo Mage::helper("core/url")->getCurrentUrl()?>'
})

然后,在控制器的相关操作方法中,向方法的开头添加快速条件,例如:

if (!this->getRequest()->isXmlHttpRequest()) {
    $this->getResponse()->setRedirect($this->getRequest()->getParam('your_param'));
}
// ... existing controller code ...
// ... ie: $block->toHtml() ...

这将允许用户在添加到购物车后返回其上一页。这也将为用户提供一种返回站点的方法,如果他们碰巧最终到达了控制器的 URL。

你可以看看 http://www.magentocommerce.com/magento-connect/catalog/product/view/id/18152/s/ajax-blocks-6911/此模块允许您使用 ajax 加载块,只需通过布局文件