投稿日:

CakePHP関西勉強会で発表してきました

CakePHP関西勉強会に行って来ました。
今回はいつも聞いているだけの立場から何か話しをしてみようということでライトニングトークに立候補しました。
話す内容はというとCakePHPでの開発事例と失敗談という事で発表しました。

失敗談を話すために今まで、はまった事を思い出しながらパワーポイントを作っていたのですが結構失敗しているなーという実感です。

ただこれらのいくつかは自己解決をせずに別の方法で逃げたとか、次のバージョンで直ってたという形の発表になってしまったのでちょっと後ろめたさもあったのですが、自分も同じような経験をしたけどこういう方法で解決をしたよとアドバイスを頂いたりして凄くありがたかったです。

懇親会でも同じような失敗をしておられる方がいて凄く参考になったと声を掛けていただいたので、発表して良かったなと心底思いました。

発表をしていて思ったことは聞いている皆さんのリアクションが凄いうれしいなという事です。
開発事例でフォーム数が200以上もあると言ったところでみんなが「ウワー」とリアクションを取ってくれたことで気持ちが楽になってリラックスして発表をしていくことが出来ました。ありがとうございました。
終わったときの満足感もあって凄く楽しい勉強会でした。

投稿日:

CakePHP関西勉強会に参加してきました

関西では初となるCakePHP関西勉強会に参加してきました。

10月に東京でCakePHPカンファレンスに行って以来、関西でもしましょう!と言って無事に実現できたのでとても感激でした。今回で、終わらせず、2,3ヶ月ペースでやっていきたいですね。次回は僕も発表しようかな?(今回は弊社の福井が発表させていただきました。)ネタを考えておこう・・・

1. CakePHP アプリケーションの流れを追う

  • shin1×1さん
  • 今までポワーンとわかっていたつもりでしたが、図で動きを説明してもらうととってもわかりやすかったです。
  • 特に前処理、後処理が色々あったのにびっくりした。
  • componentが便利そう!今、modelが肥大化傾向にあるので考えてみようかな・・・
  • Cakeのソースまた読んでみよう(だいぶきれいになったらしいので)

2. フォームメールを生成するプラグイン

  • slywalkerさん
  • 風水系にたとえていた今までの職業が気になりました(懇親会で聞けずじまい・・・)
  • いままで独学で開発されていたのはすごいです。
  • プラグインは使ったことがなかったので勉強になりました。
  • default.ctpなどがあちこちに出来るのをどうしよう・・・
  • 貴重な発表ありがとうございました。

LT1. 開発事例と失敗談

  • keisonさん
  • うまく実例と失敗談をまとめてくれました
  • チケット投げるようなバグもあったので(現在は修正済み)英語を勉強しなくては・・・
  • comporntファイルがないのに呼んでapachが落ちるバグはなんかのクラスをnewしまくってメモリが飛んでる感じでした・・・
  • 発表お疲れ様でしたm(_ _)m

LT2. CakePHPと私(仮)

  • 飯、カメラ、飯、カメラ、飯、カメラ、若干PHP
  • CakePHPは・・・(笑)
  • 写真の解説が面白かったです。
  • 湯布院から帰ってきて体重増えてませんでした?(笑)

懇親会

韓国料理おいしかったです。みんなと打ち解けだした頃に終電で帰らなければならず、すごく残念でした。もっとCakeの話をしたかったです。
次回はまだ話せなかった人と話してみたいです。
なんと、偶然、8年ぶりに会った高校の同級生も参加してました!!ビックリ!!

みなさん、お疲れ様でした。

投稿日:

Ajax郵便番号住所入力

今回も、Ajax系で書かせていただきます。
まあ、よくある郵便番号を入力すると住所が自動で入力される物です。

DBを使いたくなかったのでググッたらKawa.net様が公開されているAjaxZip2を使わせていただきました。
色々な入力フォームに対応しているのですごく便利になりました。

そこで、郵便番号が変更になった時にAjaxZip2で使っているjsonファイルを更新しますが
その更新用プログラムをPHPで作ってみたので公開します。良かったらどんどん使ってください。
(perlの更新プログラムはKawa.net様が公開されています。)

住所更新プログラムはこちら

投稿日:

日付の入力補助カレンダー

みなさん、WEBサイトで日付を入力するのって大変ですよね。
そこで、JavaScriptで現在稼働中のサイトでもすぐにカレンダーの入力が出来るようになる物を紹介したいと思います。

株式会社スプーキーズ様がSpookies LabsでProtoCalendarを公開されております。
デモはこちらで色々な入力フォームに使用できます。

デモの日本用のカレンダーの日曜が右端だったので日曜を左端に持ってくる書き方をメモっておきます。



