この記事はEthna超超超初心者向けの内容です。
どうも、M_Ishikawaです。Advent Calendar 2回目の投稿です!
1回目の投稿 HerokuとかPaaS上のEthnaのURLをイイ感じにする をやったあと、またまた問題に直面してしまいました。。
それは、URLパラメータを渡す時です。
その前に前回のおさらいをすると、、、
EthnaデフォルトのアクセスURLはアクション名を「page」とした場合
http://xx.xx.xx/?action_page=true
のようなイケてない感じになるのを、
<?php
//…
function _getActionName_Form()
{
if (isset($_SERVER['REQUEST_METHOD']) == false) {
return null;
}
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
$http_vars =& $_POST;
} else {
$http_vars =& $_GET;
}
foreach ($http_vars as $name => $value)
{
if ($value == "" || strncmp($name, 'action_', 7) != 0) {
continue;
}
// オリジナル方式 http://hostname/?action_action_name
return parent::_getActionName_Form();
}
// 新かっこいい http://hostname/action/name/ 方式
if (!empty($_SERVER['REQUEST_URI']))
{
$redirect_url = $_SERVER['REQUEST_URI'];
$action_name = str_replace('/', '_', $redirect_url);
return trim($action_name, '_');
}
// まあ悪くはない http://hostname/?action=action_name 方式
if (array_key_exists('action', $http_vars))
{
return $http_vars['action'];
}
}
を追記することでイイ感じのURL
http://xx.xx.xx/page
へのアクセスでページが表示されるようになります。
ここまでが前回の内容。
が、しかし…
これだとURLパラメータを渡すことができませんでした。そ、そんなあ(´Д`)
http://xx.xx.xx/page?type=3
- Appid[24533](ERR): Ethna_Controller._trigger_WWW(class/Ethna_Controller.php:875): undefined action [pagetype] [ERROR CODE(32)]
アクション名が[pagetype]???あきらかにおかしい。
再度いくつかの環境変数にvar_dumpを仕込んでアクセスしてみます。
<?php
//…
var_dump($_SERVER['REDIRECT_QUERY_STRING']);
var_dump($_SERVER['QUERY_STRING']);
var_dump($_SERVER['REDIRECT_URL']);
var_dump($_SERVER['REQUEST_URI']);
すると
string 'a=0&b' (length=5)
string 'a=0&b' (length=5)
string '/index.php' (length=10)
string '/page?a=0&b' (length=11)
なるほどー、元の記事でREDIRECT_URLを使っていたのはパラメータがくっつかないからなのね。
しかしこのHeroku PaaS環境でRewriteを二重で行なっている我が環境では、やはりREQUEST_URIを使ってパラメータ部を分離するしかないようだ。
で、書き換えた。
<?php
//…
function _getActionName_Form()
{
if (isset($_SERVER['REQUEST_METHOD']) == false) {
return null;
}
if (strcasecmp($_SERVER['REQUEST_METHOD'], 'post') == 0) {
$http_vars =& $_POST;
} else {
$http_vars =& $_GET;
}
foreach ($http_vars as $name => $value)
{
if ($value == "" || strncmp($name, 'action_', 7) != 0) {
continue;
}
// オリジナル方式 http://hostname/?action_action_name
return parent::_getActionName_Form();
}
// 新新かっこいい http://hostname/action/name?a=0&b#c でもイケる方式
if (!empty($_SERVER['REQUEST_URI']))
{
$redirect_url = preg_replace('/\?(.*)$/', '', $_SERVER['REQUEST_URI']);
$action_name = str_replace('/', '_', $redirect_url);
return trim($action_name, '_');
}
// まあ悪くはない http://hostname/?action=action_name 方式
if (array_key_exists('action', $http_vars))
{
return $http_vars['action'];
}
}
よしと、これでバッチリ!
enjoy! Ethna on heroku!!