เป็นการดีที่จะยกตัวอย่างคลาส getModel บนเทมเพลต phtml หรือไม่?


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

ฉันไม่เห็นด้วยกับคำตอบของ Sonassi :)

การเริ่มต้นโมเดลในเทมเพลตเป็นการปฏิบัติที่ไม่ดี บางครั้งก็จำเป็นและบางครั้งก็ทำเช่นกัน แต่ถ้าเป็นไปได้คุณควรป้องกันการเพิ่มรหัสลงในไฟล์ pHTML ของคุณและechoให้สิ่งต่าง ๆ เท่านั้น

มันเป็นแยกของความกังวล อย่ารวมเนื้อหา HTML และการเข้ารหัสเข้าด้วยกัน สิ่งนี้ควรอยู่ในคลาส Block


3
ฉันเห็นด้วยกับความไม่เห็นด้วยของคุณด้วย :) แต่การโหลดแบบจำลองเดียวนอกวงนั้นไม่ใช่จุดจบของโลก มิฉะนั้นจะกลายเป็นกรณีของนามธรรม infinitum - เพิ่มคลาสเพิ่มเติมที่มีอยู่เพียงเพื่อแยกบรรทัดเดียวของรหัสจากมุมมอง มันเพิ่มการเขียนทับค่าโสหุ้ยไม่ต้องพูดถึงการบำรุงรักษา
Ben Lessani - Sonassi

คุณมีเวลา mich เกินไปถ้าคุณต้องการที่จะแก้ไขการสะกดคำผิดทั้งหมดของฉันขอบคุณสำหรับที่ :-)
Fabian Blechschmidt

Btw คุณเป็น sonassi ที่ถูกต้อง :-) มันเป็นเพียงสิ่งที่เราควรระวัง ฉันเห็นข้อความค้นหา SQL ใน phtml-files ... ไม่ไม่ :-)
Fabian 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 คือ MVC ในกรณีของวีโอไอพี "มุมมอง" ส่วนประกอบด้วยหลายสิ่ง (บล็อก, แม่แบบ, เลย์เอาต์) บล็อกถูกสร้างขึ้นเพื่อย้ายตรรกะการจัดเตรียมข้อมูลจากเทมเพลตไปยังคลาสอื่นเพื่อให้เทมเพลตสะอาดและอ่านง่ายขึ้นสำหรับผู้พัฒนาส่วนหน้า ที่นี่ฉันต้องการเห็นด้วยกับเฟเบียน

สำหรับข้อกังวลของ Sonassi เกี่ยวกับคลาสที่ไม่จำเป็นจำนวนมากเกินไปผมแนะนำให้ตั้งตารอที่จะผลักดัน MVC ในกรณีนี้เรามองไปที่ตัวควบคุมในฐานะผู้บัญชาการที่กำหนดว่าจะบล็อกอะไรและควรมีข้อมูลใด การดำเนินการในตัวควบคุมอาจมีรหัสที่จำเป็นในการโหลดข้อมูลและใส่ลงในบล็อก (ผ่านตัวตั้งค่ามายากล) ก่อนที่จะแสดงผล


3

ฉันเห็นด้วยกับFabian Blechschmidtว่าเป็นการปฏิบัติที่ไม่ดีและคุณควรเคารพการแยกข้อกังวล

ในการเพิ่มข้อเสนอแนะเชิงสร้างสรรค์:

นี่คือสิ่งที่คลาสบล็อกมีไว้สำหรับ ในกรณีของคุณคุณจะต้องเขียนใหม่ 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.