アーカイブ: 2008年7月

redirectの後にexitはいらない

パーマリンク 2008/07/31 16:29:14 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

$this->redirect('/');

CakePHP1.1 ではこの後に exit; が必要でしたが、これからは内部的にやってくれるので、書かなくて良くなります。

Sessionの有効期限を個別に持たせる方法

パーマリンク 2008/07/30 16:33:39 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

Session を利用する場合、有効期間は app/config/core.php に書かれた、

Configure::write('Session.timeout', '120');

Configure::write('Security.level', 'high');

が影響してきます。
上記の場合は、120秒×10=20分が有効期間となります。

サイト全体で期間の変更を行いたい時は、上記の2つの何れかを変更することで対応できます。

しかし、特定のページのみ有効期間を変えたいといった場合は、各コントローラーに

function __construct() {
    Configure::write('Security.level', 'low');
    Configure::write('Session.cookie', 'sample');
    Configure::write('Session.timeout', 120);
    parent::__construct();
} 

このように書くと、このコントローラーのみ有効期間が120秒×300=10時間となります。

特定のコントローラーのみデバック情報を表示させる方法

パーマリンク 2008/07/29 17:04:02 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

サイトを公開する際に、app/config/core.php の debug は 0 にしますが、

Configure::write('debug', 0);


公開後、本番環境だけでどうしてもうまくいかないような場合がたまにあるかもしれません。
そんな時は、開発環境のようにデバック情報が表示されると、効率よく対応できそうならば、そのコントローラーのみデバック情報を表示させてしまいましょう。
方法は、該当のコントローラー内で

Configure::write('debug', 2);

と書くだけです。
(くれぐれも稼動中のコントローラーでやるのはやめましょう。
その場合は、コピーを作って、そちらでデバック情報を出しましょう。)

キャッシュの基本

パーマリンク 2008/07/28 16:49:16 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

キャッシュを書き込むには、

Cache::write('data', $data);


キャッシュを読み込むには、

$cache_data = Cache::read($data);
$cache_data = Cache::read('data');

[2008/8/27 修正]
$data は上記の書き込む時の $data とは別もので、動的に read で読み込む値を変えるのを想定して $data という変数を指定しておりました。
分かり難いので、修正しました。
蟹さん、ありがとうございます。



ファイルキャッシュの場合、通常 app/tmp/cache/ 配下にファイルが作成されます。
このパスを変更したい場合は、

Cache::config('default', array('engine' => 'File', 'path' => CACHE . 'sample' . DS));


キャッシュの有効期限は下記のように設定します。

Cache::set(array('duration' => '+1 day'));

コンポーネントでモデルを呼ぶ方法

パーマリンク 2008/07/25 16:56:17 著者: cakephp メール
カテゴリ: モデル, コンポーネント

CakePHP1.2 RC2

Model 名が Sample の場合、

App::import('Model', 'Sample'); 

これでコンポーネントでモデルが使えるようになります。

Validateのエラーメッセージを複数書いた時に最初のメッセージを出す方法

パーマリンク 2008/07/24 17:01:16 著者: cakephp メール
カテゴリ: モデル

CakePHP1.2 RC2

'mail' => array(
    array(
        'rule' => VALID_NOT_EMPTY,
        'required' => true,
        'message' => '入力してください'
    ),
    array(
        'rule' => array('email'),
        'message' => 'メールアドレスが正しくありません'
    ),
),

上記のように一つの項目に対して、複数の rule を指定している場合でも、入力が何もないときには、「入力してください」というメッセージが出て欲しいところですが、「メールアドレスが正しくありません」と表示されます。
(メッセージが上書きされて、最後のメッセージが表示されます)

「入力してください」を表示するには、

'mail' => array(
    array(
        'rule' => VALID_NOT_EMPTY,
        'required' => true,
        'last' => true,
        'message' => '入力してください'
    ),
    array(
        'rule' => array('email'),
        'last' => true,
        'message' => 'メールアドレスが正しくありません'
    ),
),

上記のように「'last' => true,」を追加すると、それぞれのメッセージで処理が止まるので、期待通りの動作になります。

Validateで新規登録と更新時の処理を分ける方法

パーマリンク 2008/07/23 16:14:09 著者: cakephp メール
カテゴリ: モデル

CakePHP1.2 RC2

新規登録時と更新時で validate の内容を使い分けたい時は

'name' => array(
    array(
        'rule' => VALID_NOT_EMPTY,
        'required' => true,
        'on' => 'create',
        'message' => '入力してください。'
    ),
),

