ラベル CakePHP の投稿を表示しています。 すべての投稿を表示
ラベル CakePHP の投稿を表示しています。 すべての投稿を表示

2012年8月29日水曜日

CakePHP/SimpleTest

CakePHPでSimpleTestでテストを行っていたら、言われのないエラーを表示されて悩んでしまった。

SImpleTestで個別にテストケースを実行すると何も問題ないのだが、Test Groups の「All tests」を実行すると
Missing Database Table

Error: Database table テーブル名 for model モデル名 was not found.

表示されているテーブルとモデルは存在し、関連するテーブル(ここで表示されてテーブルを参照している)との関連も確認したが問題なかった。

SimpleTest の All Tests がおかしいのでは? との考えに至った。

実際に、ググるとSimpleTest の All Tests は挙動不審なので使わないほうが良いとの意見もあった。

2012年6月25日月曜日

CakePHP 複数アプリの実行

CakePHP で複数アプリを実行する。

1. virtual host を設定して複数アプリを別々ホスト名で起動する。

2. .htaccess を修正する。(忘れがちなので注意)
[root@hoge sample]# cat .htaccess

   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

[root@hoge sample]# 
 
  ↓↓↓


   RewriteEngine on
   RewriteRule    ^$ webroot/    [L]
   RewriteRule    (.*) webroot/$1 [L]

サブディレクトリにcakePHPを構築する
もしサブドメインに構築する場合には、.htaccessの設定に追記が必要となる。
具体的には、RewriteBaseをきちんと設定にあるような

app/webroot/.htaccess にあるmod_rewriteの設定において RewriteBase /(サブディレクトリ名)を追加する必要がある。

もし、追加し忘れると、500 Internal Server Errorが表示され、Apacheのログには、

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

というメッセージが記録される。

今までDocumentRoot上にしか構築したことがなかったので、少しハマってしまった。

2011年12月22日木曜日

テーブル定義情報をSQL文で出力したい。

 phpMyAdminで見れば良いだろうと言えばそうのだが、やはりSQL文で定義情報を確認および保存しておく事が必要(DBやテーブルの一括作成)な時も多々ある。

 CakePHPでschema.php に定義を追加する時なども必要になる。関連など後から作成した表が schema.php にない場合もあるので、定義情報を簡単に出力できるように確認しておくべきだ。

■MySQL では、下記の通りで対応できる。

■コマンド
[hogehoge@hoge]$ mysqldump -h[ホスト] -u[ユーザ名] -p[パスワード] -d [データベース名] [テーブル名]

■出力結果
CREATE TABLE `users` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) CHARACTER SET utf8 NOT NULL,
  `password` varchar(50) CHARACTER SET utf8 NOT NULL,
  `fullname` varchar(50) CHARACTER SET utf8 NOT NULL,
  `email` varchar(256) CHARACTER SET utf8 NOT NULL,
  `tel` varchar(20) CHARACTER SET utf8 NOT NULL,
  `memo` text CHARACTER SET utf8 NOT NULL,
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;

■オラクル(Oracle10g)では下記のコマンドになります。
■コマンド
set long 10000 (出力する文字数を指定…10000文字まで)
select dbms_metadata.get_ddl('TABLE','TABLE_NAME') from dual;

