ラベル CakePHPによる実践Webアプリケーション開発 の投稿を表示しています。 すべての投稿を表示
ラベル CakePHPによる実践Webアプリケーション開発 の投稿を表示しています。 すべての投稿を表示

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が未熟なため思うように捗らなかったりするので、都度掲載していくようにする。