2013-12-08 1 views
2

Magento : 레이아웃 XML 파일 내에서 setParentBlock?

public Mage_Core_Block_Abstract::setParentBlock(Mage_Core_Block_Abstract $block) 

은 분명이 인수로 블록 오브젝트를 존재한다. 나는 시도했다 :

<reference name="myBlock"> 
    <action method="setParentBlock"> 
     <block><reference name="newParent"/></block> 
    </action> 
</reference> 

운이 없다. 아이디어가 있으십니까?
블록 객체를 메소드에 레이아웃 파일 내에서 전달할 수 있습니까?

답변

3

레이아웃 XML 파일에서 해당 메서드를 호출 할 수 없습니다. 레이아웃 XML 파일의 <action/> 노드는 주로 문자열을 매개 변수로 전달하는 데 사용됩니다 (아래 참조). 즉, 형식 힌트가 명시 적으로 개체를 요구하는 메서드를 의미합니다.

Mage_Core_Block_Abstract $block 

은 XML에서 호출 할 수 없습니다. 이것은 시스템 구현에 사용되는 방법이며 레이아웃 XML 시스템은 우연히 호출하지 못하도록 방지하기위한 것입니다.

또한, 당신은 당신이합니다 (<reference/> 태그는 최고 수준의 레이아웃 핸들의 즉각적인 조상으로 만 유효

<reference name="newParent"/> 

참조를 사용하여 발생한 다른 행동을하려는 방법으로 참조를 사용할 수 없습니다 다른 곳에서는 의도하지 않은 구현 부작용이 있습니다. 나는이 행동에 의존하는 것에 조심해야합니다.)

마지막으로 은 레이아웃의 "도우미 매개 변수"기능을 사용하여 원하는 것을 얻을 수 있습니다. 체계.

<action method="setParentBlock"> 
    <block helper="core/data/someMethod" arg1="foo" ...> 
</action> 

당신은 헬퍼 클래스

Mage::helper('core/data'); 
을 찾을 수 있다면 someMethod 당신이

Mage::helper('core/data')->someMethod(parameters,from,attributes,above); 

하지만 블록의 부모 변경 한 후 종류의 학대 중순을 렌더링하고있는 블록을 반환

레이아웃 시스템, 나는 그것을 반대하는 조언을하고 싶지 않다면 (당신이 원하는 것을 얻을 수있는 다른 방법이 없다면).

+0

귀하의 절대적 권리를 , 그리고 그것이 어떻게 작동 하는지를 추적 한 후에 .. :). 그것이 정말로 중반 렌더링입니까? 나는 잘 모르겠다. 이미 정의 된 레이아웃 블록을 가져갈 수없고 간단히 다른 부모 이름을 선택하여 레이아웃 블록을 재배치 할 수 없다는 것이 이상합니다. 그것은 꼭 필요한 것은 아니지만 더 우아했을 것입니다. – user76568

+0

@dror 아래의 Ben의 대답을 참조하십시오. 또한'unsetChild'와'setChild'를보십시오. 그게 보통 사람들이 당신이 당신의 코멘트에 묘사 한 것을 어떻게 성취하는지입니다. 그리고 네, 정말 중반 렌더링입니다. –

+0

내 특정 경우에는 기본 레이아웃의 블록에 별칭/특성이 없습니다. 따라서 un/setChild ..를 사용할 수 없습니다. – user76568

3

당신은 역 일반적으로 협회가 내장 된 방법으로, 전혀 걱정할 필요가 없습니다, 그러나 당신이 부모를 설정하려는 경우에는 parent 블록 속성을 사용할 수 있습니다

<block type="..." name="..." parent="parentblockname" ... /> 
+0

이 접근법을 사용하면 다른 블록이 명시 적으로 부모 이름없이 (그러나 다른 부모 내에서) 제외하고 동일한 방식으로 이미 정의되어 있습니다. 결과는 무엇입니까? 아마도 둘 다 등록 될 것입니까?또는 아마 단 하나의 블록의 부모 만 귀하의 제안을 처리 할 때 업데이트 될 것입니다 (내가 원하는 것은 무엇입니까 :)? – user76568

+0

잘 모르겠지만 부모 블록을 만들어야합니다. Magento 렌더링에서 중요한 것은 insert 또는 setChild를 통해 자식을 설정 한 부모입니다. 이는 자식을 부모로 렌더링하는 "방향"이기 때문입니다. – benmarks

관련 문제