5

ウィジェットのコード内からウィジェットの構成を変更して保存したいと考えています。私はこのようなものを探しています:

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

ウィジェットはモデルではないため、save() メソッドはありません。ウィジェットの変更されたデータを保存するにはどうすればよいですか?

4

1 に答える 1

11

それはトリッキーで、おそらく単一の Stack Overflow の質問よりも複雑です。開始するための背景を次に示します。上記で扱っているクラス/オブジェクトはブロッククラスです。ブロックは、HTML のレンダリングに使用されます。あなたが指摘したように、それらはステートレスです。

ブロックは、ウィジェット インスタンス モデル オブジェクトからデータを取得します。

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

これらのオブジェクト (変更しようとしているデータ) の状態は、テーブルにありますwidget_instance

問題は、ブロック オブジェクトがウィジェット インスタンス オブジェクトについて何も知らないことです。ウィジェットは、データベースに保存された特別なレイアウト ハンドルを使用してページ レイアウトに挿入されます (レイアウト システムで本を書くことができるため、単純化しすぎています)。インスタンス ウィジェットがページに表示される理由は、ページ レイアウトが次のような情報で更新されているためです。

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

ウィジェット インスタンス ID への参照がないため、インスタンス オブジェクトを読み込めません。

理論的には、パラメータ値はデータベースに格納されているため、パラメータ値に基づいてウィジェット インスタンスをロードすることができます。ただし、それらは列に格納されwidget_paramater、シリアル化された文字列です。つまり、SQL やモデル フィルターを使用してクエリを実行することはできません。特定のインスタンス タイプ/テーマ/ストアのすべてのウィジェット インスタンスをロードしforeach、適切なオブジェクトが見つかるまで手動でロードする必要があります。これは、少数のウィジェットではパフォーマンスが向上する可能性がありますが、多数のウィジェットではすぐにパフォーマンスが低下します。また、ウィジェットのパラメーターの値が他のレイアウト更新コードによって変更されている可能性があるため (可能性は低いですが)、これが機能することは保証されません。

より良い (そしてより時間のかかる) アプローチは、レイアウト更新 XML にページ ID が含まれるように、コードを挿入するウィジェットを書き直すことです。これにより、インスタンス ID がウィジェット ブロック コードに渡され、ウィジェット インスタンス オブジェクトをインスタンス化して保存できるようになります。カスタム クラスが常にインスタンス ID を保存するウィジェットにフィールドを追加することもできます。

幸運を!

于 2012-05-22T17:05:04.820 に答える