2013-11-27 3 views
2

몇 시간 동안 디버깅을 시도한 후에 아이디어가 없어지고 설명이 필요합니다. (어느 시점에서 개념을 잘못 이해했다고 생각합니다).Magento 1.7+ : 페이지 레이아웃 핸들을 사용하는 방법

뒷 배경 : 일부 기본 범주에는 하위 범주 및 제품에서 자동으로 생성되는 "개요 페이지"가 ​​필요합니다. 그래서 내 접근 방식은 모든 기본 범주에 하위 범주를 추가하고 모든 하위 범주에서 사용되는 사용자 지정 페이지 레이아웃을 만드는 것이 었습니다. 내 고객의 경우 Magento 백엔드에서 관리하기가 매우 쉽습니다. 한 번의 드롭 다운으로 값을 변경하기 만하면되기 때문입니다. 그래서 새로운 페이지 레이아웃을 정의하는 간단한 모듈을 만들었습니다. 백엔드에서 나는 이것을 선택할 수있었습니다.

모듈 설정 :이 특별한 개요 페이지 이후

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Company_Layouts> 
      <version>0.1.0</version> 
     </Company_Layouts> 
    </modules> 
    <global> 
     <page> 
      <layouts> 
       <company_category_overview module="page" translate="label"> 
        <label>Kategorie-Übersicht</label> 
        <template>page/1column.phtml</template> 
        <layout_handle>company_category_overview</layout_handle> 
       </company_category_overview> 
      </layouts> 
     </page> 
    </global> 
    <frontend> 
     <layout> 
      <updates> 
       <company_layouts> 
        <file>company_layouts.xml</file> 
       </company_layouts> 
      </updates> 
     </layout> 
    </frontend> 
</config> 

내가 특정 레이아웃 파일 (company_layouts.xml)에서 레이아웃을 참조하기 바라고 일부 레이아웃을 변경해야 ... 그리고 여기 내 논리가 저를 떠나고있다 :

<layout_handle>company_category_overview</layout_handle>이 특정 페이지 템플릿을 사용할 때만 레이아웃을 변경하는 데 사용할 수있는 핸들을 정의하고 싶습니다. 정확히 이것은 그렇지 않습니다. company_category_overview 핸들 내 레이아웃 업데이트는 무시됩니다.

더 깊이 파고 들자 마자 깨닫지 못했지만 제 코드가 아닌 일반 문제처럼 보입니다. 이전 Magento 1.4 설치에서는 페이지 레이아웃 핸들이 page_one_column과 같은 모든 사이트로 전송됩니다. Magento 1.7과 (현재 사용하고있는 것) 1.8 이것은 홈페이지의 경우에만 있습니다. 디버깅을 위해 Commerce Bug를 사용하고 있습니다. 나는 방금 신선한 1.7과 1.8의 설치로 이것을 시도했다.

이 개념이 내가 이해하지 못하거나 단순한 버그입니까?

또한 레이아웃 업데이트가 백엔드에서 수행 될 수 있다는 것을 알고 있지만 복사/붙여 넣기 등의 작업없이 별도의 파일에서이 작업을 수행하는 것이 훨씬 깔끔하다고 생각하기 때문에 이것이 마지막 옵션 일 것입니다.

답변

5

이 개념이 내가 이해하지 못하거나 단순한 버그입니까?

둘 다? 둘 다? <page><layout>...</layout></page> 노드의 정보는 범주 페이지와 CMS 페이지에서 모두 사용되지만 각 시스템은 정보를 다르게 사용하며 두 시스템 모두 예상대로 사용하지 않습니다. 다음은 카테고리 페이지에서이 정보를 사용하는 방법에 대한 요약입니다.

카테고리 페이지는 다음 컨트롤러 액션

#File: app/code/core/Mage/Catalog/controllers/CategoryController.php 
public function viewAction() 
{ 
    ... 
} 

이 컨트롤러 액션 표준 loadLayoutrenderLayout 메서드 호출이없는 렌더링됩니다. 대신 레이아웃 핸들을 추가하고 블록을 생성하고 최종 레이아웃을 렌더링하는 작업을 수행하는 데이 메서드에 많은 추가 코드가 있습니다. 사용자 지정 디자인 탭에서 "페이지 레이아웃"와 범주를 저장하면 우리가 관심있는 부분이

$design = Mage::getSingleton('catalog/design'); 
$settings = $design->getDesignSettings($category); 

#...other stuff we don't care about... 

if ($settings->getPageLayout()) { 
    $this->getLayout()->helper('page/layout')->applyTemplate($settings->getPageLayout()); 
} 

입니다 위의 getPageLayout 메서드 호출 company_category_overview를 반환해야합니다. 카테고리 페이지에서 Magento는 이것을 사용하여 핸들을 적용하지 않고 값을 applyTemplate 메소드로 전달합니다. 그 방법이 전부입니다.

#File: app/code/core/Mage/Page/Helper/Layout.php 
public function applyTemplate($pageLayout = null) 
{ 
    if ($pageLayout === null) { 
     $pageLayout = $this->getCurrentPageLayout(); 
    } else { 
     $pageLayout = $this->_getConfig()->getPageLayout($pageLayout); 
    } 

    if (!$pageLayout) { 
     return $this; 
    } 

    if ($this->getLayout()->getBlock('root') && 
     !$this->getLayout()->getBlock('root')->getIsHandle()) { 
      // If not applied handle 
      $this->getLayout() 
       ->getBlock('root') 
       ->setTemplate($pageLayout->getTemplate()); 
    } 

    return $this; 
} 

관련 부분은,이 라인입니다 구성 Varien_Object

<label>Kategorie-Übersicht</label> 
<template>page/1column.phtml</template> 
<layout_handle>company_category_overview</layout_handle> 

의 정보를로드

$pageLayout = $this->_getConfig()->getPageLayout($pageLayout); 

. 그런 다음이 정보를 사용하여 루트 블록에 템플릿을 적용합니다.
$this->getLayout() 
->getBlock('root') 
>setTemplate($pageLayout->getTemplate()); 

그래서, 카테고리 페이지를 들면, <layout_handle/> 노드의 정보가 사용되지 않습니다. 이것이 레이아웃 업데이트가 적용되지 않는 이유입니다. Magento는 실제로 귀하의 핸들을 적용합니다.

+0

자세한 설명을 주셔서 감사합니다. 1.4 Magento 설치의 카테고리 컨트롤러를 파헤 치면 Magento의 현재 버전에서 누락 된'applyHandle' 함수 호출을 발견했습니다. 현재, layout_handle은 범주 및 제품 페이지에서 무시되는 경우 꽤 쓸모없는 것으로 보입니다. – themroc

+0

내가 필요했습니다 - 카테고리 페이지 레이아웃을 다루십시오. 이 문제를 해결하기 위해 GlobalHandle 확장 프로그램을 업데이트했습니다. 이제 핸들이 선택된 상태로 주입됩니다. https://github.com/ProxiBlue/GlobalHandle – proxiblue