在我的产品视图模板中,我正在加载子模板,并将产品实例转移到此子模板中:
<?php
echo $this->getLayout()
->createBlock('core/template')
->setTemplate('catalog/product/view/addedToCartDialog.phtml')
->setAttribute('product', $_product)
->toHtml();
?>
然后在我的目录/产品/视图/ addedToCartDialog.phtml中,我正在尝试使用此产品实例:
<?php $product = $this->getData('product'); ?>
<?php echo"<pre>";print_r($product->getId());echo"</pre>"; ?>
但似乎没有加载:致命错误:在/ home / ryba / workspace / polcode / Greenlights / app / design / frontend / default / greenlights / template中的非对象上调用成员函数getId()第2行的/catalog/product/view/addedToCartDialog.phtml 但是当我用print_r检查变量$ product时:
<?php echo"<pre>";print_r($product);echo"</pre>"; ?>
显示此变量是正确的Mage_Catalog_Model_Product对象,还检查属性是否正确(如sku,名称等) - 一切正确。
这有什么问题?
答案 0 :(得分:1)
我会给你几个答案。第一个是直接回答你的问题。其余的是替代方案,但更好的方法来做你正在尝试的事情。在我看来,最后一个答案是最好的。
直接答案:
不使用setAttribute,只需使用魔术setter / getter方法:
<?php
// In catalog/product/view.phtml
echo $this->getLayout()
->createBlock('core/template')
->setTemplate('catalog/product/view/addedToCartDialog.phtml')
->setProduct($_product)
->toHtml();
?>
<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>
<强>更好的:强>
而且,如果您知道自己位于目录/产品控制器加载的模板中,则可以通过这种方式获得产品。
<?php
// In catalog/product/view.phtml
echo $this->getLayout()
->createBlock('core/template')
->setTemplate('catalog/product/view/addedToCartDialog.phtml')
->toHtml();
?>
<?php
// In addedToCartDialog.phtml
$_product = Mage::registry('product');
echo $_product->getId();
?>
更好
最好的方法是使用已加载方法的不同块类型(再次,如果您知道您在目录/产品控制器加载的模板中)
<?php
// In catalog/product/view.phtml
echo $this->getLayout()
->createBlock('catalog/product_view')
->setTemplate('catalog/product/view/addedToCartDialog.phtml')
->toHtml();
?>
<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>
最后,最好的
最后一项业务。向模板添加额外块的更好方法是在local.xml文件中添加块。
<!-- Local.xml -->
<catalog_product_view translate="label">
<reference name="content">
<block type="catalog/product_view" name="addedToCartDialog" as="addedToCartDialog" template="catalog/product/view/addedToCartDialog.phtml" />
</reference>
</catalog_product_view>
现在,设置你的phtml文件
<?php
// In addedToCartDialog.phtml
$_product = $this->getProduct();
echo $_product->getId();
?>
然后从您的phtml文件中调用该块
// In catalog/product/view.phtml
<?php echo $this->getChildHtml('addedToCartDialog'); ?>