2012-05-22 15 views
5

Quiero cambiar y guardar la configuración de un widget desde el código del widget. Estoy buscando algo como esto:Magento: cambiar programáticamente la configuración de un widget

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

Desde los widgets hay modelos, que no tienen un método save(). Entonces, ¿cómo puedo guardar los datos modificados de mi widget?

Respuesta

10

Eso va a ser complicado, y probablemente más complicado que una sola pregunta de desbordamiento de pila. Aquí hay algunos antecedentes para que comiences. La clase/objeto con el que te enfrentas arriba es una clase bloque. Los bloques se usan para renderizar HTML. Son, como habrás notado, apátridas.

El bloque obtiene sus datos de un objeto modelo de instancia de widget.

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

El estado de estos objetos (los datos que está intentando cambiar) se encuentra en la tabla widget_instance

El problema es, un objeto de bloque no sabe nada sobre el objeto de instancia del widget. Los widgets se insertan en el diseño de página con identificadores de diseño especiales almacenados en la base de datos (eso es una simplificación excesiva, porque podría escribir a book en el sistema de diseño). La razón de su widget de ejemplo se muestra en una página es debido a que el diseño de la página ha sido actualizada con información algo como esto

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

No hay ninguna referencia a la ID de instancia de widget, lo que significa que no se puede cargar el objeto de instancia.

En teoría, podría intentar cargar la instancia del widget en base a los valores del parámetro, ya que esos son almacenados en la base de datos. Sin embargo, están almacenados en la columna widget_paramater, con una cadena serializada. Eso significa que no puede usar SQL o modelar fileters para consultarlo. Tendría que cargar todas las instancias de widgets de un tipo de instancia/tema/tienda en particular, y luego manualmente foreach hasta que encuentre el objeto correcto. Esto podría ser un rendimiento para un pequeño número de widgets, pero se convertiría rápidamente en no rendimiento para una gran cantidad de widgets. Además, esto no estaría garantizado para funcionar, ya que es posible (aunque poco probable) que los valores de los parámetros de su widgets puedan haber sido cambiados por otro código de actualización de diseño.

El mejor enfoque (y que consumirá más tiempo) sería reescribir el código de inserción del widget de manera que incluya una identificación de página en el XML de actualización del diseño. Esto pasaría la identificación de instancia al código de bloque de widget, lo que le permite crear una instancia de un objeto de instancia de widget y guardarlo. También es posible que pueda agregar un campo a un widget cuya clase personalizada siempre guardará el ID de instancia.

¡Buena suerte!

+1

Esto fue realmente muy útil. Me hizo reconsiderar mis planes para ese widget en particular y después de sopesar el trabajo requerido y sus beneficios, tomé la decisión de que no vale la pena y que implementaré el widget de manera diferente. Creo que sería genial si los desarrolladores de Magento incluyeran funcionalidad para cambiar la configuración de un widget desde el widget en una versión futura. – Subsurf

Cuestiones relacionadas