■出力結果(テーブル:users)
DBMS_METADATA.GET_DDL('TABLE','users')
--------------------------------------------------------------------------------

  CREATE TABLE "HOGE"."USERS"
   ( "ID" NUMBER(6,0),
 "USERNAME" VARCHAR2(50),
 "PASSWORD" VARCHAR2(50),
 "FULLNAME" VARCHAR2(50),
 "EMAIL" VARCHAR2(256),
 "TEL" VARCHAR2(20),
 "MEMO" VARCHAR2(512),
 "CREATED" DATE,
 "UPDATED" DATE,
  CONSTRAINT "USERS_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 20 PCTUSED 70 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 983040 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"

※上記は別ファイルの出力結果をMySQLのテーブルと項目名を揃えた編集版です。
 よって、領域の情報は元々のテーブルの値をそのまま表示しています。

2011年12月17日土曜日

CakePHPによる実践Webアプリケーション開発

ログアウトがうまくいかない

 毎度の事ながら、書籍の通りにコーディングしてもうまくいかない機能が発生する。

 CakePHP初心者の私には、解決するのに時間がかかって困る。 (>_<)
 しかし、結果的には「CakePHPの辞典」やら別の実習書籍やらネットでググったりして少しづつ理解を深めていっているようだが... (・ ・?)

今回のお題はこちら...

action == 'add' || $this->action == 'edit') {
            $this->AppAuth->authenticate = $this->User;
        }
        if($this->User->findCount() == 0) {
            $this->AppAuth->allow('add');
            if($this->action != 'add') {
                $this->redirect('add');
                exit;
            }
        }
        return parent::beforeFilter();
    }
    function login() {
    }
    function logout() {
        clearCache('element_'.$this->AppAuth->user('id').'_action_menu', 'views', '');
        $this->redirect($this->AppAuth->logout());
    }
}
?>
 上記だけの抜粋での説明には無理があるかと思いますが、default.ctp にてログアウトを行うリンクを貼り、上記のlogoutが実施されるという手はずになていますが、ログアウトが行われない。
 ここで言う「ログアウトの成功」は、現在表示されている画面から「ログイン画面」に切り替わることを言います。もちろんセッション情報が解除(削除されていることは言うまでもなく前提条件になります。

 なかなか解決できずに困りググっていたところ「CakePHPによる実践Webアプリケーション開発」のサポート」サイトでログイン関連のスレッドがあったのでその内容を参考にさせてもらったところログアウトが実現できるようになりました。その方法は、下記のように beforeFilter() の先頭に $this->AppAuth->logout(); を追記するという内容です。

変更後の内容は下記のとおりです。
AppAuth->logout();
        if($this->action == 'add' || $this->action == 'edit') {
            $this->AppAuth->authenticate = $this->User;
        }
        if($this->User->findCount() == 0) {
            $this->AppAuth->allow('add');
            if($this->action != 'add') {
                $this->redirect('add');
                exit;
            }
        }
        return parent::beforeFilter();
    }

  ‥‥‥ 省略 ‥‥‥

}
?>

 上記の設定でログアウトはできるようになったが、ログアウト以外を選択してもログアウトされてしまう... 解決になってない。orz

2011年12月5日月曜日

CakePHPによる実践Webアプリケーション開発

何度も記載しているが、書籍の通りに記述しても実行できない箇所が多数あり、なかなか最後までたどり着けない。
 サポートのサイトを閲覧しても、こちらの疑問箇所はひとつだけ掲載されていたが、その内容はあくまでもcakephp1.2のみに通用する内容のようで、cakephp1.3以降で試す場合は、多数の箇所で問題にブチあたります。
 私と同じような内容で悩む方の助けになれば幸いですが...

関連(HABTM)を検索(find)する部分が動かない件について

書籍(CakePHPによる実践Webアプリケーション開発)では、下記のようにHABTMを検索するように記載されていましたが、エラーになってしまいます。

$user_ids = $this->Group->Belong->find('list', array(
        'conditions'=>array('Belong.group_id'=>$group_id), 
        'fields'=>array('Belong.user_id','Belong.user_id'), 
        'group'=>'Belong.user_id'));
エラー内容(habtmを検索できない)
Notice (8): Undefined property: Group::$Belong [APP/controllers/schedules_controller.php, line xx]

Fatal error: Call to a member function find() on a non-object in /var/www/cakephp/calendarnote/controllers/schedules_controller.php on line xx 
上記のようにエラーになるなので、habtmの関連モデル(Belog)を検索するように変更した。
$this->Group->Belong->find
$this->Belong->find
$user_ids = $this->Belong->find('list', array(
        'conditions'=>array('Belong.group_id'=>$group_id), 
        'fields'=>array('Belong.user_id','Belong.user_id'), 
        'group'=>'Belong.user_id'));
上記の変更で、無事に検索したいデータが検索されるようになった。
めでたし、めでたし...ヘ(ё_ё)ノ\ ワーイ

2011年11月29日火曜日

CakePHPによる実践Webアプリケーション開発

バージョンによる違いで時間を浪費

