Phtml şablonlarında getModel sınıfını başlatmak iyi mi?


14

Bu, Magento'daki iyi programlama uygulamalarıyla ilgili bir sorudur.

Ürünü (kategori ürün listesinde) ilgili ürünlerle küçük resimler halinde göstermem gerekiyor. Bu yüzden mypackage/mytheme/template/catalog/product/list.phtmlböyle bir şeyle düzenledim

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

Ve çok iyi çalışıyor.

Ama sorum şu: Phtml dosyalarında bir model sınıfı başlatmak doğru mu?

Değilse, bu işlevselliği elde etmenin en iyi yolu ne olurdu? Yani, hangi dosyayı düzenlemek daha iyidir veya hangi sınıfı eklemek daha iyidir, nerede? Yardımcı mı?

Küçük bir örnek verebilir misiniz veya hangi dosyaların düzenlenmesinin daha iyi olduğuna bir göz atabilir misiniz?

Yanıtlar:


10

Sonassi'nin cevabına katılmıyorum :)

Şablonda bir model başlatmak kötü bir uygulamadır. Bazen ihtiyaç duyulur ve bazen de yaparım. Ancak mümkünse pHTML dosyalarınıza kod eklemeyi ve yalnızca echoverilen şeyleri eklemelisiniz .

Öyle endişeleri ayrılması . HTML ve kodlama öğelerini karıştırmayın. Bu, Block sınıfında olmalıdır.


3
Aynı zamanda anlaşmazlığınıza da katılıyorum :) Ancak bir döngü dışında tek bir model yüklemek dünyanın sonu değildir. Aksi takdirde, soyutlama sonsuzluğu haline gelir - yalnızca tek bir kod satırının görünümden ayrılması için mevcut ek sınıflar eklenir. Sadece bakımdan bahsetmiyorum, ek yükleri yeniden yazmayı ekler.
Ben Lessani - Sonassi

Tüm yazım hatalarımı düzeltmek istiyorsanız çok mich zamanınız var, bunun için teşekkürler :-)
Fabian Blechschmidt

Btw, haklısın sonassi :-) Bu sadece dikkatli olmamız gereken bir şey. Ben phtml dosyalarında SQL querys gördüm ... HAYIR HAYIR :-)
Fabian Blechschmidt

4

Dosyaya model yüklemekle ilgili yanlış bir şey yoktur phtml. Ama bunu neden yaptığınıza bağlı.

Tüm modele ve onunla ilişkili tüm verilere ihtiyacınız varsa, tüm modeli de yükleyebilirsiniz.

Ancak, yalnızca Ürün URL'sine (örneğinizden) ihtiyacınız varsa, doğru koleksiyonu yükleyebilirsiniz

$_product->getRelatedProductCollection();

Sonra bunu gerektiği gibi tekrarlayın

<?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 sentimi buraya koymak istiyorum. Magento'da kullanılan mimarlık ilkelerine saygı duymalıyız. Magento'da kullanılan ana mimari model MVC'dir. Magento durumunda "Görünüm" kısmı birkaç şey içerir (blok, şablon, düzen). Ön hazırlık geliştiricileri için şablonları daha temiz ve okunabilir hale getirmek amacıyla veri hazırlama mantığını şablondan başka bir sınıfa taşımak için bloklar oluşturuldu. Burada Fabian ile hemfikir olmak istiyorum.

Sonassi'nin çok fazla gereksiz sınıfla ilgili endişelerine gelince, MVC'yi itmeyi dört gözle bekliyorum. Bu durumda denetleyiciyi hangi bloğu ve hangi verilerin olması gerektiğini tanımlayan komutan olarak görüyoruz. Denetleyicideki eylem, oluşturma işleminden önce veri yüklemek ve bloke (sihirli ayarlayıcılar aracılığıyla) koymak için gerekli kodu içerebilir.


3

Fabian Blechschmidt ile kötü uygulama olduğuna katılıyorum ve Endişelerin Ayrılmasına saygı duymalısınız.

Yapıcı bir öneri eklemek için:

Bu, Block sınıflarının amaçladığı bir şeydir. Durumunuzda Mage_Catalog_Block_Product_List , istediğiniz işlevselliği eklemek için yeniden yazmanız gerekir :

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

Bu yöntemlerin şablonda nasıl kullanılacağı açık olmalıdır.

Not: Yeniden yazma, çekirdek dosyayı düzenlemek anlamına gelmez. Bir bloğu nasıl yeniden yazacağınızı bilmiyorsanız özelleştirme eğiticisini izleyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.