簡體   English   中英

在 Magento 之外加載塊,並應用當前模板

[英]Load block outside Magento, and apply current template

我有一個與外部網站集成的 Magento 安裝,我希望 Magento 的購物車塊顯示在此外部網站的 header 上。

我通過以下代碼實現了這一點:

<?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();

但是,我想要(並且相信這是可能的)一種更好的方法。

我不喜歡我必須通過setTemplate()手動指定模板的事實,這涉及硬編碼模板位置並重復它在其他地方定義的內容(在設計的布局 xml 文件中)。 我嘗試通過$app->getLayout()->getBlock($name)加載塊,但沒有結果( $name是否代表塊的引用名稱,如布局 xml 文件中所定義)。

所以問題是:

有沒有辦法在 magento 之外渲染一個塊(具有以下要求)?

  • 我希望自動加載基本布局 xml 和商店的設計布局更新設計更改,因此我不需要手動指定模板路徑和塊類型(再次)。
  • 我想通過它的引用名稱加載塊,所以我可以在布局 xml 文件中使用應用於它的屬性。

此問題的目的是將其包裝在 function 中,並以與在 Magento 模板上相同的方式渲染 Magento 之外的每個塊。 例如:

<div id="sidebar-cart-container">
    <?php echo $this->renderMagentoBlock('cart-block-reference-id'); ?>
</div>

提前致謝。

我花了幾分鍾調試,但似乎相對容易。

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

請注意,您必須手動指定要從中加載塊的布局句柄。 “默認”布局句柄將包含側邊欄,因為它是從 checkout.xml 內部放置的。

但是使用“默認”布局句柄會帶來顯着的性能成本,因為許多模塊將它們的塊放在這個句柄中。 您可能希望將您在外部站點上使用的所有塊放在單獨的布局句柄中並簡單地加載它。

這是你的選擇。 祝你好運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM