2012-05-22 10 views
5

Chcę zmienić i zapisać konfigurację widżetu z poziomu kodu widgetu. Szukam czegoś takiego:Magento: Programowa zmiana konfiguracji widgetu

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(); 
     } 
     // ... 
    } 
    // ... 
} 

Ponieważ widżety nie są modelami, nie mają metody save(). Jak mogę zapisać zmienione dane mojego widżetu?

Odpowiedz

10

To będzie trudne i prawdopodobnie bardziej związane z pojedynczym pytaniem o przepełnienie stosu. Oto tło, od którego możesz zacząć. Klasa/obiekt, z którym mamy do czynienia powyżej, jest klasą blokową. Bloki służą do renderowania HTML. Są, jak już zauważyłeś, bezpaństwowcami.

Blok pobiera dane z obiektu modelu instancji widgetu.

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

Stan tych obiektów (danych starasz się zmienić) znajduje się w tabeli widget_instance

Problemem jest obiektem blok nie wie nic o tym wiedzieć widget instancji obiektu. Widżety są wstawiane do układu strony za pomocą specjalnych uchwytów układu przechowywanych w bazie danych (to nadmierne uproszczenie, ponieważ można napisać a book w systemie układu). Powodem instancja widget pojawia się na stronie, ponieważ układ strony został zaktualizowany o informacje coś takiego

<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> 

nie ma żadnego odniesienia do widgetu id instancji, co oznacza, że ​​nie może załadować obiekt instancji.

Teoretycznie można spróbować załadować instancję widgetu w oparciu o wartości parametrów, ponieważ te są przechowywane w bazie danych. Są one jednak przechowywane w kolumnie widget_paramater, a ciąg jest serializowany. Oznacza to, że nie można używać zapytań SQL lub filtrów modelu w celu wyszukania zapytania. Musisz załadować wszystkie instancje widgetu określonego typu/tematu/składu instancji, a następnie ręcznie do momentu znalezienia właściwego obiektu. Może to być przydatne w przypadku niewielkiej liczby widżetów, ale szybko stałoby się nieskuteczne w przypadku dużej liczby widżetów. Ponadto nie gwarantujemy, że zadziała, ponieważ jest możliwe (choć jest mało prawdopodobne), że wartości parametrów widżetów mogły zostać zmienione przez inny kod aktualizacji układu.

Lepszym (i bardziej czasochłonnym) podejściem byłoby przepisanie kodu wstawiającego widget tak, aby zawierał identyfikator strony w pliku XML aktualizacji układu. Spowoduje to przekazanie identyfikatora instancji do kodu blokowego widgetu, co umożliwi utworzenie instancji widgetu i zapisanie go. Możesz także dodać pole do widżetu, którego klasa niestandardowa zawsze zapisuje identyfikator instancji.

Powodzenia!

+1

To było bardzo pomocne! Zmusiło mnie to do ponownego przemyślenia moich planów dotyczących tego widżetu, a po rozważeniu wymaganej pracy i jej korzyści doszedłem do wniosku, że nie jest to tego warte i że inaczej zaimplementuję widżet. Myślę, że byłoby wspaniale, gdyby twórcy Magento wprowadzili funkcjonalność do zmiany konfiguracji widżetu z poziomu widżetu w przyszłej wersji. – Subsurf

Powiązane problemy