5

追加する方法と、CakePHP での作業方法created_bymodified_by同様の方法があるかどうか疑問に思っていますか?createdmodified

Cake がこれらのフィールドを認識し、モデルに関係なく自動的に処理してくれるという事実が気に入っています。実装する必要はまったくありません。現在のユーザー ID を使用して同様の機能を追加したいと考えています (私のアプリケーションでは、ユーザー ID が 0 の場合もありますが、常に存在します)。

出発点はbefore_save()app_modelにあると思いますか?

--

また、ケーキがこれをユーザーテーブルへの外部キーとして自動的に認識するようにする方法はありますか (認識方法と同様user_id)、または手動で has/belongs to 関係を追加する必要がありますか? これは私のモデルのほとんどに当てはまるので、冗長なコードを減らしたいと思います。

ありがとうございました!

4

3 に答える 3

6

質問の最初の部分では、この動作コードを使用して、探していることを正確に実行します。

class UserLinkBehavior extends ModelBehavior
{
    /**
     * The string to use to retrieve the user id from CakeSession
     *
     * @var string
     */
    var $user_id_key = 'Auth.User.id';

    function setup(&$model, $settings)
    {
        if(isset($settings['user_id_key']))
        {
            $this->user_id_key = $settings['user_id_key'];
        }
    }

    function beforeSave(&$model)
    {
        App::uses('CakeSession', 'Model/Datasource');

        $logged_user_id = CakeSession::read($this->user_id_key);

        if(isset($logged_user_id))
        {
            $this->set_user_on_current_model($model, $logged_user_id);
        }

        return true;
    }

    /**
     * Set the created_by and modified_by user id on the current model
     *
     * @param Model $model
     * @param int $logged_user_id
     * @return void
     */
    private function set_user_on_current_model(&$model, $logged_user_id)
    {
        if(isset($logged_user_id))
        {
            /*
             * Id is not set -> it is a creation
             */
            if($model->hasField('created_by') && (!isset($model->data[$model->alias]['id']) || empty($model->data[$model->alias]['id'])))
            {
                if(!isset($model->data[$model->alias]['created_by']))
                {
                    $model->data[$model->alias]['created_by'] = $logged_user_id;

                    /*
                     * If the save is called with a whitelist, add 'created_by' to the whitelist
                     * in order to have this field saved as well
                     */
                    if(!empty($model->whitelist) && !in_array('created_by', $model->whitelist))
                    {
                        $model->whitelist[] = 'created_by';
                    }
                }
            }

            /*
             * Id is set -> it is an update
             */
            if($model->hasField('modified_by') && isset($model->data[$model->alias]['id']) && !empty($model->data[$model->alias]['id']))
            {
                $model->data[$model->alias]['modified_by'] = $logged_user_id;

                /*
                 * If the save is called with a whitelist, add 'modified_by' to the whitelist
                 * in order to have this field saved as well
                 */
                if(!empty($model->whitelist) && !in_array('modified_by', $model->whitelist))
                {
                    $model->whitelist[] = 'modified_by';
                }
            }
        }
    }
}

次に、モデルまたは AppModel で宣言するだけです

var $actsAs = array('UserLink');

質問の 2 番目の部分については、ビヘイビアーに beforeFind() コールバックを追加し、model->bindModel()created_by関数を使用して、およびmodified_byフィールドを持つモデルを User モデルにリンクすることができます。個人的には、必要に応じて各モデルでこれらのリンクを手動で宣言することを好みます。

于 2012-05-03T07:14:23.057 に答える
0

作成および変更されたフィールドのようにすることはできませんが、このフィールドをコントローラー メソッドの任意の場所に追加できます。

例えば。add メソッドでは、次のように追加できます。

 $this->request->data['ModelName']['created_by'] = $this->Auth->user['userid'];
于 2012-05-03T05:56:44.667 に答える
0

私はこれを見つけて、私にとってはうまく機能していて、実装と理解が簡単です

<?php

App::uses('Model', 'Model');

class AppModel extends Model {
//get current logged-in user
    public function getCurrentUser() {
    App::uses('CakeSession', 'Model/Datasource');
    $Session = new CakeSession();
    $user = $Session->read('Auth.User');
    return $user['id'];
  }

//populate created_by and modified_by
    public function beforeSave($options = array()) {
    parent::beforeSave($options);
    //find all fields from table created_by/modified_by exists
    $fields = array_keys($this->getColumnTypes());

    //get modal name to feed in data in appropriate array key        
    $modal = array_keys($this->data);
    $modal = $modal[0];

    //add created_by value
    if(in_array('created_by', $fields) && !isset($this->data[$modal]['id'])){
        //correct this line
        $this->data[$modal]['created_by'] = $this->getCurrentUser()==null?-1:$this->getCurrentUser();
        return true;
    }elseif(in_array('modified_by', $fields)){
        $this->data[$modal]['modified_by'] = $this->getCurrentUser()==null?-1:$this->getCurrentUser();
        return true;
    }
    return true;
}
}
于 2016-12-25T10:23:28.723 に答える