Home > PHP > CakePHP

CakePHP Archive

CakePHP 携帯用ビューを表示する

この記事の所要時間: 245

サイトにPC用と携帯用がある場合、PC用とは別に携帯用の表示を行う方法です。この方法なら同じコントローラ・アクションで、レイアウトとビューファイルを変更することができます。なお携帯版のURLは[/m/]で始まるようにします。

1.URLルーティングを設定する。

[app/config/routes.php]で[/m/]からURLが始まる場合にwebservicesとして扱うように設定します。

[app/config/routes.php]

<?php
(snip)
$Route->connect('/m/:controller/:action/*', array('webservices' => 'Mobile'));
?>

2.WEBSERVICESを有効にする。

webservicesがフレームワーク内でサポートされるように設定を変更します。

[app/config/core.php:123行目付近]

/**
 *  The define below is used to turn cake built webservices
 *  on or off. Default setting is off.
 */
define('WEBSERVICES', 'on'); // off から on にします。

3.携帯用コンポーネント、ヘルパーを設置する。

携帯用コンポーネント、ヘルパーを設置します。これは単に表示を変えるだけなら不要なのですが、1.でwebservicesとして動作するように設定しているので必須となります。(クラス内はとりあえず空で良いです)

[app/controller/components/mobile.php]

<?php
class MobileComponent extends Object
{
}
?>

[app/views/helpers/mobile.php]

<?php
class MobileHelper extends Object
{
}
?>

4.携帯用レイアウト、ビューファイルを設置する。

携帯用レイアウト、ビューファイルを[app/views/layouts/mobile][app/views/%controller_name%/mobile]に設置します。双方ともmobile/ディレクトリ以下に設置するのがミソです。

これで[/post/index]にアクセスすればPC版のレイアウト・ビューファイルが、[/m/post/index]にアクセスすれば携帯版のレイアウト・ビューファイルが表示されるようになります。

>>

なぜwebservicesとして扱うか?

CakePHPには一つのコントローラ、アクションでrssやxmlといった多種の出力形式をサポートする機能があります。これがWEBSERVICESです。前出のrssやxmlはフレームワークで定義されているのですが、携帯用と思われるものはありませんでした。そこでroutes.phpのルーティング情報に携帯用を定義する方法を取っています。

この方法の良いところは、レイアウト・ビューファイルの切り替えはフレームワーク側でやってくれるのでコントローラ側では何も意識する必要が無い点です。悪い点はURLが[/m/~]になってしまう点でしょうか。
URLが[/m/]ではじまるのが気になる場合は、mod_rewriteで携帯からのアクセスの場合は自動的に[/m/]へ飛ばす設定にしておく、という方法もありです。

CakePHP 管理者用アクション

この記事の所要時間: 424

CakePHPでは一つのコントローラの中に通常のアクションと管理者用アクションとを定義できます。例えばコントローラ名がpostの場合、URLは以下のようになります。

・通常
 http://www.example.com/post
・管理者用
 http://www.example.com/admin/post

この機能を使う手順は以下になります。

1.CAKE_ADMINを有効にする

app/config/core.phpのCAKE_ADMIN定義を有効にします。(デフォルトはコメントアウトされている)

/**
 * Uncomment the define below to use cake built in admin routes.
 * You can set this value to anything you want.
 * All methods related to the admin route should be prefixed with the
 * name you set CAKE_ADMIN to.
 * For example: admin_index, admin_edit
 */
define('CAKE_ADMIN', 'admin'); // 有効にする

この’admin’という値を見て、勘の良い人ならばお気づきだと思います。実はURLやアクション名のadminはこの値を参照しています。もしadminから他のワードに変更すればURL、管理者アクション名・ビューファイル名を変更できます。(ex. maintenanceなら、URLが/maintenance/posts、アクション・ビューファイル名がmaintenance_indexになります。)

2.管理者アクションをコントローラに記述する

管理者アクションをコントローラに記述します。アクション名は[admin_ + %アクション名%]になります。

[app/post_controller.php]

class PostController extends AppController {
  function index()
  {
    // 通常のアクション
  }

  function admin_index()
  {
    // 管理者用アクション
  }
}

3.管理者アクションビューを設置する

2.で記述した管理者アクションに関連づけられるビューファイルを設置します。ビューファイル名はアクションと同じく[admin_ + %アクション名%.thtml]となります。

[app/views/post/admin_index.thtml]

<h2>管理者用アクション</h2>

以上で管理者アクションが動作するようになります。

>>

管理者用画面はたいてい通常画面とは異なるレイアウトになるので、レイアウトも管理者用画面に変更します。

