Cake PHP メッセージを日本語化する

PHP

Cake PHP メッセージを多言語化(日本語化も含む)

CakePHP 1.2.3.8166

CakePHPではデフォルトが英語のメッセージになってますが、これを日本語化したり、多言語化することができます。

Cakeコンソールからi18n(アイイチハチエヌです。間違わないように!)を実行します。
なぜこれを利用するか、というと、ビューファイルからメッセージを抜き取って、どの単語を日本語にすればよいか、という言語ファイルを自動生成してくれるからなんですね。

 例 Windowsの場合 下記をコマンドプロンプトで実行します。
 C:\Program Files\xampp\htdocs\cake_test>cake\console\cake.bat i18n extract -app cake_test

ダイアログに沿って進めます。

localeディレクトリに、default.potができているでしょうか?
できていたら、lacaleの下に/jpn/LC_MESSAGES というディレクトリを作ります。
そこに、default.potをコピーします。
最後に、default.potをdefault.poにリネームします。

default.po内で、日本語に変更したいメッセージを探して、編集します。

 例
 #: \views\pages\home.ctp:72
 msgid "Editing this Page"
 msgstr "このページを編集します。"

データベースを利用して、翻訳サイトを作ることもできます。

参考:CakePHP 翻訳のデータベース
http://book.cakephp.org/ja/view/793/Initializing-the-i18n-Database-Tables

CakePHP 日本語化翻訳データの編集にPoeditを使う

Cake PHP ファイルのダウンロード

PHP

Cake PHP ファイルをダウンロードさせる

CakePHP 1.2.3.8166

CakePHPでファイルをダウンロードさせるために、メディアビューというクラスを使うことができます。
ファイルは画像、PDFとかもちろん何でもOK。

ファイルの直接リンクなどを防ぐこともできるので、Webサーバーの非公開ディレクトリにファイルをおいて、CakePHPからのみダウンロード可能にして、ファイルを守ることができます。

http://book.cakephp.org/ja/view/489/Media-Views

なお、MediaView用にsetするパラメーターについて補足しますと、pathはダウンロード用のファイルがあるディレクトリのパスで、ファイル名を含みません。
つまり、setするパラメーターは、ファイルのフルパスをディレクトリパス、ファイルのベース名(拡張子を含まない)、拡張子といった要素に分割してsetするということになります。

なお、パスは絶対パスが望ましいですが、CakePHPのルートからの相対パスでも動作します。

Cake PHP パスワードを暗号化してDBに格納

PHP

CakePHP パスワードを暗号化してDBに格納する

CakePHP 1.3

Cake PHPのマニュアルサイトなどをみると、usersテーブルを規則通りに、usersという名称で、usernameとpasswordというフィールド名で作成すれば、パスワードは自動的に暗号化されてDBに格納される、と書いています。

http://book.cakephp.org/ja/view/172/Authentication

しかし、usersコントローラーを作った状態でユーザーを追加してみると、パスワードが暗号化されていません。

あれあれ?と思いますが、これはAuthコンポーネントを追加しないと、パスワードを暗号化してくれないからなんですね。

しかし、ユーザーがない状態でAuthコンポーネントを追加すると、認証がかかってしまってログインしないとユーザーが追加できない、しかしユーザーがないのでログインしようがないというジレンマに陥ってしまいます。

そのため、最初は、すべてのアクションを許可するようにusersコントローラーに設定しておきましょう。

//users_controller.php内に下記を追加

 
 var $components = array('Auth');
 	function beforeFilter() {
 	    parent::beforeFilter(); 
 	    $this->Auth->allow('*');
 	}

その状態で、ユーザーをAddすれば、パスワードが暗号化されて、ユーザーを追加できます。

それが終わったら、function beforeFilter()は消去しましょう。

Cake PHP データベースを利用するACLの使い方2

Cake PHP データベースを利用するACLの使い方1
PHP

CakePHP データベースを利用するACLの使い方2

CakePHP1.2

Cake PHP データベースを利用するACLの使い方1の続きです。

次に、AclとAuthのコンポーネントを読み込むようにしておきます。
これを動作させたいコントローラーに記述すればよいのですが、筆者はアプリケーションの全部で動作させたいので、app_controller.phpに記述し、すべてのコントローラーでこのコンポーネントを読み込むようにしています。

 var $components=array('Acl', 'Auth');

それでは、グループとユーザーを登録しましょう。
これは普通にグループmodelの機能、ユーザーmodelの機能を利用して、追加します。groups/add, users/add で追加すればよいのです。

次のグループを作ってみましょう。
groupsテーブル
|id|name|created|updated|
|1|戦士|2011-07-14 19:13:08|2011-07-14 19:13:08|
|2|魔法使い|2011-07-14 19:13:08|2011-07-14 19:13:08|
|3|ホビット|2011-07-14 19:13:08|2011-07-14 19:13:08|
|4|来訪者|2011-07-14 19:13:08|2011-07-14 19:13:08|
次に、これらのグループに属するユーザーを作ります。group_idは上記のIDです。
usersテーブル
|id|name|username|password|group_id|created|updated|
|1|アラゴルン(戦士)|alagorn|*****|1|2011-07-14 19:13:08|2011-07-14 19:13:08|
|2|ガンダルフ(魔法使い)|gandalf|2|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|
|3|フロド(ホビット)|flodo|3|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|
|4|ゴクリ(来訪者)|gokuri|4|*****|2011-07-14 19:13:08|2011-07-14 19:13:08|

これで、グループに紐づけられたユーザーができました。
これが、リクエストをする主体、AROです。

次にACOを登録します。できれば、アプリケーションが完成してからの方がよいでしょう。
というのは、コントローラーのアクションのそれぞれにユーザー権限を付与できますが、アプリケーション開発の途中でこれを付与してしまうと、何かアクションを追加するたびに、ACOとAROの関連をアップデートせねばならず、かなり面倒だからです。

