現在0.2.0RC1として公開していますKtai Libraryですが、ちょっといろいろと忙しくて開発の方を中断している状態です。正式版を待たれている方もいらっしゃるかもしれませんが、ちょっとお時間がかかるかもしれませんので、RC1をお使いになることを一応オススメさせていただきます。申し訳ないです。
ちなみにKtai Libraryがらみでは、いくつか水面下で進行しているものがあります。
一つは決定事項がありますが、これはちょっとトップシークレットでして(笑)。
もう少ししましたら告知させていただきます。というかまだ全然出来ていないので(^^;。
それから来週、とある方にKtai Libraryをご説明する機会があり、これがどういう話の流れになるのかは分からないのですが、特定に対してKtai Library単品でご説明したりお話を伺うのは今回初めてですので大変に楽しみにしております。
あとは、これは皆さんに直接関係があるかもしれませんが、Ktai Libraryを快適に使っていただくための「外部ツール」を現在企画しております。現在技術検証段階ですのでそれ次第になりますけど、携帯サイト開発に無くてはならないものだと思いますので、おそらくKtai Libraryの価値が格段に高まるかと。それくらい価値のあるツールであると考えています。こちらも是非お楽しみに。
その他、ちょっともやっとしているものがあり、これをどうしようかと悩んでいるところがあります。今後のKtai Libraryの方針に左右されるところがあり、かなり慎重にいきたい反面、基本的に「Ktai Libraryは私一人で作っているものではない」気持ちのため、出来ればそうしていきたい…そういった、技術的というものではなくコンセプト的なところでの課題点なのですが。でも、最終的には利用される皆さんが満足できるような方向で行きたいと考えています。
あ、ちなみに有料化するとか、どこかの企業の管轄になるとか、そういった話ではないのでご安心を。
MASA-P 様、はじめまして。
Ktai Library を利用させて頂いております。
Ktai Library について伺いたい点があり
コメントさせて頂きました。
内容が長くなってしまい申し訳ありません。
質問1:
Ktai Libary にてオーバーライドする
AppController::redirect() メソッドでは、
内部で Router::parse を使っているため、
引数に渡せるのは文字列(\’/users/index\’)だけであり、
以下のような配列
array(\’controller\’ => \’users\’, \’action\’ => \’index\’)
を渡すことはできないと思っています。
これは仕様でしょうか?
質問2:
Docomo からアクセスした場合に、
リダイレクトすると Missing Controller が発生しました。
AppController::redirect() メソッドの、
$url = Router::url($url);
を削除すると期待通りに動作し、Missing Controller は発生しません。
今は、上記行を削除して動かそうとしていますが、
これにより発生してしまう問題はあるでしょうか?
まだ CakePHP を初めて日が浅く、
質問が的外れな内容でしたら失礼しました。
その場合、本件については御放念ください。
以上、お忙しい所誠に恐縮ではありますが
アドバイス頂ければ幸いでございます。
ご質問ありがとうございます。
まずRouter::parse()の件ですが、これは当方の意図していない出力がされているようですので、修正したいと思います。ご報告ありがとうございます。
それからdocomoでリダイレクトできない件ですが、当方では現象が出ておらず、出力等を確認しましたが問題なくurlが出ております。
原因はいくつか考えられるのですが、例えばdocument rootとwebrootの指し示す場所が異なる場合、url()で正しく補完されないことがあります。mod_rewriteの兼ね合いもあるのですが、たまたま動いているけど実は設定がうまくいっていなかった、ということがまれにあります。ただし、この場合ですと、他のキャリアでも同じようなエラーになるはずです。
また、テストされた機種がパス形式を受け付けないでエラーが出る(つまり「http://~」でないとダメ)、ということも考えられます。最近の機種は分からないのですが、以前mova携帯の頃に、こういった現象があったように思います。
一応オプション的なことを追加して、柔軟に出来るように考えてみます。
ちなみに、debug=3にしてみて、何かエラーの情報は出ていますでしょうか?
それから、app_controller内のredirect()内でURLをダンプしてみて、どのようなURLが出力されていますでしょうか? 加工前と加工後のURLの違いから、何か手がかりがつかめるかもしれません。
早速お返事頂きありがとうございます。
> Router::parse()の件
了解致しました。
お返事頂きまして助かりました。
> docomoでリダイレクトできない件
こちらの環境では各ユーザのホームディレクトリにある public_html を公開ディレクトリにしています。
例として http://example.com/foo/index.html は、
/home/foo/public_html/index.html を見るようにしています。
ブラウザのURLを改めて確認したところ、リダイレクトによる遷移前後でURLが以下のようになっていました。
遷移前: http://example.com/foo/controller/index
遷移後: http://example.com/foo/foo/controller/index
ユーザー名に相当する部分が二重になってしまい、コントローラ名として扱われているようです。
mod_rewrite については以下のように設定しています。
※mod_rewrite を理解していない状態で試行錯誤の末、以下のような状態です。
.htaccess
RewriteEngine on
RewriteBase /foo
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
app/.htaccess
RewriteEngine on
RewriteBase /foo/app
RewriteRule ^$ app/webroot/ [L]
RewriteRule (.*) app/webroot/$1 [L]
app/webroot/.htaccess
RewriteEngine On
RewriteBase /foo/app/webroot
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
> テストされた機種がパス形式を受け付けないでエラーが出る
実機は docomo L-03A です。
http://www.nttdocomo.co.jp/product/foma/style/l03a/
また Firefox アドオンの FireMobileSimulator にて docomo P903i 設定で動かしてみた際にも同様の現象が発生します。
ちなみに au, softbank 実機あるいは上記シミュレータの au, softbank 設定では現象が発生しませんでした。
> debug=3にしてみて、何かエラーの情報は出ていますでしょうか?
“Missing Controller” とそれに付随する、
Error: FooController could not be found.
Error: Create the class FooController below in file:
が表示されるのみでした。
> app_controller内のredirect()内でURLをダンプ
1. redirect() に入った直後と、
2. parent::redirect() を呼び出す直前
でダンプしてみました。
1. /controller/index
2. /foo/controller/index?csid=(セッションID)
au, softbank 端末では上記の問題が発生しない点が不思議です。
連続コメント失礼します。
cake/libs/router.php を追いかけてみました。
以下の部分で URL が意図する結果とは違ってしまうようです。
Router::url()
781: $base = $path[‘base’];
904: $output = str_replace(‘//’, ‘/’, $base . ‘/’ . $output);
上記 $base は、dispatcher.php の Dispatcher::baseUrl() が元になっているようです。
と、この辺りまで調べて集中力が切れてしまったので(^^;
最初に戻って
– AppController::redirect() の Router::url() は上手くいかず、
– AppController::redirect() 内部でも Router::url() を呼んでいるのに、
何が違うのか?
と調べてみました。
そこで AppController::redirect() で呼んでいる、Router::url() の第2引数を true にしたところ、問題となっている現象を回避できました。
MASA-P 様が指摘されていた
「テストされた機種がパス形式を受け付けないでエラーが出る」
に嵌ってしまっていたのかもしれません。
状況が飲み込めました。
確かに、redirect()ではフルパス形式でURLを渡すルールのようですので、url()の第2引数はtrueである必要がありますね。早速修正します。これと、もう一つの「フルパス形式以外のURLを入れると変になる」件を併せて修正します。
それと気になったのが、.htaccessのRewriteBaseの書き方なのですが…
/foo/app/.htaccess
RewriteEngine on
RewriteBase /foo/app/
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]
appが1つ多い気がするのですが、これは大丈夫ですか?
まあこれは上記話題とはあまり関係ないところだとは思いますが、「/foo/app」にアクセスした場合にたぶんこけるのではないかと思われます。
度々のお返事恐縮です。
> url()の第2引数はtrueである必要がありますね。
ひとまず上記の対応をしていたのですが、
ご助言頂いて安心できました。
ありがとうございます。m(_ _)m
> それと気になったのが、.htaccessのRewriteBaseの書き方なのですが…
Ktai Library と関係の無いところにまでアドバイス頂き本当にありがとうございます。
mod_rewrite 設定の書き方は理解が足らず、試行錯誤で現状のようになってしまっていました。
書いて頂いた内容で(今さらですが)書き方のイメージができました。
現状の内容は意図的にそうしているわけではないので、修正します。
MASA-P 様のおかげで問題が解決できました。
ありがとうございました。
p.s.
今回の一連の件は内容が長くなってしまいそうだったので「お問い合わせ」から送信させて頂こうと思ったのですが、私の環境では送信に失敗してしまうようだったのでブログにコメントさせて頂きました。
もし、「次から質問は~のサイトで!」などありましたら御指摘ください。
解決できそうとのことで何よりです。
問い合わせフォームの件ですが、最近MTAを入れ替えまして、その影響でエラーが出ていたようです(sendmailが起動できなかったためエラーが起きていた)。今は直っておりますので、他に何かあるようでしたらこちらでも大丈夫ですよ。