Home

Shin x blog

CakePHP URLマッピング修正パッチ

この記事の所要時間: 053

CakePHP 管理者用アクションに書いた/admin以下をApacheのBasic認証やIP制限でアクセス制限する方法ですが、CakePHP1.1.7.3363ではApache側のアクセス制限を回避されてしまう可能性があります。

この現象はURLのQUERY_STRINGにurl=を指定した場合に発生します。具体的には

http://www.example.com/post/index?url=/admin/user/index

でアクセスするとPostController#index()が呼ばれるのではなく、UserController#admin_index()が呼ばれてしまいます。

Apache側の設定(LocationMatch等)を上手く使う手もあるのですが、そもそもコントローラとアクションが上書きされてしまう事自体が問題だと思うので、修正パッチを書きました。気になる方はどうぞ。

[cakephp_url_mapping.patch]

php.iniの書き方

  • 2006-09-06 (水)
  • PHP
この記事の所要時間: 350

PHPの設定は記述する箇所に応じて書き方が異なります。わりと忘れがちなのでまとめてみました。

php.iniでの記述

; 引用符をつけないセミコロン(;)の後のテキストは、すべて無視されます
; セクションマーカ (角括弧の中のテキスト) は無視されます
; 論理値は、次のいずれかで指定します
; true, on, yes
; または false, off, no, none
register_globals = off
magic_quotes_gpc = yes

; 文字列を二重引用符で括ることも可能です
include_path = “.:/usr/local/lib/php”

; バックスラッシュは他の文字と同様に処理されます
include_path = “.;c:\php\lib”

from: PHPマニュアル-実行時設定

論理値のtrue(false),on(off),yes(no)は大文字・小文字を区別していないようなので、TrueやYesでも認識されます。

httpd.conf / .htaccessでの記述

php_value name value

指定した設定オプションに値を設定します。変更の可否が、 PHP_INI_ALL もしくは PHP_INI_PERDIR である設定オプションに対し利用できます。 セット済みの値をクリアしたい場合は、none を 値として使用してください。

注意: 論理値を設定する場合には php_value を使用しないでください。代わりに、php_flag (下記参照)を使用する必要があります。

php_flag name on|off

設定オプションに論理値を設定するために使用します。変更の可否が、 PHP_INI_ALL もしくは PHP_INI_PERDIR である設定オプションで利用できます。

php_admin_value name value

指定した設定オプションに値を設定します。このディレクティブは、.htaccess ファイルでは利用できません。また、 php_admin_value で設定された設定オプションの値は、.htaccess や VirtualHost ディレクティブ内から上書きできません。 セット済みの値をクリアしたい場合は、none を 値として使用してください。

php_admin_flag name on|off

設定オプションに論理値を設定するために使用します。 このディレクティブは、.htaccess ファイルでは利用できません。 php_admin_value で設定された設定オプションの値は、.htaccess や VirtualHost ディレクティブ内から上書きできません。

from: PHPマニュアル-設定を変更するには

httpd.conf / .htaccess内ではPHPの定数(error_reportingのE_ALL等)は使用できません。

設定変更可能な箇所

各設定項目は記述できる箇所が決まっています。項目ごとの詳細はPHPマニュアルに記載されているのですが、記述できる箇所(PHPマニュアルでは「変更の可否」)がPHP定数で書かれおり、いざ使う時に定数の意味を忘れてしまいがちです。(PHP_INI_SYSTEM / PHP_INI_PERDIRは良く「?」になります。。。)そこでPHP定数の定義をメモしておきます。

PHP_INI_USER	ユーザスクリプトまたはWindowsレジストリ  で設定可能なエントリ
PHP_INI_PERDIR	php.ini, .htaccess または httpd.confで設定可能なエントリ
PHP_INI_SYSTEM	php.ini または httpd.confで設定可能なエントリ
PHP_INI_ALL	どこでも設定可能なエントリ

from: PHPマニュアル-php.ini ディレクティブ

>>

あらためて見るとhttpd.confあたりは適当に書いていたなーという印象です。論理型の設定でもphp_valueを使っていましたし(値を[0 or 1]にすれば動作します)、php_admin~は使っていませんでした。(専用サーバでの運用がほとんどなので第三者に設定を上書きされる心配が無かったので。。。)ただ設定の意味合いをはっきりさせるためにもきっちり書いておいた方が良いですね。

CakePHPでDBアクセスなしのModelを作る

この記事の所要時間: 139

CakePHPのmodelはDBのテーブルと1対1になる事が想定されています。ただシステムを構築する際はこのような単純なmodelだけでは使い勝手が悪い場合があります。そこでDBアクセス無しのmodelの作成方法を模索してみました。

フレームワークのソースを見たところmodelの$useTableにfalseをいれておけば良いようです。

[app/models/no_db.php]

<?php
class NoDb extends AppModel
{
  $useTable = false;
}
?>

では、modelなしのcontrollerはというと・・・フレームワークを見る限りでは方法は無さそうですね。ただcontrollerの$nameでmodel名を指定する事ができるので、これにダミーのmodelを指定すれば、modelを新たに作らずにcontroller・ビューファイルを追加する事が可能です。

