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ファイルでモデルクラスをインスタンス化するのは正しいですか?

そうでない場合、この機能を実現する最良の方法は何でしょうか?つまり、どのファイルを編集するのが良いのか、どのクラスを追加するのが良いのか、どこですか?ヘルパー?

少し例を挙げてください。または、どのファイルを編集するほうが良いかを教えてください。

回答:


10

私はソナシの答えに反対したい:)

テンプレートでモデルを開始するのは悪い習慣です。時にはそれが必要であり、時には私もそれを行います。ただし、可能であれば、pHTMLファイルにコードを追加して、echo指定されたものだけを追加しないようにする必要があります。

それは関心の分離です。HTMLとコーディングを混同しないでください。これはBlockクラスにある必要があります。


3
私もあなたの意見の相違に同意します:)しかし、ループの外で単一のモデルをロードすることは世界の終わりではありません。それ以外の場合は、抽象化の無限のケースになります。ビューからコードの1行を分離するためだけに存在する追加のクラスを追加します。メンテナンスは言うまでもなく、書き換えのオーバーヘッドが増えるだけです。
ベン・レッサーニ-ソナシ

あなたはすべての私のスペルの間違いを修正したい場合は、その:-)のためのおかげで、あまりにもMICH時間を持っている
ファビアンBlechschmidt

ちなみに、あなたは正しいソナシです:-)それは私たちが注意するべきものです。私はphtmlファイルでSQLクエリを見ました...いいえいいえ:
ファビアンBlechschmidt

4

モデルをファイルにロードしても何も問題はありませんphtml。しかし、それはあなたがそれをしている理由に依存します。

モデル全体とそれに関連するすべてのデータが必要な場合は、モデル全体をロードすることもできます。

ただし、(例から)製品URLのみが必要な場合は、正しいコレクションをロードするだけで済みます。

$_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の場合、「表示」部分にはいくつかのもの(ブロック、テンプレート、レイアウト)が含まれます。フロントエンド開発者にとってテンプレートをよりクリーンで読みやすいものにするために、データ準備ロジックをテンプレートから他のクラスに移動するためにブロックが作成されました。ここでファビアンに同意したい。

不要なクラスが多すぎるという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;
}

テンプレートでこれらのメソッドを使用する方法は明らかです。

注:書き換えとは、コアファイルを編集することではありません。ブロックの書き換え方法がわからない場合は、カスタマイズチュートリアルに従ってください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.