CakePHP::メール送信プラグインを書いた

7月 9th, 2007 admin

CakePHPのpluginsってフォルダが気になっていたのでマニュアルを読みながらプラグイン作成に挑戦した。
DBを使わないことに決めたので、ビューにメールの本文を書いたり(requestActionが使いたかっただけ)、メールアドレスがモデルに書いてあったりしてあるので、その辺は使うときにいい感じにして下さい。

とにかくこれをダウンロードしてプラグインフォルダに突っ込めばお問合せフォームができるんだからCakePHPはやっぱりすごい。

cakephp_plugin_mail-01.zip(16kb)

仕様

よくあるお問合せフォーム

  • 確認画面あります
  • 管理者(複数)とお問合せ主にメール送ります

設置・設定

設置は簡単で、解凍してできたmailというフォルダを/plugins/mailって感じでおいてやるだけ。すると/app_dir/mail/mail_contacts/indexでアクセスできるようになる。
最低必要な設定は、/mail/models/mail_contact.php#getConfig()のところ

  function getConfig(){
    return array(
            'mail_from'      =>  'info@example.com',
            'mail_to'      =>  array("staffa@example.com","staffb@example.com"),
            'admin_title'    =>  'ホームページよりお問合せ',
            'customer_title'   =>  'お問合せ有難うございました。[bekery php]',
          );
  }

mail_form・・・メールのfromのアドレス
mail_to・・・管理者のアドレス、複数登録できる
admin_title・・・管理者あてのメールのタイトル
customer_title・・・お問合せ主宛てのメールのタイトル

あとは、メールの本文が
/mail/views/mail_contacts/bodyForAdmin.thtml
/mail/views/mail_contacts/bodyForCustomer.thtml
の二つのファイルで普通にビューになっているのでそれを編集。

気になった点

  • 入力>確認>完了の「確認」部分が非常に面倒くさい
  • radioボタンのデフォルト値の設定方法が不明
  • Cake流のメールの送り方がわからない(プレーンテキストでしかおくらないしなー)
  • プラグインってあんまり使われて無い?便利なプラグインが腐るほどあるんじゃないかと思ったんだが見つからなかった。

みんなどうやってコーディングしているのか気になってきた。cheesecakeとか読んだ用がいいのかな?できれば日本人がかいたスクリプトがいいんだけど・・・・すごい人たちで、お問合せフォームコンテスト、掲示板コンテストを行って欲しい。

CakePHPの好きなところ

7月 8th, 2007 admin

Mapleに始まり、Mojavi、Ethna、Guesswork、Roby on Rails(Ruby)とフレームワークをいろいろ適当に使わせて頂いたけど、それでも一番CakePHPが好きな理由をこのへんを見つつメモ。フレームワーク選びで迷っている人の参考になればと思います。

導入が簡単

アーカイブを解凍して配置するだけです。PEARやSmartyをダウンロードしてきたりとかする必要はありません。SSHでログインする必要がないのでロリポップでも動きます。

コンポーネントが充実

Railsのいいところは、コンポーネントが充実しているところ。Cakeもコンポーネント充実しています。
マイグレーションもある。

最強レベルのORマッパ

CakeのORマッパはDBからデータを取ってきたときに配列(ハッシュ)でとってきてくれる。RailsやEthnaのようにオブジェクトで扱うのは面倒くさいのでうれしい。
あと関連したテーブルのデータも勝手に取ってきてくれるし、取ってきてくれるだけじゃなくて削除もしてくれる!素敵!

PHP4と5の両方で動作する

しかもPHP6もサポートするらしい。安心だ

ドキュメントが充実

CakePHP プログラマーズ リファレンスガイドはかなり充実。API一覧とあわせて使えばCakeのほとんどを理解したのと同じ

デバッグが親切

詳しいエラー画面や、発行SQLの表示、オブジェクトの中身の表示など標準でデバッグ機能が充実している

Tシャツとかを販売している

なんか地道ですごい。

CakePHP::Pagenation(ページャ、ページング処理)

7月 5th, 2007 admin

ページャとかページングとか行うためのコンポーネントの紹介
PHPではよくPEAR::PAGERとか使ったりするのだけど自前でやるのがCake流(多分)

以下はBakeryのPaginationのチュートリアルのエスパー翻訳です。

Pagination  By Andy Dawson aka "AD7six"
http://bakery.cakephp.org/articles/view/pagination

もしあなたのアプリケーションでたくさんのデータを表示したりするなら、ソートできたりページに分けたほうがいいよね。このチュートリアルではそれをどうやってやるかを説明します。あなたはいくつかのファイルをコピーして数行のコードを書くだけでこれらのことができるでしょう。
これをやるのにCakeの知識はほとんどいりません:)

もしあなたがまだページネーションをつけたいと思うテーブルをもってないならhttp://manual.cakephp.org/appendix/blog_tutorial こことかで準備してくださいね。

セッティング

必要なファイルはすべてbakeryで手に入ります。
http://bakery.cakephp.org/articles/view/67 を/app/controllers/components/pagination.phpに
http://bakery.cakephp.org/articles/view/68を/app/views/helpers/pagination.phpに
http://bakery.cakephp.org/articles/view/69を/app/views/elements/pagination.thtmlに

それぞれ保存します。

コントローラの作成と編集

ページネーションを使うのに必要な編集はコンポーネント、ヘルパーのインクルードとコンポーネントのinitメソッドの呼び出しだけです。

