candycane の導入

Posted by muchag | CakePHP,Tool | 2011-09-08 (木) 10:15:36


新しい記事:candycane 2016

candycane とは、Redmine というプロジェクト管理ソフトウェアの CakePHP 版。
公式:candycane on CakePHP
github:yandod / candycane

【環境】
[レンタルサーバ] さくらレンタルサーバ スタンダード
[candycane] v0.8.0
DL & インストール
DL

相変わらずコマンドラインを避け
上記 github プロジェクトページから zip ファイルを DL 。
2011-09-08 現在の最新版は v0.8.0 。
yandod-candycane-v0.8.0-0-g07e90ad.zip
 

設置

DL してきた上記 zip ファイルを解凍。

yandod-candycane-07e90ad
┣ app
┣ cake
┣ vendors
┣ .gitignore
┣ ・・・
┗ README

CakePHP のインストール記事 インストール を思い出しながら
ディレクトリ配置及び名称の変更を済ませる。
 

公開ディレクトリ内/webroot(私は変更したので名称が異なる)/index.php

の設定を変更。
 

非公開ディレクトリ内/app/database.php.install

を database.php とリネームして DB 情報を書き換え・・・
とここで気がついた。
テーブルはどうするの?

で、調べてみたところ、candycane にはインストーラ機能がある。
素晴らしい♪
 

インストール

そこで、database.php を削除して
candycane の webroot ディレクトリ相当の URL へアクセスすると
インストーラが起動する。

 
DB の設定画面が現れるので
必要事項を記入。

 

 

 

おー! もうでけた♪
とっても親切な設計だなぁ。
 

おまけ

さくらレンタルサーバのスタンダードプランでは DB を1つしか作れないため
candycane 用テーブルに prefix を付けようと candycane の再インストールを試みたところ

Error: The requested address ‘/’ was not found on this server.

と表示されてしまった。

グーグル先生に質問してみたところ

  1. app/tmp ディレクトリのパーミッションの問題
  2. CakePHP のデバッグモードの問題

の2種類の可能性があるようだが
今回は、2のデバッグモードを一旦 1 にしてみることで解決した。

CakePHP,Tool | 2011-09-08 (木) 10:15:36 |

MySQL でカラム種別を tinyint(1) にしてハマッタ

Posted by muchag | CakePHP,MySQL | 2011-08-09 (火) 19:10:38

MySQL でカラム種別を tinyint(1) にしてハマッタ。

【環境】
[CakePHP] 1.3.10
状況
  1. $user['id'] = $id;
  2. $user['name'] = $name;
  3. $user['present'] = 2;
  4.  
  5. $this->User->save($user);

このスクリプトで、何度試してもデータを保存できなかった。
 

原因

あれこれ試した結果

  1. $user['present'] = 0;
  2.  
  3. または
  4.  
  5. $user['present'] = 1;

これだと保存できることがわかった。

因みに、present カラムは、オンオフフラグのため tinyint(1) としている。
 

実験

確かに元々 0 or 1 のみ入力するために作成したカラムなんだけど
テスト用に目立つ 2 を保存しようとしたらアウト。
5 で試してもだめだった。
 

MySQL には知能がある?

ん~、MySQL さんは、私のカラム定義の意図を汲み取ってくれちゃったの?
 

結論

よくわからないけど、わからないからこそメモ・・・。

CakePHP,MySQL | 2011-08-09 (火) 19:10:38 |

DebugKit

Posted by muchag | CakePHP,Library & PlugIn & AddIn,困ったTT | 2011-07-03 (日) 19:49:46

も、もしかして、これは素晴らしいかも。

【環境】
[CakePHP] 1.3.8
DL&インストール

github:cakephp / debug_kit

2011-07-03 現在、1.3.0 が最新版。

DL した cakephp-debug_kit-1.3.0-0-g5db6ec7.zip を解凍して
出てきたフォルダを debug_kit にリネーム。

app/plugins

に配置する。

app_controller.php など利用したいコントローラに

  1. class AppController extends Controller {
  2.  
  3.     public $components = array('DebugKit.Toolbar');
  4.  
  5. }

