Showing posts with label CakePHP2. Show all posts
Showing posts with label CakePHP2. Show all posts

3 Apr 2017

[CakePHP2] Using ACL Behaviar with cakedc/users

As of April, 2017, with cake 2.9.7 and the newest plugins,
You will need 
     'userModel' => 'AppUser',
at your settings for Auth Component Section in AppController.php.
whole block would be:
 public $components = array(
  'Session',
  'Flash',
  'Acl',
  'Auth' => array(
   'loginAction' => array(
    'controller' => 'app_users',
    'action' => 'login',
    'plugin' => false
   ),
   'loginRedirect' => array(
    'controller' => 'posts',
    'action' => 'index'
   ),
   'logoutRedirect' => array(
    'controller' => 'pages',
    'action' => 'display',
    'home'
   ),
   'flash' => array(
    'element' => 'alert',
    'key' => 'auth',
    'params' => array(
     'plugin' => 'BoostCake',
     'class' => 'alert-error'
    )
   ),
   'authorize' => array(
    'Actions' => array(
     'actionPath' => 'controllers',
     'userModel' => 'AppUser',
    ),
   ),
   //'authError' => 'Did you really think you are allowed to see that?',
   'authenticate' => array(
    'Form' => array(
     'passwordHasher' => 'Blowfish',
     'userModel' => 'AppUser',
     'fields' => array(
      'username' => 'username', //Default is 'username' in the userModel
      'password' => 'password'  //Default is 'password' in the userModel
     ),
    ),
   ),
  ),
  'DebugKit.Toolbar'
 );

10 Jul 2015

[CakePHP2]使用を避けるべきModel の名前、それは Folder

あまりにも長い間いろいろ試して判明したのがこれ。

タイトルで終了しますが、CakePHP の bake でコード生成をする際避けるべきデータベーステーブルの名前は、 folders です。

理由はUtility::Folderと名前空間がかぶるから。自動生成つかってなくても、普通にぶつかって一見原因不明のエラーが出ます。

ほかにもモジュール名でかぶりそうなものもありそうですが、ひとまず。


16 Apr 2015

[CakePHP2]モデル内で別のモデルを参照する(追記あり)

別のファイルを参照するのは3通りあるそうです。
参照元:
http://stackoverflow.com/questions/980556/can-i-use-one-model-inside-of-a-different-model-in-cakephp
から説明を抜粋。
App::import() ファイルを見つけてインポートします(それだけしかしません)。クラスを使用するにはインスタンスを作製する必要があります。 ClassRegistry::init() ファイルをロードして、インスタンスを作製します。何かをロードするにはimportよりもベターです。なぜならCakePHPが通常呼び出しの際に内部で行う手続きも実行されるからです。またクラスネームにエイリアスをつけることができます。便利です。 Controller::loadModel() 前述の ClassRegistry::init() を使用してモデルをロードします。$persistModel を使用したキャッシングにも対応します(する予定です?)。コントローラ内部でのみ動作します。
と上記では書いてありますが、Model内でも Controller::loadModelは作動する模様。

Controller::loadModel('AnotherModel');
$data = $this->AnotherModel->read(null, $id);
(追記7/7)やっぱりだめっぽい。以下のやりかたが良いようです。
$anotherModel = ClassRegistry::init('AnotherModel');
data = $anotherModel->read(null, $id);

10 Feb 2015

[CakePHP2] date / datetime / year フィールドで和暦の年を併記する

CakePHPのフォーム自動生成、超便利です。
日付に和暦が表示されて欲しいとき、この自動生成の中で勝手に変換されたら、最高です。
要はこんな感じで。
相変わらずでっちあげですが、
/app/View/Helper フォルダにFormHelper.php をコピーします。
_generateOptions というのがオプションを生成してる箇所になるんで、


case 'year':
(中略)
    for ($i = $min; $i <= $max; $i++) {
        $data[$i] = $i;
    }
(中略)
    break;
の箇所を
for ($i = $min; $i <= $max; $i++) {
    $wareki = 0;
    if ($i > 1988) {
        $wareki = $i - 1988;
        $data[$i] = "${i}年(平成${wareki}年)";
    } elseif ($i > 1925) {
        $wareki = $i - 1925;
        $data[$i] = "${i}年(昭和${wareki}年)";
    } elseif ($i > 1911) {
        $wareki = $i - 1911;
        $data[$i] = "${i}年(大正${wareki}年)";
    } elseif ($i > 1867) {
        $wareki = $i - 1867;
        $data[$i] = "${i}年(明治${wareki}年)";
    } else {
        $data[$i] = "${i}年";
    }
}
に置き換えます。

表示はお好みで。

3 Jan 2015

[CakePHP2] データベースにログをとる

Logging(CakePHP official)
http://book.cakephp.org/2.0/en/core-libraries/logging.html
Database logging in CakePHP
http://blog.jandorsman.com/blog/database-logging-in-cakephp
一つ目の記事に書いてあることはCake2.*でもそのままつかえます。ファイルの場所が 'app/libs/log/database_logger.php'(for CakePHP 1.*) から 'app/Lib/Log/Engine/DatabaseLog.php' (for CakePHP 2.*)になるぐらいです。素晴しい。

たとえばログにセッション情報(ユーザIDとかね)を記録したい、みたいな事になったら、ユーザがログインしてるのか確かめないと、ログインしてない時に上手くログに入りません。例えばログイン失敗しました、みたいなログがきちんと取られないことになります。
public function write($type, $message) {
 $log['type'] = ucfirst($type);
 $log['created'] = date('Y-m-d H:i:s');
 $log['content'] = $message;
 if ($login = CakeSession::read('Auth.User')) {
  $log['user_id'] = $login['id'];
 }


 return $this->Log->save($log);
}

