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

Sonassi의 답변에 동의하지 않습니다 :)

템플릿에서 모델을 시작하는 것은 좋지 않습니다. 때로는 필요하고 때로는 그렇게하기도합니다. 그러나 가능하다면 pHTML 파일에 코드를 추가하지 말고 echo주어진 것만 피하십시오.

그것은는 우려의 분리 . HTML과 코딩을 섞지 마십시오. 이것은 Block 클래스에 있어야합니다.


3
나는 또한 당신의 의견에 동의하지 않습니다 :) 그러나 루프 외부에 단일 모델을로드하는 것이 세상의 끝이 아닙니다. 그렇지 않으면 추상화 무한대 의 경우가됩니다 .보기에서 단일 코드 행을 분리하기 위해 존재하는 클래스를 추가하는 것입니다. 유지 보수는 말할 것도없고 오버 헤드를 다시 쓰기 만하면됩니다.
Ben Lessani-Sonassi

내 맞춤법 실수를 모두 고치려면 시간이 너무
촉박

Btw, 당신은 바로 sonassi입니다 :-) 그것은 우리가 조심해야 할 것입니다. phtml-files에서 SQL 쿼리를 보았습니다 ... NO NO :-)
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 센트를 넣고 싶습니다. 우리는 마 젠토에서 사용되는 아키텍처 원칙을 존중해야합니다. 마 젠토에서 사용되는 주요 아키텍처 패턴은 MVC입니다. Magento "View"부분의 경우 몇 가지 요소 (블록, 템플릿, 레이아웃)가 포함됩니다. 프런트 엔드 개발자가 템플릿을보다 깨끗하고 읽기 쉽게 만들기 위해 데이터 준비 로직을 템플릿에서 다른 클래스로 옮기는 블록이 만들어졌습니다. 여기 나는 Fabian에 동의하고 싶습니다.

너무 많은 불필요한 클래스에 대한 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.