これで完了。
 

IE との相性

導入してみた途端に IE が吹っ飛んだ。

具体的には debug_kit フォルダを
app/plugins
に放り込んで IE を F5 で更新したら
IE がクラッシュし、無言で消えた。

IE を起動して、再度アドレスを入れてみたら
無事に DebugKit が機能したので
これでいけるかもしれないけど
しばらく様子見。

こんな記事も発見した。
趣味の延長線:DebugKit+IEでのエラー緩和

上記を参考に

app/plugins/debug_kit/webroot/js/js_debug_toolbar.js
  1. var clickedEl = event.target;
  2. var clickedEl = event.target || event.srcElement;
  1. event.preventDefault();
  2. if (event.preventDefault) {
  3.     event.preventDefault();
  4. } else {
  5.     // IE
  6.     event.returnValue = false;
  7. }

と書き換えてみたが、直ったかどうかよくわからない。
 

アクション名が・・・

上述の如くパッチを当てたが、ログインアクションで不思議な現象が起こった。

users_controller.php の login アクションにてログインを処理をしているのだが
突然不具合が出た。

エラーメッセージを見ると

Missing Method in UsersController
Error: The action : is not defined in controller UsersController
Error: Create UsersController:::() in file: app\controllers\users_controller.php.


Notice: If you want to customize this error message, create app\views\errors\missing_action.ctp

アクション名 : (コロン)って・・・。

そら ctp ファイルもないでしょうよ・・・。

Firefox では問題ない。

ログイン後に元見ていたページへ飛ばす仕組みになっている。

早速 DebugKit で元ページのアドレスを見ると(何か皮肉な・・・
IE のときだけ末尾に /:/ が追加されている。

原因はわかったけど、直し方が・・・わから~にゃい!
 
参考元サイト:cakephperの日記(CakePHP, MongoDB) 超便利なDebugkitを画面キャプチャ付きで解説

CakePHP,Library & PlugIn & AddIn,困ったTT | 2011-07-03 (日) 19:49:46 |

データのバリデーション -> rule 編

Posted by muchag | CakePHP | 2011-07-03 (日) 18:16:33

rule はボリュームが多いので
別ページにしてみた。

たくさんあって、さっぱり覚えられない・・・。

【環境】
[CakePHP] 1.3.8

ルール内容を記述する場所。

内容は定義済みルールでも独自ルールでも可能。
 

定義済みルール

The CakePHP 1.3 Book:4.1.4 組み込みのバリデーションルール(Validation Rules)
下記参考元サイトの方が見易い。

<参考元サイト>
CakePHPまとめ:Validation(バリデ-ション)
CSS テンプレートガイド:CakePHPに組み込みのバリデーションルールをまとめた表
 

独自ルール
正規表現によるバリデーション

The CakePHP 1.3 Book:4.1.5.1 独自の正規表現による定義

  1. 'rule' => array('custom', '/[a-z0-9]{3,}$/i'),

などのように記述。
 

エスケープ

独自ルールで正規表現を用いる場合
中身に以下の半角記号を入れたい場合はエスケープする。

  • / (スラッシュ)
    正規表現の最初と最後に配置する記号なので、ここで終わりと勘違いされる
  • \ (バックスラッシュ、場合によっては円マーク)
    正規表現でエスケープに用いる記号なので、次の文字のエスケープと勘違いされる
  • ]
    正規表現でパターン列挙に用いるカッコなので、ここで終わりと勘違いされる
  • $ (ドルマーク)
    正規表現で文末を表す記号なので、ここが文末と勘違いされる
  • (シングルクォーテーション)
    PHP で文字列を括る記号なので、ここが文字列末と勘違いされる
  • (ダブルクォーテーション)
    PHP で文字列を括る記号なので、ここが文字列末と勘違いされる

※ シングルクォーテーションとダブルクォーテーションは、どちらを用いているかによる
※ その他もどのように記述しているかによる

  1. 'rule' => array('custom', '/[^@-\/]$/i'),

 
これを忘れると、スラッシュの場合は

