cakephpゴマ知識 auのSSL通信時の文字化けを回避する!

UTF-8のケータイサイトをつくってたら、SSLページでAUだけ文字化けする!

AUはSSLページでSjis以外は使えないらしくその対応を迫られた。
※アホス過ぎ!

SSLページかつAUのときだけSjis-winに変換することで対応ができた。

app_controller.phpを一部抜粋

public function afterFilter() {
	if (isset($_SERVER['HTTPS'])) { //SSLか判定
		if ($this->ezweb()) {    //AUか判定
			$outBuffer = ob_get_clean();
			$outBuffer = mb_convert_encoding($outBuffer, "sjis-win", "UTF-8");
			mb_http_output("sjis-win");
			ob_start("mb_output_handler");
			echo $outBuffer;
		}
	}
}

・出力バッファを取得し、UTF8からSjis-winに変換
・出力エンコードをSjis-winに設定
・バッファを出力して完了

っという具合。(即興コードなんであしからずw)

エンコード内容は各環境に切り替えればどこでも対応できると思います。
PHPでも利用できるんで、ちょっと改造してつかってみてください。

追記

※beforeRenderではなく、afterRenderじゃないとsessionがきれちゃいました><:

修正

すみません、めちゃめちゃインチキ書いてました!
app_controller.php 抜粋

public function afterFilter() {
	parent::afterFilter();
	if (isset($_SERVER['HTTPS'])) { //SSLか確認
		if ($this->auMobile()) { //AUか確認
			$this->output = mb_convert_encoding($this->output, ‘SJIS-win’, ‘UTF-8′);
			header(“Content-Type: text/html;charset=sjis-win”);
		}
	}
}
                     -

cakephpは$this->outputをエンコードして、ヘッダーをエンコードに合わせて設定すればオッケーです。
いやはや、Auのせいで大変ですわ><;

cakephp 配列を無限にネストしてhiddenへ自動で設定してくれるhelper

ssl環境下でセッションのやり取りが面倒になったため、値をすべてhiddenでもちまわすように変更したと思ったときにみつけました。

【Ryosukeさんのサイト】
http://www.mrk.jp/node/605#comment-209

即実践活用可能なレベルのヘルパーで一切の手修正いれずに活用できました。

感謝感謝!

動的なswfを利用する際、auの強力なキャッシュを回避する

いま作成中のサービスでauの爆裂に強力で理不尽なキャッシュ機能の壁にぶち当たった。

flashを動的に作成するサービスで、何度作り直しても1回目に作成したflashが表示されてしまう。
ブラウザ履歴の削除を都度促さなければいけないという意味不明な仕様になってしまうために、
googleで検索。。。

【yuki走り書き】
http://yukilog.yukiweb.jp/2008/04/flash.html

上記のyukiさんのブログを参考に解決。


[phpの場合]

■修正前
<object data=”/<?php echo “hoge.swf”; ?>” type=”application/x-shockwave-flash” width=”100%” height=”100%”>
<param name=”bgcolor” value=”000000″>
<param name=”loop” value=”off”>
<param name=”quality” value=”high”>
<embed src=”/<?php echo “hoge.swf”; ?>” width=”100%” height=”100%” loop=”on” quality=”high” bgcolor=”#000000″></embed>
</object>
■修正後
<?php
//KDDIキャッシュ対応
//乱数生成方法は適当で!w
$hash = substr(AuthComponent::password(date(“his”)), 0, 10);
?>
<object data=”/<?php echo “hoge.swf”; ?>?<?php echo $hash ?>” type=”application/x-shockwave-flash” width=”100%” height=”100%”>
<param name=”bgcolor” value=”000000″>
<param name=”loop” value=”off”>
<param name=”quality” value=”high”>
<embed src=”/<?php echo “hoge.swf”; ?>?<?php echo $hash ?>” width=”100%” height=”100%” loop=”on” quality=”high” bgcolor=”#000000″></embed>
</object>

という具合に赤文字の変更をいれたら解決しました。
表示ページのURLを変えてもダメなんですね。
ファイル名ごとに強力なキャッシュで守られてるっぽいので、今回はファイル名にキャッシュ対策を入れました。

ちなみにこのタグの記載方法で3キャリア対応です♪

ゴマ知識:fromヘルパーの定義でactionを指定すると、urlのケツにidが付与される

タイトルの通りなんですが、fromヘルパーの定義でactionを指定すると、urlのケツにidが付与される事がある。

これはcakephpの仕様のようですね。
バージョンは不明ですけど今回は1.3系で確認しました。
※匠曰く、1.3の仕様らしいんですけど、、暇なときに他のバージョンでも確認してみるずら。

