WindowsプログラマのWebアプリへの挑戦日記。あとパンとか。

Archive for the ‘cakePHP’ Category

AGAG – Amazonアソシエイトサポートツール リリース

日曜日, 6月 8th, 2008 Posted in AGAG, cakePHP, PHP | No Comments »

Amazonアソシエイト・プログラム(アフィリエイト)の利用をサポートするAGAGというサービスを開始しました。

AGAG – Amazonアソシエイトサポートツール
http://www.agag.its55.com/

AGAG

Amazonアソシエイト・プログラムを使用して雑誌などを紹介しようとすると、雑誌が発売されるたびにリンクを変更しなくてはいけなくて、とても面倒でした。そこで、キーワードを登録しておくと自動で最新の商品を表示するサービスを作ってみました。

商品を検索するキーワードを登録しておくと、AGAGの自動サーチ機能が毎日自動でAmazonに検索をかけて、その検索結果を新しい商品から指定個数分表示します。AGAGが発行するコードをブログなどに貼っておくと、勝手にブログに表示される商品が新しいものに変わります。

このサービスを利用するには、ユーザ登録が必要です。

このサービスはCakePHPを使って作りました。初めてCakePHPで作ったサービスで、CakePHPってどんな感じかなというのを探るために作りました。

作ってみた感想ですが、CakePHPいい!

それほど難しいことはしてなくて、CakePHPができる範囲内で作ればかなり楽です。まあセッション周りとかちょこちょこ思い通りにならないこともあったけど、それを妥協しても作りやすさを選んだほうがプライベートで作るにはいいのかなと思ってます。

AGAGに関しての質問や要望などありましたら、このブログにてご連絡ください。

AGAGは今後機能追加などしていく予定です。

cakePHPのセッションでハマる

金曜日, 3月 21st, 2008 Posted in cakePHP, PHP | No Comments »

cakePHPを使って簡単なサイトを作っているんですが、セッションまわりで謎が多いのでちょっとまとめます。(自分用)

まず、セッションに入れたはずなのに画面遷移するとデータがなくなっている現象から。

HogeControllerのDoSomethingというアクションで、次のようにセッションにデータを入れます。

  1. $this->Session->write( 'search_category', $category );
  2. $this->Session->write( 'search_word', $word );

そしてDoSomethingのviewでは、DoOtherへリンクしているとします。

アクションDoOtherでセッションを確認すると、次のようになっていました。

  1. [search_category]=;
  2. [search_word]=;

DoSomethingで入れた値がDoOtherでは消えています。しかしキーは残っています。

cakePHPのフォーラムで次のようなスレッドを発見。
“cake1.1.18にversionアップしたらSessionが使えない?” フォーラム – CakePHP Users in Japan

どうやらCAKE_SECURITYがhightだとセッション開始のたびに

  1. $this->renew();

が呼ばれ

  1. session_regenerate_id()

されてしまうようです。
なのでとりあえずCAKE_SECURITYをmediumに変更。
んが、これでも問題は解決せず。

んで、同じくcakePHPフォーラムで次のようなスレッドを発見。
“セッションまわりの挙動がおかしい?時” フォーラム – CakePHP Users in Japan

viewで使っている画像のパスがrelative(相対パス?)だったら、アクションが複数回呼ばれることがあるらしい。

開発中のサイトでは、コントローラの$layoutは\cake\libs\view\templates\layouts\default.thtmlを\app\views\layouts\default.thmlにコピーしてレイアウトに関する部分だけ変更して使っていたので、

  1. <link rel="shortcut icon" href="<?php echo $this->webroot . 'favicon.ico'; ?>" type="image/x-icon" />

の部分を削除するとDoOtherでもセッションから正しいデータを取得することができました。

もう一つセッションに関する問題があるんですが、長くなりそうなので別記事で。

cakePHPでJavascriptを出力する

日曜日, 2月 3rd, 2008 Posted in cakePHP, PHP | 2 Comments »

HTMLに以下のようなJavascriptのコードを埋め込み、srcでPHPなどの動的な処理をするファイルを指定すると、静的なHTMLに動的な処理を埋め込むことが出来ます。アクセス解析のサービスなどでよくありますね。

  1. <script src="xxx.php" type="text/javascript"></script>