書籍では1.2の環境で行われているため、バージョンの違いによる変更箇所で時間を浪費する。
書籍とおりに行ってみて動かない場合は、ほぼバージョンアップによる変更があった機能である。(※しかし、コーディングミスもままあるけど..「('ヘ`;\ )

Html->link()

(1.2)
 $html->link($title, $url, $htmlAttributes, $confirmMessage, $escapeTitle)
   ↓
(1.3)
 $html->link($title, $url, $options, $confirmMessage)
上記のように変更になった。

リンクの付いた画像をHtmlヘルパーで表示する方法も下記のような変わる。
(1.2)
 $html->link($html->image('sample.png'),array('action' => 'hoge'), null, null, false);
 ※1.2では、linkの内容でimgのようなhtmlタグを出力する場合は、5つ目のパラメータをfalseにする。
   ↓
(1.3)
 $html->link($html->image('sample.png'), $url, array('escape' => false));
 ※1.3では、$options['escape']のようにしてエスケープしてimgタグを出力する。

2011年11月27日日曜日

CakePHPによる実践Webアプリケーション開発

CAKEPHP 1.3.11
下記の実行部分でエラーになってしまい対応できないでいた。
$session->flash();
$session->flash('auth');
↓ app_controller.phpで下記を設定することで解決した。
var $helpers = array('Session');
上記の解決に至ったのは、下記のサイトのおかげです。
http://stackoverflow.com/questions/8165192/cakephp-2-0-3-fatal-error-flash-on-object

内容は下記のとおりです。
Make sure you've added the Session helper to your public $helpers array.
class SomethingsController extends AppController {
    public $helpers = array('Session');
}
Or you could add it to a global AppController so that the Session helper is available to all controllers.
class AppController extends Controller {
    public $helpers = array('Session');
}
ネットで調べても日本語サイトの解決策がなかなかでてこないのでないので、仕方なく海外のサイトを確認して解決に至りました。

きっと、こんな簡単な内容はあまりネットに掲載しないのかなぁ...

cakephp 初心者の私には、大変助かりました。

2011年11月1日火曜日

CakePHPによる実践Webアプリケーション開発

書籍の内容と実際では異なる件について書き留めます。

■データソースからデータを検索

条件を満たすデータ件数を取得する。
(1.1 1.2 まで)
$this->User->findCount()
  ↓(下記のようになる)
(1.3以降)
$this->User->find('count')
※コマンドの詳細についてはマニュアルを参照して下さい。

■ログイン認証について

Authコンポーネントの利用条件
DIVでのレイアウト確認を行っています。 テスト

すべてをまとめて掲載しようと思っていたが、思うように時間が取れなかったり、cakephpが未熟なため思うように捗らなかったりするので、都度掲載していくようにする。

CakePHPによる実践Webアプリケーション開発

マシントラブルによる再インストールや繁忙な日々が続いていたため、すっかりCakePHPをご無沙汰してしまったので、再度「CakePHPによる実践Webアプリケーション開発」を学習して悩んだ点を書き綴ります。

名前付きパラメータ

以前、途中まで行ったのである程度は理解しているが、この書籍のが間違っているのか? それともCakePHPにのバージョン違い(書籍では1.2、現在は1.3.11が安定版・・・2.0もリリースされてますね。)のせいなのか、思い通りに動作しない点がいくつからあり困惑する。
書籍では、:id という名前付きパラメータをフル活用されているが、バージョン1.3では :id はデフォルトの名前付きパラメータではないため思い通りの動作が実現しない。もしかするとRoutesを設定すると可能なのかもしれないが、Routesを自由に扱えるような上級者でもないので、:id を無視してソースを変更して対応する。
(変更前)
$out = $this->Html->link($out, array('action'=>'edit', 'id'=>$schedule['Schedule']['id']));
      ↓
(変更後) 
$out = $this->Html->link($out, array('action'=>'edit', $schedule['Schedule']['id']));
というように変更して対応しました。
「CakePHPによる実践Webアプリケーション開発」のサポートサイトにも上記の件の問い合わせがありましたが、筆者はデフォルトで使用できるとの旨の解答でした。(バージョンの違いについては言及されていなかったためなのかなぁ?)

ほかにも悩んだ点がありますが、ボチボチと掲載していきます。

2011年7月26日火曜日

CAKEPHP でそのまま実行すると下記のようにエラーになる。(いつも事だな。)

Release Notes for CakePHP 1.3.10.
Read the changelog

Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE/cake/libs/debugger.php, line 684]

Warning: touch() [http://php.net/function.touch]: Utime failed: Permission denied in /var/www/cakephp-1.3.10/cake/libs/file.php on line 125

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/libs/debugger.php, line 688]

URL rewriting is not properly configured on your server.

    Help me configure it
    I don't / can't use URL rewriting

Your tmp directory is writable.

The FileEngine is being used for caching. To change the config edit APP/config/core.php

Your database configuration file is NOT present.
Rename config/database.php.default to config/database.php
saltの変更を促す警告
Notice (1024): Please change the value of 'Security.salt' in app/config/core.php to a salt value specific to your application [CORE/cake/libs/debugger.php, line 684]
(変更箇所)
/**
 * A random string used in security hashing methods.
 */
 Configure::write('Security.salt', '****************************************');
Security.saltに設定する値は、mkpasswd で作成するのが便利。
mkpasswd -l 40
※mkpasswd は、ecpectパッケージに含まれています。


cipherSeed 値の変更を促される。
セキュリティ強化のため、今回の cakephp-1.3.10 あたりで追加されたらしい。
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/libs/debugger.php, line 688]
(変更箇所)
/**
 * A random numeric string (digits only) used to encrypt/decrypt strings.
 */
 Configure::write('Security.cipherSeed', '******************************');