という感じで 'on' => 'create' を追加すれば新規登録時のみチェックを行います。
create の部分を update に変更すると、更新時のみチェックを行います。

IPアドレスの取得方法

パーマリンク 2008/07/22 07:20:01 著者: cakephp メール
カテゴリ: コンポーネント, コントローラー

CakePHP1.2 RC2

RequestHandlerコンポーネントのgetClientIPを呼び出すだけで取得できます。

    var $components = array('RequestHandler');

    function index() {
        $ipaddress = $this->RequestHandler->getClientIP();
    }

ラジオボタンの作り方

パーマリンク 2008/07/18 16:29:17 著者: cakephp メール
カテゴリ: ヘルパー, ビュー

CakePHP1.2 RC2

<?php e($form->radio('Sample/flg', array('0' => 'なし', '1' => 'あり'))); ?>

これだけでラジオボタンが作成できます。

デフォルトで LEGEND タグを付けてくれますが、外したい場合は、

<?php e($form->radio('Sample/flg', array('0' => 'なし', '1' => 'あり'), array('legend' => false))); ?>


デフォルトで選択状態にしたい場合は、

<?php e($form->radio('Sample/flg', array('0' => 'なし', '1' => 'あり'), array('value' => '1'))); ?>

とすると、「あり」が選択されます。


ラジオボタンを複数並べる時に縦並びにしたい場合は、

<?php e($form->radio('Sample/flg', array('0' => 'なし', '1' => 'あり'), array('separator' => '<br>'))); ?>

とすると、改行されて表示されます。


CakePHP1.1 ではラジオボタンのテキスト部分をクリックしても選択された状態にならなかったのですが、1.2 ではデフォルトでテキストをクリックした時に、そのラジオボタンが選択された状態になっています。

空を許可しない値のバリデーション時の注意点

パーマリンク 2008/07/16 16:31:46 著者: cakephp メール
カテゴリ: モデル

CakePHP1.2 RC2

バリデーションの基本は「バリデーション」を参考にしてください。


空の許可を与えない場合に

'rule' => VALID_NOT_EMPTY

と書くだけで一見問題ない動作をしますが、正常なフォームから呼ばれなかった場合など、この値自体が渡されなかった時には、これだけだとスルーしてしまいます。

そこで、空は通さない値の時は、上記に加え、

'required' => true

も追加するようにしましょう。

条件付きでのページ送り機能

パーマリンク 2008/07/12 10:33:59 著者: cakephp メール
カテゴリ: ヘルパー, ビュー, コントローラー

CakePHP1.2 RC2

ページ送りの基本については「ページ送り機能1.2 RC2(基本版)」をご覧ください。



View の「戻る」に条件を追加します。

<?php e($paginator->prev('戻る', array('url' => array('keyword' => urlencode($keyword))))); ?>



1 | 2 | 3 | 4 などのページ番号のリンクに条件を追加します。

<?php
    e($paginator->numbers(
                    array(
                        'separator' => '&nbsp;',
                        'modulus' => 14,
                        'url' => array('keyword' => urlencode($keyword))
                    )
                  ));
?>



あとは、Controller 側で $keyword に値をセットすることで、ページ送りの各リンクが ~/keyword:{$keyword} という感じになります。
※"keyword"という文字列は任意文字列

LIKE 文の作成方法

パーマリンク 2008/07/11 15:49:01 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

下記の様に、like を key に記載し、value を % で囲めばできます。

$conds = array(
            'name like' => '%hoge%'
         );
$data = $this->Sample->findAll($conds);

FormHelper#create()の動作

パーマリンク 2008/07/09 15:36:55 著者: cakephp メール
カテゴリ: ヘルパー, ビュー

CakePHP1.2 RC2

Form タグを生成する View の書き方はこの通り。

<?php e($form->create(null, array('action' => 'edit'))); ?>


実際には、このようなタグが生成されます。

<form id="SampleEditForm" method="post" action="/samples/edit">
<fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /></fieldset>


データの変更画面などで、Controller において $this->data にデータを渡してあげると、View の書き方は上記のままで、

<form id="SampleEditForm" method="post" action="/samples/edit/10">
<fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /></fieldset>

というように、action 部分に id が自動で付加されます。

tagValueからvalueに変更

パーマリンク 2008/07/08 11:51:36 著者: cakephp メール
カテゴリ: ヘルパー, ビュー

CakePHP1.2 RC2

View に Model から取得したデータを出力する時、CakePHP1.1 では

<?php e(h($html->tagValue('Sample/name'))); ?>

としていたのですが、CakePHP1.2 RC2 ではそれを使うことが出来ません。

