문제

누군가가 왜 젠토를 좋아하는 제품을 로드되는 경우 요청을 로드 레이아웃?

나는 그냥 산책을 통해 어떤 젠토 코드에서 1.9.2.나는 서 면으로 컨트롤러 그냥:loadLayout en renderLayout.그래서 나는 것을 문질러서 나는 바꿀 수 있 블록 사이의 두 가지 기능이 있지만,그것을 밝혀지 않는 경우는 대부분의'코어'블록입니다.예를 들어 이 블록에서 채우는 HTML 헤더를 수행하는 경우를 말한다:"loadLayout".

누군가에 경험이 있는 블록을 제거하는 이미'변화'글로벌 젠토 world?

예를 들어:Mage_Catalog_Block_Product_View

/**
 * Retrieve current product model
 *
 * @return Mage_Catalog_Model_Product
 */
public function getProduct()
{
    if (!Mage::registry('product') && $this->getProductId()) {
        $product = Mage::getModel('catalog/product')->load($this->getProductId());
        Mage::register('product', $product);
    }
    return Mage::registry('product');
}
/**
     * Add meta information from product to head block
     *
     * @return Mage_Catalog_Block_Product_View
     */
    protected function _prepareLayout()
    {
        $this->getLayout()->createBlock('catalog/breadcrumbs');
        $headBlock = $this->getLayout()->getBlock('head');
        if ($headBlock) {
            $product = $this->getProduct();
            $title = $product->getMetaTitle();
            if ($title) {
                $headBlock->setTitle($title);
            }
            $keyword = $product->getMetaKeyword();
            $currentCategory = Mage::registry('current_category');
            if ($keyword) {
                $headBlock->setKeywords($keyword);
            } elseif ($currentCategory) {
                $headBlock->setKeywords($product->getName());
            }
            $description = $product->getMetaDescription();
            if ($description) {
                $headBlock->setDescription( ($description) );
            } else {
                $headBlock->setDescription(Mage::helper('core/string')->substr($product->getDescription(), 0, 255));
            }
            if ($this->helper('catalog/product')->canUseCanonicalTag()) {
                $params = array('_ignore_category' => true);
                $headBlock->addLinkRel('canonical', $product->getUrlModel()->getUrl($product, $params));
            }
        }

        return parent::_prepareLayout();
    }

이것은 나의 테스트:

<?php
include_once('../initMage.php');
initMage();

$controller = initController('Gn_Test_IndexController');
$product = Mage::getModel('catalog/product')->load(1);
Mage::register('product', $product);
$controller->loadLayout();
도움이 되었습니까?

해결책

설명에서 이득을 넘어서는 싱글 스택 교환 답변,레이아웃 시스템을 채울 수 있는 작은 책이(고 썼는 예약).

에서 짧은 경우에는 전화 loadLayout 당신이 말하고 젠토

  1. 모든 병 레이아웃 XML 파일을 업데이트(app/design/area/theme/layout)하나로 나무
  2. 을 찾아의 특정 부분에 있는 나무를 사용하여 이를 요청
  3. 사람의 특정 부분에 트리를 결정을 막는 객체를 인스턴스화,그리고 다음 차단 인스턴스화체

그것은 마지막 부분 3 위는 던지고-당신 때 젠토 인스턴스화하는 블록을 통해 레이아웃은 전화 _construct_prepareLayout 에 차단합니다.이러한 방법을 자주 할 것을 로드하는 제품 컬렉션입니다.

를 완료하는,위의를 호출할 때 renderLayout 당신이 말하고 Magento"call 뿌리 블록 toHtml 방법을 렌더링하는 뿌리 블록 phtml 템플릿으로 계곡을 다른 블록 phtml 템플릿을 통해 getChildHtml (이것은 또한 때로는 트리거에 직접 인스턴스화 및 렌더링 기타 블록 개체)

누군가에 경험이 있는 블록을 제거하는 이미'변화'글로벌 젠토 world?

일반적으로,당신 하고 싶지 않다.다른 블록 코드에 의존 할 수 있는 상태를 찾을 변경하고 제거하는 원인이 될 수 있습 치명적인 오류가 있습니다.

는 경우 필요하다면 나는 모습으로 다음과 같은 이벤트

controller_action_layout_load_before
controller_action_layout_generate_xml_before
controller_action_layout_generate_blocks_before

다음은 직접 수정의 레이아웃 및/또는 레이아웃 업데이트 객체(에서 전달에서 관찰자)의 제거하는 XML 에 대한 책임을 만들고 싶은 블록을 제거합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 magento.stackexchange
scroll top