将模型设置为子块的模板数据(属性)

时间:2012-01-26 14:23:48

标签: magento layout

在我的产品视图模板中,我正在加载子模板,并将产品实例转移到此子模板中:

<?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,名称等) - 一切正确。

这有什么问题?

1 个答案:

答案 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'); ?>