それはトリッキーで、おそらく単一の 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 を保存するウィジェットにフィールドを追加することもできます。
幸運を!