我正在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') ?>
...
答案 0 :(得分: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();
答案 1 :(得分:2)
下面的链接提供了一种类似于Alan提到的方法,尽管这涉及添加可能包含JS文件和CSS的其他块。您可能也想尝试检查它:
How to add Magento blocks, CSS and Javascript to an external site
答案 2 :(得分: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>';