概要
追記:CakePHP 2.xに対応しました。(遅
複数のファイルを同時にアップロードしてくれるjQueryのpluploadプラグインがあります。
このプラグインをCakePHPですぐに使えるようにプラグイン化してみました。
追記:CakePHP 2.xに対応しました。(遅
複数のファイルを同時にアップロードしてくれるjQueryのpluploadプラグインがあります。
このプラグインをCakePHPですぐに使えるようにプラグイン化してみました。
CakePHPの1.3の途中からFormHelperやRequestHandlerのコードに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の部分だけ対処すれば文字化けはしない。
以下に対処の方法をメモ。
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::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側のコードのヘルパー名を変更しなくて済みます。
追記 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を使ってみることにした。
下記から必要なものをダウンロードし展開しておく。(※上記の追記したリンク先を参照して下さい)
①プラグインの追加
[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が追加される。
でも、見た目は何がかわったのかサーっパリわかんね。。。
新規に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
等入力してみましたが、何も起きない。