で、srcにPHPのファイルを指定し、PHP側でJavascriptのコードを出力する処理を書けば実現できます。詳しいやり方は、PHP:JS(JavaScript)からPHPを呼び出しHTML上に出力する方法に丁寧に書かれているので参考にしてください。

で、cakePHPでこの処理を書こうと思ったわけです。まずは、Javacsriptを呼び出すHTML側では、

  1. <script src="/app/[コントローラー]/[メソッド]/[プロパティ]" type="text/javascript" charset="utf-8"></script>

のように書きます。controller側のメソッドでは、最初に

  1. header("Content-type: application/x-javascript");

を書く必要があるようです。viewでheaderを出力すると、Javascriptとして認識されません。

cakePHPの/app/core.phpのDEBUGモードが0以外だと余計なモノが出力されるのでJavascriptとして認識されないみたいです。ボクは動作確認はDEBUGモードを0にしてやっています。特定の場合だけDEBUG出力を抑制することは出来ないモノですかね。

Amazon Webサービスを利用するサイトをcakePHPで構築

月曜日, 1月 14th, 2008 Posted in cakePHP, PHP | 5 Comments »

せっかくのMVCなので、Amazon Webサービスからデータを取得する処理をModelとして実装してみました。

ModelではとりあえずfindAllのみをオーバーライドします。後で必要になれば必要な関数をオーバーライドするつもりです。Modelは以下の通り。

  1. class Aws extends AppModel {
  2.  
  3.     var $name = 'Aws';
  4.    
  5.     var $useTable = false;
  6.    
  7.     function findAll( $category, $keyword, $count ){
  8.         //データの取得処理を実装
  9.     }
  10. }

実際にAmazon Webサービスからデータを取得する処理は、「ITmedia エンタープライズ:特集:後編 WebサービスをAmazonで知る――PHPでECS 4.0を使うテクニック (1/5)」を参考にしました。

ModelでDBテーブルを使わない場合は、

  1. var $useTable = false;

と書くとDBテーブルにアクセスしないらしい。

controllerでは、対応するDB以外のModelを使う場合、

  1. class BillsController extends AppController {
  2.  
  3.     var $name = 'Bills';
  4.     var $helpers = array('Html', 'Form' );
  5.     var $uses = array( 'Bill', 'Aws' );
  6.    
  7.     //以下略
  8. }

のように使うModelを配列で宣言する。このとき対応するcontrollerに対応したDBも配列に入れることを忘れずに。

coreserverでcakePHPを試す

月曜日, 1月 14th, 2008 Posted in cakePHP, PHP | 1 Comment »

cakePHPの動作環境をレンタルサーバーのcoreserver上に構築します。ローカルでの動作確認はCakePHPをローカルで試すを参照してください。

cakePHPはダウンロードしてきたモジュールを解凍すると、次のようなフォルダ構成になります。

  1. /cakeroot
  2.     /app
  3.         /config
  4.         /controllers
  5.         /models
  6.         /plugins
  7.         /tmp
  8.         /vendors
  9.         /views
  10.         /webroot
  11.         .htaccess
  12.         index.php
  13.     /cake
  14.     /vendors
  15.     .htaccess
  16.     index.php

レンタルサーバーで複数のcakePHPアプリを動作させる場合、容量を節約したいなどの理由でcakePHPのcoreは共通のファイルを参照したいと思って、次のような構成に変更しました。

  1. /virtual/xxx/lib/cake_core
  2.     /cake
  3.     /vendors
  4.    
  5. /virtual/xxx/public_html/caketest.xxx.com/
  6.     /app
  7.         /config
  8.         /controllers
  9.         /models
  10.         /plugins
  11.         /tmp
  12.         /vendors
  13.         /views
  14.         /webroot
  15.         .htaccess
  16.         index.php
  17.     .htaccess
  18.     index.php

/virtual/xxx/lib/cake_coreは複数のcakePHPアプリで共通とし、アプリごとに/virtual/xxx/public_html/caketest.xxx.com/以下のようにフォルダを構成します。

フォルダ構成を変更したことで次のファイルを編集します。/virtual/xxx/public_html/caketest.xxx.com/app/webroot/index.phpの、

  1. define('CAKE_CORE_INCLUDE_PATH', ROOT);

  1. define( 'CAKE_CORE_INCLUDE_PATH', DS.'virtual'.DS.'xxx'.DS.'lib'.DS.'cake_core' );

に変更します。