4.管理者用レイアウトを設置する

管理者用レイアウトファイルを作成し、app/views/layoutsにadmin.thtmlのファイル名で設置します。

5.管理者用レイアウトを呼び出す

レイアウトはcontrollerの$layoutで設定されているで、管理者用レイアウトを表示するにはこの値を変更します。管理者用アクション内で設定しても良いのですが、各コントローラのアクション毎に記述するのは非効率です。そこで親クラスのAppControllerに記述しておきます。以下のようにbeforeRender内に書いておけば、アクション内には特別な記述は不要です。(なおbeforeRenderは画面生成前に呼ばれます)

[app/app_controller.php]

class AppController extends Controller {
  function beforeRender() {
    if(defined('CAKE_ADMIN') && !empty($this->params['admin'])){
      $this->layout = 'admin';
    }
  }
}

これで通常のアクセスではdefault.thtmlが、管理者用アクセスではadmin.thtmlがレイアウトになります。

管理者サイトを/admin/以下にまとめておけば、あとはhttpd(Apache等)側でBasic認証をかけるなり、IPアドレスでのアクセス制御など対応が取りやすくなるので便利ですね。(これは中々面白い機能だと思います。)

※追記(2006/09/06)
Apache側でのBasic認証やIP制限をかける際はLocationMatchディレクティブでadminがURLのどの位置に来てもマッチするようにしておくか、修正パッチを適用する必要があります。詳しくはCakePHP URLマッピング修正パッチをご覧下さい。

CakePHPでZendFrameworkを使う

この記事の所要時間: 128

CakePHPにはメールを送信するコンポーネントがありません。そこでZendFramework(以下、ZF)のZend_Mailを組み合わせてみました。

1.ZendFremeworkを設置

ZFをダウンロード・解凍し、library/以下を[app/vendors]に設置します。設置すると以下のような構成になります。

[app]
  + [vendors]
        + [Zend]
        + Zend.php

2.ZendFremework読み込み準備

ZFではクラスファイルを読み込む際にinclude_pathが通っている事を前提としています。このまま使用するとクラスファイルが読み込めずにエラーが発生するので、include_pathを設定するスクリプトを設置しておきます。

[app/vendors/zend_init.php]

<?php
ini_set('include_path', ini_get('include_path')
                                . PATH_SEPARATOR . dirname(__FILE__));
?>

3.controllerで使用する

まず2.で設置したスクリプトをvendor(zend_init)で読み込みます。あとは使用する各ファイルをvendor()で読めばOKです。

[app/controller/mail_controller.php]

<?php
vendor('zend_init'); // ZFを読む前に実行
vendor('Zend/Mail/Transport/Smtp');
vendor('Zend/Mail');

class MailController extends Controller {
  var $name = 'Mail';

  function send() {
    $encodeTo = 'ISO-2022-JP';
    $encodeFrom = 'UTF-8';

    mb_language('ja');
    $subject = 'テストメール';
    $subject = mb_convert_encoding($subject, $encodeTo, $encodeFrom);
    $subject = mb_encode_mimeheader($subject);
    $body = 'こんにちは。テストメールです。';
    $body = mb_convert_encoding($body, $encodeTo, $encodeFrom);

    $mail = new Zend_Mail($encodeTo);
    $mail->addHeader('Mime-Version', '1.0');
    $mail->setFrom('hoge@example.com', 'Admin');
    $mail->addTo('foo@example.com');
    $mail->setSubject($subject);
    $mail->setBodyText($body);

    // SMTP
    $mail->send(new Zend_Mail_Transport_Smtp('mail.example.com'));
  }
}
?>

>>

すべてがフレームワークでまかなえればそれに越したことはないのですが、足りない部分は他のライブラリなりを使って解決していけば良いと思います。CakePHPはそれを見越したような作りになっているのでわりときれいに取り込めますね。

# ちなみにZFを使うにはPHP5が必要です。ただPHP4でもPEARを使えば同じような事ができます。

CakePHP ViewHelperの使い方

この記事の所要時間: 256

ViewHelperはHTML表示や数値表現、日付判定などviewで役立つコンポーネントです。controllerで使用するHelperを指定しておくとフレームワークにてインスタンス化され、view内で使用できるようになります。ViewHelperには以下のようなものがあります。

    [cake/libs/view/helpers]

  • AjaxHelper [ajax.php]
  • CacheHelper [cache.php]
  • FormHelper [form.php]
  • HtmlHelper [html.php]
  • JavascriptHelper [javascript.php]
  • NumberHelper [number.php]
  • SessionHelper [session.php]
  • NumberHelper [number.php]
  • TextHelper [text.php]
  • TimeHelper [time.php]

