Có tốt không khi khởi tạo một lớp getModel trên các mẫu phtml?


14

Đây là một câu hỏi liên quan đến một thực hành lập trình tốt trong Magento.

Tôi cần hiển thị (trong danh sách sản phẩm danh mục) sản phẩm với các sản phẩm liên quan trong hình thu nhỏ. Vì vậy, tôi đã chỉnh sửa mypackage/mytheme/template/catalog/product/list.phtmlvới một cái gì đó như thế này

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

Và nó hoạt động rất tốt.

Nhưng câu hỏi của tôi là: Điều này có đúng để khởi tạo một lớp mô hình trên các tệp phtml không?

Nếu không, cách tốt nhất để đạt được chức năng này là gì? Ý tôi là, tập tin nào tốt hơn để chỉnh sửa hoặc lớp nào tốt hơn để thêm vào, ở đâu? Một người trợ giúp?

Bạn có thể cung cấp một ví dụ nhỏ hoặc cho tôi xem lướt qua những tập tin nào tốt hơn để chỉnh sửa.

Câu trả lời:


10

Tôi muốn không đồng ý với câu trả lời của Sonassi :)

Bắt đầu một mô hình trong mẫu là thực hành xấu. Đôi khi nó là cần thiết và đôi khi tôi cũng làm điều đó. Nhưng nếu có thể, bạn nên ngăn không cho thêm mã vào các tệp pHTML của mình và chỉ echonhững thứ đã cho.

Đó là sự tách biệt của mối quan tâm . Đừng trộn lẫn các công cụ mã hóa và html. Điều này nên có trong lớp Block.


3
Tôi cũng đồng ý với sự bất đồng của bạn :) Nhưng tải một mô hình duy nhất bên ngoài vòng lặp không phải là kết thúc của thế giới. Mặt khác, nó trở thành một trường hợp trừu tượng hóa - thêm các lớp bổ sung hiện có chỉ để tách một dòng mã khỏi khung nhìn. Nó chỉ thêm vào để viết lại chi phí, không đề cập đến bảo trì.
Ben Lessani - Sonassi

Bạn có quá nhiều thời gian nếu bạn muốn sửa tất cả các lỗi chính tả của tôi, cảm ơn vì điều đó :-)
Fabian Blechschmidt

Btw, bạn đúng đấy sonassi :-) Đó chỉ là thứ chúng ta nên cẩn thận. Tôi thấy các truy vấn SQL trong tệp phtml ... KHÔNG KHÔNG :-)
Fabian Blechschmidt

4

Không có gì sai khi tải một mô hình trong một phtmltập tin. Nhưng nó phụ thuộc vào lý do tại sao bạn đang làm điều đó.

Nếu bạn cần toàn bộ mô hình và tất cả dữ liệu liên quan đến nó, thì bạn cũng có thể tải toàn bộ mô hình.

Nhưng nếu bạn chỉ cần URL sản phẩm (từ ví dụ của bạn), thì bạn có thể tải bộ sưu tập chính xác

$_product->getRelatedProductCollection();

Sau đó lặp đi lặp lại khi cần thiết

<?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

Muốn đặt 5 xu của tôi ở đây. Chúng ta nên tôn trọng hoàng tử kiến ​​trúc được sử dụng trong Magento. Mô hình kiến ​​trúc chính được sử dụng trong Magento là MVC. Trong trường hợp phần "Xem" của Magento chứa một số thứ (khối, mẫu, bố cục). Các khối được tạo để di chuyển logic chuẩn bị dữ liệu từ mẫu sang một số lớp khác để làm cho các mẫu sạch hơn và dễ đọc hơn cho các nhà phát triển lối vào. Ở đây tôi muốn đồng ý với Fabian.

Đối với mối quan tâm của Sonassi về quá nhiều lớp không cần thiết, tôi đề nghị mong muốn đẩy dựa trên MVC. Trong trường hợp này, chúng tôi xem bộ điều khiển như người chỉ huy, người xác định khối nào và dữ liệu nào nên có. Hành động trong bộ điều khiển có thể chứa mã cần thiết để tải dữ liệu và đưa nó vào khối (thông qua các ma thuật) trước khi kết xuất.


3

Tôi đồng ý với Fabian Blechschmidt rằng đó là một thực tiễn tồi tệ và bạn nên tôn trọng Tách biệt các mối quan tâm.

Để thêm một đề xuất mang tính xây dựng:

Đây là một cái gì đó, các lớp Block có nghĩa là cho. Trong trường hợp của bạn, bạn sẽ phải viết lại Mage_Catalog_Block_Product_List để thêm chức năng mong muốn:

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

Rõ ràng là làm thế nào để sử dụng các phương pháp này trong mẫu.

Lưu ý: Rewrite không có nghĩa là chỉnh sửa tệp lõi. Thực hiện theo hướng dẫn tùy chỉnh nếu bạn không biết cách viết lại một khối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.