アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

CakePHP コントローラのメソッドをシェルで実行する方法

こんにちは高橋です。最近はドクターペッパーの謎の中毒性に苛まれています。

さて本題です。

シェルの作り方はすごく簡単で、AppShellクラスを継承するだけです。
今回は「TwitterBotに定期的につぶやかせたい」といったケースを想定して作成していきます。

app/Controller/BotController.php


<?php
App::uses('AppController', 'Controller');

class BotController extends AppController
{
    public function tweet()
    {
        return $this->Bot->tweet(); //つぶやいた内容をreturnするメソッドとする
    }
}


app/Console/Command/BotShell.php


<?php

App::uses('TwitterController', 'Controller');

class BotShell extends AppShell
{

    public function startup()
    {
        parent::startup();
        $this->TwitterController = new TwitterController();
    }

    public function tweet()
    {
        $this->out($this->TwitterController->tweet());
    }

}


準備はこれだけです。Botモデルの処理は省略させて頂きました。

これを動かしてみます。


php ./app/Console/cake.php bot tweet

といっても、上記の一行を実行するだけです。



php ./app/Console/cake.php bot tweet

Welcome to CakePHP v2.3.9 Console
---------------------------------------------------------------
App : app
Path: /Users/yuya/Sites/test/rest/app/
---------------------------------------------------------------
hello world.


しっかり「hello world.」が表示されていますね!

次は作成したシェルをCronのジョブに追加します。



crontab -e




#bot 
20,40 * * * * php /var/www/html/project/app/Console/cake.php bot tweet


これでCronが毎時20分と40分にコマンドを実行してくれることになります。

今回は単にメソッドを実行しただけですが、Cakeアプリの一部のため
例えばCakeLogやCakeEmailも簡単に追加できそうで便利だなぁと感じました。

詳しくは公式のドキュメントをご覧ください。
http://book.cakephp.org/2.0/ja/console-and-shells.html


---
余談となりますが、crontab -e はとーっても危険です。 crontab -r がジョブを削除するコマンド(お隣さん!)なので気を付けてください。個人のサーバですが、一度やらかして面倒なことになってしまいました。笑

・恐怖のcrontab -r. 設定ファイルはレポジトリ管理せよ
http://d.hatena.ne.jp/LukeSilvia/20080621/p1

それでは!

CakePHP2で簡単にACLを使う方法



チョーシドウダ?カラダァ?どうも、高橋です!
今朝、CakePHP2.3.0-beta版がリリースされましたね!

今回のリリースでは、パフォーマンス、セキュリティ、使いやすさを向上させる新機能が追加されました。
また完全に下位互換があるので、2.2系からのマイグレーションは(おそらく)容易でしょう。

というわけで、早速Cake2.3を使ってACLを実現してみたいと思います。

イメージが掴みにくいと思ったのでデモを作成しました。(がんばりました!
ログイン:http://s1.asial.co.jp/~yuya/blog/20121029/users/login
username: adminuser / password: 0000
ACL管理 :http://s1.asial.co.jp/~yuya/blog/20121029/admin/acl

またCakePHPのセットアップについては以下の記事をご覧ください。
http://blog.asial.co.jp/1040


ACLとは



ACLとは、ユーザやグループを元に権限を制御することです。
例えば、ファイルやフォルダのパーミッションですね。

これをWebに置き換えると、↓のような感じです。
「アシアル(グループ)の高橋(ユーザ)はアシアルブログを編集を許可する(権限)」

とっても簡単ですね。

ACLを利用することで、通常の認証機構では困難なフレキシブルな権限管理をいとも簡単に実現出来ます。


プラグインの設定



っていきなりプラグインに頼るんかい!ってそのリアクション、ありがとうございます。
簡単に扱うというテーマには合致しているので問題ないはず。

ダウンロードはこちら(直リンです)
http://www.alaxos.ch/blaxos/downloads/get/alaxos_acl_2.2.0.zip

このプラグインCakePHPCMSで有名なcroogoでも採用されている実績があります。
またファイル名に「2.2.0」とかいう意味深な文字列がありますが、気にしないでおきましょう。

1. プラグインを配置する


解凍すると「Acl」というフォルダになるので「app/Plugin/Acl」のように配置します。

2. adminルーティングを有効にする


app/Config/core.php の113行目付近のコメントアウトを解除します。



//Configure::write('Routing.prefixes', array('admin'));
↓
Configure::write('Routing.prefixes', array('admin'));


3. プラグインと設定の読み込み


app/Config/bootstrap.php の145行目付近に以下のコードを追加します。



CakePlugin::load('Acl', array('bootstrap' => true));


これで完了。


必要なテーブルを作成する



まずユーザやグループのテーブルを作成します。
ACLではARO(リクエストオブジェクト)の役割を成します。



CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    group_id INT(11) NOT NULL,
    created DATETIME,
    modified DATETIME
);


