WHAT'S NEW?
Loading...
ラベル CakePHP の投稿を表示しています。 すべての投稿を表示
ラベル CakePHP の投稿を表示しています。 すべての投稿を表示
環境というのは、例えばWindowsにVirtualBoxを乗せてその上でCentOSを走らせているようなVM環境で開発してたら、それがローカル環境だ。

どこかのサーバに一式アップロードし、自分たちと限られた人たちだけが閲覧可能な状態であれば、いわゆるステージングと呼ばれる環境かもしれない。

クライアントに最終チェックしてもらう前に、自分たちで限りなく本番に近い環境で且つ、自由にいじれる先進的な環境も持っているなら、それはテストサーバなのかもしれない。

いずれにせよ、環境というのはサーバ、基盤のことと考えていいと思う。でもこれらの環境には当然ながら設定に差異があり、設定ファイルにそれぞれ環境から判別させるロジックを書いていたら、面倒くさい。

今回はBootstrapとデバッグに関して書こうと思う。

チュートリアルではMVCの概念とか、エントリスクリプト(ポイント)とかデバッグに関して書いてあるんだけど、今回は少し独自解釈した内容でお届けする予定。

まぁそれほど大してすごい内容ってわけじゃないけどね。

ところでブートストラップってのはもう知ってると思うけど、知らない人のために説明しておくよ。

簡単に言うと、一つのポイントにリクエストするだけで、そこから順にライブラリなどをたどって、最終的に元の場所にレスポンスとして戻ってくるという流れだ。直訳すると、自力で進む、的な内容になる。

最近のフレームワークは昔のとは違い、ジェネレータ機能が最初から含まれてる場合が多いよね。

Ruby on Railsは残念ながら触ったことがないのでわからないけど、CakePHPにはbakeがある。

そしてこのYiiにはGiiがある。発音はギィでいいのかな。

余談だけどZiiというのもあるので、Giiをジィと呼ぶと紛らわしくなるので、カタカナでギィと発音することにするよ。

そしてジェネレータはややおせっかい度とホスピタリティが高いんだけど、のちのち嫌がらせにしか思えなくなる事請け合いなしなので、本当は個人的には使いたくない。

さぁ、やると言ったらやるんだ、俺的に。
早速行ってみよう。

ところでYiiってなに?なんでそんな変な名前なの?
井伊さんが作ったの?
それともすごく( ・∀・)イイ!!から?

そんなことはない。ロシア人と中国人が率先して作ってるわけで、わざわざ世界で一番面倒くさい日本語を使って命名してるとは思えない。

実は答えは単純で、なぁんだそうなんだ、で終わる。

PHPのフレームワークはいろいろ出てきてて、CakePHPやCodeIgniter、Symphonyなんかとくらべて全然知名度が低いYiiだけど、その命名の由来はこういうことらしい。
Is it fast? ... Is it secure? ... Is it professional? ... Is it right for my next project?
Yes, it is!
速い? ... 安全? ... プロが使える? ... 次のプロジェクトに合っている?
Yes, it is!
ね、なぁんだそういうことなんだ、でしょ。ようするになんでもできちゃう、的なニュアンスを醸し出したかったんだろうね。

はいご無沙汰ね。うん。
半年くらい開いちゃったかな。

いろいろなことがあってブログにまで手が回らなかったよ。

というわけでサクッと再開。

そうそう、PHPのフレームワークだけどさ、ずっとCakePHPを使ってたけど、今の職場がYii(1.1)使ってるので、Yiiを覚えようと思うんだよ。

今の職場でYiiをいじってて最初に思ったことは、Javaみたいだ!って感じ。

実は俺はJavaはほとんどできないんだけど、トレーニング的にチュートリアルを10個くらいやったことがある。

YiiはとにかくOOPだ。

さぁみなさん、CakePHP2.4とBoostCakeプラグインでBootstrap3を試してみる時間ですよ!

元ネタ知ってる人は毎週タイムボカンシリーズ1時間前からテレビつけてた人だろうね。
んなことたぁどうでもいい。早速始めてみようか。

