問題描述
我有一個與外部網站集成的 Magento 安裝,我希望 Magento 的購物車塊顯示在這個外部網站的標題上.
我使用以下代碼實現了這一點:
<?phprequire_once(dirname(__FILE__).'/store/app/Mage.php');$app = Mage::app();$session = Mage::getSingleton('core/session', array('name'=>'frontend'));$block = $app->getLayout()->getBlockSingleton('checkout/cart_sidebar')->setTemplate('checkout/cart/sidebar.phtml');回聲 $block->toHtml();
但是,我想要(并且相信這是可能的)更好的方法.
我不喜歡我必須通過 setTemplate()
手動指定模板的事實,這涉及硬編碼模板位置并重復它在其他地方(在設計的布局 xml 文件中)定義的內容.我嘗試通過 $app->getLayout()->getBlock($name)
加載塊,但沒有結果($name
表示塊的引用名稱,如在布局 xml 文件中定義).
所以問題是:
有沒有辦法在 magento 之外渲染一個塊(具有以下必要條件)?
- 我希望自動加載基本布局 xml 和商店的設計更改的設計布局更新,因此我不需要(再次)手動指定模板路徑和塊類型.
- 我想通過引用名稱加載塊,這樣我就可以在布局 xml 文件中使用應用于它的屬性.
這個問題的目的是將它包裝在一個函數中,并以與在 Magento 模板上所做的相同的方式在 Magento 之外渲染每個塊.例如:
<?php echo $this->renderMagentoBlock('cart-block-reference-id');?>
提前致謝.
花了我幾分鐘的調試時間,但似乎相對容易.
getLayout();$layout->getUpdate()->addHandle('默認')->addHandle('some_other_handle')-> 加載();/** 生成塊,但必須是來自先前加載的布局句柄的 XML* 首先加載.*/$layout->generateXml()->generateBlocks();/** 現在我們可以簡單地以通常的方式獲取任何塊.*/$cart = $layout->getBlock('cart_sidebar')->toHtml();回聲 $cart;
請注意,您必須手動指定要從中加載塊的布局句柄.默認"布局句柄將包含側邊欄,因為它位于 checkout.xml 中.
但是使用默認"布局句柄會帶來顯著的性能成本,因為許多模塊將它們的塊放置在此句柄中.您可能希望將您在外部站點上使用的所有塊放在一個單獨的布局句柄中,然后簡單地加載它.
選擇權在你.祝你好運.
I have a Magento installation which is integrated with an external website, and I want the Magento's shopping cart block to be displayed on the header of this external site.
I have achieved this with the following code:
<?php
require_once(dirname(__FILE__).'/store/app/Mage.php');
$app = Mage::app();
$session = Mage::getSingleton('core/session', array('name'=>'frontend'));
$block = $app
->getLayout()
->getBlockSingleton('checkout/cart_sidebar')
->setTemplate('checkout/cart/sidebar.phtml');
echo $block->toHtml();
But, I want (and believe that it's possible) a nicer approach.
I dislike the fact that I must specify the template manually via setTemplate()
, which involves hard-coding template locations and repeating something that it's defined somewhere else (in the design's layout xml files). I tried loading the block via $app->getLayout()->getBlock($name)
with no results (were $name
represents the block's reference name, as defined in the layout xml files).
So the question is:
Is there any way to render a block outside magento (with the following requisites)?
- I want the base layout xml and the store's design layout updates of the design changes to be loaded automatically, so i don't need to specify the template path and the block type (again) manually.
- I want to load the block by it's reference name, so I can make use of the properties applied to it on the layout xml files.
The purpose of this question is to wrap it in a function, and render every block outside Magento the same way it's done on the Magento templates. For example:
<div id="sidebar-cart-container">
<?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>
Thanks in advance.
Took me a couple minutes of debugging, but it seems relatively easy.
<?php
/*
* Initialize magento.
*/
require_once 'app/Mage.php';
Mage::init();
/*
* Add specific layout handles to our layout and then load them.
*/
$layout = Mage::app()->getLayout();
$layout->getUpdate()
->addHandle('default')
->addHandle('some_other_handle')
->load();
/*
* Generate blocks, but XML from previously loaded layout handles must be
* loaded first.
*/
$layout->generateXml()
->generateBlocks();
/*
* Now we can simply get any block in the usual way.
*/
$cart = $layout->getBlock('cart_sidebar')->toHtml();
echo $cart;
Please note that you must manually specify which layout handles you want to load blocks from. The 'default' layout handle will contain the sidebar since it is placed there from inside checkout.xml.
But using the 'default' layout handle can come with a significant performance cost since many modules place their blocks in this handle. You may want to put all the blocks that you use on your external site in a separate layout handle and simply load that.
The choice is yours. Good luck.
這篇關于在 Magento 之外加載塊,并應用當前模板的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!