CakePHP 条件に合致しないデータを抽出

PHP

CakePHP 条件に合致しないデータを抽出

~でない、というデータを抽出したい場合があります。
SQL文では次のように書く場合です。

 SELECT * FROM table_name WHERE field != 'value';

CakePHPでは、モデル名->findを利用して、データベースを検索します。
上記のように、!=を作るには次のようにします。

 $this->Model->find('all',array(
   'conditions'=>array(
     "Car.contents !="=>'1')
   )
  );

conditionsの中に入れる場合に、!を入れておきますが、イコールを忘れないようにするのがポイントです。

CakePHP 月日のセレクトボックスのselected

PHP

CakePHP 月日のセレクトボックスのselected デフォルト値を指定

CakePHP1.3

date型のデータは自動的に年月日のセレクトボックスにしてくれますが、その時の初期値の指定方法です。

オプションに、次のように指定します。たとえば、2011年8月23日を指定します。

 
    
 'selected'=>array('year'=>'2011', 'month'=>'08', 'day'=>'23')

フォーム全体は、次のような感じです。

 echo $this->Form->input('cancel_date',array('dateFormat'=>'YMD',
                               'selected'=>array('year'=>'2011',
 				                'month'=>'08',
 				                'day'=>'23'),
 				           )
                        );

CakePHP 月の名前を数字にする

PHP

CakePHP 月の名前を数字にする

次のソースをコピペして、言語ファイルに記載してください。
言語ファイルの場所は、
\app\locale\jpn\LC_MESSAGES\default.po
ですが、なかったら作りましょう。

 msgid "January"
 msgstr "1"
 
 msgid "February"
 msgstr "2"
 
 msgid "March"
 msgstr "3" 
 
 msgid "April"
 msgstr "4"
 
 msgid "May"
 msgstr "5"
 
 msgid "June"
 msgstr "6"
 
 msgid "July"
 msgstr "7"
 
 msgid "August"
 msgstr "8"
 
 msgid "September"
 msgstr "9"
 
 msgid "October"
 msgstr "10"
 
 msgid "November"
 msgstr "11"
 
 msgid "December"
 msgstr "12"

CakePHP 日本語化翻訳データの編集にPoeditを使う

PHP

CakePHPのメッセージを日本語化するためには、「cake i18n」コマンドで生成されたファイルを編集して翻訳データを追記します。
app/locale/jpn/LC_MESSAGES/default.po

default.poはテキストファイルなので、テキストエディタで直接編集してもよいのですが、Poeditという対訳データ編集用のツールがあります。

Poedit公式サイト
http://www.poedit.net/

Poeditダウンロード
http://www.poedit.net/download.php

http://www.poedit.net/screenshots/win.png

「TAB」原文・対訳一覧ペインと、対訳ペインの入力フォーカスを切り替えます。
「CTRL+↑」「CTRL+↓」で対訳データ入力中に、一覧上の行移動ができます。

なお、「cake i18n」コマンドで自動生成したファイルをそのまま編集すると、保存時に下記エラーが表示されます。(エラーを無視してもcakephpの動作に問題はない)

 msgfmt: found 2 fatal errors
 invalid nplurals value
 field `Language-Team' still has initial default value

.poファイルの下記行を言語にあわせて変更するとエラーが出ないようになります。

 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

日本語の場合は下記でよいはずですが、

 "Plural-Forms: nplurals=1; plural=0;"

未翻訳メッセージで常に単数形になってしまうので、英語にあわせて下記指定が無難なようです。

 "Plural-Forms: nplurals=2; plural=(n != 1);"

参考
http://drupal-jbox.net/?q=node/207

CakePHP 全ての関連モデルに対してunbindModelする

PHP

CakePHP 2.x以前では、unbindModelでは個別に関連を指定する必要があって煩雑になることが多いので、例外指定した関連以外の全モデルの関連を外すメソッドを作りました。

 class AppModel extends Model {
 	public function unbindAllBut($params = array(), $reset = true) {
 		foreach(array('hasOne', 'hasMany', 'belongsTo', 'hasAndBelongsToMany') as $association){
 			if(!empty($this->{$association})) {
 				$unbind = array_keys($this->{$association});
 				
 				if(array_key_exists($association, $params)) {
 					$unbind = array_diff($unbind, $params[$association]);
 				}
 				
 				$this->unbindModel(array($association => $unbind), $reset);
 			}
 		}
 	}							
 }