PHP:
  1. <?php
  2. class PostsController extends AppController
  3. {
  4.     var $name = 'Posts'; // for PHP4 installs
  5.     var $components = array ('Pagination'); // Added
  6.     var $helpers = array('Pagination'); // Added
  7.  
  8.     function index() {
  9.         $criteria=NULL;
  10.         list($order,$limit,$page) = $this->Pagination->init($criteria); // Added
  11.         $data = $this->Post->findAll($criteria, NULL, $order, $limit, $page); // Extra parameters added
  12.  
  13.         $this->set('data',$data);
  14.     }
  15. }
  16. ?>

ビューの作成と編集

ページネーションを使うにはエレメントのインクルードとオプションとしてソート順を変えるためのテーブルヘッダを指定が必要です。

PHP:
  1. <?php
  2. $pagination->setPaging($paging); // Initialize the pagination variables
  3. $th = array (
  4.             $pagination->sortBy('id'),
  5.             $pagination->sortBy('title'),
  6.             $pagination->sortBy('created')
  7. ); // Generate the pagination sort links
  8. echo $html->tableHeaders($th); // Create the table headers with sort links if desired
  9.  
  10. foreach ($data as $output)
  11. {
  12.     $tr = array (
  13.         $output['Post']['id'],
  14.         $html->link($output['Post']['title'], "/Posts/View/{$output['Post']['id']}"),
  15.         $output['Post']['created']
  16.         );
  17.     echo $html->tableCells($tr,array('class'=>'altRow'),array('class'=>'evenRow'));
  18. }
  19. ?>
  20.  
  21. <?php echo $this->renderElement('pagination'); // Render the pagination element ?>

訳注:ここの段階でページングできてます!便利だなぁ

Ajaxアップデートの追加

もしRequestHandlerコンポーネントとAJAXヘルパーをコントローラにインクルードしていて、prototype.jpもビューに読み込んでいるならajaxアップデートが簡単にできます。デフォルトでは"content"divがアップデートされますが、これはコンポーネントで(そのほかdirectryやrun timeでも)変更可能です。you can disable this automatic behaviour if required.

Prototypeの追加方法

ではどのようにprototypeを追加するのでしょうか?
レイアウトを変更しましょう。

Prototype JavaScriptライブラリはhttp://prototype.conio.net/で入手可能です。
prototype.jsを/app/webroot/js/に入れて
下記のコードをタグ内に入れてください。

PHP:
  1. <?php
  2. if(isset($javascript)):
  3.     echo $javascript->link('prototype.js');
  4. endif;
  5. ?>

追記
additional infoとして追加のページがあるようです。
http://bakery.cakephp.org/leafs/view/7

CakePHPに関して学んだことメモ(1)

7月 3rd, 2007 admin

CAKE_ADMIN

http://www.example.com/admin/~という管理者用の画面を用意するための仕組みがCakePHPには用意されている。

CakePHP 管理者用アクション » Shin x blog
http://www.1x1.jp/blog/2006/09/cakephp_admin.html

decorate.phpはかなり便利

CakePHPのおいしい食べ方: Scaffolding and Decorating your web app with CakePHP
http://cakephp.seesaa.net/article/25299712.html

通常のScaffoldingに加えて検索やソートがついている便利ジェネレータ。テーブルを作ったらまずは全部デコレートしてみるのもありなのかもしれない。
テーブルのアソシエーションも一部考慮してくれるようだし、管理画面用のScaffoldも生成してくれるというところもうれしい。

確認画面とかは面倒?

入力->確認->完了という流れを実現するための方法が

CakePHPまとめ@Wiki - 確認画面を挟む
http://www12.atwiki.jp/nezox/pages/6.html

にあるのですが、非常に面倒くさい。一つ一つhiddenを書いたり、エラー用のヘルパを書いたりとかなんか面倒くさい。Ethnaのように{app_ne.hidden_vars}を書くだけでhidden全部入りますよ。みたいなのはないのだろうか?

追記
ビューからのコンポーネントへのアクセス
○○コンポーネントにはビューから$○○でアクセスできる。だからセッションには

< ?php pr($session) ?>

とかできる。他のコンポーネントも一緒

2007/07/03追記

CakePHP1.1系でのクッキーの取り扱い注意

CakePHP1.2系ではコンポーネントを通じて扱うことができるようになったそうだが、1.1系ではコンポーネントがないためphpのsetcookie関数を使ったりするのだが、CakePHP1.1ではphpの変数であるsession.cookie_pathというのを設定しているのでクッキーの登録時に

setcookie(COOKIE_NAME, $data,$expire_date,$this->Session->path)

って感じでpathを設定してあげないと$_COOKIEで値を取得できないので注意。というかかなり悩んだ。

CakePHPに対する誤解のまとめ

7月 2nd, 2007 admin

flashはダサい

リダイレクトをしてくれて非常に便利なんだけど、数秒後にリダイレクトとかすごいダサいし、レイアウトも共有できなくてダサいし、ひどいわこれ!と思っていたらこれはデバッグ用の便利機能だったそうで、本番環境ではRailsと同様の動きをしてくれるとのこと・・・便利ですね。

this->flash() 関数は、ユーザにメッセージを(flash レイアウトを使用して)1秒表示(flash)し、その後、他の URL (この場合は、 /posts)に転送するコントローラの関数です。DEBUG が 0 に設定されている場合、$this->flash() は自動的にリダイレクトしますが DEBUG が 0 より大きい場合には、flash レイアウトが表示され、メッセージをクリックした時にリダイレクトが実行されるようになります。http://www.cakephp.jp/doc/apas09.html