symfony1.4(1.3)で簡単に確認画面を作るアドミンジェネレータ

exDoctrineThemePlusPlugin

すでに議論され尽くしている感がある「確認画面を作る方法」ですが、symfony1.3以降で簡単に確認画面を作成できるテーマを作成しましたので紹介します。

Read more

1行で書けるPHPファイルを直接実行させない方法

Webサーバーのウェブルート以下に、クラスファイルやincludeされることが前提となっているライブラリファイルのような直接実行されることを意図していないPHPファイルを置いてしまった場合、意図していなくてもブラウザから直接URLを入力された場合はPHPファイルが実行されてしまいます。

Read more

PHP5 配列をメソッドチェインで再帰処理するクラス

CakePHPを使っていると、データ構造が多階層の配列で管理されていることが多く、一括で処理をしたい場合などに度々再帰処理を実装することがあります。
通常であれば、array_map系の関数を使って再帰的に処理を記述することになりますが、

  • 毎回array_mapを使うのは面倒だし、もっと簡潔に記述したい
  • 個別のグローバル関数・各メソッドを連続して簡単に利用したい

という理由で、以下のように記述できるクラスを作成しました。
(クラスのソースコードは最後に記述しています)

PHP:
  1. // $arrの全ての要素にtrimと半角カナ変換を実施
  2. ArrayMap::create($arr)->trim()->mb_convert_kana('KV');
  3.  
  4. // $arrの全ての要素に「先頭:」という文字を追加
  5. ArrayMap::create($arr)->sprintf('先頭:%s');

※PHP5のマジックメソッドを使って実現していますので、PHP4系では使えません
※通常の手続き型で実装する場合は「array_walk_recursive」「array_map recursive」などで検索するといろいろ参考情報があります。

Read more

Symfony TemplatingをCakePHPで使ってみる

CakePHPでSymfony Templatingを使ってみる

前回はSymfony Templatingを単独で利用したり、Smartyと連動させてみました。
次に何をしようかと思い、現在のsymfonyで組み込んでみようかと思いましたが、すでにOpenPNEでおなじみの手嶋屋の海老原さんがブログで実践されていました。
というわけで、あのCakePHPのViewとしてSymfony Templatingを使ってみたらどうだろうと思い試してみました。

ただし、CakePHPのViewを完全に置き換えているわけではありません。
とりあえずCakePHPのViewとして動作させることができたという感じです。

Read more

Symfony Templatingを使ってみませんか?

Symfony Componentsというのをご存知でしょうか?その名前のとおり、あのPHPのフレームワークで有名なsymfonyに関係するコンポーネントなのですが、symfonyの次期バージョンであるSymfony2で利用されるコアとなる各コンポーネントがライブラリとして公開されています。

近頃、その1つでテンプレート機能部分である Symfony Templatingが公開されましたので、さっそく使ってみました。軽量で柔軟性が高いのでsymfonyを使った事がある人も無い人も簡単に導入する事が可能だと感じました。

そこで、symfonyを使った事がある人も無い人も、「テンプレートエンジンといえばSmartyを使っているけど、PHPってテンプレートエンジンみたいなものだしPHPでテンプレートを書きたい。。」という方まで、ドキュメントとソースを読んで実際に使ってみた例を紹介したいと思います。

Read more

DoctrineのfindBy,findOneByにorder byを追加する方法

symfonyではDoctrineが実質的な標準ORMになりました。
まだまだ使いきれていないのですが、機能が豊富にあるため知っているのと知らないのではかなりの差がでてきます。

今回は知っていると得するDoctrineの小ネタです。

Doctrineの特徴としてfindByとfindOneByメソッドがあります。
これらはマジックメソッドで実装されており、カラム名をつけて呼び出すことでより通常のDQLの記述よりも短くすっきりと書くことができます。

Read more

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の接続情報を利用しています。

Read more

CakePHP 動的なウィジェットの作り方

CakePHPではコントローラーでの処理はビューを介してレイアウトのメインコンテンツ($content_for_layout)の部分に展開されます。
その際レイアウトに配置してあるメインコンテンツ以外の部分は基本的にはコントローラーから操作ができません。(たぶん)
一般的なサイトでは2段組みや3段組みのレイアウトを使うケースが多いと思いますが、メインコンテンツ領域以外もCakeを使って柔軟に制御する方法を検討します。
(出力されるHTMLの部品をウィジェットとします)

※今回の実装サンプルはこちらから確認できます。
※ソースコードはこちらからダウンロードできます。
※サンプルではメインコンテンツ側で指定されたカテゴリの情報をフッター部に表示しています。

Read more

CakePHP Behaviorでバリデーション周りの効率化を図る 応用編

前回紹介したBasicValidationBehaviorを使って、動的にバリデーションを切り替える方法を紹介します。
共通のモデルを複数のフォームで利用している場合にバリデーションの定義を動的に変更したい場合などに有効です。

例1:新規登録時と編集時でバリデーションの登録項目を変更する

対応1)loadValidate()メソッドに引数を追加し、条件によって分岐させる

[モデル内の処理]

PHP:
  1. function loadValidate($action = 'add') {
  2.     $valid = array(
  3.         'name'   => 'required | maxLen[50]',
  4.         'email'         => 'required | email | isUnique | maxLen[200]',
  5.         'password'  => 'required | single | maxLen[20] | minLen[6]',
  6.         're_password'   => 'required | confirm[password]',
  7.         'sex'     => 'required | numeric | maxLen[1]',
  8.         'birthday'  => 'required | ymd',
  9.         'tel'      => 'required | phone | maxLen[13]',
  10.         'zip'      => 'required | zip | maxLen[8]',
  11.         'pref'    => 'required | maxLen[12]',
  12.         'addr1'      => 'required | maxLen[200]',
  13.         'addr2'      => 'maxLen[200]',
  14.     );
  15.     // 新規登録時以外はパスワード関連の項目を無効にする
  16.     if($action !== 'add'){
  17.         unset($valid['password']);
  18.         unset($valid['re_password']);
  19.     }
  20.     $this->setValidate($valid);
  21. }

対応2)コントローラーでモデルのvalidate()やsave()前にloadValidate()を明示的に実行する

[コントローラー内の処理]

PHP:
  1. function add(){
  2. // 処理を省略
  3.  
  4.     $this->TestUser->set($this->data);
  5.     // バリデーションを設定
  6.     $this->TestUser->loadValidate('add');
  7.     if($this->TestUser->validates()) {
  8.    
  9. // 処理を省略
  10. }
  11.  
  12. function edit($id = null){
  13. // 処理を省略
  14.  
  15.     $this->TestUser->id = $id;
  16.     $this->TestUser->set($this->data);
  17.     // バリデーションを設定
  18.     $this->TestUser->loadValidate('edit');
  19.     if($this->TestUser->validates()) {
  20.    
  21. // 処理を省略
  22. }

Read more

Next Page →