ですので、下記のように変更しましょう。

<?php e(h($html->value('Sample/name'))); ?>

バリデーション

パーマリンク 2008/07/07 16:57:22 著者: cakephp メール
カテゴリ: モデル, ビュー, コントローラー

CakePHP1.2 RC2

CakePHP1.2 ではバリデーション機能が充実されましたので、より使いやすくなったと思います。

Controller
バリデーションを呼び出します。

if ($this->Sample->validates()) {
}


Model

<?php
class Sample extends AppModel
{
    var $validate = array(
        'name' => array(
            array(
                'rule' => 'ruleName',
                'message' => 'ルールに従って入力してください。'
            ),
            array(
                'rule' => array('customFunc', 'hoge'),
                'message' => '正しくありません。'
            ),
        ),
        'memo' => array(
            array(
                'rule' => 'ruleName',
                'message' => 'ルールに従って入力してください。'
            ),
        ),
    );

    /**
     * カスタムチェック
     */
    function customFunc($value, $param)
    {
        if (・・・・・・・・) {
            return false;
        }
        return true;
    }
}

ruleName に当たる部分の内容がとても充実しています(詳しくはこちら)が、それ以外のチェックを行いたい場合は、customFunc のように自由に function を作成し、rule から呼び出すことが出来ます。
$value には $this->data のデータが配列で入ってきます。


View

<?php e($form->error('Sample/name')); ?>

モデルで設定したメッセージを表示させたい箇所に上記のように記載します。

ページ送り機能1.2 RC2(基本版)

パーマリンク 2008/07/04 09:46:30 著者: cakephp メール
カテゴリ: ヘルパー, ビュー, コントローラー

CakePHP1.2 RC2

CakePHP1.2 からは標準でページ送り機能がついています。

まずは、コントローラーに下記のように記載します。

function index()
{
    $option = array(
                'conditions' => array(
                                    'flg' => '0'
                                ),
                'limit' => 20,
                'order' => array(
                            'created' => 'desc'
                           )
              );
    $this->paginate = $option;
    $data = $this->paginate();
    $this->set(compact('data'));
}

$option で条件や表示件数やソートなどの指定をします。


次に、ビューの書き方です。

戻る・次へのリンク

<?php e($paginator->prev('戻る')); ?>
<?php e($paginator->next('次へ')); ?>



1 | 2 | 3 | 4 などのページ番号のリンク

<?php
    e($paginator->numbers(
                    array(
                        'separator' => '&nbsp;',
                        'modulus' => 14,
                    )
                  ));
?>

modulus は表示させるページ数(現在の表示ページは除く)


上記との関連でこの先のページもある事を示す「...」の表示

<?php
    //現在のページ数-modulus/2 > 1
    if ($paginator->counter(array('format' => '%page%')) - 7 > 1) {
        e('...');
    }
?>
<?php
    //現在のページ数+modulus/2 < トータルページ数
    if ($paginator->counter(array('format' => '%page%')) + 7 < $paginator->counter(array('format' => '%pages%'))) {
        e('&nbsp;');
    }
?>


これだけでページ送り機能が実現できます。

ですが、特に管理画面などで同じようなページ送り機能が必要な場合に毎回これを書くのは面倒です。

そこで、app/views/elements/paginator.thtml を作成し、そこに上で書いたコードを全て記述します。
そして、ビュー側は作成したエレメントを呼び出すだけにします。

<?php e($this->element('paginator')); ?>

ビューがシンプルになりました。


関連記事

Formヘルパーをより簡単に記述する方法

パーマリンク 2008/07/03 16:26:10 著者: cakephp メール
カテゴリ: ヘルパー

CakePHP1.2 RC2

<?php e($form->input('id')); ?>

普通に input タグをこのように書くと、自動で label や div が付いてきます。
それを付けないようにするには、

<?php e($form->input('id', array('label' => false, 'div' => false))); ?>

このように書くと付きません。
ですが、ほとんどの input タグで付かなくて良い場合には、毎回書くのは面倒です。

そこで下記の様に Form ヘルパーを変更することで手間を省けます。

[app/views/helpers/form.php]

