6

サイトの特定の部分について、Magentoの外部に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') ?>
...
4

3 に答える 3

12

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

レイアウトには単一のブロックがあります。子ブロックを追加していません。したがって、ブロックのテンプレートが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();
于 2011-01-02T19:19:36.500 に答える
2

以下のリンクは、JSファイルとCSSを含む可能性のある他のブロックを追加することを含みますが、アランが言及したものとやや類似したアプローチを提供します。あなたもそれをチェックしてみたくなるかもしれません:

Magentoブロック、CSS、Javascriptを外部サイトに追加する方法

于 2011-01-04T15:47:10.697 に答える
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>';
于 2012-09-04T18:42:38.577 に答える