アーカイブ: 2008年8月

任意のファイルをビューに設定する

パーマリンク 2008/08/23 08:08:38 著者: cakephp メール
カテゴリ: ビュー, コンポーネント

CakePHP1.2 RC2

通常、ビューを呼び出すのは、何もしなくて良いです。
フレームワークの便利なところですね。

別のコントローラのビューを呼び出すことも可能です。
コントローラーから別のビューを呼び出す方法

さらに、任意のファイルを呼び出すこともできます。

$path = WWW_ROOT . 'sample.html';
$this->render(null, null, $path);

このように第3パラメータにファイルのパスを記述することで、そのファイルを呼び出すことができます。
(第1パラメータは Action 、第2パラメータは Layout)

PostgreSQL のINFORMATION_SCHEMAについて

パーマリンク 2008/08/21 19:14:53 著者: cakephp メール
カテゴリ: モデル, データベース, PostgreSQL

CakePHP1.2 RC2

開発中に debug の設定を 2 などにしておくとページを表示させる為に利用している SQL を出力してくれて大変便利です。
PostgreSQL を利用している場合、その SQL の一番上に表示される

SELECT table_name as name FROM INFORMATION_SCHEMA.tables WHERE table_schema = 'public';

などのスキーマに関する SQL の処理時間が結構かかります。

本番に導入した際にこんなに時間を取られては困るという場合は、debug を 0 にすれば解決します。
(本番環境では debug を 0 にするのは当然ですね)


この仕組みについてです。

スキーマ情報は app/tmp/cache/models/ 配下にキャッシュされるのですが、cake/libs/model/datasources/datasource.php を見てみると、

function __cacheDescription($object, $data = null) {
	if ($this->cacheSources === false) {
		return null;
	}
	if (Configure::read() > 0) {
		$expires = "+15 seconds";
	} else {
		$expires = "+999 days";
	}
	if ($data !== null) {
		$this->__descriptions[$object] =& $data;
	}

	$key = ConnectionManager::getSourceName($this) . '_' . $object;
	$cache = Cache::read($key, '_cake_model_');

	if (empty($cache)) {
		$cache = $data;
		Cache::write($key, $cache, array('duration' => $expires, 'config' => '_cake_model_'));
	}

	return $cache;
}

デバック情報が 0 でない場合は、キャッシュの有効期間が15秒とあります。
これの影響で、ページを表示する度にスキーマの SQL が呼ばれていたという訳です。

一方、デバック情報を 0 とした場合、有効期間が999日になっているので、毎回スキーマの SQL が呼ばれなくなります。

これで安心して本番導入できます。

#本番環境ではスキーマ情報が保持され続けるので、テーブルの構造を途中で変えたような時は、このキャッシュを削除しないと反映されないので注意しましょう。

Cookieの使い方

パーマリンク 2008/08/21 17:13:56 著者: cakephp メール
カテゴリ: コンポーネント, コントローラー

CakePHP1.2 RC2

Cookieの使い方です。

サイト全体で行う時は、app/app_controller.php に処理を入れます。

class AppController extends Controller
{
    var $components = array('Cookie');

    function beforeFilter()
    {
        $value = 'sample';
        // 書き込み
        $this->Cookie->write('cooking', $value);
    }
}


write のパラメータについての補足。

$this->Cookie->write('cooking', $value, false);

クッキー情報が暗号化されません。

$this->Cookie->write('cooking', $value, false, '10 Days');

クッキー保持期間を10日間に設定できます。


また、クッキーの名称は上記の例では、
CakeCookie[cooking]
となり、"CakeCookie"の部分を変更するには、beforeFilter 内で

$this->Cookie->name = 'Cookie';

とすることで変更できます。



CakePHP1.1

1.2 の Cookie コンポーネントをコピーして利用することができます。
ただし、内部で 1.2 の設定である Security.salt を呼び出している箇所があるので、その付近を修正する必要があります(暗号化が必要な場合)。
暗号化が必要でない場合は、1.2 の時と同様に第3引数に false を与えることで、そのまま利用することができます。

ファイルの存在確認

パーマリンク 2008/08/20 16:12:00 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

ファイルに関する色々な処理(存在確認、読み書きなど)、Fileオブジェクトを利用すると簡単にできます。
cake/libs/file.php に色々と用意されています。

DocumentRoot 配下に sample/hoge.php ファイルがあるかどうかをチェックするには、

$path = WWW_ROOT . 'sample' . DS . 'hoge.php';
$file = new File($path);
if ($file->exists()) {
    e('あるよ!');
} else {
    e('ない?');
}

登録したデータを1処理内でもう一度取得する

パーマリンク 2008/08/12 13:36:00 著者: cakephp メール
カテゴリ: コントローラー

登録・更新したデータを1つの Action の処理内でデータを取得しようとすると、CakePHP1.1 ではクエリーがキャッシュされるので、取得できません。
取得するには、

CakePHP1.1

$this->Sample->cacheQueries = false; 

Sample モデルに対するキャッシュを保存したくなければ、コントローラでこのように指定することで対応できます。


CakePHP1.2 RC2

1.1 とは違い、デフォルトの設定が保存しないになりましたので、逆に保存したい場合は、下記のように記載します。

$this->Sample->cacheQueries = true; 

Validationのbetweenの注意点

パーマリンク 2008/08/11 12:01:09 著者: cakephp メール
カテゴリ: モデル