function input($fieldName, $options = array()) {
    :
    :
    $options = array_merge(array('before' => null, 'between' => null, 'after' => null), $options);

    /**
     * 以下、追加内容
     */
    // label 非表示設定(デフォルト)
    if (!isset($options['label'])) {
        $options = array_merge(array('label' => false), $options);
    }
    // div 非表示設定(デフォルト)
    if (!isset($options['div'])) {
        $options = array_merge(array('div' => false), $options);
    }

CakePHP1.2のビューの拡張子

パーマリンク 2008/07/03 11:01:52 著者: cakephp メール
カテゴリ: ビュー

CakePHP1.1 の時は、ビューの拡張子が .thtml でしたが、CakePHP1.2 になってからは、.ctp となりました。
新規で作成する場合は良いのですが、CakePHP1.1 からの移行を行うとなると、拡張子を変更しなければならないです(もちろんそれ以外の問題も沢山ありますが・・・・)。


と思っていましたが、CakePHP1.2 RC2 では .thtml でも問題なく動作しました(デフォルトは .ctp です)。
これでCakePHP1.1 からの移行もより簡単になりそうですね。

テスト環境でのDBの切り替え方

パーマリンク 2008/07/02 17:31:53 著者: cakephp メール
カテゴリ: データベース

データベースの接続情報は app/config/database.php に記載するのですが、ここの値を本番環境とテスト環境で書き換えるのは手間ですし、間違ってアップしてしまう可能性もあるので、できればやりたくありません。

そんな時には、CakePHP 環境に応じてDBの設定を変えるが参考になります。

色々な方法が紹介されていますが、下記の方法がやりやすいかなと思います。

1.httpd.conf に下記の内容を追加

SetEnv CAKE_DB_CONFIG test


2.app/app_model.php に下記の内容を追加

<?php
class AppModel extends Model
{
    function __construct($id = false, $table = null, $ds = null)
    {
        $this->useDbConfig = empty($_SERVER['CAKE_DB_CONFIG']) ? $this->useDbConfig : $_SERVER['CAKE_DB_CONFIG'];
        parent::__construct($id, $table, $ds);
    }
}


これでサーバー側で利用する DB の接続情報を判断して取得してくれるので、開発側としては意識せずに取り組めます。

日付フォーマットヘルパー

パーマリンク 2008/07/01 16:40:32 著者: cakephp メール
カテゴリ: ヘルパー

日付のフォーマットヘルパーです。

app/views/helpers/html.php(ない場合はcakeからコピー)に下記の内容を追記します。

function dateFormat($date,$format = "Y年m月d日") {
    return date($format,strtotime($date));
}
function df($date,$format = "Y年m月d日") {
    return $this->dateFormat($date,$format);
}

※df は dateFormat の省略形式

呼び出すビュー側は下記の通りです。

<?php e($html->df($date)); ?>


頻繁に利用するフォーマットは予め用意しておくと便利ですね。

例えば、こんな感じで。

function dateFormat($date, $format = "Y年m月d日") {
    if (empty($date)) {
        return false;
    }
    return date($format, strtotime($date));
}
function dfj($date, $format = "Y年m月d日") {
    return $this->dateFormat($date, $format);
}
function df($date, $format = "Y/m/d") {
    return $this->dateFormat($date, $format);
}
function dtfj($date, $format = "Y年m月d日 H:i:s") {
    return $this->dateFormat($date, $format);
}
function dtf($date, $format = "Y/m/d H:i:s") {
    return $this->dateFormat($date, $format);
}
function dmfj($date, $format = "Y年m月d日 H:i") {
    return $this->dateFormat($date, $format);
}
function dmf($date, $format = "Y/m/d H:i") {
    return $this->dateFormat($date, $format);
}
function tmf($date, $format = "H:i") {
    return $this->dateFormat($date, $format);
}




参考:CakePHP::date形式の日付を年月日形式に変換するヘルパー
参考:日付のフォーマット文字列

2008年7月
 << < 現在> >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

CakePHPに関する情報をまとめていきます。

開発スピードがアップできればうれしいです。

>>連絡はこちらへどうぞ



CakePHP最新版
CakePHP 1.2.3.8166


CakePHPの書籍

CakePHPによる実践Webアプリケーション開発

CakePHP1.2で作成する人にオススメ。
とても参考になります。

まるごとPHP!(vol.2)

安藤さんの解説が載っています。
AmazonのPagination部分は参考になります。

CakePHPによるWebアプリケーション開発

まだ読んだことありません

CakePHPポケットリファレンス
CakePHPポケットリファレンス
CakePHP1.2 でやるなら、これがあると何かと便利♪

CakePHP徹底入門
CakePHP徹底入門
CakePHP1.2 を今から始めるならここから

Fast CakePHP
Fast CakePHP
シンプルでわかりやすい CakePHP の入門書

CakePHPガイドブック
CakePHPガイドブック
CakePHP1.1 ではとても参考にした CakePHP 最初の入門書

検索

XMLフィード

16ブログ     open source blog tool