preg_match() [function.preg-match]: Unknown modifier ‘]’

こうなる。

シングルクォーテーションとダブルクォーテーションの場合は Syntax Error 。

他のはスルーされた。

今回試したパターンで発見できたものだけなので
他にもあると思う。
 

バックスラッシュの場合

ちなみに、\ (バックスラッシュ、場合によっては円マーク)を文字列挙の最後にするときは

  1. 'rule' => array('custom', '/[^@-\\]$/i'),

とすると

preg_match() [function.preg-match]: Compilation failed: missing terminating ] for character class at offset 11

こうなってしまうので

  1. 'rule' => array('custom', '/[^@-\\\]$/i'),

こうするか、場所を変えたらちゃんと動作した。
 

独自メソッドによるバリデーション

The CakePHP 1.3 Book:4.1.5.2 独自のバリデーションメソッド
public $validate = array(
‘promotion_code’ => array(
‘rule’ => array(‘limitDuplicates’, 25),
‘message’ => ‘この販促コードは使い切りました。’
)
);

private function limitDuplicates($data, $limit)
{
$existing_promo_count = $this->find( ‘count’, array(‘conditions’ => $data, ‘recursive’ => -1) );

return $existing_promo_count < $limit; }[/php]

CakePHP | 2011-07-03 (日) 18:16:33 |

alias

Posted by muchag | CakePHP | 2011-07-02 (土) 23:42:37

alias なんていうプロパティがあることを発見。
達人の方々はすごい・・・。

【環境】
[CakePHP] 1.3.8
利用法
  1. $this->(モデル名)->alias = '(エイリアス名)';
  2.  
  3. $this->User->alias = 'u';

このように記述してやることで、以降エイリアス名にて指定可能になる。
 

name との差異

どこかの自動翻訳サイトで
name プロパティと alias プロパティの違い
なんていうテーマが載っていたけど
確かに SQL から見れば
CakePHP のモデル名もエイリアスになっている。
(結局違いはわからなかった・・・)
 

SQL 文

CakePHP の吐く SQL 文を見れば一目瞭然で

  1. FROM users AS 'User'

のような感じになっている。
 

レコードセット

抽出結果のレコードセットを見ても

  1. // name
  2. $result = $this->Model->find('first', $params);
  3. print_r($result);
  4.  
  5. // output
  6. Array
  7. (
  8.     [Model] ・・・
  9. )
  10.  
  11. // alias
  12. $this->Model->alias = 'm';
  13. $result = $this->Model->find('first', $params);
  14. print_r($result);
  15.  
  16. // output
  17. Array
  18. (
  19.     [m] ・・・
  20. )

こうなる。
 
もっと CakePHP の理解が進んだら
再び勉強してみようっと。
 

virtualFields との併用

マニュアルに virtualFields と併用する際の注意点が載っていた。
The CakePHP 1.3 Book:3.7.10.3 バーチャルフィールドとモデルのエイリアス

CakePHP | 2011-07-02 (土) 23:42:37 |

virtualFields

Posted by muchag | CakePHP | 2011-07-01 (金) 17:47:53

長い間欲しかった機能を見つけてしまった♪
モデルの virtualFields プロパティ。

1.3.x からの機能なんだそうな。

The CakePHP 1.3 Book:3.7.10 バーチャルフィールド

【環境】
[CakePHP] 1.3.8

参考元サイト:yuhei.kagaya バーチャルフィールド(モデルの$virtualFields プロパティ)が便利。

CakePHP | 2011-07-01 (金) 17:47:53 |

find

Posted by muchag | CakePHP | 2011-07-01 (金) 17:41:14

CakePHP で DB からデータの抽出を行うには
find メソッドを利用する。

以前のヴァージョンでは findAll など find に接尾辞が付いたメソッドがあったが
1.3.x では、抽出種別は第1引数に設定するようになった。

【環境】
[CakePHP] 1.3.10
書式

find($type, $params)

The CakePHP 1.3 Book:3.7.3.1 find

第1引数:抽出手法
第2引数:抽出条件配列
 

