【CakePHP/KtaiLibrary】複数submit設置でセッションキーが消える!?

icon_ktaisession.use_trans_sidがらみでまた問題が確認されました。

これは大変に不思議なことなのですが、フォーム内に複数のsubmitを設置したい場合があると思うのですが、この場合にどちらか片方(おそらく最後にあるもの「以外」のもの)を押した場合、クエリストリング中のセッションキーが消えてしまう、という現象に遭遇しています。submitが一つだけ存在する場合、もしくは最後のsubmitを押した場合は問題がないのです。

つまり、携帯サイトの場合、docomo携帯で一部フォームで正常に動かなくなる事態に遭遇する、というわけです。

いろいろなケースで試してみたのですが、結局分からず。
最終手段として、「url_rewriter.tags」を変更することで、セッションキーが継続され、問題解決ができました。
具体的には、Ktai Libraryの「app/config/ktai_session.php」の末尾にある設定箇所を変更します。


//formの場合の設定を変更
//    ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,form=fakeentry,fieldset=');
ini_set('url_rewriter.tags', 'a=href,area=href,frame=src,input=src,form=action,fieldset=');

ところで、「fakeentry」というパラメータはなんなんでしょうかね?
これはデフォルトのPHP設定なのですが。
なぜ「action」ではないのか、私には分かりません。

この件に関しては、ライブラリの修正はちょっと待って、しばらく様子を見ようと思います。
ちょっと変更することによる影響が分かりませんので。
問題ないようなら更新したいと思います。

【Ktai】Ktai Libraryが海外サイトでも捕捉されたみたいです…が

icon_ktaiKtai Libraryですが、なんか知らない間に海外サイトに取り上げられたようです。

▼Japanese Mobile Support for Cake PHP
http://blog.mobalean.com/2009/03/16/japanese-mobile-support-for-cake-php

何かいろいろと書かれているみたいですが…(大汗)
「オブジェクト指向に従っていない」「ヘルパー・コンポーネントで同じ関数を複製している(Railsで言うFowardable moduleのようになっていない)」みたいなことが書かれていますが、言い分は何となく分かるのですが、それをあえてやっていない理由をくみ取っていただけなかったのは残念だなぁ…
「キャリアコード」云々と言っている部分は意味が良く分からなかったんですが、要は「もっとシンプルに書ける」って事でしょうか。まあ「キャリアコード」というのは後から書いた部分なので、無駄があるのは承知してますので、今後の対応ですかね。

