RSS
 

Archive for the ‘CakePHP’ Category

HABTMの注意事項

13 7月

CakePHP1.2でloadModelを使ってモデルを用意することがあるが、
その際予期していたクラスでなく、AppModelが入ってくることがある。

ひとつの原因として、綴りミスがある。
しかし綴りは合っているのにAppModelになってしまったり、
loadModelする場所によってAppModelになったりちゃんとしたクラスが呼び出されたりする。

この原因はHABTMにある場合がある。

たとえばposts, posts_tags, tagsというテーブルがあったとする。
この時、posts_controller.phpでは自動的にposts_tagsとtagsが初期化されるのだが、
この時連結であるposts_tagsがAppModelとして初期化されていた。
そのため、以後loadModelでPostsTagを呼びだすとAppModelとして返ってきてしまい、
PostsTagに宣言してあった関数などが呼び出せなくなったりしてしまう。
(すべての環境、バージョン等でそうかは知らない)

対処法としては、PostモデルのHABTM以外にhasManyとしてPostsTagを宣言しておけば良い。
ご注意を。

 
No Comments

Posted in CakePHP

 

携帯サイトその2

05 7月

以前、CakePHPでrender関数をオーバーライドして
自動的に携帯テンプレートを振り分ける方法を紹介した。
それにも関連するが、追加のプログラムを紹介。

	function _mb_render() {
		$this->layout = 'mobile';
		$output = $this->render();

		$contents = mb_convert_encoding($this->output, 'SJIS', 'UTF-8');
		echo $contents;
		exit;
	}

例えば上記は明示的に携帯サイトの出力を行ないたい場合などに便利。
最近のrender関数は返り値で出力内容を返してくれるようなので、
上記だけで全部済んでしまう。
mobileのlayoutのメタタグにはshift_jisと書いておく必要はあるが、
基本的に全部プログラムはテンプレートはutf-8で作ることが出来る。
(ただし、別途GETやPOSTの取得は手動でshift_jisからutf-8に変更したりは必要)

他にも、上記の方法を使ったりrender関数をオーバーライドしたりすることで、
携帯サイトだけでなくPC側のopensocial用のプログラムなどにも利用出来る。

{
    'html' : $output,
    'parameters' : $parameters,
}

みたいな感じのjsonを出力すれば
アプリケーション側では受け取ったhtmlをそのままinnerHTMLにいれるだけで
楽にアプリが作成可能。

 
No Comments

Posted in CakePHP

 

cronを使う

29 6月

以前、CakePHPにて別の方法でcronを使用する方法を書いていましたが、
バージョン1.2以降はシェル機能が付いているのでそちらを利用する方が正解です。
とりあえず一例だけ載せておきます。

vendors/shells/test.php

class TestShell extends Shell {
	var $uses = array('Test');

	function main() {
		$this->Test->find('all');
		echo 'finish';
	}
}
0 0 * * * cd /dir/at/app;php cake/console/cake.php test
 
No Comments

Posted in CakePHP

 

scripts_for_layoutとは?

21 3月

いつのまにやらlayoutにscripts_for_layoutという変数が出力されている。
これは何だろう?
viewを見てみると、addScriptというメソッドがある。
これを利用すれば良いようだが、どこで使うかが分からない。
調べてみると、各々のコンテンツの中で使えば
そのスクリプトがhead内に入るらしい。
例えば以下のように使う。
index.ctp

<h2>○○の一覧</h2>
<?php foeach… ?>
<?php endforeach ?>
<?php $this->addScript($javascript->codeBlock(’alert("alert in head!");)) ?>

すると出力時は

<html …>
<head>
 :
 :
<script type="text/javascript">alert("alert in head!");</script>
</head>
<body>
 :

という感じ。

追記となるが、上記は半分間違い。
実際にはJavascriptHelperのcodeBlock, linkメソッドやHtmlHelperのcssメソッドの引数で
その場に記述するかscripts_for_layoutsに記述するかを指定できる。
基本的にはそっちを使うべき。
ソースを見てみるとinlineがどうたらこうたらで指定するようなので一度ご確認を。

 
No Comments

Posted in CakePHP, php

 

cakephpのモデル

13 10月

モデルでreadしてもなぜかアソシエーションしているものが取れなかった。
よくよく調べてみると、モデルのファイル名を間違えて複数形にしていた。
しかしなぜかプログラムはちゃんと動いている。
つまり単純なモデルならばモデルファイルを作らなくても
良くなっているということだ。
知らないところで進化し続けているなあ。

 
No Comments

Posted in CakePHP

 

オリジナルのView

24 4月

CakePHPではViewにViewというクラスが用いられているが、
これはオーバーライドしたものを利用できる。