実はもう少し早めに2回目を書こうと思ってたんだけど、いろいろ生活上の理由があって、とうとう一週間も経ってしまったよ。

連載はなるべく数日後には続きを書きたいんだけどね。次回からは念頭において、ローラの画像探すのに時間かけないようにするよ。

さて、今回はすでにほぼデプロイが終わってるであろう、CakePHP、Bootstrap、各種プラグインを、実際にビューファイルを作って試してみようと思う。
さてと、久々にWeb開発とかしてみるわけね。うん。

なんで開発者なのに、Web開発が久々かというと、それはかなり私的な話で恐縮なんだけどさ、ずっとここ1年以上、開発じゃなくて管理部にいたんだよね。要するに人事異動ってやつで。

つまり1年ほど、メンテナンスはしてたけど、ほっとんど開発してなかったわけ。ちょっと振り返ってみると、自分の開発レベルもガッタガタに落ちてしまって、もうシオシオのパーよ。とほほだね。

周りのみんながいろいろやってるのを見てるとさ、『VagrantとChefでサクっと環境作る』とか、『Bootstrapはbowerでインスコ!』とか、俺からしたらみんないつの間に宇宙人になったの?って感じ。

正直言うと、人事異動で半年くらい経ってからさ、周りの開発仲間から随分と引き離された感が否めないんだよね。

ぶっちゃけ、開発仲間が多くいる俺のFacebook、すごく距離が遠く感じる自分をいとも容易に発見できてしまったりして、自分探しなんか俺にはまるで必要ねぇ!みたいなぁ~。

というわけで、しばらく一人でしょんぼりしてたけど、生来物事をネガティブに捉えることが出来ない質なので、取り敢えずなーんも考えずに、手を動かすことにしたんだよ。うほほ。

俺の(いくつあるのかわからん)座右の銘に『考えると動けないし動くと考えられない。どうせなら今すぐ動いて後から考えろ!』というのがある。割りと数年前(2006年くらい)に気づいた事。

取り敢えず笑顔で行ってみよう。
今年もやって参りました、CakePHP Advent Calender。
21日担当の俺でやんす。

俺のことはむしろどうでも良いのですぐに本題に入る訳よ。どうよ。

まずこの記事の対象となるCakePHPのバージョンは1.3なので、
1.2をお使いのモノノフがオレオレテーマ機能を自前で開発する方向性ならば、残念ながらこの場でサヨナラするか、素直に1.3を使うのが良策かと。

というわけで早速やってみよう。

さて、今回でSearch Pluginの説明は終わらせる予定だ。
CakePHPには他にもびっくりするくらい便利なプラグインが山盛り存在する。

もちろんヘルパ、コンポーネント、ビヘイビアなども沢山あるので、一度Bakeryを見てみるのも良いと思う。

というわけで本題に入るが、前回適当すぎて投げやりだった、ページャのスタイルを直してしまおうと思う。

CakePHPには便利な機能が山盛りで、中でもページネータ(以下ページャ)はかなりの使用頻度があるんじゃないだろうか。

データベースの特定のテーブルを一覧表示する際なんか、数千件を1ページに収めるわけにもいかず、かといって先頭の10件だけを表示するなんてアホらしすぎるわけだ。

ページャというのは、1ページ10件、残りは次のページ!的な振る舞いをするコンテナのことだ。

代表的ないくつかのページャ

CakePHPではこのページャをヘルパを使っていろいろなスタイルで表示できるんだけど、一つ困ったことがある。それはなにか!?

今まで勉強会というのは何度か参加したことはあるけど、LT(LightningTalk)は経験したことがなかった。
ライトニングトーク(Lightning Talk)とはカンファレンスフォーラムなどで行われる短いプレゼンテーションのこと。様々な形式があるが、持ち時間が5分という制約が広く共有されている。
wikipediaより
いつか、近いうちにLTを経験しておくべきかな、と思い、Twitter上でつぶやいたところ、なんとLTやってみないかとお誘いがあった(@konsan あざっす!!)。

