CakePHP + Ext JS で グリッド 編集 (EditorGridPanel)
CakePHPとExt JSにはRESTの仕組みがあります。これを利用してExt JSのグリッド編集を行います。
前回のサンプルではグリッド表示だけで、編集機能がありませんでした。
これに編集機能を付けます。
追加・変更部分のみ記載します。
CakePHP + Ext JS で グリッド 表示 (GridPanel)
CakePHPとExt JSにはRESTの仕組みがあります。これを利用してExt JSのグリッド表示を行います。
下記のサンプルでは蔵書テーブル(books)と著者テーブル(authors)から情報を取得して一覧をグリッドで表示します。
CakePHP 「GeoSimple Plugin」にGoogle Static Mapsを扱うHelperを追加してみた
前回作成したGeoSimple Pluginを使ってGPS等で取得した緯度経度の近隣データを取得することができました。
こうなるとデータを表示する際には地図で確認できるようにしたい、ということで、
携帯でも表示できる Google Static Maps を使って簡単に地図を表示・操作ができるHelperを作成してみました。
検索結果の画面はこんな感じになります。(クリックで実際の動作が確認できます)
CakePHP 携帯ライブラリと位置情報ライブラリを使った簡易GPS検索プラグイン「GeoSimple Plugin」
CakePHPユーザー最大のイベントPHPMatsuriが近づいてきました。
今年は弊社も協賛として微力ながら応援させて頂きます。
だからという訳では無いのですが、久々のCakePHP関連の投稿です。
最近の携帯端末やiPhone、android携帯では標準でGPS機能が搭載されていますので、
このGPSを使った簡易位置検索(現在地から近隣のデータを検索)を行うプラグインを作成してみました。
※本プラグインでは以下のライブラリを利用しています。
・携帯ライブラリ(Ktai Library)
・位置情報ライブラリ(Geomobilejp)
※検索方式は空間情報を利用したものではありません。三平方の定理で簡易的に距離を求めています。
Read more
PHP5 配列をメソッドチェインで再帰処理するクラス
CakePHPを使っていると、データ構造が多階層の配列で管理されていることが多く、一括で処理をしたい場合などに度々再帰処理を実装することがあります。
通常であれば、array_map系の関数を使って再帰的に処理を記述することになりますが、
- 毎回array_mapを使うのは面倒だし、もっと簡潔に記述したい
- 個別のグローバル関数・各メソッドを連続して簡単に利用したい
という理由で、以下のように記述できるクラスを作成しました。
(クラスのソースコードは最後に記述しています)
-
// $arrの全ての要素にtrimと半角カナ変換を実施
-
ArrayMap::create($arr)->trim()->mb_convert_kana('KV');
-
-
// $arrの全ての要素に「先頭:」という文字を追加
-
ArrayMap::create($arr)->sprintf('先頭:%s');
※PHP5のマジックメソッドを使って実現していますので、PHP4系では使えません
※通常の手続き型で実装する場合は「array_walk_recursive」「array_map recursive」などで検索するといろいろ参考情報があります。
Symfony TemplatingをCakePHPで使ってみる
CakePHPでSymfony Templatingを使ってみる
前回はSymfony Templatingを単独で利用したり、Smartyと連動させてみました。
次に何をしようかと思い、現在のsymfonyで組み込んでみようかと思いましたが、すでにOpenPNEでおなじみの手嶋屋の海老原さんがブログで実践されていました。
というわけで、あのCakePHPのViewとしてSymfony Templatingを使ってみたらどうだろうと思い試してみました。
ただし、CakePHPのViewを完全に置き換えているわけではありません。
とりあえずCakePHPのViewとして動作させることができたという感じです。
CakePHP MySQLのバックアップ(mysqldump)を行うバッチ
CakePHP1.2からコマンドラインからCakeが起動できるようになりました。
この機能を使って、MySQLのバックアップを行う簡単なスクリプトを作成してみました。
データベースの接続には、/app/config/database.phpの接続情報を利用しています。
CakePHP 動的なウィジェットの作り方
CakePHPではコントローラーでの処理はビューを介してレイアウトのメインコンテンツ($content_for_layout)の部分に展開されます。
その際レイアウトに配置してあるメインコンテンツ以外の部分は基本的にはコントローラーから操作ができません。(たぶん)
一般的なサイトでは2段組みや3段組みのレイアウトを使うケースが多いと思いますが、メインコンテンツ領域以外もCakeを使って柔軟に制御する方法を検討します。
(出力されるHTMLの部品をウィジェットとします)
※今回の実装サンプルはこちらから確認できます。
※ソースコードはこちらからダウンロードできます。
※サンプルではメインコンテンツ側で指定されたカテゴリの情報をフッター部に表示しています。
CakePHP Behaviorでバリデーション周りの効率化を図る 応用編
前回紹介したBasicValidationBehaviorを使って、動的にバリデーションを切り替える方法を紹介します。
共通のモデルを複数のフォームで利用している場合にバリデーションの定義を動的に変更したい場合などに有効です。
例1:新規登録時と編集時でバリデーションの登録項目を変更する
対応1)loadValidate()メソッドに引数を追加し、条件によって分岐させる
[モデル内の処理]
-
function loadValidate($action = 'add') {
-
'name' => 'required | maxLen[50]',
-
'email' => 'required | email | isUnique | maxLen[200]',
-
'password' => 'required | single | maxLen[20] | minLen[6]',
-
're_password' => 'required | confirm[password]',
-
'sex' => 'required | numeric | maxLen[1]',
-
'birthday' => 'required | ymd',
-
'tel' => 'required | phone | maxLen[13]',
-
'zip' => 'required | zip | maxLen[8]',
-
'pref' => 'required | maxLen[12]',
-
'addr1' => 'required | maxLen[200]',
-
'addr2' => 'maxLen[200]',
-
);
-
// 新規登録時以外はパスワード関連の項目を無効にする
-
if($action !== 'add'){
-
}
-
$this->setValidate($valid);
-
}
対応2)コントローラーでモデルのvalidate()やsave()前にloadValidate()を明示的に実行する
[コントローラー内の処理]
-
function add(){
-
// 処理を省略
-
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('add');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}
-
-
function edit($id = null){
-
// 処理を省略
-
-
$this->TestUser->id = $id;
-
$this->TestUser->set($this->data);
-
// バリデーションを設定
-
$this->TestUser->loadValidate('edit');
-
if($this->TestUser->validates()) {
-
-
// 処理を省略
-
}
CakePHP Behaviorでバリデーション周りの効率化を図る
CakePHPでバリデーションを使う際、標準(CakePHP1.2)のままでも十分開発はできますが、大きめのプロジェクトや複数のプロジェクトでも汎用的かつ効率的に使えるようにできないかと検討しました。
バリデーション改善の目的
- エラーメッセージを日本語化し共通化・デフォルト化したい
- 独自バリデーションメソッドを共通化したい
- ルール配列を簡単に記述したい(項目が多いとソースが長くなり過ぎて見通しがよくない)
- バリデーションの前に自動で整形処理をしたい(半角英数変換やカタカナ変換など)
実装にあたって
バリデーションメソッドの共通化については、
cakephperさんの日記:よく使う独自バリデーションルールをプラグインのbehaviorにまとめる
に記載してありますように、プラグインのbehaviorで管理するほうが良いと思いますが、今回は弊社で過去に実装した通常のbehavior(BasicValidationBehaviorとします)を使った方法を紹介します。

