Plugin」タグアーカイブ

CakePHP1.3 prefixで携帯の処理を行っている場合の文字コードの注意

App.encodingの設定で文字化け発生

CakePHPの1.3の途中からFormHelperRequestHandlerのコードにcore.phpのConfigure::write(‘App.encoding’, ‘encoding’);
で設定された値を使う箇所が出てきています。

prefixで携帯の表示を処理している場合、設定された文字コードによって文字化けの影響を受けるおそれがあります。

例えば、UTF-8で作成していて、携帯の出力時に全てShift_JISに変換している場合です。

最初はbeforeRender()内で
Configure::write(‘App.encoding’, ‘Shift_JIS’);
ってやればいいんじゃないの??って思ったけど、
やってみると微妙に文字化けが発生orz

grepしてみると、他にはmultibyte.phpの中などに、App.encodingの値を設定している箇所がある。

どこかで影響を受けているのだろうが、ちゃんとは調べていない;;

とりあえず、RequestHandlerとFormの部分だけ対処すれば文字化けはしない。

以下に対処の方法をメモ。

RequestHandlerComponent

症状

debug値 < 2 の場合にstartup()内で、HTTPのヘッダでtext/htmlのcharsetにApp.encodingが設定される。
したがって、App.encodingの値で表示しようとするため文字化けする。

対処

startup()はbeforeRender()の前に呼ばれるので、

beforeRender(){
    if($this->Ktai->is_ktai()){
        $this->RequestHandler->respondAs('html', array('charset' => 'Shift_JIS'));
    }
}

を追記。

FormHelper

症状

FormHelper::create()内で’encoding’オプションにApp.encodingが設定される。
このencodingオプションはaccept-charset属性の値を設定する。
したがって、携帯の機種によっては、accept-charsetに設定された文字コードでフォームの値が送信されてくる可能性がある。
送られてきた値をサーバー側で変換すると文字化けが発生する。

対処

対処は3つほど考えられる。

1.create()のencodingオプションを全てに追加する。

$this->Form->create('Hoge', array('encoding' => 'shift-jis'));

2.強引に置換。
app_controller.phpのafterFilter内に

if($this->Ktai->is_ktai()){
    $this->output = str_replace('accept-charset="utf-8"', 'accept-charset="shift-jis"', $this->output);
}

3.FormHelperを継承してKtaiFormHelperを作る。
名前は何でもいいと思うけど、ここではKtaiFormHelperを作る。
さらに、HackPluginを使って、View側のコードをいじらないで済むようにする。
Hack Pluginは@hiromi2424さんが作成された、コンポーネントやヘルパーのエイリアスの設定を行ってくれるとても便利なプラグインです。
Hack Pluginの設置
githubからダウンロードしたものを次のように配置する。
app/plugins/hack

/app/views/helpers/ktai_form.php

class KtaiFormHelper extends FormHelper{
     public $helpers = array('Ktai', 'Html');
     public $settings = array(
          'encoding' => 'shift-jis',
     );
     
     function __construct($settings){
          $this->settings = am($this->settings, $settings);
     }
     function create($model = null, $options = array()){
          // e.g.携帯の判定を行って値を変更する
          if($this->Ktai->is_ktai()){
               $options = am($this->settings, $options);
          }
          return parent::create($model, $options)
     }
}

app/controllers/app_controller.php

//e.g.AppControllerにHelperを読み込む場合
class AppController extends Controller{
     public $helpers = array('KtaiForm', 'Hack.Alias' => array('Form' => 'KtaiForm'));
}

これで、View内で$this->KtaiForm->create()ってしなくても
$this->Form->create()で呼び出せます。

つまりは既存のView側のコードのヘルパー名を変更しなくて済みます。

CakePHP + NetBeans [cakephp-netbeans]

追記 2011/09/24
cakephp-netbeans pluginを少し修正したものを公開しました。
CakePHP cakephp-netbeans plugin

下記の内容は古いので上記のリンク先を参照して下さい。

★★★追記 2011/05/28 Themeを使っていると、Controller ⇔ View 間の移動は効かなくなるようです。
よってプロジェクトに小さなアイコンを表示するだけになってしまいますw
書くまでもないですが、2.0では何もかわりません。

上のプラグインを使うとTheme使用時も動きます。

今まではEclipse + Aptanaを使っていたけど、

githubにcakephp-netbeansなるものを見つけたので、NetBeansを使ってみることにした。

概要

  • cakephp-netbeansのDL
  • NetBeans 7.0開発版のDL
  • nbmファイルを作成しプラグインの追加
  • Cakephp Projectの作成

準備

下記から必要なものをダウンロードし展開しておく。(※上記の追記したリンク先を参照して下さい)

NetBeansの設定

①プラグインの追加
[Tools]->[Plugins]->[Available Plugins]
NetBeans Plugin Development

②cakephp-netbeans のプロジェクトの追加
[File]->[Open Project]
展開したフォルダを指定する。

③nbmファイルの作成
※最初にプロジェクトのプロパティを開いてSource level が1.5になっていることを確認。(1.6だとエラーだった。。。ここでしばらくはまってしまったorz)
自分がforkしてコードを追加しているものはソースコードは1.6で動くはずです。
追加したプロジェクト(CakePHP Framework)の上で右クリック -> Create NBM
Filesタブをクリックするとbuildというディレクトリが作成されていて
org-cakephp-netbeans.nbmというファイルが作成されます。

④プラグインの追加
①と同様で[Downloaded]タブを開き、
Add Pluginsボタンをクリック
③で作ったnbmファイルを追加

これでCakePHP Framework Pluginが追加される。

でも、見た目は何がかわったのかサーっパリわかんね。。。

CakePHP Projectの作成

新規にPHPプロジェクトを作成し、cakephpの中身のフォルダを全部入れるだけ。
(app/ cake/ 等)

通常のPHPプロジェクトの表示の右上に小さくCakePHPのロゴが表示されます。

何ができるの???

gitのREADMEファイルには、
actions: bake, go to view, go to action
と記載されています。

ということで、bakeができるんだな。
あとは何だ?って思っていたけど、操作しているときに気がつきました。

Controllerのaction とviewのファイルを行き来できるようです。

具体的には、
HogeContorllerのindex()メソッドの中で、
[右クリック]->[Navigate]->[Go to View]

Viewのindex.ctpファイルで
[右クリック]->[Navigate]->[Go to Action]

ってすれば、お互いのファイルに飛びます!!

右クリック面倒!!ってなときは
[Tools] ->[Options]->keymap

PHP: Go to Action or View
にショートカットキーを割り当てればOKです。

それでもう一つのbakeの方は、
CakePHPプロジェクトの上で
[右クリック] -> [CakePHP] ->[Bake]
で動くようです。

でも使い方がわかりません。。。orz
知っている人がいたら教えてください。。
Outputs – bake
っては表示されるけれど、どう使えばいいのだか。。。
bake
bake model
等入力してみましたが、何も起きない。