んで、試行錯誤、瞑想した挙句、下記の方法で落ち着きました。
———————————–
回避するにはactionではなくurlを定義する。
———————————–

ようするにこんな感じです。
———————————–
Form->create(‘User’, array(“url” => “/hoge/userEdit”, “inputDefaults” => array(“dev” => false, “label” => false))); ?>
———————————–

こうすると余計なパラメータとかつかないので平和ですw

cakephpのゴマ知識、携帯のradioボタンでちょっとハマる

今回はradioボタンの配置とデータの引き継ぎでハマッタ・・・。
例にならってゴマ知識なんですけど。
radioボタンを横に並べるには一個一個radioを定義しなければいけない。
array()とかでセットするとなぜか縦にしかならない。。。。
横にシロっつの!
まぁ間に何か挟むとかもできなくなるんで、ようはサボルなってことなんですね。
こんな感じにしたら、横3列の縦2列の強そうなradioボタンフィールドが出来あります。
—————————————————————————————————————————-
<table>
<tr>
<?php
for ($i =0; $i < 6 ; $i++){
echo ‘<td>’;
if(empty($this->data)){
echo $form->radio( ‘hogehoge.item’, array( $i=>” ) ,array(‘legend’ => false,’value’ => ‘none’) );
} else {
if($this->data[‘hogehoge’][‘item’] == $i){
echo $form->radio( ‘hogehoge.item’, array( $i=>” ) ,array(‘legend’ => false,’value’ => $i) );
} else {
echo $form->radio( ‘hogehoge.item”, array( $i=>” ) ,array(‘legend’ => false) );
}
}
echo ‘</td>’;
if($i == 2){
echo ‘</tr>’;
echo ‘<tr>’;
}
}
?>
</tr>
</table>
—————————————————————————————————————————-
※$this->data[‘hogehoge’][‘item’]にはvalidationとかでエラーになった際、選択したアイテムがセットされる想定です。
それで、選んでたアイテムの番号のときにvalueをそのアイテムの番号($i)に変更すれば、選択情報を引き継げます。
しかし、最近の携帯は<table><tr><td>とか使えるのね。
優秀だ~><;

cakephpのIDE変更!

タイトル通り、今日はCakephp用のIDEを変えました!

まず、Eclipse PDT.(定番ですね。)
却下!激しく重い!

次、phpエディタ
悪くはないんですが、やはり重いかなぁ・・。
pprの使い方をマスターする前に飽きた・・。

次、サクラエディタだけ。
無理!ハイライトキボンヌ!

次、Microsoft Expression Web4!
こいつはすべてを破壊する!(嘘)
重いし、頻繁にフリーズするし、高いし!

そして、色々探した結果!
NetBeans!
コレダ!!!
無料、軽い、性能もそこそこ、プラグインもあるそうで(追加したことないけどw)

まぁ無難にこれっすね!

※追記※

IDEのTAB設定でなぜか半角にスペースに変換する処理がデフォルトでなっている。

これを外さないと、他のエディタと色々問題を発生させる。

外すことを推奨してまーす。

以上!

cakephpのauthを使ってみたときの落とし穴ていうか墓穴

cakephpでの初案件を対応中。

なかなかauthの機能を使いこなせていないんですが、豆知識以下の、ゴマ知識について書き残します。

ひとーつ!!
$this->Auth->allow(‘アクション’)は認証スルーのアクションを指定する!
間違っても、認証後見れるページではないぜ!!!

ふたーーつ!!
login.ctpにの$form->create(‘User’,array(‘action’=>’login’));はlogin以外指定してはいかんぜ!!!
そりゃじゃまたログインページに飛ぶじゃないかと思うだろうが、↓のように設定するんだ!
$this->Auth->loginRedirect = ‘/users/memberTop;
そうすれば、認証後、そこへリダイレクトされるんだ!!!

ちなみに変なの設定すると認証されなくてハマるぜ!!!ハマッタZE!!!!

みーーーっつ!!!
新規会員登録時のパスワードはハッシュ化しないと、ログインできないぜ!!!!
//新規会員登録
function register($data)
{
$request = array();
$request[‘loginid’] = $data[‘User’][‘new_member_id’];
//AuthComponent::passwordでハッシュ化
$request[‘password’] = AuthComponent::password( $data[‘User’][‘new_member_password’] );
$result = $this->save($request);
return $result;
}

という具合だ!!

これを抜けるのに5時間かかった!!!
ハハハハハ!!

くすん・・・。