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

下面的链接提供了一种类似于 Alan 提到的方法,尽管这涉及添加可能包含 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 回答