[app/controllers/no_my_model_controller.php]

<?php
class NoMyModelController extends AppController
{
  var $name = 'NoDb';

  function index() {
    $this->viewPath = 'no_my_model'; // ビューファイルディレクトリを指定
  }
}
?>

index()内のviewPathの設定を行わないと$nameの値でビューファイルディレクトリ名が決定されてしまうので注意が必要です。(ビューファイルもmodel同様に共通で良ければこの行は必要ありません。)

修正:2006/09/15
modelなしのcontrollerも作れますね。controllerの$usesをarray()かnullにすれば良いようです。

class MyController extends AppController
{
    // var $uses = null; works too
    var $uses = array();

    function index()
    {
    }
}

from: cakebaker » A controller without a model

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を使えば同じような事ができます。

「GTD ひたすらリストを書き出す会 in 関西」

この記事の所要時間: 19

前回のエントリでITmedia Biz.IDさんにトラックバックを送ったところ、取り上げて頂きました。

 Biz.IDが行ったGTD徹底研究会に言及されています。「次回のGTD徹底研究会は是非関西で」とのことですが、最近はプログラマーの方などが会議室などを借りて小規模な勉強会を開くことも珍しくないようです。ブロガー同士で「ひたすらリストを書き出す会」を開いてみてはいかがでしょうか? 場合によっては、Biz.ID編集部も応援します。

from: ITmedia Biz.ID:関西でGTD研究会!?

せっかくの機会なんで是非やりたいですね。ざっくりですが概要は以下のような感じでしょうか。(実際に人数が集まればその時にまた調整しましょう。)

  • 場所は大阪市内
  • 時期は9月中旬~10月末頃
  • 貸会議室等、集中できる環境に集まる。
  • リストを書き出していくのに3時間はいるかな
  • なので土日の午後が良いかも 
  • とにかく書き出す。
  • 雑談&意見交換会。
  • 講習会では無いです。全員が参加者です。相互扶助の精神で。

というわけで「ひたすらリストを書き出す会 in 関西」 に参加してみたいという方は、コメントなりトラックバックなりでご連絡下さいませ。

# とにかく集まって、書き出して、(できれば)GTDの情報交換をしようぐらいのノリなのでお気軽に。

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

PHP 5 Power Programming

  • 2006-08-29 (火)
  • PHP
この記事の所要時間: 045

PHP 5 Power Programming (Bruce Perens Open Source)

PHP 5 Power Programming」という書籍のPDF版が100万ダウンロードを突破したそうです。この本の出版社では他にも数冊がPDFで配布されています。(Bruce Perens’ Open Source Series

私は気に入った本ならPDF版が配布されていても書籍として購入したいタイプなのですが、やはり検索や持ち運びを考えるとPDF版もあると便利です。PDF版は無料で配布せずとも、書籍に添付したり、書籍購入者のみダウンロードできるといった仕組みを作るなりすれば良いと思うのですがいかがでしょうか。

ちなみに記事によるとPHP使用者は450万人(!)もいるそうです。

via Andi Gutmans’ Weblog: PHP 5 Power Programming passes 1 Million downloads!

GTD 全てを書き出したい

この記事の所要時間: 139

GTDを実践したいなと思いつつ、はじめの「頭の気になることを全て書き出す」で止まっています。なかなか数時間を他からの割り込みなしに確保するのは難しいですね。日頃一人で仕事している私なんかは環境的には恵まれている方だとは思うのですが、時間があるとついついやりたい事に手をつけてしまいます。

あとこれは後で考えれば良いと思うのですが、書き出して、分類して、週次レビューして、という流れをどのように行うか(ノートに書くのか、PCに記録するのか、Webに記録するのか、ツールは何を使うのか・・・)を考えてしまい中々進みません。
# まあ、これは「とにかくどんな方法でもいいからやる」という方向で良いんだとは思うのですが。

なので

 ただ少しでもこの数時間を気楽なものにするには、数人で集まって行ってみるといいのかもしれません。今回の研究会でも、「書くことがなくなってしまったけど、周りの人がたくさん書き出しているのを見てまた書き出すことができた」という方もいらっしゃいました。機会があればこの研究会も第2回を開催してみたいと思います(次回は休日に5時間ぐらいかけてやりたいですね……)。

from: ITmedia Biz.ID:GTD徹底研究会でわかったこと (1/3)

というのはとても良い方法だと思います。数人で一緒に時間・場所を取ってやれば、他の事はやれないでしょうし、邪魔が入る心配もありません。周りががんがん書いてる中、自分だけやめるのも何なんで、無理矢理絞り出してでも書く、というのが良いんでしょうね。

もんもんとしたものを絞り出してすっきりとしたいので、次回のGTD徹底研究会は是非関西で(笑)。

>>

追記(2006/09/01):「ひたすらリストを書き出す会 in 関西」をやってみようかと考えています。興味のある方は「ひたすらリストを書き出す会 in 関西」をどうぞ。一緒に頭の中を書き出してしまいませんか。:)

Home

検索
フィード
メタ情報

Return to page top