Security.cipherSeedに設定する値も mkpasswd で作成するのが便利。
mkpasswd -l 30 -c 0 -d 30 -C 0 -s 0


mod_rewiteの設定に問題あり?
URL rewriting is not properly configured on your server.
バーチャルホストの設定で、下記のディレクティブを設定。
    
        Options FollowSymLinks
        AllowOverride All
    
ようやく無事に初期画面が表示されたぜ。
※データベースの設定はまだだけどね。

2011年6月28日火曜日

【CakePHP】でNoticeエラーを表示させない

http://blog.livedoor.jp/loopus/archives/50214277.html

CakePHPで開発を行っているときは、app/config/core.php にて debug を1もしくは2に設定すると思います。
しかし、それだと Notice が発生した場合にも表示されてしまいます。
php.ini でNoticeを出さないように設定しても、Cakeは親切なので? きっちりNoticeを表示してくれます。

本来はNoticeを表示させないようなプログラムを書くのが望ましいですが、どうしてもという場合の解決方法をお教えします。

cake/libs/configure.php の修正

cake/libs/configure.php の273行目あたりを以下のように修正し、強制的にE_ALLにされるのを回避する。
if (isset($config['debug'])) {
if ($_this->debug) {
// error_reporting(E_ALL);
cake/libs/debugger.php の修正
cake/libs/debugger.php の193行目あたりを修正し、E_NOTICEが表示される時にハンドリングされないようにする。
$level = LOG_DEBUG;
switch ($code) {
case E_PARSE:
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$error = 'Fatal Error';
$level = LOG_ERROR;
break;
case E_WARNING:
case E_USER_WARNING:
case E_COMPILE_WARNING:
case E_RECOVERABLE_ERROR:
$error = 'Warning';
$level = LOG_WARNING;
break;
/* case E_NOTICE:
case E_USER_NOTICE:
$error = 'Notice';
$level = LOG_NOTICE;
break;*/


これで、debugを有効にしてもNoticeを表示しなくなる。

CakePHPによる実践Webアプリケーション開発

随分と記載するのが遅くなってしまったが、「CakePHPによる実践Webアプリケーション開発」でCakePHPを学習していて戸惑った件を記載します。まだ、勉強中の身ですが...

『CakePHPによる実践Webアプリケーション開発』を書籍通りに入力しても登録した予定の表示は問題ないが、表示された一覧(月・週)から指定の日付を選択しても別の日付が表示されてしまう。

『なんで指定した日が表示できないんだ?』
と思いデバッグ(変数を表示させる)を進めていくとカレンダーの一覧表示を選択した日付を受け取る部分で『年』が正しく受け取れていない。という現象になっている。

もしかしたら、何か設定に問題があるのかと思いいろいろ調べたが、わからないのでプログラムを直接修正して対応した。
   ↓
【AppFolder】/controllers/components/calendar.php
11行目を下記のように修正。
$from_time = mktime(0,0,0,$month,1 - date('w', $firstday), $year);
   ↓
$from_time = mktime(0,0,0,$month,1 - date('w', $firstday), date('Y'));

本来は、ここではなくココを呼び出す部分である schedules_controller.php で対応するべきなのかと思い controller 部分をデバッグしたように思うが(しなかったのかな?).....
結局は、とりあえず早く先に進みたいという事で components の calendar.php を修正してしまった。
よかったのかなぁ? ... 後で再度確認するかなぁ〜 (不安)

2011年4月13日水曜日

CakePHP つまずき

久々に Cakephp をさわったら、「Warning (512): Could not find validation handler ... 」と Warning が多発。

良く確認したら、CakePHPを複数アプリを起動できるようにしていたので、起動方法(URL)が間違っていたためであった。しかし、久々に操作だったので事をすっかり忘れてしまって解決に思わぬ程時間がかかってしまった。 (_ _ ;)尸 マイリマシタ…

vhost.conf で起動アプリを制御する。

CakePHPで複数アプリを起動させるため、httpd の vhost.conf でバーチャルホストを定義して起動するアプリごとに起動するパスを分けることで、アプリのベースパス(URL)を制御する。

2010年11月21日日曜日

CakePHPディレクト構成の変更

When the archive is extracted, it becomes a composition of the following directories.

  1. Method of arranging directory that needs manager authority.
  2. ├var
    │
    ├www
    │ │ ├cake ← When the archive is extracted,
    │ │ │ ├app
    │ │ │ │ ├config
    │ │ │ │ ├controllers
    │ │ │ │ ├models
    │ │ │ │ ├plugins
    │ │ │ │ ├tmp
    │ │ │ │ ├vendors
    │ │ │ │ ├views
    │ │ │ │ ├webroot ← It is set to the document route.
    │ │ │ │ ├.htaccess
    │ │ │ │ └index.php
    │ │ │ ├cake
    │ │ │ ├vendors
    │ │ │ ├.htaccess
    │ │ │ └index.php

  3. Method of arranging directory that doesn't need manager authority.
  4. ├cake
    │ ├app ・・・(1)
    │ │ ├config
    │ │ ├controllers
    │ │ ├models
    │ │ ├plugins
    │ │ ├tmp
    │ │ ├vendors
    │ │ ├views
    │ │ ├webroot ・・・(3)
    │ │ ├.htaccess
    │ │ └index.php
    │ ├cake ・・・(2)
    │ ├vendors
    │ ├.htaccess
    │ └index.php

    It becomes the following if it arranges it according to the custom of the Linux system.

    │
    ├ home
    │ └ user
    │   └ app ← Directory (1) is moved here.
    ├ usr
    │ └ lib
    │   └ cake ← Directory (2) is moved here.
    ├ var
    │ └ www
    │   └ *** ← Contents of the directory that name is (3) are moved here.


    The procedure summary.
    unzip ./cakephp-cakephp-1.3.5-0-ga16f4c5.zip
    $ mv ./cakephp-cakephp-fd82f1b/app /home/user/app
    $ mv ./cakephp-cakephp-fd82f1b/cake /usr/lib/cake
    $ mv ./cakephp-cakephp-fd82f1b/app/webroot/* /var/www
    $ mv ./cakephp-cakephp-fd82f1b/app/webroot/.htaccess /var/www
    $ chmod -R 0777 /home/user/app/tmp
    When the movement of the file is completed, three places of the following of the content of index.php are edited.

    • ROOT定数にappを含むディレクトリへのパスを設定する。

    • 今回の例では、"/home/user"
    • APP_DIR定数にappディレクトリの名前を設定する。

    • 今回の例では、"app"
    • CAKE_CORE_INCLUDE_PATH定数にcakeディレクトリを含むディレクトリへのパスを設定する。

    • 今回の例では、"/usr/lib"

    Concretely, it edits it as follows.

    if (!defined('ROOT')) {
       define('ROOT', DS . "home" . DS . "user");
    }
    if (!defined('APP_DIR')) {
       define('APP_DIR', "app");
    }
    if (!defined('CAKE_CORE_INCLUDE_PATH')) {
       define('CAKE_CORE_INCLUDE_PATH', DS . "usr" . DS . "lib");
    }