そのカンファレンスは「デザイナー向けCakePHP勉強会」。つまりロゴ的には「CakePHP for Designer」だ(Twitterでのハッシュは#cakephp4d)

« 11日 msng氏「CakePHPでデバッグレベルが0の時だけ発生するエラー
Datasourceを使い倒す」kaz_29氏 13日 »

スタンド名「スパスティック」
特技「空気読まない」
俺のスタンドだ。距離はゼロメートル。
むしろ俺自身がスタンド。

さて、CakePHP Advent Calendar 12日目の担当だ。
なんで12日目を選んだかというと、12という数字がすきだからだ。
それにyamlよりiniファイル好きな俺としては、12はドメスティックに愉快だとおもわないか?

ま、そんな話は完全に無視して良い。

12ということで、テストしたCakePHPのバージョンは1.2を使用してみた。

ところでテーマだけど、俺はフォームヘルパーに関して、ざっくりとやってみたい。

完全にオレオレフレームワークでプロプライエタリな開発環境だが、いい加減メジャーなフレームワークに移行したいといういろいろな開発者、もしくはその関係者に対して、俺はCakePHPがMVCフレームワークの中でもかなりの勢いがあるし、何しろ俺がやってるから俺が直接教えることができるんだ!的な普及活動をしているんだけど、質問の多くを占める、inputタグに関する滞りを払拭してみたいと思った。

さる11月2日、弊社ライトアップでCakePHPの勉強会をやったんだ。
主催は俺で、こういったカンファレンスは初めてだったので、やや緊張はしたものの、生来いいかげんな性格なので、意外に大丈夫なんだなということがわかった次第。

というわけで勉強会のレポートをする。

使用したスライドは以下。


部分的に(マーカーなどが)文字化けしてしまっているので読みにくいかもしれないが、そこら辺は脳内エンコードが達者な日本人には特に注意しないでもご理解いただけると思うので、直さないでそのまま使用させていただく。

CakePHPのバリデーションは非常に便利だ。1.1時代はかなりショボすぎる感があったけど、1.2になって、直感的にかなり分かりやすいものになった。

具体的に例を出すと、例えばメールフォームがあたっとして、内訳が
  • 件名:subject
  • 宛先:to
  • 本文:body
があったとする。
それらにバリデーションを入れる場合、例えば件名は空禁止、toはemail形式、本文は最低5文字(実際には5バイト)入力するのを強制する場合は、以下のような内容でモデルを設定することになる。
class Mail extends AppModel {
  public $name = 'Mail';
  public $validate = array(
    // 件名のバリデーション
    'subject' => array(
      // 空入力
      array(
        'rule' => array('notEmpty'),
        'message' => '件名を入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
    // 宛先のバリデーション
    'to' => array(
      // email形式
      array(
        'rule' => array('email'),
        'message' => '正しいメールアドレスを入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
    // 本文のバリデーション
    'body' => array(
      // 入力文字数
      array(
        'rule' => array('minLength', 5),
        'message' => '最低5バイトは入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
  );
記事を書いた後CakePHP武将のecworks_masap氏に言われて気がついたんだけど、1点注意!「5バイト」なんて文字は運用では使わない。ユーザに対して「バイト」なんて単位を書くのはおかしいからだ。しかしここではあくまで例として(minLengthを使ったため)コードとの整合性を重視し、あえて「5バイト」と書いてみた。
各フィールド名の中には複数の条件を入れることができる。そしてそれらの条件1個1個に名前を付けることもできるが、今回は1つのフィールドに1個しか条件を入れてないので、特に名前は付けていない。

だから、'subject' => array()の中にいきなりarray()で条件をかいている。

各条件のコメント分にも書いてあるような内容を名前にしておくとあとで便利になる場合がある。もしくは厳密に名前を独自に付けることによるコントローラ側でのバリデーション判別などする場合も便利になる。具体的には以下のように、いきなり
array()ではなく、名前を指定してarray()を代入する。
'subject' => array( 'empty_case' => array( 'rule' => ・・・・・・ 'required'=> true));

言語切替ボタンを付けてみようじゃないか。

最終的にはフリーな国旗アイコンなどをゲットして、好きなレイアウトにすれば良い話なので、とりあえず全部テキストでやっていく予定。

完全にどのページからでもいつでも言語を切り替えられるのかと言われれば、「正解です」といえる様な処理なんだけど、ページネータなどのnamedパラメータが絡むテストはしていないので予めご了承していただきたい。
何事もそうだけど、「この処理は完全に全ページで正しく動くのか?」とか「1箇所でも挙動が怪しい場合は実装するな!」とか、そんな予測コストなんかはっきりいって犬が喰えば良い

なんかあった時のことを考えつつも、「こうなる可能性もあるが、ここはひとまずこう実装しておく」という、対応コストで作っておかないと、あなたは何時まで経っても自宅に帰れなくなる

そして「そんな事いってもそういう仕組で仕事が進んでいるんだからしょうがないじゃないか」と言う人がいるかも知れないが、それはそういう星の下に生まれたことを己が悔やむしかない。そしてもっと良い会社に転職できることを(俺は本当に)切に願う。

大企業のクソフローなんか無視してなンぼ。
というわけでひとまず、新規でCakePHPを構築してみることにする。
  1. CakePHPのダウンロードと設置後、最低限の設定
  2. Dashboardsコントローラ
  3. POファイル作成
  4. 言語を変更
  5. 言語切替処理
  6. リファラを使う
だいたいこういった内容と流れになる予定だ。

当然だがXAMPPなどのLinux詐欺な環境での動作確認は一切してないので、こちらもあわせてご了承いただきたい。あくまで純粋なLAMP環境を前提としている。

もしLinux詐欺をやめて、正しいLinuxを使いたくなった場合、VMwareを使うと良い。
詳しくはこちらを参照されたし。

さて早速取り掛かろう。

■CakePHPのダウンロードと設置後、最低限の設定

今回は会えて1.2を使う。というのも、1.3は1.2と比べると変更点が多く、まだ俺自身調査しきれていないからだ。

世の中には便利な本もある。『Pocket詳解 CakePHP辞典』だ。
俺はまだこの本は手に入れて無い。しかしこの本は正直欲しい。そのうち買う。

マロはどうしても1.3じゃなきゃイヤじゃ!的なわがままちゃんは、こういった優れた書籍をゲットし、己で修行していただければと思う。

さて、CakePHPの1.2.8をダウンロードしたとして、Apacheの設定も終え、早速初期設定といこうじゃないか。

まずは余計なファイルの削除と、最低限の設定。

日本人は日本人の為だけに日本語のみを用意するのが好きであるし、それ自体が文化でもある。
俺はこういった日本の文化を、最高にくだらない低レベルなクソFuckでSuckな文化(略してガラパゴス)だと思っているんだけど、それに気づいたときには時すでに遅し。

なにしろ俺自身、どっぷりそんな日本の完全プロプライエタリ文化に染まりきっていた。
要するに俺もそこらの役所のおえらいさんとかと同じ、クソFuckでSuckなヘタレということである。こりゃたまらんぜ。

というわけで、俺自身が俺に向けて、そんな“実は俺が一番SUCKだった”説から脱却せよと言ってみたい気持ちをそのままストレートに表現するために、そして、仕事で多言語が要求されているのもあわせて、CakePHPで多言語対応をしてみようと思う。

その前にまずは、ブラウザで言語はどのような扱いになっているのかを知っておく必要がある。

まずこんなスクリプトを用意し、ブラウザで実行してみる。
print_r($_SERVER['HTTP_ACCEPT_LANGUAGE']);
俺の環境では以下のような結果になった。

Google Chrome 7.0
ja,en-US;q=0.8,en;q=0.6

FireFox 3.6
ja,en-us;q=0.7,en;q=0.3

IE8
ja

Opera 10
ja-JP,ja;q=0.9,en;q=0.8

さて、なんじゃこりゃ、というのが正直な結果だが、よく見ると国名らしき単語と数値が表示されているのがわかる。

実はこれ、カンマで改行し、セミコロンで区切ると分かりやすい。
Chromeを例にとると、このようになる。

ja
en-USq=0.8
enq=0.6

さらに分かりやすく、テーブルヘッダを入れてみるとこうなる。

言語名品質値
ja
en-USq=0.8
enq=0.6

そしてさらに表示された順序も加えると、

順序言語名品質値
1ja
2en-USq=0.8
3enq=0.6

となる。

これが何を意味するのかというと、実はただ単純にブラウザに対して表示させる言語の優先度を順位を元にして設定しているというだけのこと。

jaの場合は品質値がないが、これは自動的に1という数値が割り当てられているようだ。

品質値の浮動小数点は、実はこれも優先順位をあわらしている。

試しにChromeの設定を変更し、
  1. 日本語
  2. 英語(アメリカ合衆国)
  3. 英語
の英語部分を入れ替えてみて
  1. 日本語
  2. 英語
  3. 英語(アメリカ合衆国)
にした場合、先程のスクリプトの実行結果は
ja,en-US;q=0.8,en;q=0.6
から
ja,en;q=0.8,en-US;q=0.6
に変わる。

大体ご理解いただけただろうか。

どうしてもCakePHP内のビューやコントローラ内で、php自体によってHTMLタグを生成したいという人以外は、可能な限り以下の方法をとると、寝覚めが良いはずだ。
  • HTMLタグには極力アトリビュートを付けない
  • 付けるのは少しのIDといくつかのclass程度
  • 当然TABLEタグでレイアウトなんぞは組まない
 どういう事かというと、吐出されたHTMLタグまでをphpで制御しようというのはおかしいと思っているから、そういう完全に見た目という意味でのビューは、jQueryなどのクライアントサイドスクリプトでやっちまえばいいだろう。

こういう考えで開発していくと、CakePHPのFormヘルパーが吐き出す、そっけなく簡素で女々しいHTMLタグも、むしろそれでいてくれてありがとうと思えるほど便利になる。

さて、俺が何を言いたいのか、わかっていただけてるかな。


「CakePHPのFormヘルパーで出力されたラジオボタンを整列したい」という問に対してphpでHTMLタグを出力させ、cssなどで整形するという解決

これ、完全に、デザイナの領域なのに、開発側で対応しようというのがそもそもの間違いであり、こういった作業は往々にして大した結果に至らない。要するに解決にならない場合が多いのではないだろうか。

とにかく、無理矢理が良くない、ということを言いたい。

CakePHPはほぼphpで書かれたMVCだけど、Vから先のことはこう考えるとよいだろう。

JavaScriptで、HTML(DOM)とCSSをコントロールする

だ。俺が言いたいことがわかっていただけたかな。

CakePHPのMVCよろしく、jQueryをコントローラとし、DOMで拾う内容をモデルとし、それらを吐き出すためにcss、場合によってはHTMLで整形してビューとする、というような流れを考えたほうが良い。

このほうが何しろソースは綺麗になるわ、サーバの負荷分散にもなるわ、デザイナのスキルアップにもなるわ、開発者の手間も省けるわ、で、いいことずくめだ。どうしてやらない?と俺は聞きたい。

ちなみにこの方法が実現できない様な糞ブラウザ(IE)を上司から要求されたら、そいつにこう言ってあげるとよいだろう。

「おや?部長、口からクソがはみ出てますよ?」

と。


というわけで、前置きが長くなったけど、CakePHPで素直に出力したcheckboxを、DOM操作で整列させるjQueryプラグインを作ったので披露してみたい。

CakePHP側では以下のようなビューを使用することとする。
echo $form->input('hobbies', array(
      'type' => 'select',
      'multiple' => 'checkbox',
      'options' => $masters['hobby'],
      'div' => true,
      'label' => false,
    ))
$masters['hobby']には、find('list')などして生成したマスタデータが入っている。

そしてこのビューを素直に表示させたときのサンプルがこうだ。
 まぁこんな感じだよな。当然縦に長くなる。

正直いって、生粋の開発者として長年生きてる人にとっては、この時点でこれ以上いじるのはやめたほうが良い。ろくなことがない。デザイナがやりにくくなるだけだ。2列にしてと言われても、開発者はやっちゃだめだ。

昨日CakePHP1.3の挙動を調べていたんだけど、何がやりたいかというと、実は英語、中国語、韓国語、日本語のSNSを作る事になっているので、完全に国際化をさせないといけない。

今まではCakePHP1.2を長い間使っていたけど、バーチャルフィールドに惹かれてCakePHP1.3を使うことにした。

CakePHP1.3ではapp/libsというディレクトリが増えていて、知人が言うには「何でもいれると良いよ!(MASA-Pさん)」とのことなので、何でもいいからいれてみることにした。

何を入れるかというと、まずはマスタ系の文字列を格納しておきたい。
というのも、1年ほど前、データベースでi18n対応したとき、あまりの面倒くささと手際の悪さで、__()関数使ったほうがメンテナンシビリティ高いアルよ!と独断している状態を続けている。

というわけなんだけど、さすがにすべてのリテラル文字列を配列に入れて宣言するのは、いくらなんでもメモリ使いすぎなので、カテゴリ別に関数にしておくことにした。

今回で「PHP とjQueryライブラリ「jqPlot」で綺麗なグラフを描画する」シリーズは最終回にしたおきたい。
というわけで、vote.ctpの説明をする。

現状のvote.ctpは以下のようになっているはずだ。

[/app/views/quickpolls/vote.ctp]
<div id="graph" style="width:600px;height:300px;margin:30px;"></div>
<script type="text/javascript">
  var data = [<?php echo $data;?>];
  plot = $.jqplot('graph', [data], {
    title: 'モビルスーツ人気投票',
    series:[{renderer:$.jqplot.BarRenderer}],
    axes: {
      xaxis: {
        renderer: $.jqplot.CategoryAxisRenderer,
        tickRenderer: $.jqplot.CanvasAxisTickRenderer,
        tickOptions: {
          enableFontSupport: true,
          angle: -30
        }
      }
    }
  });
</script>
読みこんでいるプラグインは以下になる。
プラグイン名 説明
jqplot.barRenderer.min.js 棒グラフを描画するのに必須
jqplot.categoryAxisRenderer.min.js カテゴリを反映させるために必須
jqplot.canvasAxisTickRenderer.min.js tickの表示や角度を付ける場合に必須

ビュースクリプトでビジネスロジックを書いてしまうと言うのがどうしてダメなのか、もしくはどうして気持ちが悪いのか、というのを考えて見よう。

そもそもPHP君からしてみれば、動かしているPHPファイルがMだろうがVだろうがCだろうが、全く関係ない。もっとプリミティブな階層で動かしているので、そんな話は全く理解してないはず。

しかし、人間から見た場合、情報を扱うレイヤ、表示するレイヤ、それらを管理するレイヤという風に分けた方が、脳みそが分かりやすいからだ。

なので、只の思想と言うことになる。只の思想を実装に代えた物がMVCフレームワークだ。だからビュースクリプトにビジネスロジックを書くことに対しては、極端な話、只の個人の好き嫌いと言う事になる。

それを、「MVCフレームワークだから当然Cでビジネスロジックを実装し、Vは表示のみだろう」という話に持って言ってもし様が無いわけで、正直、全く理由になってはいない。何しろ只の好みの問題なのだから。

とはいえ、せっかく人間が作ったこれらの思想、CakePHPで言うところの規約にも当てはまるが、自ら破るのもなんだか後味が悪いし、どうせ複雑なものであるならば、最初は正攻法で攻めて見たいと思うのは多くの人がそう思っても否定出来ないと思う。