CREATE TABLE groups (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    created DATETIME,
    modified DATETIME
);



次に制御するページのテーブルです。
こちらはACO(コントロールオブジェクト)となります。



CREATE TABLE posts (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT(11) NOT NULL,
    title VARCHAR(255) NOT NULL,
    body TEXT,
    created DATETIME,
    modified DATETIME
);

CREATE TABLE widgets (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    part_no VARCHAR(12),
    quantity INT(11)
);



MVCの作成 というかBake





cd /Users/yuya/html/cake/app
./Config/cake bake all
1
./Config/cake bake all
2
./Config/cake bake all
3
./Config/cake bake all
4

上手に焼けましたーーッ!
あ、まだコンソールは閉じないでくださいね。


ACLテーブルの初期化



コンソールで一行実行するだけなので簡単です。



./Console/cake schema create DbAcl
y
y


これで acos、aros、aros_acos という
ACLに関連する3つのテーブルが初期化されました。


グループとユーザを追加する(AROの追加)



追加はDBから直接行ったりはせず、Cakeのアプリケーションで行います。
そこで認証機構の準備とログイン処理を作成します。

app/Controller/UsersController.php



<?php

App::uses('AppController', 'Controller');

class UsersController extends AppController {

    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash('Your username or password was incorrect.');
            }
        }
    }

    public function logout() {
        //Leave empty for now.
    }
~~~~



app/View/Users/login.ctp



<?php
echo $this->Form->create('User', array('action' => 'login'));
echo $this->Form->inputs(array(
    'legend' => __('Login'),
    'username',
    'password'
));
echo $this->Form->end('Login');



app/Model/User.php



<?php
App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class User extends AppModel {

    public function beforeSave($options = array()) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
        return true;
    }
~~~



app/Controller/AppController.php



<?php
App::uses('Controller', 'Controller');

class AppController extends Controller {

    public $components = array(
        'Acl',
        'Auth' => array(
            'authorize' => array(
                'Actions' => array('actionPath' => 'controllers')
            )
        ),
        'Session'
    );
    public $helpers = array('Html', 'Form', 'Session');

    public function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
    }

}



リクエスタとしてビヘイビアに設定



app/Model/User.php



<?php

App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class User extends AppModel {
    public $belongsTo = array('Group');
    public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        if (!$this->id  & & empty($this->data)) {
            return null;
        }
        if (isset($this->data['User']['group_id'])) {
            $groupId = $this->data['User']['group_id'];
        } else {
            $groupId = $this->field('group_id');
        }
        if (!$groupId) {
            return null;
        } else {
            return array('Group' => array('id' => $groupId));
        }
    }

~~~~


app/Model/Group.php



<?php

App::uses('AppModel', 'Model');

class Group extends AppModel {

    public $actsAs = array('Acl' => array('type' => 'requester'));

    public function parentNode() {
        return null;
    }

~~~



これからグループとユーザを追加しますが、「http://~~~~/users」 にアクセスしても
ログインページにリダイレクトされてしまうでしょう。

一時的に認証を解除するためのコードを挿入します。

app/Controller/UsersController.php



<?php

App::uses('AppController', 'Controller');

class UsersController extends AppController {

    // すべてのアクションを許可する
    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow();
    }

    public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash('Your username or password was incorrect.');
            }
        }
    }

    public function logout() {
        //Leave empty for now.
    }

~~~



app/Controller/GroupsController.php



<?php

App::uses('AppController', 'Controller');

class GroupsController extends AppController {

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow();
    }

~~~



ここで何回やっても許可したはずなのにログインページに飛ぶ!!ってハマったんですが
前は $this->Auth->allow('*'); ですべてのアクションを許可だったはずなんですが
今は $this->Auth->allow(); になっているようです。気をつけてください。