このアプリケーションには次のコントローラーとアクションがあるとします。

  1. 武器コントローラー(weapons) アクション(index,view,add,edit,delete)
  2. 指輪コントローラー(rings) アクション(index,view,add,edit,delete)
  3. 豚の切り身コントローラー(meats) アクション(index,view,add,edit,delete)
  4. ビールコントローラー(beer) アクション(index,view,add,edit,delete)

これらのコントローラーがアクションに分割されてACOテーブル(acos)に格納されます。
acosのテーブルの内容を人間が見て、操作したり理解するのはほぼ不可能です…。
ここは、自動でCakePHPがやってくれることに任せましょう。
後でACLが動作しない場合、このテーブルにちゃんと登録がされているか、は見ておいた方がよいと思います。

では、ついにAROとACLの関連づけをしましょう!
これをすることにより、たとえば「魔法使いグループには、すべての権限を与える」「武器の操作は戦士しか行えない」などのユーザー権限コントロールが初めてできます。

どこのコントローラーでもよいので、次のようなアクションを作ります。
筆者は、ユーザーコントローラー(users)に、次のような関数を作りました。

 //Aclコンポーネントを読み込んでいること
 function init_permissions() {
    $group =& $this->User->Group;
 
    //魔法使いにはすべての権限を与える
    $group->id = 2;
    $this->Acl->allow($group, 'controllers');
 
    //戦士は武器を操作できる
    $group->id = 1;
    $this->Acl->allow($group, 'controllers/Weapons');
 
    //などなど後は省略
    
    echo "all done";
    exit;
 }

それで、そのあと上記の関数、Users/init_permissionsを一度実行します。
すると、aros_acosテーブルがアップデートされたのがわかるでしょうか?
なお、上記の例ではグループのみに権限を操作していますが、ユーザー単位、アクション単位でこの権限を設定することができます。
すごいですよね!

aros_acosテーブルも、人間が見て操作するのはとても大変ですがacosテーブルよりはわかりやすいと思います。

Users/init_permissionsは一度利用すればもう利用しないので、コメントアウトなどで消しておきましょう。
ユーザー権限を変更したい場合、グループを追加した場合、アクションを追加した場合などはこの関数を自分でアップデートして、実行しましょう。

CakePHP 公式マニュアルの補助になれば幸いです。[smile]

Cake PHP データベースを利用するACLの使い方1

PHP

CakePHP データベースを利用するACLの使い方

ログインを必要とするWebアプリケーションのニーズは非常に多いでしょう。
ログインをCake PHPではACL(Access Control List)という方法で細かく制御できます。

本家のマニュアルサイトでは説明が分かりにくかったので書いておきます。

【参考】
[[Defining Permissions: Cake’s Database ACL:
http://book.cakephp.org/view/467/Defining-Permissions-Cake-s-Database-ACL]]

Simple Acl controlled Application

まず、ACOとAROという単語を理解します。

  • ACO=Access Control Object アクセスを求められる機能など

たとえば、ブログの投稿機能、削除機能、編集機能などのような機能が多く考えられます。

 
  • ARO=Access Request Object

多いケースは、ユーザーです。一般ユーザーだったり、管理者だったり、というような区分けがあるでしょう。

それでは、ユーザーとグループを作りましょう。
ユーザーは数が多いので、グループを作るのが一般的です。

本家マニュアルサイトに習い、「指輪物語」のキャラクターで考えてみます。
(指輪物語について知らないと理解が難しいかもしれませんが(^_^;)

Fellowship of the Ring™(指輪物語)

    * 戦士
          o アラゴルン
          o レゴラス
          o ギムリ
    * 魔法使い
          o ガンダルフ
    * ホビット
          o フロド
          o ビルボ
          o メリー
          o ピピン
    * 訪問者
          o ゴラム

上記では、ユーザーがアラゴルンやレゴラスで、戦士や魔法使い、がグループです。

指輪物語的なCRUD(Create, Read, Update, Delete)アプリケーションができあがっていて、これからユーザー認証を加えるという前提です。

グループのテーブル(Groups)を作り、ユーザーのテーブル(Users)に所属するGroupIDを入れましょう。

ユーザーのモデル(user.php)に次のように記述します。

 var $belongsTo = array(
   'Group' => array(
 	'className' => 'Group',
 	'foreignKey' => 'group_id',
 	'conditions' => '',
 	'fields' => '',
 	'order' => ''
   )
 );

グループのモデル(group.php)に次のように記述します。

 var $hasMany = array(
  'User' => array(
 	'className' => 'User',
 	'foreignKey' => 'group_id',
 	'dependent' => false,
 	'conditions' => '',
 	'fields' => '',
 	'order' => '',
 	'limit' => '',
 	'offset' => '',
 	'exclusive' => '',
 	'finderQuery' => '',
 	'counterQuery' => ''
   )
 );

ユーザーはグループにblongsToで、グループはユーザーに対してhasManyという関係です。
(データベースのテーブルも、そのように作っておきます。)

ここまでできたら、ケーキのコンソールから、次のようにコマンドを打ちます。

 cake schema run create DbAcl

(cake)の部分は、cake.batなどを動かす部分です。

すみません、ちゃんと全部解説するつもりでしたが、途中で終わっていました。
役に立たなかったの声にお応えして(^_^;、続きを記載しておきます。

 cake schema run create DbAcl

を進めていくと、aros, acos, aros_acos, という3つのテーブルができると思います。

aros, acos, aros_acos というテーブルの中身については、データベースを利用するログインに必要なものですが、とりあえず気にしないで次に進みましょう。

Cake PHP データベースを利用するACLの使い方2