パラメータ名でアクションを指定

出来るだけ元のソースを変更せずに対応したかったので
Actionの派生クラスを作成し、作成するアクションは
このクラスを派生するようにする事で対応。

  1. 「action_xxx_module_yyy=???」がきたら 「action=xxx」「module=yyy」
  2. 「action_xxx=???」がきたら「action=xxx」

とみなす。

注意点は

  • 元のactionの値より優先される
  • 「action_xxx=???」等とみなすパラメータが複数あった場合の動きは保障しない
define("FIX_MODULE_PREFIX",   MODULE_ACCESSOR."_");
define("FIX_ACTION_PREFIX",   ACTION_ACCESSOR."_");

class CustomAction extends Action
{
    function initialize (&$controller, &$request, &$user)
    {
        // パラメータの取得
        $params =& $request->getParameters();

        // 全パラメータを参照していく
        foreach( $params as $key => $value ){
            // type="image"対応
            if (preg_match('/_x$/', $key) || preg_match('/_y$/', $key)) {
                $tmp = substr($key, 0, strlen($key)-2);
            }else{
                $tmp = $key;
            }

            // 「action_xxx_module_yyy」の形式?
            if( preg_match ("/^".FIX_ACTION_PREFIX."([^_]+)_".
                                 FIX_MODULE_PREFIX."(.+)$/",$tmp , $ar_ret) ){
                // 元のパラメータ削除
                $request->removeParameter($key);
                // 今のモジュール、アクションと違う?
                if( $controller->getCurrentModule() != $ar_ret[2] || 
                    $controller->getCurrentAction() != $ar_ret[1] ){
                    // 指定したモジュール、アクションへforward
                    $controller->forward($ar_ret[2], $ar_ret[1]);
                    return FALSE;
                }
            }
            // 「action_xxx」の形式?
            else if( preg_match ("/^".FIX_ACTION_PREFIX."(.+)$/", $tmp, $ar_ret)){
                // 元のパラメータ削除
                $request->removeParameter($key);
                // 今のアクションと違う?
                if( $controller->getCurrentAction() != $ar_ret[1] ){
                    // 指定したアクションへforward(モジュールは今と同じ)
                    $controller->forward($controller->getCurrentModule(), $ar_ret[1]);
                    return FALSE;
                }
            }
        }
        return TRUE;
    }
}