引数を2つ指定するだけでした。
一つハマったのが、編集画面などでデータが「2008/11/22」ではなく「2008-11-22」のようになっていると入力フォームの初期値が消えてしまいました。

株式会社スプーキーズ様いい物をありがとうございます。

投稿日:

複数行のリストを一気に登録する際の入力チェック

お客さんの要望で複数行のリストを直接リストの画面で編集したいと
言われて作った時に困った入力チェックの方法を覚書しておきます。

シチュエーションは注文カートに注文情報を入れてるリストで
数量を一気に変えたいというものでした。

まずビューで登録されている注文の商品と個数を一覧に出します。

<table>
<tr>
<th>商品名</th>
<th>値段</th>
<th>数量</th>
</tr>
<?php foreach($lists as $key=>$val) { ?>
<tr>
<td><?= es($val['Order']['name']) ?></td>
<td><?= es($val['Order']['price']) ?></td>
<td><?php echo $form->input("Order.{$key}.num", array('type' => 'text')); ?></td>
</tr>
<?php } ?>
</table>
<input type="submit" name="recalc" value="再計算" >

ここで数量のところをテキスト入力にしておいて再計算ボタンを押して$this[‘Order’][キーの番号][‘num’]
という風にコントローラに持ってきます。

これをモデルに渡して数量の入力チェックをかけます。

//注文リストの変更の際の入力チェック
function orderValidates($data) {
$chk =& Validation::getInstance();
//注文リストに入れる際に入力チェックをする
foreach($data['Order'] as $key=>$val) {
if (empty($val['num']) || !$chk->numeric($val['num'])) {
$this->validationErrors[$key]['num'] = '数量が不正です';
}
}
//結果の返却
if (count($this->validationErrors) > 0) {
return false;
}
return true;
}

これで数量の入力チェックでエラーが出た時にエラーの行の数量のテキストエリアの
隣に「数量が不正です」とメッセージをcakeが自動で出してくれました。

投稿日:

PHP関西勉強会に行ってきました

関西では久しぶりというPHPの勉強会です。
kunitさんらがKOFに絡めてPHPの勉強会でもやりましょうかという突発的な感じで始められた今回の勉強会です。
勉強会の3日前にevents.php.gr.jpで募集をかけたにもかかわらず当日行ってみると満員との事にかなりの驚き!!
関西にもPHPの情報を欲しがっている人は一杯居るんだなと実感しました。
とりあえず勉強会の内容を書いていきたいと思います。

PHPUnitのこんな機能知ってる? (kunit)
トップバッターはkunitさんのテストのお話です。
まず最初にseleniumの紹介をサラッとされて本題の「PHPUnit + seleniumRC」の組み合わせで自動でテストをしてみようというもの。
seleniumRCとはseleniumテストを遠隔操作するための製品ということで開発環境とは別にselenium-serverを立ててそこにテストを流し込んでいくものみたいです。
メリットはブラウザの種類だけselenium-serverを用意しておくと一つのテストケースで全てのブラウザのテストが出来てしまうという事だと。
ここでPHPUnitで作ったテストケースをseleniumRCにドバット渡して自動でテストをガリガリしてくれるという感じでした。
用意する時間が無かったみたいなので実装まで見ることが出来ませんでしたがすごく便利そうな機能だなと思いました。(見たかった残念!!)

CakePHPとか (shin1x1)
次にshin1x1さんのCakePHPについてのお話です。
CakePHPを導入するに当たってフレームワークに行こうとしたきっかけや、フレームワーク選定はどういう基準で行ったかという話でした。それを聞いてまったくうちと同じだなという感じでした。
CakePHPを選んだ基準は
1.php4/5どちらでも動く
2.他のフレームワークに比べてゆるい構造
3.日本語の文献が多かった
4.Rubyの思想で作っているので最悪Rubyに乗り換えれる
5.分かりやすかった
と他にもおっしゃっていたと思うのですがこれらの理由で決めたということでした。
何より分かりやすかったというのが一番の決め手だと言っておられました。
最後にCakePHP関西を開催するということも!!

PHPScraping2008 (させざき)

最後にさせざきさんのPHPScrapingについてのお話です。
PHPScrapingとはHTMLを取得して取り出したいデータを取り出して再利用すると言うものだったと思います。
ライブラリの説明と構造を追ってどういう処理を行っているという事をおっしゃっておられました。
途中ZendFramworkを使って作っておられるのかなと言う部分も見受けられて参考になりました。

