Posts tagged ec
CakePHP Model::generateList メソッドの {n}
2CakePHP で select タグを生成する際に generateList メソッドをよく使います。
ちなみに使い方は下記の通りです。
$this->Model->generateList($conditions, $order,$limit, $keyPath, $valuePath);
$coditions :検索条件
$order :ソートの指定
$limit :取り出す数
$keyPath :配列のキーにするフィールド
$valuePath :配列の値にするフィールド
この $keyPath と $valuePath の指定方法が曲者で
{n}.Model.field
のようにモデル名の前に「{n}.」をつけなくては正しくデータを取得できません。
この「{n}」というのがなんなのかが気になり調べてみました。
詳しくは下記リンク先を参照していただくと分かります。
{n} ? – Cake PHP | Google グループ
以下実際に CakePHP のコードを調べてみたことをまとめます。
- generateList メソッドでは検索条件などによって findAll する
- findAll したデータから Set::extract メソッドを使用して該当するフィールドデータのみ抜き出す
- Set::extract メソッドは配列以外にもオブジェクトからも extract できるように設計されている
- 配列の場合はモデル名の前に「{n}」があるかどうかで判定している
という感じのようです。
ちなみに Set クラスは /cake/libs/set.php で定義されていて、コメントを見ると配列用のライブラリクラスのようです。
また、generateList で $keyPath, $valuePath を指定しなかった場合は下記のようになるようです。
- $keyPath には モデルで指定した $primaryKey を使用
- $primaryKey の指定がなければ ‘id’ フィールドを使用
- $valuePath には モデルで指定した $displayField を使用
- $displayField の指定がなければ ‘title’ フィールドが存在すれば ‘title’ フィールドを使用
- ‘title’ フィールドが存在しなければ ‘name’ フィールドを使用
- ‘title’ フィールドも ‘name’ フィールドも存在しなければ ‘id’ フィールドを使用
フィールド名の付け方も重要ですね。
CakePHP ファイルアップロードするコンポーネント
2CakePHP でファイルアップロードを簡単に行うコンポーネントです。
ReverseFolds – CakePHP File Uploads
データベースにファイル名、MIMEタイプ、サイズなどを記録し、ファイルは指定したディレクトリへアップロードするようになっています。
ビューにファイルアップロード用のタグを設置
<input type='file' name='userfile[]'/>
複数配置したいときは
<input type='file' name='userfile[]'/> <input type='file' name='userfile[]'/>
コントローラに使用するコンポーネントを追加
var $components = array('FileHandler');
アップロード処理
$this->FileHandler->setDebugLevel(1); $this->FileHandler->setRequired(0); $this->FileHandler->setHandlerType('db'); $this->FileHandler->setDbModel('FileUpload'); $uploadDir = 'path/to'; // アップロードするディレクトリを指定 if ($this->FileHandler->upload('userfile', $uploadDir)) { echo 'アップロード成功'; } else { echo 'アップロード失敗'; }
実際の処理などはリンク先からダウンロードしたファイルにコンポーネントの他に、ビュー、コントローラ、モデル、SQL と必要なものは入っているのでソースを見てみるとすぐに分かると思います。
アップロードされるファイルは $uploadDir で指定したディレクトリ内にユニークなディレクトリ名を作成してそのディレクトリ内に元のファイル名で保存してくれます。
その他のメソッド
アップロードできるファイルタイプを限定するメソッド
void setAllowedMime( array $mimeTypes )
ファイルの最大容量を設定するメソッド
void setMaxSize( int $size )
などもあります。
CakePHP Pagination まとめ
2CakePHP の Pagination に関してまとめてみました。
コントローラでコンポーネント、ヘルパーに Pagination を指定
// 使用コンポーネント名 var $components = array('Pagination'); // 使用ヘルパー名 var $helpers = array('Pagination');
コントローラの一覧表示するアクションでの一覧表示取得方法
$this->Pagination->modelClass = 'Model'; // 使用するモデル $this->Pagination->sortBy = 'created'; // デフォルトのソートするフィールド名 $this->Pagination->direction = 'DESC'; // デフォルトの昇順、降順を指定 $this->Pagination->show = 10; // 1ページに表示する件数 $conditions = array(); // 検索条件 list($order,$limit,$page) = $this->Pagination->init($conditions); $lists = $this->Model->findAll($conditions, $fields, $order, $limit, $page, $recursive);
ビューでのヘルパー使用準備
ビューで Pagination ヘルパーを使用できるようにする
< ?php $pagination->setPaging($paging); ?>
ビューでの総件数と表示している件数の表示
< ?php echo $pagination->result('検索結果:', '/', '?'); ?>件
上記のように指定すると「検索結果:1?10/5253件」と表示されます。
ソートするフィールドを変更するリンクを表示する
< ?php echo $pagination->sortBy('field_name', 'フィールド名', 'ModelName'); ?>
field_name にソートするフィールド名、
フィールド名にリンクに表示する名前、
ModelName にはフィールド名が属するモデル名
を指定します。
モデル名は $this->Pagination->modelClass と同じ場合には省略可能です。
また、sortBy メソッドは
veiws/heplers/pagination.php
function sortBy ($value, $title=NULL, $Model=NULL,$escapeTitle=true,$upText=' ^',$downText=' v')
のように定義されています。見て分かるとおり第5、6引数を指定することにより、ソートしたときのリンクのフィールド名につく「^」「v」の文字を変更することができます。
select タグによってソートを指定したいときは sortBySelect メソッドがあります。
function sortBySelect($sortFields, $t='Sort By: ',$upText=' ^',$downText=' v')
CakePHP 携帯でセションを有効にする
2CakePHP で携帯サイトの開発をしています。
ドコモなどはクッキーが使用できないのでセションID を URL で引き継がないといけないのですが、PC サイトではクッキーでセションID を保持したいところです。
携帯サイトと PC サイトが共存しているときの携帯用のビューを表示させる方法は下記が参考になります。
CakePHP 携帯用ビューを表示する | Shin x blog
また、携帯でのアクセス時にクッキーを使用せずにセション を保持するのは下記が参考になります。
Docomoとセッション フォーラム – CakePHP Users in Japan
私は上記の方法に
ini_set('session.use_trans_sid', 1);
を入れて使用しています。
全てのリンク、フォームにセションID が付加されるので便利です。
ただリダイレクトするときだけ、
$this->redirect('/controller/action/'.session_name().'='.session_id());
のようにセションIDを入れました。
あとビューを書くときに覚えておくとよいのが、ini_set(‘session.use_trans_sid’, 1); を指定したときにリンクを http:// から始まる URL を書くとセションID は当然ですが付加されません。相対パス、絶対パスなどの自サイト内へのリンクのみセションIDが付加されます。
自サイト内のリンクに http:// から書くとセションID が付かないのではまらないように。
SQL BLOB の容量を計算する方法
1OpenPNE のカスタマイズをしていて会員毎に画像容量の制限をする必要がでてきました。
quota を使用できれば簡単なのですが、OpenPNE は DB に バイナリデータとして画像を保存しているため使用できません。
そこで SQL で容量を計算する方法を考えました。
LENGTH 関数を使用して
SELECT LENGTH(blobカラム)
とすればバイト数を計算できます。
OpenPNE の場合は c_image というテーブルに画像データが格納されています。
そこで特定の会員の日記に使用した画像の容量を計算するのに下記のようにしてみました。
SELECT SUM(LENGTH(i.bin)) FROM c_image as i LEFT JOIN c_diary d ON(d.image_filename_1=i.filename OR d.image_filename_2=i.filename OR d.image_filename_3=i.filename) WHERE d.c_member_id=会員ID
得られる値は byte 数になります。
OpenPNE ユーザID からユーザ情報を取得するグローバル関数
1OpenPNE をカスタマイズしていてユーザID からユーザのニックネームなど簡単に取得できないかと調べてみると、色々なグローバル関数がありました。
openpne/webapp/lib/db/member.php 内で各種定義されています。
ユーザ情報のよく使う部分のみを取得する
- 関数名
- db_member_c_member4c_member_id_LIGHT($c_member_id)
- 引数
- int $c_member_id ユーザID
- 戻り値
- array ユーザ情報
引数はユーザ IDで、ユーザ情報が連想配列で戻されます。
array( 'c_member_id' => 'ユーザID', 'nickname' => 'ニックネーム', 'image_filename' => '画像ファイル名' )
ニックネームはそのままテンプレートで表示できます。
画像ファイル名は以前のエントリの「OpenPNE 画像の保存、表示方法」や「OpenPNE 画像を色々なサイズで表示する」を参考に表示させることができます。
ユーザ情報を取得する
bool $is_secure `c_member_secure`の項目を取得するかどうか
bool $with_profile `c_member_profile`の項目を取得するかどうか
string $public_flag プロフィール項目を取得する場合の公開設定(public, friend, private)
その他
まだまだ色々な関数があります。興味ある方はソースを調べてみるとよいかと思います。
OpenPNEでのSmarty の覚書
1「OpenPNE PHP で作成したプログラムを組み込む」で書いたように、
/openpne/webapp_ext/modules/pc/page/hoge_foo.php に
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
のようにすると ?m=pc&a=page_hoge_foo でアクセスできるようになります。
このときにどうやって Smarty に値を渡すのか少し戸惑ったのでメモしておきます。
Smarty タグ
通常は 「{」「}」 ですが、OpenPNE では 「({」「})」 です。
assign
$smarty->assign("var", $var);
のようにして Smarty に値を渡したいときは execute メソッド内で
$this->view->set("var", $var);
とすればOK。
display
$smarty->display("hoge_foo.tpl");
は自動的にやってくれます。
default_modifiers (escape)
また、OpenPNE の smarty オブジェクトはオブジェクト生成時に
$smarty->default_modifiers に escpae 修飾子が設定されているので、
テンプレート変数に HTML タグが設定されていて HTMLタグを出力したい場合は
({$var|smarty:nodefaults})
とすれば、escape 処理されずに出力されます。
私は HTML_QuickForm をよく使うので、form タグ関係を出したいことがありますので、その場合に使用しています。
OpenPNE PHP で作成したプログラムを組み込む
1OpenPNE PHP で作成したプログラムを組み込むときのメモです。
基本的に、/openpne/webapp_ext/ 以下に追加するファイルを置きます。
URLのパターン
OpenPNE の URL は下記のようになります。
- ?m=pc&a=page_hoge_foo
- ?m=pc&a=do_hoge_foo
携帯だと m=ktai とかになりますが、今回はPC のみ考えます。
page_hoge_foo のパターンはページを表示する
do_hoge_foo のパターンはモデルに対して処理を行う
page_hoge_foo でモデルに対して処理を行うこともできるが
MVC の意味がないかも。
?m=pc&a=do_hoge_foo のURL を追加する
/openpne/webapp_ext/modules/pc/do 以下に
hoge_foo.php を作成
hoge_foo.php
class pc_do_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
/openpne/webapp_ext/modules/pc/validate/do 以下に
hoge_foo.ini を作成
例えば ?m=pc&a=do_hoge_foo&id=10&no=20 のように id, no を GET で渡したい場合は
[id] type = "int" required = 1 [no] type = "int" required = 1
のように定義する。
こうしておくと do/hoge_foo.php 内で
$id = $requests["id"];
のようにバリデーションを通して値を取得できる。
?m=pc&a=page_hoge_foo のURL を追加する
/openpne/webapp_ext/modules/pc/page 以下に
hoge_foo.php を作成
hoge_foo.php
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
/openpne/webapp_ext/modules/pc/validate/page 以下に
hoge_foo.ini を作成
中身は do_hoge_foo の場合と同じ。
その他
/openpne/webapp_ext/lib
クラスファイルなどを置きました
自分で作成クラスをインクルードしたいときは /openpne/webapp_ext/lib
からインクルードします。
8月に読んだ本
18月に読んだ本のメモ
OpenPNE や XOOPS などを調査中なので、その関係の書籍を何冊か読みました。
「OpenPNEでつくる!最強のSNSサイト」はかなりよかったです。
もうひとつの「OpenPNEではじめる自作SNS入門」は少し初心者向けかも。
「XOOPSコミュニティサイト構築ガイド」はモジュールの自作方法も載っていてかなり参考になりました。