Apakah baik untuk membuat instance kelas getModel pada templat phtml?

14

Ini adalah pertanyaan mengenai praktik pemrograman yang baik di Magento.

Saya perlu menunjukkan (dalam daftar produk kategori) produk dengan produk terkait dalam thumbnail. Jadi saya edit mypackage/mytheme/template/catalog/product/list.phtmldengan sesuatu seperti ini

<?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>';
    }
?>

Dan itu bekerja dengan sangat baik.

Tetapi pertanyaan saya adalah: Apakah ini benar untuk membuat instance model kelas pada file phtml?

Jika tidak, apa cara terbaik untuk mencapai fungsi ini? Maksud saya, file apa yang lebih baik untuk diedit atau kelas apa yang lebih baik untuk ditambahkan, di mana? Pembantu?

Bisakah Anda memberikan sedikit contoh atau memberi saya sekilas file apa yang lebih baik untuk diedit.

pengguna604
sumber

Jawaban:

10

Saya ingin tidak setuju dengan jawaban Sonassi :)

Memulai model dalam template adalah praktik yang buruk. Terkadang dibutuhkan dan terkadang saya juga melakukannya. Tetapi jika memungkinkan Anda harus mencegah untuk menambahkan kode ke file pHTML Anda dan hanya echomemberikan hal-hal.

Ini adalah Pemisahan masalah . Jangan mencampur hal-hal html dan pengkodean. Ini harus di kelas Blok.

Fabian Blechschmidt
sumber
3
Saya juga setuju dengan ketidaksetujuan Anda :) Tetapi memuat satu model di luar satu lingkaran bukanlah akhir dari dunia. Kalau tidak, ini menjadi kasus abstraksi infinitum - menambahkan kelas tambahan yang ada hanya untuk pemisahan satu baris kode dari tampilan. Itu hanya menambah penulisan ulang overhead, belum lagi pemeliharaan.
Ben Lessani - Sonassi
Anda memiliki terlalu banyak waktu jika Anda ingin memperbaiki semua kesalahan pengejaan saya, terima kasih untuk itu :-)
Fabian Blechschmidt
Btw, kau benar sonassi :-) Itu hanya sesuatu yang harus kita berhati-hati. Saya melihat queri SQL dalam file-file phtml ... TIDAK TIDAK :-)
Fabian Blechschmidt
4

Tidak ada yang salah dengan memuat model dalam phtmlfile. Tetapi itu tergantung pada mengapa Anda melakukannya.

Jika Anda membutuhkan seluruh model dan semua data yang terkait dengannya, maka Anda dapat memuat seluruh model.

Tetapi jika Anda hanya perlu URL Produk (dari contoh Anda), maka Anda bisa memuat koleksi yang benar

$_product->getRelatedProductCollection();

Kemudian beralih melalui yang diperlukan

<?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; ?>
Ben Lessani - Sonassi
sumber
3

Ingin menaruh 5 sen saya di sini. Kita harus menghormati prinsip arsitektur yang digunakan di Magento. Pola arsitektur utama yang digunakan di Magento adalah MVC. Dalam kasus bagian Magento "View" berisi beberapa hal (blok, templat, tata letak). Blok diciptakan untuk memindahkan logika persiapan data dari templat ke beberapa kelas lain untuk membuat templat lebih bersih dan mudah dibaca oleh pengembang frontend. Di sini saya ingin setuju dengan Fabian.

Adapun keprihatinan Sonassi tentang terlalu banyak kelas yang tidak dibutuhkan saya sarankan untuk berharap untuk mendorong MVC berbasis. Dalam hal ini kita melihat pengontrol sebagai komandan yang menentukan blok mana dan data apa yang seharusnya. Aksi di controller dapat berisi kode yang diperlukan untuk memuat data dan memasukkannya ke dalam blok (melalui setter ajaib) sebelum rendering.

Dmitriy Vasilenko
sumber
3

Saya setuju dengan Fabian Blechschmidt bahwa ini adalah praktik yang buruk dan Anda harus menghormati Pemisahan Kekhawatiran.

Untuk menambahkan saran yang membangun:

Ini adalah sesuatu, kelas Block dimaksudkan untuk. Dalam kasus Anda, Anda harus menulis ulang Mage_Catalog_Block_Product_List untuk menambahkan fungsionalitas yang diinginkan:

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;
}

Harus jelas bagaimana menggunakan metode ini dalam templat.

Catatan: Menulis ulang tidak berarti mengedit file inti. Ikuti tutorial penyesuaian jika Anda tidak tahu cara menulis ulang blokir.

Fabian Schmengler
sumber