2014-05-14 2 views
0

Ajax 요청에 응답하는 모듈이 있습니다. 여러 제품을 렌더링하고 결과 HTML을 가져 오려고 시도하고 있습니다. 내 컨트롤러는 코드입니다. 테스트 목적으로 ID를 하드 코딩했습니다.Magento의 같은 페이지에 여러 제품 표시

$ id = 52986;

foreach ($ids as $id) { 
    Mage::helper('catalog/product')->initProduct($id, $this); 
    $this->loadLayout(); 
    $output[] = $this->getLayout()->getOutput(); 
    Mage::unregister('current_product'); 
    Mage::unregister('product'); 
} 
print_r($output); 

난 (각각에 대해 생성 될 수, 즉 A '새로운'레이아웃 렌더링)를 각각 독립적으로 렌더링 foreach는 렌더링에서 각각의 제품을 상정. 분명히 나는 ​​레이아웃 시스템이 어떻게 작동하는지 완전히 이해하지 못한다. 따라서 두 가지 질문이 있습니다.

1) 어떻게 각 제품의 렌더링 된 HTML을 가져올 수 있습니까?

2) 레이아웃이 예상대로 작동하지 않는 이유는 무엇입니까? 그것은 기본적으로 새로운 출력을 추가 젠토을 알려줍니다

<?xml version="1.0"?> 
<layout> 
    <shopthelook_ajax_index> 
     <remove name="right"/> 
     <remove name="left"/> 
     <reference name="content"> 
      <block type="shopthelook_ajax/response" template="shopthelook_ajax/response.phtml" /> 
     </reference> 
    </shopthelook_ajax_index> 
</layout> 

(:

관련 정보에 대한

이 내가, 레이아웃 XML 파일을 업데이트 모든

<?xml version="1.0"?> 
<layout version="0.1.0"> 
    <shopthelook_ajax_index> 
     <update handle="catalog_product_view" /> 
      <remove name="html_calendar" /> 
      <reference name="root" output="toHtml"> 
        <action method="setTemplate"><template>shopthelook/wrapper.phtml</template></action> 
      </reference> 
      <reference name="product.info"> 
        <action method="setTemplate"><template>catalog/product/view.phtml</template></action> 
      </reference> 
      <reference name="product.info.media"> 
        <action method="setTemplate"><template>catalog/product/view/media.phtml</template></action> 
      </reference> 
      <reference name="product.info.options.configurable"> 
        <action method="setTemplate"><template>catalog/product/view/type/options/configurable.phtml</template></action> 
      </reference> 
    </shopthelook_ajax_index> 
</layout> 

답변

0

먼저 사용하고 레이아웃 XML입니다 블록)을 컨트롤러에 연결하십시오. 이제 모듈 (응용 프로그램/코드/지역/Shopthelook/아약스/차단/Response.php)이 블록 클래스를 만들어야합니다 템플릿 파일을

class Shopthelook_Ajax_Block_Response 
extends Mage_Core_Block_Template 
{ 
    public function getCollection() 
    { 
     $productIds = array(52986, 52987, 52988); 
     $collection = Mage::getModel('catalog/product')->getCollection(); 
     $collection->addAttributeToFilter('entity_id', array('in' => $productIds)); 
     $collection->addAttributeToSelect('*'); 
     return $collection; 
    } 
} 

및 생성 (응용 프로그램/디자인/프론트 엔드/기본/기본/템플릿/shopthelook_ajax/response.phtml :이 후

<?php $_collection = $this->getCollection(); ?> 
<ul class="products"> 
<?php foreach ($_collection as $_product) { ?> 
    <li> 
     <span class="product-name"><?php echo $_product->getName() ?></span> 
     ... 
    </li> 
<?php } ?> 
</ul> 

는 레이아웃을 렌더링하기 위해 컨트롤러를 업데이트 :

액션 레이아웃 XML 파일을 합병하고 핸들에 따라 찾을 수로드

public function ajaxAction() 
{ 
    $this->loadLayout()->renderLayout(); 
} 
당신의 엠 이벤트/컨트롤러/액션 이름 (귀하의 경우 shopthelook_ajax_index). 그런 다음 선택한 템플릿을 사용하여 블록을 만들고 렌더링합니다. 선택된 제품의 콜렉션을 작성하는 템플리트 getCollection 메소드가 호출됩니다.

현재 코드를 테스트 할 수 없기 때문에 코드가 100 % 정확하지만 아키텍처는 & 원칙이 좋으므로 잘 모르겠습니다.

+0

이것은 나를 더 가깝게 만듭니다! product.info 블록을 실제로 사용해야하지만 전체 카탈로그 모듈은 한 번에 하나의 제품을 처리하도록 만들어졌습니다. 본질적으로 내가 뭘 하려는지 레이아웃로드, HTML 렌더링 및 반복 할 수 있습니다. – callmetwan

+0

catalog.product (catalog/product_view) 블록은 글로벌 레지스트리 (Mage :: registry ('product'))에서 제품 모델을로드합니다. 블록을 한 페이지에 여러 번 렌더링하려면 제품 모델을 전역 레지스트리에 등록해야하고 렌더링 후에 블록을 등록 취소하고 다른 제품 모델을 다시 등록하십시오. 그러나 product_view 블록이 제품 데이터를 렌더링하는 범위를 넘어서는 다른 작업 (예 : 페이지 제목 및 메타 정보 설정)을 수행하기 때문에이 접근 방식을 권장 할 수 없습니다. 더 나은 방법은 제품 데이터를 렌더링하기 위해 맞춤 블록을 만드는 것입니다. –

관련 문제