2011-01-02 7 views
6

私は自分のサイトの特定の部分についてMagentoの外にあるMagentoのブロックを読み込んでいます。私は次のような何かでこれをうまくやり遂げることができます。Magentoの子供のhtmlをMagentoの外にロードする

require_once $docRoot.'/app/Mage.php'; 
umask(0); 
Mage::app('default'); 
... 

$layout = Mage::getSingleton('core/layout'); 
$block = $layout->createBlock('Mage_Page_Block_Html_Header'); 
$block->setTemplate('page/html/header.phtml'); 
echo $block->renderView(); 

問題は、レンダリングするブロックに子ブロック(html)がある場合、出力に含まれないということです。上の例では、ファイルheader.phtmlには、出力から欠落している子htmlの次の呼び出しが含まれています。

... 
<?php echo $this->getChildHtml('topLinks') ?> 
... 
+0

アランはかなりよく質問に答えのように私には見える:あなたはあまりにもそれをチェックアウトしてみたいと思うかもしれません。それはあなたが望むように問題を解決していないかもしれませんが、私はそれが正しいとマークすることをお勧めします。 – shaune

+0

マゼンタのヘッダーとフッターをサードパーティのCMS /アプリケーションなどの外部に含める場合は、次の記事を参照してください。
http://www.blog.magepsycho.com/using -magento-header-footer-magentoの外/ハッピーEコマース!! – MagePsycho

答えて

12

レイアウトオブジェクトはブロックオブジェクトの集合です。ブロックは、親子ツリー形式で編成されています。

レイアウトには1つのブロックがあります。子ブロックを追加していません。したがって、ブロックのテンプレートがgetChildHtmlを使用して子をレンダリングしようとすると、ブロックのテンプレートが見つからず、追加の出力は生成されません。

さらに、topLinksブロックはデフォルトで何も表示しません。それにはリンクが追加されている必要があります。これは、通常、他のlayout.xmlファイルを通じて行われます。

最後に、それは

以下
echo $block_header->toHtml(); 

あなたはなるだろうというように、あなたが巣ブロックが正しく、などがそのアクションメソッドを呼び出すことができる方法の一例であるへの呼び出しでレンダリングをキックオフするために、おそらく良いでしょうブロックを通常のディスパッチ手順の外にレンダリングすることができます。新しいリンクブロックを作成し、リンクを追加してトップレベルのブロックに追加するという点で、あなたとは異なります。

require_once 'app/Mage.php'; 
umask(0); 
Mage::app('default'); 

$layout   = Mage::getSingleton('core/layout'); 

$block_header = $layout->createBlock('page/html_header')->setTemplate('page/html/header.phtml'); 

// <block type="" name="top.links" as="topLinks"/> 
$block_links = $layout->createBlock('page/template_links','top.links')->setTemplate('page/template/links.phtml'); 
$block_header->setChild('topLinks',$block_links); 

//<reference name="top.links"> 
// <action method="addLink" translate="label title" module="customer"><label>My Account</label><url helper="customer/getAccountUrl"/><title>My Account</title><prepare/><urlParams/><position>10</position></action> 
//</reference> 
$block_links->addLink('My Account','foo/baz/bar/','My Account','','',10); 

echo $block_header->toHtml(); 
+0

ありがとうとても助かりました –

+0

これは "孤立して"実行されるようです。私はtest.phpというファイルを作成し、これを実行しました。私のテンプレートには$ this-> getUrl( '')が含まれていて、それをBASE_URLとしてレンダリングしました。 /test.php/。手動で子供を追加する必要がないようにMagentoのレイアウトxmlでこれを行う方法はありますか? – JaseC

+0

@JaseCあなたが何を求めているのか分かりません。あなたのコメントのような音は、新しい質問として良いでしょう。 –

0
# Init Magento 
require_once 'app/Mage.php'; 
umask(0); 

$app = Mage::app('default'); 

$app->getTranslator()->init('frontend'); 

# Init User Session 
session_name('frontend'); 
$session = Mage::getSingleton('customer/session'); 

# Init Blocks 
$linksBlock = $app->getLayout()->getBlockSingleton("page/template_links"); 

$checkoutLinksBlock = $app->getLayout()->getBlockSingleton("checkout/links"); 
$checkoutLinksBlock->setParentBlock($linksBlock); 

$wishlistLinksBlock = $app->getLayout()->getBlockSingleton('wishlist/links'); 
$wishlistLinksBlock->setParentBlock($linksBlock); 

# Add Links 
$linksBlock->addLink($linksBlock->__('My Account'), 'customer/account', $linksBlock->__('My Account'), true, array(), 10, 'class="first"'); 
$wishlistLinksBlock->addWishlistLink(); 
$checkoutLinksBlock->addCartLink(); 
$checkoutLinksBlock->addCheckoutLink(); 

if ($session->isLoggedIn()) { 
    $linksBlock->addLink($linksBlock->__('Log Out'), 'customer/account/logout', $linksBlock->__('Log Out'), true, array(), 100, 'class="last"'); 
} else { 
    $linksBlock->addLink($linksBlock->__('Log In'), 'customer/account/login', $linksBlock->__('Log In'), true, array(), 100, 'class="last"'); 
} 

echo '<div class="toplinks">'.$linksBlock->renderView().'</div>'; 
+1

コードの壁だけではなく、いくつかの説明を提供できますか? –

+0

このコードでは、ヘッダーのtoplinksブロックしか取得できません。 –

関連する問題