余談ですが、他の指定法としては


$this->Auth->allow(array('edit', 'add'));
$this->Auth->allow('edit', 'add');

があります。


グループ・ユーザーのデータ登録(AROの追加)



さて、無事にページが表示できたらデータを登録していきます。
絶対にグループから登録してください(重要

今回は形式的に
グループ:administrators、managers、users
ユーザ :adminuser、manageuser、useruser

というパターンを作成しましょう。
グループやユーザの追加は必ずCakeのアプリケーションから追加してください。



mysql> SELECT * FROM aros;
+----+-----------+-------+-------------+-------+------+------+
| id | parent_id | model | foreign_key | alias | lft  | rght |
+----+-----------+-------+-------------+-------+------+------+
|  1 |      NULL | Group |           1 | NULL  |    1 |    4 |
|  2 |      NULL | Group |           2 | NULL  |    5 |    8 |
|  3 |      NULL | Group |           3 | NULL  |    9 |   12 |
|  4 |         1 | User  |           1 | NULL  |    2 |    3 |
|  5 |         2 | User  |           2 | NULL  |    6 |    7 |
|  6 |         3 | User  |           3 | NULL  |   10 |   11 |
+----+-----------+-------+-------------+-------+------+------+
6 rows in set (0.00 sec)


このようにAROが追加できたら、認証のコードは外しておきましょう。


コントローラとアクション(ACO)の登録



ここからはWebでの操作となります!ACLプラグインさんオナシャス!

http://~~~~/admin/acl」にアクセスしてください。



こんなページが表示されましたか?だったらOK
いま「Missing ACOs」といって不足分のACOを表示してくれています。

ページ下部の「Synchronize ACOs」をクリックしてください。





すると、なにやらエラーが出ましたね。
「The Role model is not configured to act as an ACL requester」

んー・・・・・・あぁ!なるほどっ!!
どうやら、プラグイン内の初期設定ではgroupはroleという名前で動作するようです。

app/Plugin/Acl/Config/bootstrap.php の14行目付近



Configure :: write('acl.aro.role.model', 'Role');
↓
Configure :: write('acl.aro.role.model', 'Group');


これで再度、ページを更新してみる。



無事メニューが表示されたので「Synchronize actions ACOs」をクリック

すると・・・

「The ACO datatable is already synchronized」

はい、ガッツポーズ



あとは「Permissions」の「Roles permissions」で権限を設定してみてください。
アクション単位で権限を制御できるのは非常に強力です。

あと地味にAjaxでページ遷移なしで設定変更できるのもストレスがなくて良い感じですね。

まとめですが、やることは多かったけど、全体を通してみると内容は簡単だったと思います。
それでもって実践でもかなり使えるレベルの認証なのでオススメです。

---

締めですが、私は11月3日のPHPMatsuri2012@福岡に参加予定ですので
もしお会いできる方がいればよろしくお願いします!
http://www.phpmatsuri.net/2012/

また、前日の11月2日にも「MonacaHTML5ではじめるハイブリットアプリ勉強会」というイベントを開催しますので興味のある方は当日でも参加してくださいね〜!(私はハンズオン担当でーす
http://atnd.org/event/monaca121102 (無料です

それでは、福岡で会いましょう

CakePHP2 手っ取り早く入門するための開発環境構築&Cake初期設定



どうも、筋肉痛の高橋です。

先日、江ノ島に行ってみたところ、猫とフナムシがたくさんで驚きました!特に洞窟の入り口付近がすごくて、透明フナムシの大群が・・・生シラス丼はめっちゃおいしかったです!

さて、今回のネタは私の好物であるCakePHPです。

Cakeについては色々と紹介したい機能がありますが、その前に下準備から書きます。
"これから" という初心者が困らないように、最短でCakeを動作させる手順をまとめました。
ただし、筆者の都合でややMac向けです。



ローカルに開発環境を準備する



はじめに書いておきますが、特別な知識は必要ありません。

CakePHPを動かすには、Webサーバ(Apacheなど)やDBサーバ(MySQLなど)を準備する必要がありました、が、

いまやクリックだけですぐに環境が出来るパッケージがあります。もちろん無料です。(良い時代になったものだぁ〜と言うやつですね

MAMPをインストールする(WindowsならXAMMPなど)



手順はこちらの記事で
「MAMPでMacにWordPressローカル環境インストールするの簡単すぎ、5分でできた」

自分が書くべき事がスクショ付きで詳しく書かれてます。分かりやすい
今回ワードプレスは関係ないので、データベースの作成まで進めてください。

「新規データベースを作成」の際、データベース名は「cake」にしておいてください。あとで使います。

次はPHPの動作テストをやってみましょう。


<?php phpinfo();


「/Macintosh HD/アプリケーション/MAMP/htdocs/info.php」に保存します。
あとは「http://localhost/info.php」にアクセスするだけ


・・・どうですか?PHPの設定情報がずらーーーっと表示されたでしょうか?
あなたが初めてPHP触ったという方ならば、これはとても大きな一歩です。
※ もし、なんらかのエラーが出た場合は報告をお願いします。

さて次はいよいよCakeのインストール、引かぬ媚びぬ省みぬで挑みましょう!


CakePHPのダウンロード



CakePHPはバージョン管理されています。GitHubというサイトにあるので、最新版をダウンロードしましょう。
https://github.com/cakephp/cakephp/


ダウンロードした圧縮ファイルを「htdocs/」以下に解凍しましょう。
ついでにゴチャゴチャしたフォルダ名なので「htdocs/cake/」に名前を変更しておきましょう。

これで「http://localhost/cake/」にアクセスしてみてください。



きたーー!インストール完了!やたらエラー出てますが、完了は完了です!

※ もし、なんらかの問題が出た場合は報告をお願いします。


CakePHPの初期設定



ここからはCakeユーザなら誰もが一度はやるであろう設定のまとめです。

「'Security.salt'」と「'Security.cipherSeed'」を変更する



「Notice (1024): Please change the value of 'Security.salt' in app/Config/core.php to a salt value specific to your application [CORE/Cake/Utility/Debugger.php, line 821]」
「Notice (1024): Please change the value of 'Security.cipherSeed' in app/Config/core.php to a numeric (digits only) seed value specific to your application [CORE/Cake/Utility/Debugger.php, line 825]」



「'Security.salt'」「'Security.cipherSeed'」は「app/Config/core.php」の187行目と192行目です。



/**
 * A random string used in security hashing methods.
 */
	Configure::write('Security.salt', 'abcd1234qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');

/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
	Configure::write('Security.cipherSeed', '12345678657453542496749683645');


「'Security.salt'」は半角英数字、「'Security.cipherSeed'」には半角数字を入れてください。
上記のように値は適当で構いませんが、セキュリティ上、記事と同じ文字列はオススメしません。

ちなみに「'Security.salt'」はハッシュの生成、「'Security.cipherSeed'」は暗号化・復号化に用いられます。


「app/tmp」ディレクトリを書き込み可能にする



「 Your tmp directory is NOT writable.」



手っ取り早くchmodコマンドで権限を変更します。
コンソールを起動して


$ cd /Applications/MAMP/htdocs/cake/
$ chmod -R 777 app/tmp


もし余裕があれば、ディレクトリの所有者をWebサーバに変更する方法も試してみてください。


<?php echo `whoami`;

上記でわかったユーザ名を


$ chown -R ユーザ名 app/tmp

これでOK



データベースの設定



「Your database configuration file is NOT present.
Rename APP/Config/database.php.default to APP/Config/database.php



エラーで言われてる通り「database.php.default」を「database.php」に名前を変更する。

すると新たなエラーが2つ発生(Warningは私の環境だけかもしれませんが

「Warning (2): PDO::__construct() http://php.net/pdo.--construct: [2002] No such file or directory (trying to connect via unix:///var/mysql/mysql.sock) [CORE/Cake/Model/Datasource/Database/Mysql.php, line 149]」
「Cake is NOT able to connect to the database.
Database connection "SQLSTATE[HY000] [2002] No such file or directory" is missing, or could not be created.」



「app/Config/database.php」を開いて設定を行う



class DATABASE_CONFIG {

	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => '127.0.0.1',
		'login' => 'root',
		'password' => '',
		'database' => 'cake',
		'prefix' => '',
		'encoding' => 'utf8',
	);

	public $test = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'test_database_name',
		'prefix' => '',
		//'encoding' => 'utf8',
	);
}




以上ですべてグリーンラベルになりました。Cakeの開発環境が完成、やったね。

一つだけ注意点ですが、これはあくまでローカルPCで勉強用に使う簡易的な環境です。
本番の場合は、MySQLの設定などセキュリティ面を考慮した設定でご利用ください。

また今回の記事の目的はCakeを動かす環境ですので、関係のない内容は極力避けてました。
私がCake関連の記事を書く場合は、ここまでの設定が出来たものとして書きます。

うまくいかないなど気になる事がありましたら、コメントにてよろしくお願いします。

アシアルPHPスクールにて、フレームワークCakePHP、WebAPI、Flex編など新設講座を開設

こんにちは。小林です。

アシアルPHPスクールでは、市場や受講希望者のニーズに合わせて、この度、続々とプログラミング講座を新設しました。

講座の新設にあわせ、講座説明会(無料)も開催しております。次回開催日は6月2日となりますので、皆様、お気軽にご参加いただけたらと思います。

新設・ブラッシュアップした講座は以下のとおりです。

-----
■ モバイル編: 絵文字や固有IDなど携帯特有の開発テクニックを学ぶ
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/8

CakePHPフレームワーク編:フレームワークを利用することで開発効率up
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/12

PHP×Flex初級編: Flex4の基礎的なアプリケーション構築をマスター
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/15

PHP×Flex中級編: Flexスキルを実務レベルまで押し上げる中級編
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/16

■ オブジェクト編: PHPで学ぶオブジェクトの仕組みと使い方
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/10

Linuxサーバ編: Linux コマンド操作やLAMP環境の構築方法について学ぶ
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/9

■ HTML×CSS初級編: Webサイトの制作のベースとなるHTMLをマスターしよう!
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/13

■ HTML×CSS中級編: スタイルシートによる魅力的なデザイン
◇詳しくはこちら:https://www.asial.co.jp/school/course_detail/14
-----






-----
以下、本日発表したプレスリリースの内容
-----
アシアルでは、2005年にPHPスクールを開始して以来、Web入門者向けの「初級編」、PHPスキルを実務レベルまで押し上げる「中級編」など、PHP言語を用いた開発のスキルアップをサポートする研修を実施してきました。これらの研修は、アシアルが開発現場で培ったソフトウェア技術をベースとしており、より実践的であることから多くの支持を集め、エンジニア・デザイナーを中心に約1500人に受講頂きました。

現在、Web製作の現場ではPHP言語を開発に利用することが完全に主流となりましたが、Webテクノロジーの進歩、PHP言語の普及と成長に伴い、さらに先を行く下記のようなニーズが高まってきました。

・大規模な開発におけるPHPの利用増加と、それに伴うより効率的な開発体制の構築
・デザインとプログラミング技術の強い連携
Flashなど高い表現力と処理能力を使い高いパフォーマンスのアプリケーション構築
・外部サイトと連携させることによる魅力的なコンテンツの提供

現在のエンジニアには、Webアプリケーションの開発現場の中で、よりフレキシブルに対応できることが求められています。大人数での効率的な開発、サーバ操作、モバイルサイトへの対応、先進的なデザインとの連携をはじめとして、数年前と比較すると、より先に進んだスキル、豊富な知識が求められています。

一方、Webデザイナーも従来のようにサイトのデザインに特化した体制ではなく、Flashの知識、プログラムへの理解、技術を考慮した上でのデザインが重要視されるようになってきました。

このような背景のもとアシアルは、プログラマ、デザイナへのサポート、スキルアップのため新たに講座を開設しました。

開設される講座は、いずれもアシアルが自社サービス及び受託開発で好評を受けたソフトウェア技術をベースとしてり、ハンズオンで実際にアプリケーションを作成しながら進める実践的な内容で、スキルを実務レベルに押し上げる内容です。

【アシアルPHPスクールの特徴】
・講師は現場で活躍する現役のPHPエンジニア
・受講者のスキル・希望にあわせた豊富なカリキュラムを提供
・各種割引制度(継続割引、グループ割引、早期申込割引)
・スクールの雰囲気や講座の内容について把握するための講座説明会(無料)の開催(次回開催 6月2日)

【新たに開設するプログラミング研修】
PHP×Flex 初級編
 Flex入門者を対象にActionScript3、最新版であるFlex4を取り上げ、PHPスクリプトと連携した簡単なアプリケーションを作成

PHP×Flex 中級編
 Flex4とPHPの連携によるRIAアプリケーションの作成、基本コンポーネントの使用法、実践的なカスタマイズ方法

CakePHP フレームワーク
 フレームワークを使用したスピーティかつ効率的な開発

PHP講座 モバイル開発編
 3G方式の携帯端末、3キャリアに対応した開発

PHP講座 Web API
 Twitterなど人気コンテンツとの連動

PHP講座 オブジェクト編
 ソースコードの効率化、デザインパターンへの理解

Linuxサーバ編
 基本的なサーバー知識と操作方法

CakePHPのShellからメール送信

こんにちは、中川です。
最近CakePHPはあまりさわってなかったのですが、久々にCakeからメール送信するバッチ処理を書くことがありまして、簡単に紹介したいと思います。

CakePHPでメール送信ですが、EmailComponent使いたいと思います。

テンプレートを使って送信する場合(テキストメールだと)、

/path/to/myproj/app/views/elements/email/text/hoge.ctp


<?php echo $user_name ?> さん

メールテストです!


メールテンプレートを作成し、アクションからは、

hoge_controller.php


<?php
・
・
var $components = array('Email'); 
・
・
function _sendMail() {
	$this->Email->from = 'Somebody <somebody@example.com>';
	$this->Email->to = 'Somebody Else <somebody.else@example.com>';
	$this->Email->subject = 'Test';
	// テンプレートはhoge.ctpを使用
	$this->Email->template = "hoge";
	// 'html'(HTML)、'text'(テキスト)、または'both'(両方)で送信。(デフォルトは 'text')。
	$this->Email->sendAs = 'text';
	// ビュー変数を普通に渡す。
	$this->set('foo', $foo);
	$this->Email->send();
}
・
・
?>


とこんな感じで簡単に送信できます。
しかし、今回は、バッチ処理で送りたいので、CakePHPのシェルとしてスクリプトを作成します。

Shellとして、作った場合、



var $components = array('Email'); 


このような使い方ができないようなので、startupメソッドでimportしたEmailコンポーネントインスタンス化しています。また、メールテンプレートに変数を渡すために、インスタンス化したEmailコンポーネントにControllerのオブジェクトを渡してやり、Controllerに対して変数をの set を行っています。

以下、完成版です。

/path/to/myproj/app/vendors/shells/hoge.php



<?php
App::import('Core', 'Controller');
App::import('Component', 'Email');

class hogeShell extends Shell {

  function startup(){
    $this->controller = new Controller();
    $this->Email = new EmailComponent($this);
    $this->Email->startup($this->controller);
  }
  
  function main(){
    $this->out("start!!");
    $this->controller->set("user_name", "てすとゆーざー");
    $this->_sendmail();
    $this->out("complete!!");
  }
  
  function _sendmail(){
    $this->Email->to = '#送信先メールアドレス#';
    $this->Email->from = '#送信元メールアドレス#';
    $this->Email->subject = 'TEST SUBJECT!';
    $this->Email->sendAs = "text";
    $this->Email->template = "hoge"; ## /path/to/myproj/app/views/elements/email/text/hoge.ctp 
    $this->Email->send();
    $this->Email->reset();
  }
  
}
?>


まだまだアシアルの開発では、symfonyが多いですが、
CakePHPも1.2正式版が出たらもっと使っていけたらいいかもと思います。

CakePHPで国際化の方法を試してみました

cakePHPでは、翻訳ファイルを使う方法と、データベースを使う方法の2種類が用意されているようです。
今回は、翻訳ファイルを使う方法を試してみたいと思います。
尚、使用したcakeのバージョンは「1.2.0.6311-beta」です。



----------------------------------------------
以下、長々と書いていますが、[CakePHP のおいしい食べ方: CakePHP1.2の簡単国際化]の方法でほぼ、そのまま動きました。
違いは、cake_1.2.0.6311-beta でmoファイルの読み込みが不具合ある部分を変更しているくらいです。
----------------------------------------------

まずは、翻訳対象にするテキストをテンプレート内で、以下のように「__(アンダースコア*2)関数」を使用して記述します。


<?php __('Hello World'); ?>

__関数ですが、第1引数に文字列を渡し、第2引数はデフォルトはfalseでecho出力し、trueを渡すと戻り値として返却になります。
(※basics.phpに関数定義されています。)
そして、cakeのコンソールを使って翻訳ファイルを作成します。


$ /path/to/myproject/cake/console/cake i18n

Hello yoshiki,

Welcome to CakePHP v1.2.0.6311 beta Console
---------------------------------------------------------------
What is the full path you would like to extract?
Example: /data/myapp
[Q]uit  
[Q] > /path/to/myproject/app			#対象ディレクトをフルパスで指定
What is the full path you would like to output?
Example: /path/to/myproject/app/locale
[Q]uit  
[/path/to/myproject/app/locale] >  ## デフォルトのままlocaleを使用
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q) 
> E			##Eを選択


Extracting...
---------------------------------------------------------------
Path: /path/to/myproject/app
Output Directory: /path/to/myproject/app/locale/
---------------------------------------------------------------
Would you like to merge all translations into one file? (y/n) 
[y] > ## yes
What should we name this file?  
[default] > 	## defaultを使用
Processing /path/to/myproject/app/index.php...
Processing /path/to/myproject/app/config/acl.ini.php...
Processing /path/to/myproject/app/config/bootstrap.php...
Processing /path/to/myproject/app/config/core.php...
Processing /path/to/myproject/app/config/inflections.php...
Processing /path/to/myproject/app/config/routes.php...
Processing /path/to/myproject/app/config/sql/db_acl.php...
Processing /path/to/myproject/app/config/sql/i18n.php...
Processing /path/to/myproject/app/config/sql/sessions.php...
Processing /path/to/myproject/app/views/layouts/default.ctp...
Processing /path/to/myproject/app/views/layouts/flash.ctp...
Processing /path/to/myproject/app/views/pages/home.ctp...
Processing /path/to/myproject/app/webroot/css.php...
Processing /path/to/myproject/app/webroot/index.php...
Processing /path/to/myproject/app/webroot/test.php...
Processing /path/to/myproject/app/webroot/js/vendors.php...
Done.
---------------------------------------------------------------
I18n Shell
---------------------------------------------------------------
[E]xtract POT file from sources
[I]nitialize i18n database table
[H]elp
[Q]uit
What would you like to do? (E/I/H/Q) 
> Q		## 終了


これで、


/path/to/myproject/app/locale/default.pot  

が、作成されます。

次に、日本語用のディレクトリ 「/jpn/LC_MESSAGES」 を作成します。


$ mkdir -p  /path/to/myproject/app/locale/jpn/LC_MESSAGES

default.pot を 作成したディレクトリにdefault.poのファイル名でコピーします。


$ cp /path/to/myproject/app/locale/default.pot /path/to/myproject/app/locale/jpn/LC_MESSAGES/default.po


後は、default.poを翻訳ファイル編集ソフトのPoeditで簡単に編集することができます。


Poeditで編集して保存した際に default.mo ファイルができるのですが、
「rev6311」のcakeでは正常にmoファイルを使えません。
最新のrevisionでは修正されているようですのでそちらを使うことにします。

※変更点
Changes in branches/1.2.x.x/cake/libs/i18n.php [6296:6622]

これで、moファイルを読み込んで使用できます。
なお、default.moファイルを作らなければ、default.poファイルを使用するように
なっていますので、default.moを作らない方法でもいいかもしれませんね。


今後の作業でテキストの追加等を行った場合は、
「cake i18n」 コマンドでまた、default.pot を作成し、
Poeditで「カタログ」→「POTファイルを元に更新します」→default.potを指定すると、変更点がマージされます。



と、CakePHPでは、こんなに簡単に国際化ができました!!
次は、DBを使った方法も試してみたいと思います。

CakePHPを簡単に使ってみました

こんばんは、笹亀です。

今日はひさしぶりに起きたら雨が降って少し涼しい朝でした。
そんなことも知らずに、前日に窓を開けて寝たおかげで、風邪気味です^^;

最近、CakePHPがどのようなものかが気になり、触ってみようかなぁとおもいました。
実際にCakePHPのマニュアルを参照しながら、
設置、設定、簡単なblog機能を最初の一歩として行ってみました。
今回はその内容についてご紹介させていただきます。

CakePHPとは、WEB開発用 PHP4/PHP5/PHP6のRADフレームワークです。

本家は「http://cakephp.org/」にあります。
海外のサイトで英語でかかれています^^;
いきなりハードルが高い感じでうち砕かされそうでしたが、
日本語でかかれているところがないかと探してみることにしました。
http://cakephp.jp/doc/index.html
やっぱりありました~~
ということで安心しました^^
今も翻訳中ですべてが日本語訳にできたわけではないみたいですが、
十分に内容を確認することはできます。

サイト上の「A. Cake ブログチュートリアル」でCakePHPの設定を行いながら、
blogを作るという箇所があったので、ここを参考にしながら作成していこうと思います。


CakePHPの設定を行いながら、特定のデータベースの全てのデータをリスト表示して、
リストの詳細データを表示するところまでを作成してみようとおもいます。

手順どおりに、ソースをダウンロードして・・・
ダウンロードしたファイルを展開して・・・
ブログのデータベースを作成して・・・
 ※私はちなみにMySQLで作成しました。

CakePHPのデータベースの設定ファイルを変更して・・・
Apachemod_rewriteを設定して・・・

ここらの設定関連の処理はマニュアルを見ながら全て設定していきました。

とりあえずここまでの設定が終わるとブラウザで確認することができます。
早速ブラウザでアクセスしました。


「Cake is able to connect to the database」ってことは、
データベースに接続できたらしいので、たぶん動いているということでしょう^^;
ここまで動いたのを確認後にマニュアルではブログを作っていくみたいです。

えっと・・
まずはmodelクラスを定義していきます。
view、add、edit、deleteの操作を行うための土台となるクラスらしいです。

app/models/post.php


<?php
class Post extends AppModel
{
    var $name = 'Post';
}
?>


ふむふむ・・
ここでアプリケーションのモデルを定義していくみたいです。

次はposts用のコントローラを作成する。
ここのコントロール部分が実際にview、add、edit、deleteなどのアクションコマンドを記述していくところらしいです。

実際に、indexアクションを追加して、ブラウザーでリストが表示できるかを確認。

/app/controllers/posts_controller.php


<?php

class PostsController extends AppController
{
    var $name = 'Posts';

    function index()
    {
        $this->set('posts', $this->Post->findAll());
    }

}

?>


マニュアルには、
「[$this->set('posts', $this->Post->findAll()) は set() という命令を使って、データをビューに渡しています。」と記述されていました。
$this->Post->findAll()はPostモデルのデータを全て取得するメソッドなのでしょう。
その取得したデータをset()でViewに渡しているということですね。
PHPsmartyでいうとassignみたいなものなのでしょうか。

さて、作成できたのでブラウザで実行してみます。


エラーが出ていますね・・
内容をみると、「ファイルが無いよ」と怒られている。
次の章を確認してみるとviewを作成する箇所がありました。
では、さっそくviewファイルを作成します。

/app/views/posts/index.thtml


<h1>ブログの投稿</h1>
<table>
    <tr>
        <th>Id
        <th>タイトル</th>
        <th>作成日</th>
    </tr>

   <!-- ここで、 $posts 配列のループをまわして、投稿情報を printing out します。 -->

    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $post['Post']['id']; ?></td>
        <td>
            <?php echo $html->link($post['Post']['title'], "/posts/view/".$post['Post']['id']); ?>
        </td>
        <td><?php echo $post['Post']['created']; ?></td>
    </tr>
    <?php endforeach; ?>

</table>


今度こそ、リスト一覧が表示されるはずです。


ここまでくると、詳細ページのリンク部分も作成したくなってきます。
先ほどの手順と同じように・・
コントローラにviewアクションを追加して、viewsフォルダにテンプレートを作成すると、このように簡単に詳細ページも作成できます。


CakePHPで簡単にリストと詳細ページまでを作成することができました。
この後もマニュアル通りに進んで作成していくと、
登録する処理、更新する処理、削除する処理を追加することができます。
気になる方は続きをぜひ作ってみてください。

このように、CakePHPを簡単に触りましたが、symfonyと違いを見つけたかったのですが・・違いまではさすがに感じることができませんでした。
もっと深く触ってみないとCakePHPのいいところと不便さなどは探せないのではないでしょうか。

個人的にPHPで何か作るときには本格的に使ってみようと思います><;
みなさんもぜひ、CakePHPを使用してみてはいかがでしょうか^^