/virtual/xxx/public_html/caketest.xxx.com/index.phpの

  1. define('CAKE_CORE_INCLUDE_PATH', ROOT);

  1. define( 'CAKE_CORE_INCLUDE_PATH', DS.'virtual'.DS.'xxx'.DS.'lib'.DS.'cake_core' );

に変更します。

これでhttp://caketest.xxx.com/postsにアクセスしちゃんとなにやらエラーがでます。どうやらアクセス権のエラーっぽいので、/virtual/xxx/public_html/caketest.xxx.com/app/tmp/cache/modelsの、default_xxx_caketest_listとdefault_postsの属性を757に変更するとちゃんと表示されました。どうやら、/virtual/xxx/public_html/caketest.xxx.com/app/tmp/cache以下のディレクトリの属性を変更した方が良さそうです。

追記:2008/05/12

なんだかファイルの編集する箇所が大幅に間違っていたので訂正しました。

CakePHPをローカルで試す

火曜日, 1月 8th, 2008 Posted in cakePHP, PHP | No Comments »

PHPのフレームワーク、CakePHPをローカルで試してみました。基本はCakePHP プログラマーズ リファレンスガイドの通りにやればいいんですが、ちょっと気になることなどをメモします。

ローカルの環境はWindows Vistaにxamppを入れています。

  1. CakePHPのインストール

    CakePHPからcake_1.1.18.5850.zipをダウンロード。1.2系はまだbetaっぽいので1.1系で。C:\xampp\htdocsに解凍。

  2. DBの作成

    A.3.ブログデータベースの作成の通りにテーブルとデータを作成。
    /app/config/database.php.defaultを/app/config/database.phpにリネームする。/app/config/database.phpの$defaultを作成したDBに併せて変更

    1. <br />
    2. var $default = array('driver' => 'mysql',<br />
    3. 'connect' => 'mysql_connect',<br />
    4. 'host' => 'localhost',<br />
    5. 'login' => 'ユーザ名',<br />
    6. 'password' => 'DBパスワード',<br />
    7. 'database' => 'DB名',<br />
    8. 'prefix' => '');<br />

    ここまででいったんhttp://localhost/cakeにアクセスしてみると、

    Your database configuration file is present.
    Cake is able to connect to the database.

    と表示され問題ないことを確認する。

  3. Modelの作成

    A.6.Post Model の作成の通りに/app/models/post.phpを作成する。

  4. Controllerの作成

    A.7.Posts Controller の作成の通りに/app/controllers/posts_controller.phpを作成する。controllerからは$this->PostでModelにアクセスできる。

  5. Viewの作成

    ビューのファイルは、/app/views以下に対応するコントローラにあうフォルダを作成する必要がある。今回はpostsというフォルダを作成する。A.8.Posts Controller の作成の通りに/app/views/posts/index.thtmlを作成する。

    とりあえずここでhttp://localhost/cake/posts/indexにアクセスしてみる。んが、文字化け。UTF-8で保存したら文字化けするみたい。Shift-JISで保存すると問題ない。どこかに文字コードの設定があると思うんだけど、また今度調べよう。

    続いて/app/controllers/posts_controller.phpにfunction view()を追加。これで投稿された記事を個別に見れるようになる。

    さらにA.9.Posts の追加の通りに/app/controllers/posts_controller.phpにfunction add()を追加。フォームデータをPOSTで送信したら、$this->params[form]でフォームに入力されたデータにアクセスできるらしい。htmlヘルパーの$html->inputなどを使ってフォームの内容を送信すると$this->data['モデル']['フィールド名']でアクセスできる。

    A.10.データバリデーションの通りに/app/views/posts/add.thtmlを作成し、新規作成画面のviewを作成する。

    HtmlHelperの$html->input、$html->textareaの第一引数は対応するモデル/フィールドを指定する。第二引数はフォームの属性などを指定。’size’=>’40′で入力フィールドのサイズに40を指定。

    モデル(/app/models/post.php)に$validateを定義することによってsaveが呼ばれたときにフォームからの入力をチェック(validate)することができる。新規作成画面へのリンクを表示するために/app/views/posts/index.thtmlに/posts/addへのリンクを作成。

    1. < ?php echo $html->link( "新規投稿", "/posts/add" ); ?></p>
    2. <p>

ローカルでは特に問題なく動作しているので、次回はcoreserverで試してみます。