2012-05-22 4 views
5

위젯 코드 내에서 위젯 구성을 변경하고 저장하려고합니다. 나는 이런 식으로 뭔가를 찾고 있어요 : 위젯이 어떤 모델을없는Magento : 프로그래밍 방식으로 위젯 구성 변경

class My_Module_Block_Widget 
    extends Mage_Catalog_Block_Product_List 
    implements Mage_Widget_Block_Interface 
{ 
    // ... 
    protected function _beforeToHtml() 
    { 
     // ... 
     if(/* data needs to be changed */) 
     { 
      // assuming "widget_config_data" to be one of the widget's 
      // parameters configured in the etc/widget.xml file of my module 
      $this->setData("widget_config_data", "New Data"); 
      $this->save(); 
     } 
     // ... 
    } 
    // ... 
} 

때문에,이 저장() 메소드가 없습니다. 그러면 내 위젯의 변경된 데이터를 어떻게 저장할 수 있습니까?

답변

10

이것은 까다로울 수 있으며 아마도 스택 오버플로에 관한 한 가지 질문에 더 관련되어있을 것입니다. 시작하려면 몇 가지 배경이 있습니다. 위에서 다루고있는 클래스/객체는 블록 클래스입니다. 블록은 HTML 렌더링에 사용됩니다. 당신이 말했듯이, 그들은 무국적자입니다.

블록은 위젯 인스턴스 모델 객체에서 데이터를 가져옵니다.

Mage::getModel('widget/widget_instance'); 
Mage_Widget_Model_Widget_Instance 

이러한 개체 (변경하려는 데이터)에 대한 상태 테이블 widget_instance

문제가에 위치하고 있으며, 블록 객체는 위젯 인스턴스 객체에 대해 아무것도 알지 못한다. 위젯은 데이터베이스에 저장된 특수 레이아웃 핸들을 사용하여 페이지 레이아웃에 삽입됩니다 (레이아웃 시스템에 a book을 쓸 수 있기 때문에 과도하게 단순화됩니다). 페이지 레이아웃을 사용하면 인스턴스 개체를로드 할 수 없음을 의미 위젯 인스턴스 ID에 대한 언급은 없다이

<reference name="content"> 
    <block type="cms/widget_page_link" name="48fc761f38fa9838fcc3a3b498c47f72" template="cms/widget/link/link_block.phtml"> 
     <action method="setData"> 
      <name>anchor_text</name> 
      <value>asdfasdfsad</value> 
     </action> 
     <action method="setData"> 
      <name>title</name> 
      <value>asdfasdfasdfasd</value> 
     </action> 
     <action method="setData"> 
      <name>page_id</name> 
      <value>2</value> 
     </action> 
    </block> 
</reference> 

같은 정보 뭔가 업데이트되어 있기 때문에 인스턴스 위젯이 페이지에 표시하는 이유입니다.

이론상으로, 은 데이터베이스에 저장된이므로 매개 변수 값을 기반으로 위젯 인스턴스를로드 할 수 있습니다. 그러나 그들은 widget_paramater 열에 저장되며 직렬화 된 문자열이 있습니다. 즉, SQL 또는 모델 파일러를 사용하여 쿼리 할 수 ​​없습니다. 특정 객체 유형/테마/저장소의 모든 위젯 인스턴스를로드 한 다음 올바른 객체를 찾을 때까지 수동으로 foreach을 통해로드해야합니다. 이는 적은 수의 위젯에서는 성능이 좋지만 많은 수의 위젯에서는 빠르게 성능이 저하됩니다. 또한, 위젯 매개 변수의 값이 다른 레이아웃 업데이트 코드에 의해 변경되었을 수는 있지만 (가능하지는 않지만) 작동하도록 보장되지는 않습니다.

레이아웃 업데이트 XML에 페이지 ID를 포함하도록 위젯 삽입 코드를 다시 작성하는 것이 더 좋으며 (더 많은 시간이 소요됩니다) 이렇게하면 인스턴스 ID가 위젯 블록 코드로 전달되어 위젯 인스턴스 객체를 인스턴스화하고 저장할 수 있습니다. 또한 사용자 정의 클래스가 항상 인스턴스 ID를 저장하는 위젯에 필드를 추가 할 수도 있습니다.

행운을 빈다.

+1

이것은 실제로 매우 도움이되었습니다. 그것은 내가 특정 위젯에 대한 나의 계획을 재고하게 만들었고, 필요한 작업과 이점을 비교 한 후에 필자는 가치있는 것이 아니라 위젯을 다르게 구현할 것이라는 결정에 이르렀다. Magento 개발자가 향후 릴리스에서 위젯 내에서 위젯의 구성을 변경하는 기능을 포함하면 좋을 것 같습니다. – Subsurf

관련 문제