デフォルトではHtmlHelperが有効になっています。

ViewHelperを指定する

controllerの$helpersに使用するHelper名を配列で渡します。Helper名はクラス名をそのまま指定するのではなく、HogeHelperのHogeの部分を小文字にして指定します。(HogeHelperならhoge)ちなみにこの指定方法はHelper以外でもCompenent、Modelなどでも使うで覚えておくとおいしいケーキが焼けます。:)

[app/controller/sample_controller.php]

< ?php
class SampleController extends Controller {
  // HtmlHelper,TimeHelper 
  var $helpers = array('html', 'time');
}
?>

ViewHelperを使用する

viewでは$hogeでHogeHelperインスタンスが使用できます。(HtmlHelperなら$html、TimeHelperなら$time)

[app/view/sample/index.thtml]

<!-- 日付判定:更新時間が1週間以内ならNew!!を表示 -->
<?php if (!$time->wasWithinLast("1 weeks", $sample['modified'])) { ?>
<strong>New!!</strong>
<?php } ?>

<!-- フォームタグ -->
<?php echo $html->formTag() ?>
<p>< ?php echo $html->submit('投 稿') ?></p>

>>

ViewHelperは自作する事もできます。

ViewHelperを作成する

自作ViewHelperは以下を満たすように作成します。

  • クラス名を[%Helper名% + Helper]にする
  • Helperクラスを継承する
  • ファイル名を[%helper名% + .php]にし、[app/views/helpers]に配置する。
    %helper名%はクラス名の%Helper名%を小文字に変換し、単語の区切りを[_]でつなげます。(FooBarHelperならfoo_bar)

[app/views/helpers/hello.php]

<?php
class HelloHelper extends Helper {
  function hello($name) {
    return $this->output(sprintf("Hello, %s", $name));
  }
}
?>

あとはcontrollerの$helpersに’hello’を加えれば、viewで$hello->hello()が使用できます。

>>

■参考サイト
http://manual.cakephp.org/chapter/helpers

CakePHP – validate

この記事の所要時間: 141

CakePHPでのvalidateネタ。

validateは入力チェック正規表現をmodelの$validateに配列で設定しておくだけなんだけど、メールアドレスの重複チェックなんかはそのままではどうにもできない。

modelの$validateに正規表現ではなく、(入力チェック)メソッド名を入れとけばそれを呼んでくれたりするのかな、と思ったがそれはナシ。
マニュアルではcontrollerで重複チェックを行う方法が載っているだが、正規表現でのチェックはmodelにあるので一緒にmodel内に書きたいところ。

で、考えたのが以下の3つの方法。

  1. model#beforeValidate()に書く
    正規表現での入力チェックより先に呼ばれてしまう。
    一意チェックなんかではDBアクセスが発生するから正規表現でのチェックを通過したものだけ処理を行う方が良い。
  2. model#validates()に書く
    parent::validates()を呼んでから、独自入力チェックを書く。
    validates()内に入力チェックが集約されるからよさげ。
    ただparent::validate()を忘れると正規表現での入力チェックが呼ばれなくなる。
  3. model#beforeSave()に書く
    validates()の後に呼ばれるので正規表現での入力チェックを通過した際のみ呼ばれる。

どの方法でもいちおう動作はするが、1.はイマイチなんで、2.か3.のどちらか。
メソッドの意味的には2.が良いかな。

メモ:

入力エラー時に↓みたいにinvalidate()を呼ぶのだが、引数に注意。

$this->invalidate('username');

この値は単にviewでtagErrorMsg()を呼ぶときに使用するものなのでmodel(DB)のフィールド名(カラム名)と合わせる必要は無いんで。(ちょっとハマッた)

CakePHP

この記事の所要時間: 031

CakePHPイイ!!
PHPらしく(スクリプト言語らしく)柔軟なつくりになっていて面白い。
フレームワークにありがちな設定ファイル書きまくりとか無いしね。

RonRを筆頭に規則を決めておいてそのとおりに記述しておけば
あとはフレームワークが良きに計らってくれるのは良くできてるなあと思う。

今マニュアルをざっと見ていってるんだけど
仕組みが分かるとホント楽しい。
# 最近のフレームワークはチュートリアルとかドキュメントが充実してて
# これもスゴイと思う。

これ使って何作ろうかなー。

ホーム > PHP > CakePHP

検索
フィード
メタ情報

Return to page top