是否有一种添加created_by和modified_by的方法,类似于在cakePHP中created和modified的工作方式?
我想知道是否有一种方法可以添加是否有一种添加created_by和modified_by的方法,类似于在cakePHP中created和modified的工作方式?,cakephp,cakephp-2.0,Cakephp,Cakephp 2.0,我想知道是否有一种方法可以添加created_by和modified_by类似于created和modified在CakePHP中的工作方式 我喜欢这样一个事实,即cake能够识别这些字段并自动处理它们,而不考虑模型,而我根本不需要实现它们。我想使用当前用户id添加一个类似的功能(在我的应用程序中,总是有一个用户id,即使有时可能是0) 我假设起始位置是app\u model中的before\u save() -- 另外,我是否有办法让cake自动将其识别为用户表的外键(类似于它识别user\u
created_by
和modified_by
类似于created
和modified
在CakePHP中的工作方式
我喜欢这样一个事实,即cake能够识别这些字段并自动处理它们,而不考虑模型,而我根本不需要实现它们。我想使用当前用户id添加一个类似的功能(在我的应用程序中,总是有一个用户id,即使有时可能是0)
我假设起始位置是app\u model中的before\u save()
--
另外,我是否有办法让cake自动将其识别为用户表的外键(类似于它识别user\u id
),或者我必须手动添加has/allown-to关系?我这样问是因为这将在我的大多数模型上进行,所以我更愿意减少冗余代码
谢谢大家! 它不能像创建和修改的字段,但您可以在控制器方法中添加此字段,无论您想在哪里添加 在add方法中,您可以添加如下内容
$this->request->data['ModelName']['created_by'] = $this->Auth->user['userid'];
对于您问题的第一部分,我使用此行为代码来完成您想要的工作:
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');
对于问题的第二部分,您可能会向行为添加beforeFind()回调,并使用该函数将具有由创建的和由
修改的字段的模型与用户模型链接起来。就个人而言,当我需要这些链接时,我更愿意在每个模型中手动声明它们。我发现这些链接很容易实现和理解,而且对我来说很好用
<?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;
}
}
还有一个:像一个符咒一样工作。。。我仍然想找出问题的后半部分,但是对于修改和创建字段来说,这种行为是完美的。谢谢这简直太完美了。必须对行为进行一些更改才能匹配签名才能使其正常工作。