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
PHP開発パートナー(個人・法人)を募集しています
弊社は創業3年目のまだまだ未熟な企業ですが、大手広告代理店・制作会社様の案件を中心に、多くのWEBサイトのアプリケーションをPHPで構築しています。
WEBインテグレーション事業を中心に、これまで少数精鋭ならではの機動力・きめ細かな対応を
活かした品質の高いサービス提供を行ってまいりました。
ですが、ここ数カ月、案件数の増加に伴いお仕事の依頼をお断りしなければならない状態が続いておりますので、弊社と共に活動して頂けるパートナー様を募集します。
単なるプログラマーではなく、サーバー設定、要件定義、システム提案・・・、などシステム構築全般において高いレベルで積極的に行動できる個人様・法人様、是非ご連絡くださいませ。
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」などで検索するといろいろ参考情報があります。
CakePHP IRC集会に参加しました
昨日cakephperさん主催のCakePHP第三回IRC集会に参加させて頂きました。
業務中だったこともあり、前半ほとんど発言できず、、途中開発環境の件では、みなさんの環境が立派すぎて「sakuraエディタです」とは言えませんでした。。
(社内の2名はEmacs派のようです)
結局、最後の1時間くらいでようやくご挨拶。このブログも取り上げて頂き有難うございました。
ウチの記事を知って頂いていた方もいらして、少しはCakePHP界に貢献できていることが実感できました。
IRCでも話に出ていましたが、CakePHPの素晴らしさはFWとしての機能も当然ありますが、
知識の共有が積極的に行われていることに尽きると思います。
本の執筆活動、フォーラムでのフォロー、勉強会やIRC集会、各自のブログ、etc・・
これらの活動をされている方々には本当に感謝しています。
弊社も少しずつですが、何らかで貢献していければと思っています。
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とします)を使った方法を紹介します。
CakePHP Formヘルパの拡張 その2
3項目の電話番号入力フィールド
$form->textを拡張して3項目の電話番号入力フィールドを生成
前回に続いて、Formヘルパの拡張の第二弾です。
入力欄としてよくあるものとしては、電話番号や郵便番号を分割された入力フィールドで入力させるケースがあります。
入力フォームはモデル(テーブル)と連携するケースが多いですが、テーブルのカラムが1つなのに入力フォームは分割しなければならない場合などは、少々面倒なことを行う必要があります。
この煩わしさを回避する為に、カラムは1つでも入力欄は3つに自動的に分割されるようにに拡張する方法を検討しました。
結論から言えば、ヘルパだけの拡張では入力欄を分割するところまではできましたが、DBに格納する際に自動的に分割した値を結合することができませんでした。
(イマイチな)解決案として、AppModel内に処理を追加することでDB格納時の自動結合化を行っています。
動作はこちらから確認できます。
Read more