CakePHP1.2 RC2

バリデーションの rule の一つである between を使うときの注意点。

使い方

'sample' => array(
    array(
        'rule' => array('between', 10, 20),
    ),
),


このように Model に書くのですが、なんとなく sample が最小値(10)と最大値(20)の間の値かどうかをチェックしてくれそうですが、実際はバイト数が最小値と最大値の間に入っているかのチェックが行われます。

cake/libs/validation.php

function between($check, $min, $max) {
    $length = strlen($check);

    if ($length >= $min && $length <= $max) {
        return true;
    } else {
        return false;
    }
}

特定のURLのみSSL接続を必須にする方法

パーマリンク 2008/08/08 15:27:55 著者: cakephp メール
カテゴリ: コンポーネント, コントローラー

CakePHP1.2 RC2

SSL接続を必須にするには Security コンポーネントを利用します。

class SampleController extends AppController
{
    var $components = array('Security');

    function beforeFilter()
    {
        // エラー時の呼び出し関数指定
        $this->Security->blackHoleCallback = '_sslFail';
        // 全アクションを SSL の対象にする
        $this->Security->requireSecure();
    }

    /**
     * SSL呼び出しエラー処理
     */
    function _sslFail($err)
    {
        if ($err === 'secure') {
            $this->redirect('https://**********.com/sample/');
        }
    }
}

上記のように requireSecure を空欄で呼び出すと、コントローラー内の全アクションが SSL の対象になります。
アクション名を指定することで、個別に対象とすることができます。


【注】
form で次ページにデータを渡す時に、hidden=0の値を渡そうとすると、内部のチェックで整合性がとれなくて上記の
$err に auth が渡されて、正常に機能しません。
参考: hidden値=0の時の、Securityコンポーネントチェック

Qdmailで日本語のメール送信

パーマリンク 2008/08/07 15:46:52 著者: cakephp メール
カテゴリ: コンポーネント, コントローラー

CakePHP1.2 RC2

CakePHP でメールを送信する機能は色々な方が作成されていますが、今回は Qdmail を利用してみました。

参考:使い方 CakePHPでのメール送信 - Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte

1.ダウンロード

こちらより最新版をダウンロードします。

2.設置

app/controllers/components/ 配下にダウンロードした qdmail.php を設置します。

3.ソースを書く

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

<php
class SampleController extends AppController
{
    var $components = array('Qdmail');

    function index()
    {
        $this->Qdmail->to('to@example.com', 'お客様');
        $this->Qdmail->from('from@example.com', '管理者');
        $this->Qdmail->subject('ご利用ありがとうございます');
        $this->Qdmail->cakeText($contents, 'sample1', 'sample2', null, 'iso-2022-jp');
        $this->Qdmail->send();
    }
}

(※エレメントが文字化けしてしまう場合は、cakeText の第5パラメータで iso-2022-jp を指定)

そして、メールの本文をエレメント( app/views/elements/email/text/sample1.ctp )で用意します。
同様にレイアウト( app/views/layouts/email/text/sample2.ctp )も用意します。

これだけで送信できます。

ただし、内部的に mail 関数が呼ばれているので、SafeMode 環境化で利用すると、第5パラメータを指定している部分でエラーとなります。
↑こちらは1.1.1bバージョンにて解消して頂けました。(2008/9/11 追記)
詳しくはこちら

【その他】
ヘッダーの追加

$this->Qdmail->addHeader('Return-Path', 'sample@example.com');


BCC

$this->Qdmail->bcc('bcc@example.com');


2008/9/4 追記
一つのアクション内で異なるメールを送信する場合、一度設定をクリアーするのを忘れないように。

$this->Qdmail->reset();

これをやっておかないと、1つ目のメールで BCC を設定して、次のメールで BCC の設定をしなくても、一つ目の BCC の設定が生きたままになってしまいます。(当たり前ですね)

リファラーの取得方法

パーマリンク 2008/08/06 15:51:09 著者: cakephp メール
カテゴリ: コントローラー

CakePHP1.2 RC2

リファラーを取得するには、これで出来ます。

$this->referer();

参考:RequestHandlerコンポーネントのgetReferrerについて[CakePHP] YARETOKO「ヤレトコ」メインブログ

入力フォームが複数ページある時のValidateの方法

パーマリンク 2008/08/05 15:06:22 著者: cakephp メール
カテゴリ: モデル, コントローラー

CakePHP1.2 RC2

ページ内にある項目について入力チェックを行いたい場合は、Model の $validate にあれこれと書くことで入力チェックを行うことが出来ます。

【参考】
バリデーション 
Validateで新規登録と更新時の処理を分ける方法 
Validateのエラーメッセージを複数書いた時に最初のメッセージを出す方法 

1ページ内に全ての項目があれば良いのですが、複数ページに入力項目がある場合、$validate に予め記載して、1ページ目の時点で入力チェックを行ってしまうと、2ページ目にある項目のチェックに引っかかりエラーとなってしまいます。

その対処方法。

Model の $validate は全ての項目について記載しておきます。
ですが、1ページ目の入力チェックを行う場合に2ページ目の項目のチェックを外します。

unset($this->Sample->validate['name']);

name という項目の入力チェックを外す場合は、コントローラで上記のように unset してあげれば対応できます。

2008年8月
 << < 現在> >>
          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 software