ちょっと大人げなく反論してみました(^^;;;
というか、海外でダウンロードされることはまったく予期していなくて、しかも国内よりも早く、具体的にソースの感想が述べられていたのは驚きでした。そういった意味で感謝。

【Ktai】「Ktai Library」のちょっとしたTipsとか

icon_ktaiとりあえず版ということで、Ktai Library を公開したわけですが、思った以上に反響があり嬉しく思います。特に ktai.org さんに取り上げていただいたことでかなりのアクセス数があります(現在進行形です)。本当にありがとうございます。CakePHPフォーラムの方は、後で自作自演しようかと思いましたが、newsに先を越されてしまいました(笑)。こちらもありがとうございます。

とにかく急いで上げたためにいろいろと落ち度がありますが、そのフォローも含めていくつか情報を書きたいと思います。

■UTF-8で製作したページを無理矢理利用する方法

Ktai Libraryでは、今のところUTF-8での利用を推奨しておりませんが、(たぶん)使えないわけではないと思いますので、一応やり方を記載しておきます。試していないので、出来ない場合はご容赦を。

CakePHP1.1等古いバージョンでは、afterRender()内でob_get_clean()でアウトプットをゲットしてコンバートする手法が一般的ですが、最近のバージョンはこのやり方では出来ません。何故かというと、バッファにはまだ書かれていなくて、コントローラ内の$this->output内に格納されているからです。なので、afterRender()内で、$this->outputを、mb_convert_encoding()でコンバートします。

しかし、これだけでは「絵文字が化けてしまう」問題が発生する場合があります。化けるのは「文字コードを直接指定した場合」です。つまり数値指定(&#xxxxx;)の場合は大丈夫なはずので、これを利用すれば実現が可能だと思います(数値はShiftJISのもので)。ちなみに、Ktai Libraryを通すと、これらは全て文字コード等に変換されます。

■「機種判別」について

公開サイト内で「機種判別」と書いてしまって大変に申し訳なかったのですが、現時点で「キャリア判別」は出来ますが、「機種を特定する」ことはできません。
これについては、現在機種情報を調べる仕組みを準備しております。機種(AUはデバイスID)だけでなく、画面サイズなどの情報も入手出来ます。Ver0.0.2で搭載予定です。データは既に準備しましたので、あとは関数部作成と他の機能の作成待ちです。おかげでファイルサイズは5倍になりました(笑)。

■次バージョンの話

上記の機種判別の件もそうですが、次バージョン(Ver0.0.2)は次の機能がつく予定です。

  • 機種情報の入手(上記の通り)
  • PHS対応
  • 機種毎の表示画像のフィッティング

上から2つは確実ですが、最後のはもしかしたら落ちるかもしれません。
PHSとEMOBILEについては一部情報が不正確かも知れません(正確なデータが公開されていないため)。

■その他(言い訳とか)

なんか「Ktai Library」をインストールさえすれば、携帯サイトが出来てしまう…と思われがちなのですが、言い訳しますと、あくまでも「サポート」はしますが、実際には他にも自前でケアしないと出来ないと思います。例えばiMODEでは未だにPNG画像は表示できませんので、自前でファイルを選択するような記述は必要ですし、ページ構成の都合上、実質PCサイトとの振り分けは必要だと思います。
本ライブラリは、現時点では「毎度書いていた携帯関連の関数をライブラリ化した」程度のものですので、そのつもりでいただけると。もし「こんなのがあったら」というようなものは、コメント欄などで書いていただければ、頑張ってみたいと思います。

なお、「iMODE時のセッション対応」について、本来なら「これこそ」ライブラリーに搭載するべきなのですが、環境に依存する部分もあり、ライブラリとしての提供は少々難しいかと感じます。うまいやり方が思いついたら搭載します(もしくは、その部分部分をライブラリ化するのは有りなんじゃないかとも考えています)。

【プログラミング関連】FirefoxでUTF-8以外が文字化けする原因(の1つ)

prog-logo最近、仕事で携帯サイトを作っていて、CakePHPを用いて製作しているのですが、ShiftJISでコーディングしているのですがなぜかFirefox「だけ」文字エンコーディングがUTF-8に強制的にされてしまうことで悩んでいました。

まあこの現象は前から認識していて、例えばたまたま以前にCakePHPフォーラムで返答したことのある こんな 話題がはてブの新着に上がってきているんですが、結局このときは良く分からないままそのままになってしまっていたんですよね。
今回のこの件も、別にPCから見れる訳ではないので気にしなくても良い問題なのですが、とはいえ何だかあまり気持ちが良くないので、少し調べてみることにしました。

とにかくおかしいのは、いくら内部エンコーディングがShiftJISになっていても、header()で書き込んでも、何をしてもUTF-8にされてしまう点です。IE、Safari(iPhone)、実機携帯(今回はSoftbank920Pをメインにチェックしてます)では問題がないのです。
そしてさらに不思議なのは、ページによってこの現象が出る所と出ないところがある点。トップページは出ないのですが、例えば画像だけしか表示しないようなページだと、ナビ用のテキスト(「戻る」とか)が化けます。当然絵文字コードも化けます(あ、携帯ライブラリ を通せば化けません)。

いろいろなものをとっかえひっかえしてみたのですが、なんと意外な事実が判明!
まあタネを知ってしまえば「な~んだ!」「つ~かしっかりやれよ」と言われそうなのですが、こんな落とし穴があったとは……

ShiftJISの場合、皆さんはどのようなcharset文字列を入れていますでしょうか?
「SjiftJIS」? 「Shift-JIS」? 「Shift_JIS」? それとも「SJIS」?
そうなんです、Firefoxは、このcharset文字列がかなり厳密で、「Shift-JIS」もしくは「Shift_JIS」でないとNGらしいのです。

私はPHPマニュアルでmb_???系の解説で「sjis」と記されているので、ずっとsjisと書いていたのですが、これが引っかかっていたようです。

分かりにくいのは、sjisと書いても文字化けにならないことがあり(というか今までならなかった場合が圧倒的に多かった)、これについては原因は特定できていないのですが、一番最初の文字列だとか、頻度だとか、そういった要因で自動判別に引っかかり、「たまたま」文字化けが起きていなかっただけなのかもしれません。とにかく、「ShiftJIS」「SJIS」はNGなのです。
というのも、こちら の仕様でもしっかり「Shift_JIS」と書かれていて、これが正式のようです。なので、本来「Shift_JIS」と書くべきなのでしょう。まあだいぶShiftJISで書く機会は減ってきていると思いますが、携帯サイトなどではまだまだ現役でしょうから、気をつけた方が良いですね。
ちなみに他のブラウザは寛大で、「ShiftJIS」「SJIS」は認識します。内部でしっかりとエイリアスされているのかもしれません。

まだ他に文字化けの理由はあるのかもしれませんが、心当たりのある方はとりあえずチェックされてみてはいかがでしょうか?

【Ktai】携帯ライブラリ for CakePHP1.2公開

icon_ktaiお待たせしました!
CakePHP1.2用の携帯ライブラリを公開いたします。
上記のリンクをたどっていただくか、こちら からどうぞ!

昨日公開のつもりでいましたが、アーカイブ一式を自宅に忘れてしまい、昼アップが出来ませんでした。しかし、ソースの手直しできる時間が出来たため、昨晩改良を行い、コンポーネントも作成したりと若干パワーアップしました。
まあでも、現時点でぶっちゃけ機種判定・絵文字・メアドチェックの3種類しかできないのですが、少しずつバージョンアップしていきますので、宜しくお願いいたします。

ちなみに、開発中にいくつか有用なTipsが見つかりましたので、後日ご紹介したいと思います。

【ktai】携帯ライブラリ&CakePHP1.2用ヘルパーの公開(予定)

icon_ktaiサイトの方が準備できてしまったので、先にサイトを公開いたします。表題の通り、CakePHP用の携帯サイトヘルパーです。

詳しくは上記メニューをたどっていただくか、 こちら をご覧ください。
ダウンロードは明日(12日)昼までには出来るようにします。

【追記】
公開しました。上のリンクか こちら からどうぞ!