イベント オブザーバーを使用すると、レンダリング命令のコンパイルの前にカスタム レンダリング構成を挿入できます。たまたま、これはコントローラー アクションの実行に接して発生します。これは、要求オブジェクトの関与を考えると適切なようです。観察するイベントはcontroller_action_layout_load_before
で、これはオブザーバー ロジックです。
class Some_Observer
{
/**
* Observer to inject update handles via query string.
*
*
* @param Varien_Event_Observer $o
* @return void
*/
public function addQueryStringHandle(Varien_Event_Observer $o)
{
$update = $o->getLayout()->getUpdate();
/* @var $update Mage_Core_Model_Layout_Update */
$query = $o->getAction()->getRequest()->getQuery();
if (is_array($query) && count($query)) {
foreach ($query as $name => $param) {
if($this->_isValidXmlName($name)) {
$update->addHandle('QS_'.$name); // QS_ prefix should prevent collisions
}
}
}
}
/**
* Check validity of arbitrary external string as XML safe
*
* @link http://stackoverflow.com/a/2519943/833795
* @param string $name
* @return bool
*/
protected function _isValidXmlName($name)
{
try {
new DOMElement($name);
return true;
} catch(DOMException $e) {
return false;
}
}
}
./index.phpの末尾に以下を追加することで、効果を確認できます。
Zend_Debug::dump(Mage::app()->getLayout()->getUpdate()->getHandles());
このソリューションは、特にレイアウト キャッシュを有効にしてテストする必要があります。特定のパラメーターをホワイトリストに登録することも賢明かもしれません。