というわけで急遽決まった勉強会なのにお三方ともに素晴らしい講義ありがとうございました。すごい勉強になりました。
懇親会も技術談話に必死に喰らいついていきながら美味しいお酒が飲めました。非常に満足です。
これを機に関西でも勉強会が定着してくれたらなと思っています。

投稿日:

CakePHPのHasAndBelongsToManyを使う

多対多のデータを扱うのにHasAndBelongsToManyをモデルで指定してあげると
簡単にデータの取り出しや保存が出来ました。

今回は社員が複数の部署に属すという仕様で使いました。
テーブルは次のようにしました。
parts(部署テーブル)、
users(社員テーブル)、
parts_users(部署・社員連携テーブル)
部署・社員連携テーブルは繋げたいテーブルを「_」で連結させてテーブル名とします。
parts_usersのフィールドは「part_id、user_id」となります。

次にPartsUserモデルを作っていないとエラーになるので作っておきます。

class PartsUser extends AppModel
{
var $name = 'PartsUser';
var $useTable = 'parts_users';
}

Userモデルで

class User extends AppModel
{
var $name = 'User';
var $useTable = 'users';
var $hasAndBelongsToMany = array('Part');
}

と記述してあげるとUserモデルでセレクトして得られた配列に
所属している部署全てが取得できています。

データの取得はこれですんなりと上手くいったのですがデータの保存が
あまり資料が無くはまりました。
データをセレクトで取得した形式でsaveしてあげても上手く保存が出来ません。
ではどういう配列構造で保存してあげればいいのか、

$this->data['Part']['Part'][0] = 部署番号
$this->data['Part']['Part'][1] = 部署番号
$this->data['Part']['Part'][2] = 部署番号
・
・
・

という感じにデータを持たしてあげるとparts_usersテーブルに社員と部署を
連携したデータを保存してくれます。

投稿日:

CakePHPカンファレンス東京に行ってきました!!

東京日帰りという強行日程でCakePHPカンファレンス東京に行ってきました。
今回の勉強会は前回までと違って昼間に開催してくれたので僕ら遠征組でも参加しやすかったです。
そうとはいえ東京までの移動と始発の電車に乗るため家を出たので会場に着いたときにはかなり疲れていました。
けどカンファレンスが始まると疲れも忘れる感じに聞き入ってしまいました。

まず安藤さんの「国内でのCakePHPの利用状況について」
CakePHPは初心者から玄人まで全てのユーザーに使っていただけるフレームワークだということ、
ネットでもCakePHPの情報がかなり手に入りやすい状況になってきているほど、
ここ最近はすごい普及してきているという事をおっしゃっていました。

次に岸田さんの「Agileな開発現場での実践例」
テストコードをCakePHPで書いておられて、実際にテストではまった所などを詳しく説明してくれて、
とても参考になりました。またテストコードを書いていると開発期間は倍になるということもおっしゃってましたが
それでも後のメンテナンスやバージョンアップの時に楽になるので導入するべきだと言っておられました。

午後からGarrett氏の「招待講演」
CakePHPの始まったきっかけや、これからCakePHPはどうなっていくということをおっしゃられていました。
バージョン2.0をリリース予定で2.0からはphp5での対応になるということでした。ただ予定は未定という感じで・・・
CakePHP開発チームにとってチケットを投げてもらう時にテストケースとパッチをつけてくれと言っていました。

その後、鶴岡さんの「XoopsCubeなのにCakePHPを使う!」
Xoopsの中にCakePHPで書いたプログラムを埋め込む事が簡単に出来るということで実際に埋め込む方法を
実践してくれていました。自作でCMSを作るよりより多くの人に使ってもらうために今もう既に存在していて認知されている物に乗っける方が結果的にいいんだということを言っておられました。

最後にライトニングトークで皆さんの実績やアイデアを聞かせてもらいすごい勉強になりました。
懇親会にも参加して色々な話が出来てとても充実した時間がすごせました。
日帰り東京という過酷なスケジュールでしたがとても満足なカンファレンスでした。

投稿日:

VS.phpを使って、リモートデバッグしてみました!

リモートデバッグって必要あるの?って聞かれるといまいち説得力のある説明が
できないんですが、ローカル環境で開発していて、本番サーバで動かすと動きが
違って困り果てることってあります。そしてたいてい納期直前のかなり切羽詰っ
た時にそういうことが起こります。そんな時、リモートデバッグが使えると便利だっ
たりすると思うんです。
でも本番サーバにDBGやXdebugをインストールできなければこれは使えません。
以下、自分が実際に使ってみた時のメモです。
<苦労したところ>
を参考にDBGをインストールして設定したけれども、
  failed to establish connection to client host on localhost:7869