抽出手法
first

1件だけ欲しい場合
または
最初の1件が欲しい場合に用いる。

  1. $this->Model->find('first', $params);
  2. print_r($result);
  3.  
  4. // output
  5. Array
  6. (
  7.     [Model] => Array
  8.     (
  9.         [id] => 1
  10.         [content] => hoge
  11.     )
  12. )

 

count

レコード数(整数型)が戻ってくる。
 

all

全レコードが戻ってくる。
たとえ結果が1件でも 0 添字の付いた配列形式で戻ってくる。

  1. $this->Model->find('all', $params);
  2. print_r($result);
  3.  
  4. // output
  5. Array
  6. (
  7.     [0] => Array
  8.     (
  9.         [Model] => Array
  10.         (
  11.             [id] => 1
  12.             [content] => hoge
  13.         )
  14.     )
  15. )

 

list

セレクトボックス等に利用しやすいインデックス付きなんだそうな。
試していないのでよくわからない。
 

threaded

nest って書いてあるから入れ子式で戻してくれるみたい。

1回試してみたら
子モデルの外部キーカラム名を parent_id にしないといけないみたい(不確か)だったので
制限が鬱陶しくて all で統一しちゃってる。
 

neighbors

全く試していないので不明だけど
マニュアルを読む限り指定した行の前後を1行ずつ取ってくるみたい。
 

抽出条件
conditions

検索条件の設定。
WHERE 句の部分。
配列可。

1回 conditon として s を付け忘れてはまった・・・orz
 

order

ORDER BY 句の設定。
 

fields

抽出カラム名の設定。
SELECT 句の部分。
配列可。
 

joins

結合の設定。

まだ1例しか確認していないが
‘fields’ も設定しないと反応しないっぽい。
 

2モデル

Parent モデル、Child モデルに対して

  1. $params = array(
  2.     'joins' => array(
  3.         array(
  4.             'table' => 'children',
  5.             'alias' => 'c',
  6.             'type' => 'INNER',
  7.             'conditions' => array('parents.id = c.parent_id'),
  8.         ),
  9.     ),
  10. );

配列が 2段 であることに注意。

table は生のテーブル名なので
prefix を設定している場合は prefix も含める。
 

3モデル以上

A ━ B ━ C であろうが
A ┳ B
◇┗ C であろうが
並列でいけるようだ。
ちゃんと試していない。

Parent モデル、Child モデル、GrandChild モデルに対して

  1. $params = array(
  2.     'joins' => array(
  3.         array(
  4.             'table' => 'children',
  5.             'alias' => 'c',
  6.             'type' => 'INNER',
  7.             'conditions' => array('parents.id = c.parent_id'),
  8.         ),
  9.         array(
  10.             'table' => 'grand_children',
  11.             'alias' => 'g',
  12.             'type' => 'INNER',
  13.             'conditions' => array('c.id = g.parent_id'),
  14.         ),
  15.     ),
  16. );

 

種類

うっかり消してしまい出展を載せられないが
どこかのサイトで
LEFTINNER しか設定できない
と書いてあった。
試していないので、ただの覚書。
 

group

カラム名を指定して、当該カラムの重複データをまとめる設定。
GROUP BY 句の部分。

paginator と併用する場合には一工夫必要。
paginator.php GROUP BY との併用
 

limit

抽出レコード数上限値。
LIMIT 句の部分。
 

recursive

アソシエーションの階層数の設定。

デフォルトは 1 に設定されている。

  • -1 アソシエーション解除
  • 0 自分のみ
  • 1 1階層下位モデルまで
  • 2 2階層下位モデルまで
  • ・・・

 

callbacks

不明。

CakePHP | 2011-07-01 (金) 17:41:14 |

COUNT

Posted by muchag | CakePHP | 2011-06-30 (木) 20:22:54

COUNT は ‘fields’ なんだそうな。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

取得レコード数を返してくれる。
GROUP BY 句と絡めることで、条件毎のレコード数を返してくれる。

詳細は解説サイト参照。
 

基本

