cakePHPでPCと携帯で出力文字コードを変更する方法

携帯用のサイト用のビューをShin x blogさんのサイトを参考にして、設定しPC用と携帯用のサイトをビューだけを切り替える方法で運用しています。
そこで問題になるのが文字コードです。
私の場合、PC用のサイトはスクリプトの文字コードも出力文字コードもUTF-8で統一させる場合が多いのですが、携帯用のサイトの場合に出力文字コードをUTF-8にしてしまっては、最近の機種でしか見る事が出来ません。
そこでPC用と携帯用で文字コードを切り替えて利用しています。
PC用の場合には、上の通りUTF-8で統一して、携帯用の場合には、スクリプトの文字コードは全てUTF-8にして、出力時にShift_JISに変換しています。

詳しくは、/app/app_controller.phpのafterFilterで、文字コードをUTF-8からShift_JISに変換して出力して、beforeFilterで、入力文字の文字コードをShift_JISからUTF-8に変換しています。

class AppController extends Controller {

function beforeFilter() {
// 入力データの文字コード変換
if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile") {
mb_convert_variables("UTF-8", "SJIS-win", $this->data);
}

// 出力データの文字コード変換
// afterFilter で文字コード変換するためにob_startで
// 出力のバッファを行なう
ob_start();

parent::beforeFilter();
}

function afterFilter() {
parent::afterFilter();

// バッファを取得して、出力バッファをクリア
$out = ob_get_clean();

if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile") {
// 出力文字コードの変換
$out = mb_convert_encoding($out, "SJIS-win", "UTF-8");
}

echo $out;
}
}

これで、携帯用のビューの場合には、出力時にShift_JISに変換して出力し、入力文字はUTF-8に変換されます。
また/app/views/pages以下のページも同様に変換したい場合には、以下の様にする事で変換する事が出来ます。

class AppController extends Controller {

function afterFilter() {
parent::afterFilter();

// バッファを取得して、出力バッファをクリア
$out = ob_get_clean();

if ((isset($this->params["webservices"])
&& $this->params["webservices"] == "Mobile")
|| ($this->params["controller"] == "pages"
&& $this->params["action"] == "display"
&& isset($this->params["url"]["url"])
&& substr($this->params["url"]["url"], 0, 8 ) == "pages/m/")) {
// 出力文字コードの変換
$out = mb_convert_encoding($out, "SJIS-win", "UTF-8");
}

echo $out;
}
}
Filed under: CakePHP — jun 1:31:31

cakePHPのControllerのaddへの引数

通常、bake.phpでControllerを作成した場合には、addメソッドに引数はないので特に問題はないですが、

http://www……./posts/add

function add() {
:
}

独自にaddメソッドに引数を追加した場合、

http://www……./posts/add/1

function add($parentid = null) {
:
}

この様にaddメソッドに引数「1」を渡すとsave時に、idが「1」のデータを更新してしまうようです。
これを回避するには、saveの前に

$this->data[”Post”][”id”] = 0;

と、通常idに存在しない「0」を渡してあげてください。

Filed under: CakePHP — jun 2:16:59

CakePHPでSmartyを利用する方法

Smartyのダウンロード(2.6.12 で動作確認)

こちらよりSmarty-2.*.**.tar.gzをダウンロード。
CakePHPの/vendorsに、smartyディレクトリを作成。
Smarty-2.*.**.tar.gzを解凍して、libs内のファイルを上で作成したsmartyディレクトリにコピー。
(/vendors/smarty/Smarty.classの様な構成になる。)

/app/tmp/smarty/にSmartyの利用するcache、compileディレクトリを作成。
/app/tmp/smarty/cache/
/app/tmp/smarty/compile/

Smarty View class (Version 1.1で動作確認)

こちらよりファイルをダウンロードしてsmarty.php にリネームして/app/views/ ディレクトリにコピー。

__constructの

$this->subDir = 'smarty'.DS;

をコメントアウト

_renderの

$this->Smarty->assign_by_ref('view', $this);



$this->Smarty->assign_by_ref('this', $this);

に変更

AppControllerへの設定

/cake/app_controller.phpを/app/app_controller.phpにコピーして

class AppController extends Controller {

var $view = 'Smarty';




これでviewに「.tpl」があればSmartyのテンプレートとして処理を行い、なければ通常通り「.thtml」を表示します。

変数のassignなどは、Smarty View classが行なってくれるので、this、html、form、sessionや利用しているモデルなどはそのまま利用する事が出来ますので、元のビューの

「< ?php echo」を「{」

「;?>」を「}」
にするだけで、ほぼ利用する事が出来ます。

{$html->input(’Member/email’, array(’size’ => ‘60′))}
の「array(’size’ => ‘60′)」の部分がエラーになる問題は、ここからファイルをダウンロードして、function.assign_assoc.phpにリネームして/vendors/smarty/libs/plugins/にコピー。

テンプレートの先頭で
{assign_assoc var=’ArrayName’ value=’size=>60′}

{assign_assoc var=’ArrayName’ glue=’::’ value=’size=>60::value=>commas, no prob’}
などとして
{$html->input(’Member/email’, $ArrayName)}
とすれば面倒ですがこの問題も解決します。

Filed under: CakePHP — jun 11:30:43

さくらのレンタルサーバでCakePHP

さくらのレンタルサーバでは、.htaccessへの記述内容によっては、Internal Server ErrorになってしまいCakePHPが正常に動作しませんでした。
同じ様な現象で悩んでいる方は以下の方法で動作させる事が出来ると思います。

/app/webrootが、Webのルートディレクトリになるようにします。
.htaccessを以下の様に変更します。

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
Filed under: CakePHP — jun 23:31:07