我一直试图在主页上显示产品详情。经过长时间搜索谷歌和stackoverflow,我已经有了这个解决方案:
Mage::register('product',Mage::getModel('catalog/product')->load('17'));
$block = Mage::app()->getLayout()
->createBlock('catalog/product_view')
->setData('area','frontend')
->setTemplate('catalog/product/view.phtml');
echo $block->toHtml();
它确实渲染了catalog / product_view块但没有它的子节点,我也想了解如何渲染这些孩子?
注意:我的主页作为布局" myviewer.phtml"上面的代码在" myviewer.phtml"。
答案 0 :(得分:2)
您目前正在手动创建产品视图块而不使用标准布局xml,因此您无法通过产品页面布局句柄获取将在产品页面上加载的任何默认子块;
catalog_product_view
在catalog.xml文件中查看此布局句柄将显示加载了哪些块,重要的是将哪些子块添加到名为“product.info”的块中,该块通常使用您尝试渲染的模板部分。
如果您查看要渲染的产品页面模板“catalog / product / view.phtml”,您将看到它调用无法使用的块,例如;
<?php echo $this->getChildHtml('addtocart') ?>
所以要解决这个问题,你有两个选择,
使用append()方法手动初始化每个子块并将其添加到您正在创建的产品块中。
或者
更新用于加载和呈现页面的控制器操作,以包含产品页面布局句柄。在控制器中调用以下内容,
$update = $this->getLayout()->getUpdate();
$update->addHandle('catalog_product_view');
这将导致布局包含所有正确的产品页面子块,然后在模板中调用;
$_product = Mage::getModel('catalog/product')->load('17');
Mage::register('product',$_product);
Mage::register('current_product',$_product);
$block = Mage::app()->getLayout()->getBlock('product.info');
echo $block->toHtml();
添加句柄可以在控制器中完成,需要使用自定义模块中的重写来覆盖(已经有很多文章)。 对控制器操作之前触发的任何事件使用事件观察器。
答案 1 :(得分:0)
Magento根据其布局XML配置创建其块层次结构。例如,catalog/product_view
块用于catalog.xml
布局文件(通常位于app/design/frontend/base/default/layout/catalog.xml
中)。该文件还定义了catalog/product_view
块的所有子块。
Magento根据活动布局句柄决定执行哪些布局指令。例如,catalog.xml
文件引用catalog_product_view
布局句柄,该句柄对应于目录模块,产品控制器,视图操作。只要调用该特定控制器操作,就会应用该布局。
在您的情况下,主页可能是CMS页面,它不应用catalog_product_view
布局句柄(它通常应用cms_page
句柄)。因此,未正确定义块层次结构,以便您使用catalog/product_view
块。
有很多方法可以解决这个问题,但首先你必须考虑到你正在尝试做什么。如果您尝试使用catalog/product_view
块,您的主页看起来几乎与常规产品页面完全相同,这可能是您想要的,也可能不是。实现这一目标的一种方法是使用<update/>
标记,它采用另一个布局句柄并将其与当前布局句柄合并。
我建议您阅读Magento的布局XML系统。 Alan Storm在这个主题上有一些很好的资源,例如this blog post(警告,它有点过时)和his book on Magento's layout system。
答案 2 :(得分:-1)
你可以通过在CMS中插入&gt;来实现。页面&gt;家
{{block type="catalog/product_list" name="home.catalog.product.list" alias="products_homepage" LATEST="0" template="catalog/product/list.phtml"}}
在这种情况下,您必须更改template / catalog / product / list.phtml 在第74,133和180行
中找到此代码<?php
$_nameAfterChildren = $this->getChild('name.after')->getSortedChildren();
foreach($_nameAfterChildren as $_nameAfterChildName):
替换添加if语句,应该是这样的:
<?php
$_nameAfter = $this->getChild('name.after');
// New if here
if($_nameAfter):
$_afterChildren = $this->getChild('name.after')->getSortedChildren();
foreach($_afterChildren as $_afterChildName):