Posts tagged find
Mac からExcel ファイルをダブルクリックすると VMware Fusion の Windows で開ける
0Mac の Finder でエクセルのファイルをダブルクリックしたら VMware Fusion が勝手に起動して Windows Vista のエクセルで開くことができました。先日 VMware Fusion を 2.0 にバージョンアップしたのですが、 こんな機能があるのを知りませんでした。
(続きを読む…)
Mac で不可視ファイルを表示する方法
1Mac で .htaccess などを Finder で見ようとしてもファイルが表示されません。ドットで始めるファイル名は不可視ファイルなので表示されなくなっています。ターミナルなどで ls -a などすれば見えるのですが、Finder で表示されないのは、何かと不便なので表示する方法を調べたのでメモです。
(続きを読む…)
Eclipse PDT1.0 を Mac OS X にインストール&日本語化
1Eclipse PDT を Mac OS X にインストールして日本語化したのですが、少々つまずいた部分もありましたのでメモしておきます。
Eclipse PDT をインストール
PDT Project から最新版をダウンロードして解凍し、アプリケーションフォルダへ入れればインストール終了。これは問題ないですね。
(続きを読む…)
MacFusion でリモートファイルを Finder で操作
0最初は MacFuse + sshfs を使おうと思ってインストールしました。
macfuse – Google Code
しかし、MacFusion という存在を知り試しにインストールしてみたところかなりいい感じ。このソフトは MacFuse を利用して FPT サーバや SSH サーバをマウントして Finder でローカルファイルのように扱えます。
第3回 CakePHP 勉強会に参加しました
1第3回CakePHP勉強会 – events.php.gr.jp
今回は申し込み開始から13分で満席になったそうです。基調講演(?)であった Gwoo の「次は参加するよ」というような話もありました。
ちなみに
“gwooがヨーロッパで講演” フォーラム – CakePHP Users in Japan
Gwooは良い機会であれば日本に行くことも可能だと言っています。
という話もあるので本当に来るのかも。
で、帰ってからブログに書くまでが勉強会ということなので(寝てしまいましたが)個人的な感想を書いておきます。
(続きを読む…)
CakePHP1.2 モデルのデータをオブジェクトで扱う
0少し前ですが下記の投稿を読んでちょっと興味があり色々と試してみました。
“取得データを配列からオブジェクトに変換” フォーラム – CakePHP Users in Japan
I want objects, not arrays! ? nuts and bolts of cakephp
モデルに下記のようなコードを書けばデータを取得するとオブジェクトとして扱えるということです。
function afterFind($results, $primary = false) { if($primary == true && !is_object($results)) { return Set::map($results); } }
CakePHP1.2 モデルの generateList は非推奨メソッドなので find(’list’) を使用する
3CakePHP で select タグを作成する際に CakePHP1.1 ではモデルの generateList メソッドを使用しましたが、このメソッドは CakePHP1.2 では非推奨メソッドになっているようです。その代わりに find メソッドを使用します。
$this->Model->generateList();
と書く代わりに
$this->Model->find('list');
と書きます。
find メソッドのこの書き方は他に
- find(‘count’)
- レコード数を取得する。COUNT(*) の SQL を実行する
- find(‘first’)
- 最初のレコードを取得する。 LIMIT 1 で SQL を実行する
- find(‘all’)
- 全てのレコードを取得する。findAll と同等。
findAll は内部で find(‘all’) を実行している。
などがあります。
CakePHP PHP4 のとき findByカラム名の注意点
1現在開発しているシステムで初めて PHP4 で CakePHP を使用しています。
PHP4 で CakePHP を使用するときの注意点です。
ユーザID で検索するときに findBy カラム名をよく使います。
$this->Model->findByUserId($user_id);
これを PHP4 で使用するときは
$this->Model->findByUser_Id($user_id);
とアンダーバーを入れる必要があります。
CakePHP1.2 のバリデーション
12CakePHP 1.2 を使用してフォームを作成してバリデーションを使用したメモです。
下記サイトを参考にさせていただきました。
cakePHP 1.2のバリデーションを理解する – cakephp – クロアチアで働くプログラマー日記
例としてメールアドレスを2回入力させるフォームを考えて見ます。
バリデーションルールとして
- 必須項目
- メールアドレスとして正しい
- メールアドレスがユニーク
- 2回入力したメールアドレスが一致する
モデルにバリデーションを定義する
var $validate = array( 'email' => array( 'unique' => array( 'rule' => array('checkUnique', 'email'), 'message' => 'メールアドレスは既に登録されています' ), 'rule1' => array( 'rule' => array('email'), 'message'=>'メールアドレスが正しくありません' ), 'required' => array( 'rule'=>VALID_NOT_EMPTY , 'message' => '必須項目です' ), ), 'email_confirm' => array( 'rule1' => array( 'rule'=> array('checkCompare'), 'message'=>'一致しません' ), ), );
私はエラーメッセージをバリデーション定義にまとめておきたいので、上記のように各ルールに
'message' => 'エラーメッセージ'
として定義しています。
ここで定義しておけば、後でビューに書くフォームヘルパーでフォームを出力するときに引っかかったエラーを自動的に出力することができます。
また、自分でバリデーション関数を作成してチェックすることもできます。それが checkUnique と checkCompare です。
メールのユニークチェックは参考サイトを参考にさせていただきました。
function checkUnique($field){ foreach( $field as $key => $value ){ $this->recursive = -1; $found = $this->find(array("{$this->name}.$key" => $value)); return !$found; } }
次にメールアドレスを2回入れたものが一致するかのチェックです。
これはパスワードなどでもたまに使用するので汎用性を持たせてあります。
例えばメールアドレスのフィールド名が email の場合、確認用のフィールド名は ‘_confirm’を付けて email_confirm としておけばこの2つが一致するかチェックします。
function checkCompare($field) { foreach( $field as $key => $value ){ if (preg_match('/^(.+)_confirm$/', $key, $regs)) { return $this->data[$this->name][$regs[1]] == $this->data[$this->name][$key]; } } }
ビューでフォームを設定
<?php echo $form->input('User/email', array('type'=>'text')); ?> <?php echo $form->input('User/email_confirm', array('type'=>'text')); ?>
このように書いておけばバリデーションエラーがある場合は、モデルのバリデーションに定義したエラーメッセージを自動的に出力してくれます。
ちなみに上記のように書くと input タグの前に email などのフィールド名が出力されます。これを消したい場合は
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>'')); ?>
と書くと表示されなくなります。
追記:
コメントで教えていただきました。label=>” だと表示されないが、label タグは残るので
<?php echo $form->input('User/email', array('type'=>'text', 'label'=>false)); ?>
とするとラベルタグも出力されなくなります。
コントローラでバリデーションチェック
以下のようになります。
function action() { if ($this->data) { if ($this->User->create($this->data) && $this->User->validates()) { // バリデーションOK } } }
他にもいろいろフォーム気がついた点があったのでそれはまた後でまとめます。