在phtml模板上实例化getModel类是否很好?


14

这是有关Magento中良好编程习惯的问题。

我需要在缩略图中显示(在类别产品列表中)该产品及其相关产品。所以我mypackage/mytheme/template/catalog/product/list.phtml用这样的东西编辑

<?php 
    $related=$_product->getRelatedProductIds();
    if(count($related)>0){
        echo '<div class="a'.$ap.'"></div>';
        echo '<div class="li_p"><ul>';
        foreach($related as $rela){
            $rela_nom=Mage::getModel('catalog/product')->load($rela);
            echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>';
        }
        echo '</ul></div>';
    }
?>

而且效果很好。

但是我的问题是:在phtml文件上实例化模型类是否正确?

如果不是,那么实现此功能的最佳方法是什么?我的意思是,哪个文件最好编辑,哪个类最好添加,在哪里?帮手

您能提供一个例子还是让我看看哪些文件最好编辑。

Answers:


10

我不同意索纳西的回答:)

在模板中启动模型是不好的做法。有时需要它,有时我也这样做。但是,如果可能的话,应该避免将代码添加到pHTML文件中,并且仅echo提供给定的内容。

这是关注点分离。不要混淆html和编码内容。这应该在Block类中。


3
我也同意您的不同意见:)但是,在循环之外加载单个模型并不是世界末日。否则,它将成为无限抽象的情况-添加仅用于从视图中分离一行代码的其他类。它只是增加了重写开销,更不用说维护了。
Ben Lessani-Sonassi

如果您想纠正我所有的拼写错误,您的时间太多了,谢谢:-)
Fabian Blechschmidt

顺便说一句,你是正确的sonassi :-)这只是我们应该注意的事情。我在phtml文件中看到了SQL查询... NO NO :-)
Fabian Blechschmidt

4

将模型加载到文件中没有任何问题phtml。但这取决于您为什么这样做。

如果您需要整个模型以及与之关联的所有数据,那么还可以加载整个模型。

但是,如果您只需要产品网址(来自您的示例),则可以加载正确的集合

$_product->getRelatedProductCollection();

然后根据需要进行迭代

<?php $_relatedCollection = $_product->getRelatedProductCollection(); ?>
<?php foreach ($_relatedCollection as $_item): ?>
<li>
  <a href="<?php echo $_item->getProductUrl(); ?>">
    <img src="<?php echo $this->helper('catalog/image')->init($_item, 'small_image')->resize(20); ?>" width="20" height="20">
  </a>
<li>
<?php endforeach; ?>

3

想把我的5美分放在这里。我们应该尊重Magento中使用的体系结构原理。Magento中使用的主要架构模式是MVC。如果是Magento,则“视图”部分包含几项内容(块,模板,布局)。创建块是为了将数据准备逻辑从模板移到其他类,以使模板对于前端开发人员而言更加清晰易读。在这里,我要同意Fabian。

至于Sonassi对太多不需要的类的担心,我建议期待基于推送的MVC。在这种情况下,我们将控制器看做是指挥官,他定义了哪个块以及应该包含哪些数据。控制器中的动作可能包含所需的代码,以在渲染之前加载数据并将其放入块(通过魔术师)。


3

我同意Fabian Blechschmidt的观点,这是不好的做法,您应该尊重“关注分离”。

要添加建设性建议:

这是Block类的目的。在您的情况下,您将必须重写 Mage_Catalog_Block_Product_List以添加所需的功能:

public function hasRelatedProducts()
{
    return count($this->getRelatedProductIds()) > 0;
}
public function getRelatedProducts()
{
    $products = array();
    foreach ($this->getRelatedProductIds() as $id) {
        $products[] = Mage::getModel('catalog/product')->load($id);
    }
    return $products;
}

显而易见,如何在模板中使用这些方法。

注意:重写并不意味着要编辑核心文件。如果您不知道如何重写块,请遵循定制教程

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.