从块Magento操纵模板

时间:2012-11-23 14:01:47

标签: magento

我正在尝试更改目录页面中AddtoCart按钮的行为,并仅在特定情况下显示它。我正在做的是添加一个自定义模块,用于执行布局更新并将Product / List.phtml替换为我自己的文件。这种方法在发布自定义模块时不是很灵活,因为几乎所有用户都将使用不同的模板文件,他们必须将我的自己与他们合并。

所以我的问题是我可以操作块中的phtml,也可以覆盖* Mage_Catalog_Block_Product_List *并更改* _BeforeToHtml *函数中的模板,这是一种更好的方法吗,它可行吗?

1 个答案:

答案 0 :(得分:2)

首先让我先说Magento在这个领域缺乏一点灵活性(渲染到模板时)。如果我正确理解您,您正在确定该产品是否可销售:

  • 您可以添加要监听catalog_product_is_salable_after的活动。通过这种方式,您在系统内工作以设置产品是否可供销售。当您更改事件中salable Varien_Object的值时,它会将其更改为缺货消息。也许这就是你想要的(但问题是它在if/else声明中使用 - 它可以添加到购物车中,也可以缺货(参见下面的代码)。
  • 然后,您可以使用翻译文件将 Out of Stock 更改为您希望的字符串(一种黑客攻击)。
  • 尝试覆盖Mage_Catalog_Block_Product_List的问题是,在_toHtml方法之前,模板文件甚至不包括在内。您可以覆盖它,并在代码块的开头调用parent::_toHtml()。但是,要删除添加到购物车按钮,将涉及一些非常困难的正则表达式。

这是块代码。它确实有点粘。

<?php if($_product->isSaleable()): ?>
    <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
<?php else: ?>
   <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
<?php endif; ?>