CakePHP で COUNT を利用するには
find メソッドで第2引数に設定する $options の ‘fields’ に設定する。

  1. $options = array(
  2.     'fields' => array(
  3.         'COUNT(*) AS "num"',
  4.     ),
  5. );

このように設定することで、取得レコード数を返す。

num の部分は任意。
但し、 (ダブルクォーテーション)等で括ることを忘れないこと。
(ダブルクォーテーションかどうかは、前後の引用符の用い方による)

DISTINCT とは異なり
Count のように小文字で記述しても動作した。

CakePHP | 2011-06-30 (木) 20:22:54 |

GROUP BY

Posted by muchag | CakePHP | 2011-06-30 (木) 20:02:03

GROUP BY は ‘group’ なんだそうな。
1つ1つルールがあるので
覚えていかねば・・・。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

GROUP BY カラム名
としてやることで当該カラムに重複して存在するデータのレコードをまとめてくれる。

DISTINCT 句と似ているが、GROUP BY は集計関数を併用できる。

詳細は解説サイト参照。
 

基本

CakePHP で GROUP BY を利用するには
find メソッドで第2引数に設定する $options の ‘group’ に設定する。

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5. );

 

COUNT

COUNT 句を併用するなら

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5.     'fields' => array(
  6.         'COUNT(*) AS "num"',
  7.     ),
  8. );

 

ORDER BY

更に、この COUNT 結果に ORDER BY 句を適用するなら

  1. $options = array(
  2.     'group' => array(
  3.         'User.family_name',
  4.     ),
  5.     'fields' => array(
  6.         'COUNT(*) AS "num"',
  7.     ),
  8.     'order' => array(
  9.         'num DESC',
  10.     ),
  11. );
CakePHP | 2011-06-30 (木) 20:02:03 |

DISTINCT

Posted by muchag | CakePHP,困ったTT | 2011-06-29 (水) 23:03:22

DISTINCT の使い方が難しい・・・。

【環境】
[CakePHP] 1.3.10
[MySQL] 5.1.41
機能

DISTINCT キーワードはカラム内の重複データを1つにまとめてくれるもの。

  1. SELECET DISTINCT family_name FROM users

とすると、同じ苗字のユーザがまとめられる。

その後集計を必要とするなら GROUP BY 句を用いるべき。

詳細は解説サイト参照。
 

基本

CakePHP で DISTINCT を利用するには
find メソッドで第2引数に設定する $options の ‘fields’ に設定する。

  1. $options = array(
  2.     'fields' => array(
  3.         'DISTINCT User.family_name'
  4.     )
  5. );

 

注意点
大文字で記述

DISTINCT キーワード自体は 全て大文字 で記述する。

Distinct と小文字で記述すると

SQL Error: 1054: Unknown column ‘Distinct User.family_name’ in ‘field list’

というエラーメッセージが出た。

参考元サイト:cakephperの日記 cakeのSQLでDISTINCTを扱う
 

先頭に記述

マニュアルを見ると

  1. array(
  2.     /* snip */
  3.     'fields' => array('Model.field1', 'DISTINCT Model.field2'), //フィールド名の配列
  4.     /* snip */
  5. )

The CakePHP 1.3 Book:3.7.3.1 find
と書いてあるが
ちょびろぐ:findでDISTINCTを使う際に注意すること
に書いてあるように、DISTINCT を 先頭 に設定しないと

SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘DISTINCT `User`.`family_name` FROM `users` AS `User`

というエラーメッセージが出る。
 

アソシエーション

DISTINCT を利用したいモデルにアソシエーションを設定しているときは
‘recursive’ = -1 を設定しないと重複をまとめてくれない。

具体的に試した内容は
User モデルに $hasMany プロパティを設定した状態ではNGだった。

‘recursive’ = -1 を設定したら希望通りに重複レコードをまとめてくれた。
 

複数カラムを取得できない

上述注意点を全てクリアしたものの、単一カラムは取得できても
複数カラムを設定するとエラーにはならなくても、まとめてくれない。

未解決。

CakePHP,困ったTT | 2011-06-29 (水) 23:03:22 |
次ページへ »