Layout 在Magento外部加载Magento子html

Layout 在Magento外部加载Magento子html,layout,magento,block,Layout,Magento,Block,我正在为我网站的某些部分加载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->s

我正在为我网站的某些部分加载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') ?>
...
。。。
...

布局对象是块对象的集合。块以父/子树形式组织

您的布局只有一个块。您尚未向其中添加任何子块。因此,当块的模板尝试使用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();
require_once'app/Mage.php';
乌马斯克(0);
Mage::app('default');
$layout=Mage::getSingleton('core/layout');
$block_header=$layout->createBlock('page/html_header')->setTemplate('page/html/header.phtml');
// 
$block_links=$layout->createBlock('page/template_links','top.links')->setTemplate('page/template/links.phtml');
$block\u header->setChild('topLinks',$block\u links);
//
//我的帐户我的帐户
//
$block_links->addLink('My Account'、'foo/baz/bar/'、'My Account'、''、10);
echo$block_header->toHtml();

下面的链接提供了一种类似于Alan提到的方法,尽管这涉及到添加可能包含JS文件和CSS的其他块。你也可以试试看:

#Init Magento
需要一次“app/Mage.php”;
乌马斯克(0);
$app=Mage::app('default');
$app->getTranslator()->init('frontend');
#初始化用户会话
会话名称(“前端”);
$session=Mage::getSingleton('customer/session');
#初始化块
$linksBlock=$app->getLayout()->getBlockSingleton(“页面/模板链接”);
$CheckOutlinesBlock=$app->getLayout()->getBlockSingleton(“签出/链接”);
$CheckOutlinesBlock->setParentBlock($linksBlock);
$wishlistLinksBlock=$app->getLayout()->getBlockSingleton('wishlist/links');
$wishlistLinksBlock->setParentBlock($linksBlock);
#添加链接
$linksBlock->addLink($linksBlock->(“我的帐户”),'customer/Account',$linksBlock->(“我的帐户”),true,array(),10,'class=“first”');
$wishlistLinksBlock->addWishlistLink();
$CheckOutlinesBlock->addCartLink();
$checkoutLinksBlock->addCheckoutLink();
如果($session->isLoggedIn()){
$linksBlock->addLink($linksBlock->(注销),'customer/account/logout',$linksBlock->(注销),true,array(),100,'class=“last”');
}否则{
$linksBlock->addLink($linksBlock->(“登录”),'customer/account/login',$linksBlock->(“登录”),true,array(),100,'class=“last”');
}
回显“”。$linksBlock->renderView()。';

在我看来,艾伦似乎很好地回答了这个问题。它可能没有按照您希望的方式解决问题,但我建议您将其标记为正确,除非其中有我看不到的错误。如果您希望将magento的页眉和页脚包含在它之外,例如第三方cms/应用程序,那么您可以使用以下文章:
快乐电子商务!!你能提供一些解释而不仅仅是一堵代码墙吗?谢谢,这很有帮助,Alan这似乎是“孤立”运行的。我创建了一个名为test.php的文件并运行了这个。其中我的模板包含$this->getUrl(“”),它将其呈现为基本URL/test.php/。有没有办法通过Magento的布局xml做到这一点,这样您就不必手动添加子项了?@JaseC我根本不明白您在问什么。听起来你的评论作为一个新问题会更好。@AlanStorm可能是对的。顺便说一句,感谢您在Magento网站上发布的所有其他资源。我见过你很多次了。我是说,如果我们在包含
echo$this->getUrl(“contactus”)
的“test.php”和“page/html/header.phtml”中运行上述代码,它将被呈现为“”而不是“”。
# 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>';