例えばSmartyViewを作りたい場合、
app/viewsにsmarty.phpという名前のファイルに
SmartyViewクラスを作成。
クラスの内容自体は関数をオーバーライドして適当に作ればいい。

あとはコントローラで
var $view = ‘Smarty’
と宣言すればいい。

気を付けなればいけないのが、
テンプレートの拡張子にctpもしくはthtmlを利用する場合、
Viewの_render関数をオーバーライドしても
勝手にView::_renderという感じでViewのものを呼び出されてしまう。
なのでテンプレートの拡張子をtplとかに変更するか、
_renderメソッドを呼び出しているところもすべて
オーバーライドする必要がある。

 
No Comments

Posted in CakePHP

 

フォームから配列で複数アイテムを使う

26 2月

CakePHP1.2ではフォームの作成にはhtmlヘルパーを使わず、
formヘルパーを使うようになった。
使い方は以下のような感じ。

< ?php
$form->create(’User’);
$form->input(’name’);
$form->end(’Submit’);
?>

1.1から移行した時はなんだか良く分からないなあと思うけど、
使っていくうちに$form->inputが色々出来ることに気付く。
誕生日なんかも$form->input(’birthday’, array(’type’ => ‘date’));
みたいな感じで出来るので面白い。
月が英語で出るのがやっかいだが。
例えば以下のようなデータ構造の場合。
User
- Item
- Item
- Item
このようにItemが複数ある場合もフォームで作れる。
もしかしたら1.2betaバージョン以降じゃないと駄目かもしれないが、
以下のように作成できる。

< ?php
$form->create(’User’);
$form->input(’name’);
$form->input(’Item/0/name’);
$form->input(’Item/1/name’);
$form->input(’Item/2/name’);
?>

これで
$this->data[’Item’]に複数のItemが入る。
色々出来るんだなあと思った。
後は、app_model.phpにそれようのバリデーション関数や
保存関数を加えておけばもっと便利に。

function insertList($rows) {
  foreach ($rows as $row) {
    $this->create($row);
    if (!$this->save()) return false;
  }
  return true;
}

みたいな感じ。

 
No Comments

Posted in CakePHP, php

 

userDefined

25 2月

CakePHPの1.2のバリデーションにuserDefinedというのがある。
これを利用すればフレームワークを汚さなくても
独自のバリデーションを加えることが可能。
具体的な使い方は以下の通り。
まずは特定のモデルもしくはapp_model.php等に
専用のバリデーション関数を追加する。
例えば以下のような関数。
function tel($data) {
return preg_match(’/¥d{2,4}-¥d{3,4}-¥d{4}/’) ? true : false;
}
そしてモデルのバリデーション設定には以下のように設定。
var $validate = array(
‘tel’ => array(’rule’ => array(’userDefined’, ‘User’, ‘tel’)),
);
配列の3つめに先ほどのtelを記入。
2番目はよく分からないけどモデル名を書いておけばよいと思う。
別のモデルのも使えるよと言うことだろうか。

ちなみに、モデル内にruleで指定するメソッドを定義しておけばそれでもいいらしい。

 
No Comments

Posted in CakePHP, php

 

DBコンフィグを動的に追加

19 4月

こんな感じの関数をモデルに追加。

function addDbConfig( $name, $host, $login, $password, $database )
{
    $manager =& ConnectionManager::getInstance();
    if( empty( $manager->config->{$name} ) )
    {
        $manager->config->{$name} = array(
            'driver' => 'mysql',
            'connect' => 'mysql_connect',
            'host' => $host,
            'login' => $login,
            'password' => $password,
            'database' => $database,
            'prefix' => '',
        );
        $manager->_connectionsEnum = array();
    }
}

さいごの代入は設定キャッシュのクリア。
使用する時は、

$this->MyModel->addDbConfig( 'test1', 'localhost', 'login', 'password', 'db' );
$this->MyModel->useDbConfig = 'test1';

のようにする。

 
No Comments

Posted in CakePHP

 

複数形

21 10月

モデルの名前を設定すると、
自動的にそれを複数形にしたテーブルが参照される。
例えばitem→itemsだし、
category→categoriesになる。
ただsをつけるだけじゃないようにちゃんと設定されている。

どこでそういうことをしているのだろうか見てみると、
inflector.phpのtableizeという関数で行われていた。
そこをよく見ると、
対応していない複数形も自分で設定できるらしい。

設定方法は、config/inflections.php
にどんどん設定を追加していけばいいらしい。

ちゃんとフレームワークをいじらなくても
動作を変更できるようになっている。

 
No Comments

Posted in CakePHP