というメッセージが表示されて実行できない。サーバの設定によってこう
なることがあるようです。
property.JPG
PHPプロジェクトのプロパティ「構成プロパティ」「デバッグ」「高度な設定」の
DBGクライアントホストをローカルPCのIPアドレスにすると解決。
< リモートデバッグする時の手順 >
1.サーバからデバッグ対象のソース一式をローカルへコピーする
2.プロジェクトのプロパティで以下の設定をする

”配置”
  配置方法をFTPで設定する。
  パッシブモード/アクティブモードの設定を間違えないよう注意。
  下のFFFTPの画面で赤丸部分がONの時はパッシブモード)

FFFTP.JPG
“全般”
  デバッグモード:外部モード
  デバッグ方法:DBG
  開始URLはhttp://[IPアドレス]/test/index.phpのように。
”高度な設定”
  DBGクライアントのポート番号:7869
  DBGクライアントホスト:上の<苦労したところ>に書いた
  メセージが表示される場合はローカルマシンのIPアドレスする。

3.ソリューションエクスプローラでindex.phpの上で右クリックしてメニューから

  「開始ページに設定」を選択する

4.ブレークポイントをつけて、デバッグ実行する

投稿日:

CakePHPで携帯サイト作成時に注意したところ

今回、携帯サイトを作るにあたって各携帯会社によって挙動が違うくて詰まった箇所や携帯サイト独自の作り方をしたところをメモで残そうと思います。

まず携帯会社によって入力フォームの入力文字をデフォルトで切り替える方法です。
app/app_controller.phpのbeforeFilter()で
各携帯メーカーによってモードを変えます

//  DoCoMo 用
if (ereg( "DoCoMo", $_SERVER["HTTP_USER_AGENT"] )) {
$mode = "istyle";
$mode_1 = 1;
$mode_2 = 2;
$mode_3 = 3;
$mode_4 = 4;
//  ezweb 用
} elseif (ereg( "UP\.Browser", $_SERVER["HTTP_USER_AGENT"] )) {
$mode = "format";
$mode_1 = "*M";
$mode_2 = "*M";
$mode_3 = "*m";
$mode_4 = "*N";
//  J-Phone 用
} elseif (ereg( "J-PHONE", $_SERVER["HTTP_USER_AGENT"] )
|| ereg( "SoftBank", $_SERVER["HTTP_USER_AGENT"] )
|| ereg( "Vodafone", $_SERVER["HTTP_USER_AGENT"] )) {
$mode = "mode";
$mode_1 = "hiragana";
$mode_2 = "katakana";
$mode_3 = "alphabet";
$mode_4 = "numeric";
//  L-mode 用
} elseif (ereg( "L-mode", $_SERVER["HTTP_USER_AGENT"] )) {
$mode = "istyle";
$mode_1 = 1;
$mode_2 = 2;
$mode_3 = 3;
$mode_4 = 4;
//  その他用
} else {
$mode = "istyle";
$mode_1 = 1;
$mode_2 = 2;
$mode_3 = 3;
$mode_4 = 4;
}

上の記述で出来たモードを$this->setでビューに渡して、ビュー側でフォームの属性に上のモードを持たすとデフォルトの入力文字が各携帯会社で「漢」「ア」「1」という形で出るようになります。
ビュー側の例:<?php echo $form->text(‘Delivery.name1’, array(“size”=>8, $mode=>$mode_1)) ?>

次に携帯会社によってgifが使えたりpngが使えたりと違うので携帯会社によってgifを使うかpngを使うか切り替えます。
app/app_controller.phpのbeforeFilter()で

//携帯機種によって画像拡張子を切り替える
$ua = $_SERVER["HTTP_USER_AGENT"];
if(ereg("J-PHONE|Vodafone|UP\.Browser",$ua)){
$this->set("extension", "png");;
}else{
$this->set("extension", "gif");;
}

と振り分けてビューに拡張子を渡してファイル名と拡張子を合体させて出力します。
(注)pngの場合テーブルサイズが指定されていなかったらauの場合に自動で画像を横長にしてしまったのでテーブル幅は指定しておきます。

最後に各携帯会社のブラウザの独自仕様で詰まったところを記述していきます。
・auではラジオボタンの二つの候補の間に他のフォームが入ると二つのラジオの関係性が無くなってしまうので他のフォームを挟まないようにしました。
・docomoで検索をした値をセッションに持たしておいて他のページにいった後に戻って検索をもう一度すると半角スペースを最後に付加する現象が起こって検索が引っ掛からなくなったので検索前に検索文字列をtrim関数で両端の半角スペースを除去しておきました。
・auではブラウザを閉じてもセッションを開放しないので最後のページもしくは最初のページでセッションをdestroyしておきました。