FuelPHP
PHPあべし!
最近PHP触ってて「あべし!」ってなった事。
PHP5.5でempty()の仕様が若干変わっているから注意。他人がPHP5.5で作成したものが自分の開発環境のPHP5.4だとエラーになるから調べてたら。php.netに書いてあった。ついでにPHP5.5で追加された関数とか増えてるの気づいた。
愚痴、FuelPHPのファイルとクラスの命名規則の関係はどうにかならないものか。
FuelPHPで文字化けーアップロードファイル名とメール添付ファイル名
FuelPHPをUbuntu上で作成してWindows環境(Win2003、IIS6)に納品した結果、
Windowsのクライアントからファイルアップロードするとアップロードされたファイル名が文字化けしている!
(PHPの内部エンコードがUTF-8だけどWinがShift-JISだから)
→アップロードは送信メールに添付したいがためにしているだけなので文字化け解消しなくても良かったのですが、後でアップロードフォルダ内の整理や確認等人力で行う場合に視認性が悪いので無理やり対応。
FuelPHPのUpload::save()を行う前に
ってやってアップロードファイル名をエンコードする。
弊害としては本来は内部エンコードのまま処理が進むはずだったので、同名ファイルが有る場合に枝番を付加する処理なんかが正常に動作しなくなる。
これでWindowsサーバーのフォルダに読める文字のファイル名でアップロードされる。
最初エンコードをSJISにしてたけど、CP932にしたら、①みたいなMS拡張の機種依存文字も大丈夫になった。
本当はもっとスマートな方法が欲しかったんだけど、ファイルを置くところの処理がCoreファイルで作られていて入り込む余地が無いように思えた。それとも
とかやったら良かったのかな?
文字化け状態でアップロードされたファイルをメールの添付に加えると添付ファイル名も文字化け!
(ま、そりゃそうですね)
→上記1の結果を受けてメール送信のメソッドに引数として添付ファイル名を渡す。その処理は何も加工しない。
メール送信用のメソッドの中で、引数で受け取った添付ファイル名をFuelPHPのmailに渡す処理を加工
それでも、メールヘッダがISO-2022-JPなので、機種依存文字の類はメールを受信した時に「?」とかになってるけど、それはしょうがないよね。
メールの件名が文字化けすることがある!
→犯人は半角カナ。使わないで!件名はFuelPHP側で送信時にISO-2022-JPに変換してるっぽいので、mb_convert_kana関数使って件名に含まれている半角カナを全角に変換して誤魔化す。
以上、うんこメモでした。
fuelphp使って分からなかったこと
fuelphp使うって言ってもmodelにmysql使ったりしてないんでイレギュラーな
感じなんですけど。
以下に分からなかったことなど
1,modelの検索メソッドがクラスメソッド
検索条件を検索メソッドに渡してレコードオブジェクトを受け取るんだから別に
インスタンスメソッドである必要はないんだけど、じゃぁ返ってきたモノは
ただの連想配列なのかモデルオブジェクトの塊なのか…
昔、Javaを少し自習した時にレコードオブジェクトのクラスとオブジェクトの塊を保持する
クラスが別になる書き方があって、自分にはその方がしっくり来るんだけど、多分塊を保持
するクラスが余計っていう考えなのだろうか。
何にしっくりこないかというと、モデルクラスの1インスタンスが1レコードオブジェクトなのか
その塊(1個以上)が1インスタンスなのかという事。
Model_Crudのメソッド見てるとhas_next()とかあるから、1個以上のレコードオブジェクトを
保持するイテレータオブジェクトが1インスタンスなのかなーって思う。でもそうすると、fuelphp
においては1レコードオブジェクトってのは1モデルインスタンスが保持するただの連想配列なのか
な?
このあたりは、PHPの他のフレームワーク勉強したり他の言語のフレームワーク勉強していくしか
ないかな。
2,FieldSetクラスという便利なものの中のcheckboxの名前の付け方
これは多分自分の学習が足りないだけなんだと思うけど、PHPでinputフォームのチェックボックス
を複数用意する時、name属性をname=”◯◯[]”とかにして受け取ったPHPで値を配列で扱うんだけ
ど、fuelphpのFieldSetクラスから生成したcheckboxがname属性をname=”◯◯[i]”って[]の中
に数字を入れてくるんです。受け取るPHP側では配列として受け取れるぽいんだけど、fuelphpの
Validationでこのチェックボックスグループらのどれか1つにはチェックしていること!みたいな
事が出来ない。あと、jQueryのvalidationプラグインが動かない。別のものとして扱ってしまう。
core/classes/foeldset/の中にあるファイルのcheckboxのフォームの名前属性を作る部分を直接
書き換えて(本当はappフォルダにコピーするべき)使っている。
3,FieldSetオブジェクトのフォームオブジェクトのラベル出力の時に出力されるラベル要素に
クラス(htmlのclass)を追加する手段が分からない。
こいつ、checkboxやradioのグループ出力する場合はタグ出力しないんだぜ。意味不明。 親要素のclassに装飾の指定しても無視されたりするし、ホンマむかちく(ただの勉強不足)。
やりたかったのは、必須入力のフォーム要素にはラベル名称を赤字にしたかったんだけど、css適用
されなくて、仕方なく、requiredの場合出力されるデフォルト「*」のやつを「(必須)」てかえて
それを赤字にした(requiredの時に出力される奴はlabel要素外)。
4,単にどこに何を書くかがまだ理解できていない。
controllerのactionメソッド内にloginチェックの詳細処理を書いてるんだけど、そこは外に
切り出すべきなんじゃないの?とかactionメソッド内でのみ使う提携処理&ちょっと複雑みたいな
のは外に切り出すべきなんだろうけど、それは別のcomponentクラスとかにクラスメソッドとして
フレームワークちょいちょい
ここ最近はフレームワークを少し触ってる。
Perl:Mojolicious::Lite
→DBをFileMakerで簡単な検索をするものを作成。Liteの場合は?APPPATH/templates直下に
各ビューテンプレートファイルを置く。ベースとするレイアウトはAPPPATH/templates/
layouts直下にdefault.html.epて名前で配置する。静的ファイルはAPPPATH/public配下に配置する。
このあたりの説明でドンピシャ説明しているのが見つからなくて、なかなかつまづいた。
Ruby:Sinatra
→Hamlの書き方とか忘れてて大苦戦。あとなんかサーバー再起動しないと変更が摘要されない感じとか
ちょっと苦労。Mojolicious::Liteでやったのと同じ事をSinatraでも実践。という訳でDBはFileMaker。
これは前に一度やっているのでコードをちょっと変える程度だったのにとにかく上記の不可思議で苦戦。
PHP:FuelPHP
→最初はSilexで挑戦してたんだけど、意味不明過ぎて挫折。そんでシンプルそうなFuelに手を出す。
これもDBをFileMakerで簡単な一覧表示検索という上の2つと同じ事をやるものを作成。たいぽや
コンテキストでちょいちょい間違えて詰まったけど、割と簡単だった。FuelPHPの時は静的ファイルは
public/assetsて階層に配置するんですね。
PythonのFlaskに手を出す予定だったのに時間が足りなかったから来週はFlaskかな。
OS再インストールしたせいだと思うけど、前に作ったDjangoが動かなくなってた。モジュールがインポート
出来ないとかで……