[CakePHP2]Database logging (with some Cakesession Object)

Logging(CakePHP official)
http://book.cakephp.org/2.0/en/core-libraries/logging.html
Database logging in CakePHP
http://blog.jandorsman.com/blog/database-logging-in-cakephp
Well, Jan's article is totally usable even in CakePHP 2.4 except one location 'app/libs/log/database_logger.php'(for CakePHP 1.*) to 'app/Lib/Log/Engine/DatabaseLog.php' (for CakePHP 2.*).

When you want log some information via Cakesession Object (i.e. user ID), you should check the object first in case the user not logging in.

public function write($type, $message) {
 $log['type'] = ucfirst($type);
 $log['created'] = date('Y-m-d H:i:s');
 $log['content'] = $message;
 if ($login = CakeSession::read('Auth.User')) {
  $log['user_id'] = $login['id'];
 }


 return $this->Log->save($log);
}

12 Nov 2014

[CakePHP2][Composer] プラグインもComposer経由でインストールするときにapp/Plugin フォルダに入れたい。

参考資料
https://github.com/composer/installers
増減するプラグインのために一個一個設置場所を書いていたのですが、うまいことでっちあげたんで、ログとして。
composer.json:
{
    "name": "app",
    "config": {
        "vendor-dir": "Vendor/"
    },
    "extra": {
        "installer-paths": {
            "app/Plugin/{$name}/": ["type:cakephp-plugin"]
        }
    },
    "require": {
        "php": ">=5.3",
        "cakephp/cakephp": "~2",
        "composer/installers": "~1",
        "cakephp/debug_kit": "~2",
        "cakephp/localized": "~2"
   }
}

8 Jul 2014

[CakePHP2]サブディレクトリにCakePHPを配置

CakePHPをサブディレクトリで動かすのは、一工夫いるみたいですが、
cakePHPでサブディレクトリで運用する設定あたりを参考にして、.htacess ファイルに変更を加えてみましたがうまくいかず。Composerを使えて構築してるからなのかとも思ったのですが、、

とりあえずMAMPでの話。CakePHPのバージョンは2.5.2です。

cakePHPでサブディレクトリで運用する設定
http://localhost/test/
のようにtestディレクトリ下でcakeを展開したい場合
各フォルダの3つの.htacessに下記を追加
RewriteBase    /test
1./test/直下にある.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]
   RewriteBase /test
</IfModule>
2.appディレクトリ直下の.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$    webroot/    [L]
    RewriteRule    (.*) webroot/$1    [L]
    RewriteBase /test/app
</IfModule>
3.webrootディレクトリ直下の.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
 RewriteBase /test/app/webroot
</IfModule>
に加えて、
app/Config/route.phpに下の2文を加える。
        Router::connect('/test/:controller', array('action' => 'index'));
        Router::connect('/test/:controller/:action/*');
    Router::connect('/test/', array('controller' => 'pages', 'action' => 'display', 'home'));

24 Feb 2014

[CakePHP]AuthモジュールとACLまわりの衝突

どうやら、AuthモジュールとACLまわりのモジュールはAuthの設定が優先されるっぽい。

http://book.cakephp.org/2.0/ja/tutorials-and-examples/simple-acl-controlled-application/part-two.html

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('initDB'); //この行は終わったあと削除できます
}

public function initDB() {
    $group = $this->User->Group;
    //管理者グループには全てを許可する
    $group->id = 1;
    $this->Acl->allow($group, 'controllers');

    //マネージャグループにはpostsとwidgetsに対するアクセスを許可する
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Posts');
    $this->Acl->allow($group, 'controllers/Widgets');

    //ユーザグループにはpostsとwidgetsに対する追加と編集を許可する
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Posts/add');
    $this->Acl->allow($group, 'controllers/Posts/edit');
    $this->Acl->allow($group, 'controllers/Widgets/add');
    $this->Acl->allow($group, 'controllers/Widgets/edit');
    //馬鹿げた「ビューが見つからない」というエラーメッセージを表示させないためにexitを追加します
    echo "all done";
    exit;
}
 とならんでいると、Aclの設定は無視される、ようです。

22 Feb 2014

[CakePHP]hashing password パスワードのハッシュ化

CakePHP2系 ( $version < 2.3 ) のお話

すべからくパスワードはDB保存時にハッシュ化されるべきですが、
http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html
を参考にUserモデルのファイルに、

 // hashing password
public function beforeSave($options = array()) {
    $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    return true;
}
と、ルーチンを追加して、保存時にハッシュ化されるように設定。
このままだと、passwordフィールドを含まない更新でエラーが発生するので、
下記のように書き換える。

// hashing password
public function beforeSave($options = array()) {
    if ( isset ( $this->data['User']['password'] ) ) {
        $this->data['User']['password'] = AuthComponent::password($this->data['User']['password']);
    }
    return true;
}
こうすれば、パスワードに触れずに、その他のフィールドをeditする事が可能。

2.4以降では、ハッシュ化もモジュールを通じて行われるようです。上記問題も対応済です。

http://book.cakephp.org/2.0/ja/tutorials-and-examples/blog-auth-example/auth.html

public function beforeSave($options = array()) {
    if (isset($this->data[$this->alias]['password'])) {
        $passwordHasher = new SimplePasswordHasher();
        $this->data[$this->alias]['password'] = $passwordHasher->hash($this->data[$this->alias]['password']);
    }
    return true;
}