2012-11-21 2 views
1

레이아웃 파일에서 다른 테마의 템플릿 파일을로드 할 수 있습니까? 그래서 대신에 뭔가local.xml의 다른 테마에서 템플릿로드 magento

<reference name="head"> 
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml"/> 
</reference> 

하나는있을 수 있습니다처럼 중 하나

<reference name="head"> 
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml" template="otherTheme" /> 
</reference> 

나 :

<reference name="head"> 
    <block type="page/template_links" name="customvars" as="customVars" template="/app/design/frontend/default/otherTheme/page/html/customvars.phtml"/> 
</reference> 
+0

왜 이것이 필요한가요? 단일 구성 범위 내에서 템플릿 파일에 대해 * 4 개의 가능한 위치가 있습니다 ... – benmarks

+0

예를 들어 다른 'get' 변수 값을 기반으로 블록에 대해 다른 템플릿을로드하려고합니다. 블록을 처리하거나이 값을 기반으로하지 않는 기능이 있지만 다른 템플릿 파일이 아닌 다른 테마를 지정하는 옵션이 더 좋을 것입니다. –

+0

또는 템플릿에 다른 테마를 지정하는 것이 이미 가능하다고 제안 했습니까? –

답변

1

당신이 Mage_Core_Block_Template::getTemplateFile() 봐이 표준 젠토에 수없는 경우.

public function getTemplateFile() 
{ 
    $params = array('_relative'=>true); 
    $area = $this->getArea(); 
    if ($area) { 
     $params['_area'] = $area; 
    } 
    $templateName = Mage::getDesign()->getTemplateFilename($this->getTemplate(), $params); 
    return $templateName; 
} 

는 당신이 필요하면 코드에서 $params['_package']$params['_theme']을 설정하는 것입니다. 시작점으로이 정보를 블록 매개 변수에 저장 한 다음 $params 배열로 복사 할 수 있습니다.

하지만 제품 및 카테고리 패키지에 대한 맞춤 테마를 지정할 수 있습니다. 아마도 이미 도움이 되었습니까?

+0

Alex에게 다시 한번 감사드립니다. 위의 함수를 다시 만들 것을 제안하거나 다른 모듈에서'$ params' 배열을'Get' /'Set'하는 방법이 있습니까? –

+0

'Mage_Core_Block_Template'을 재 작성하고이 기능을 추가하는 모듈을 만들 수 있습니다. – Alex

0

이벤트 관찰자를 사용하면 렌더링 명령 컴파일에 앞서 사용자 정의 렌더링 구성을 삽입 할 수 있습니다. 이런 일이 발생하면 컨트롤러 액션 실행에 접하게됩니다. 이는 요청 객체의 개입을 고려할 때 적절합니다. 관찰하는 이벤트 controller_action_layout_load_before이며, 이것은 관찰자 로직이다

class Some_Observer 
{ 
    /** 
    * Observer to inject update handles via query string. 
    * 
    * 
    * @param Varien_Event_Observer $o 
    * @return void 
    */ 
    public function addQueryStringHandle(Varien_Event_Observer $o) 
    { 
     $update = $o->getLayout()->getUpdate(); 
     /* @var $update Mage_Core_Model_Layout_Update */ 

     $query = $o->getAction()->getRequest()->getQuery(); 

     if (is_array($query) && count($query)) { 
      foreach ($query as $name => $param) { 
       if($this->_isValidXmlName($name)) { 
        $update->addHandle('QS_'.$name); // QS_ prefix should prevent collisions 
       } 
      } 
     } 
    } 

    /** 
    * Check validity of arbitrary external string as XML safe 
    * 
    * @link http://stackoverflow.com/a/2519943/833795 
    * @param string $name 
    * @return bool 
    */ 
    protected function _isValidXmlName($name) 
    { 
     try { 
      new DOMElement($name); 
      return true; 
     } catch(DOMException $e) { 
      return false; 
     } 
    } 
} 

효과 ./index.php 끝에 다음을 추가하여 확인할 수있다 :

Zend_Debug::dump(Mage::app()->getLayout()->getUpdate()->getHandles()); 

이것 솔루션은 특히 레이아웃 캐싱이 활성화 된 상태에서 테스트해야합니다. 특정 매개 변수를 허용하려면 신중해야합니다.

0

나는 이것을 얻으려는 사람에게이 답변을 추가하고 있습니다.

다른 테마에서 템플릿을로드하려면 local.xml을 동일한 (일반적인 구성)으로 유지 한 다음 컨트롤러 내에서이 코드를 추가하여 템플릿을 찾는 데 사용할 패키지와 테마를 지정하십시오 에서 파일 :

Mage::getSingleton('core/design_package') 
->setPackageName('package') 
->setTheme('theme'); 

이 코드는 "사용자 정의 디자인"을 사용할 때 젠토 카테고리 페이지에 대해 다른 테마를 적용하는 방법에서 가져온 것입니다. 테스트를 거쳐 내 라이브 사이트에서 작업하고 있습니다.

관련 문제