CConsoleApplication用于处理离线任务。例如,应用程序在 linux 系统中启动一个 cronjob。该应用程序每天都会检查您网站的注册用户是否应该更改其密码,因为它必须每 3 个月更改一次。如果密码过期发送电子邮件。
要预先选择用户,您已经设置了范围条件来检查用户的状态,以及限制登录用户对她自己的数据的范围:
public function scopes(){
return array(...,
'user' => array(
'condition'=>'id='.Yii::app()->user->id,
),
'active' => array(
'condition'=>'status='.self::STATUS_ACTIVE,
), ...
);
}
现在,在您的CCA代码中,您使用活动范围来获取所有用户:
$usersArray = User::model()->active()->findAll(); ...foreach...
. 这里的问题在于使用扩展类CActiveRecord -class。主要用作模型中的类扩展,这些模型存储在数据库中。在这个CActiveRecord -class 中,CActiveRecord->__call函数用于获取模型的所有存储范围。之后,该类将实际请求的范围与其余的数据库标准合并。首先加载所有范围的事实在加载用户范围时发生错误,包括Yii::app()->user->id
。网络用户被调用并抛出异常'CException'并带有消息'属性'CConsoleApplication.user未定义'。你不会调用WebUser,但自动为你安排这个:-)
所以,像schmunk说的那样去做。在您的范围代码中生成一个异常部分,确保Yii::app()->user
不调用它:
public function scopes(){
if (Yii::app() instanceof CConsoleApplication) {
$user = array(''); //no condition
}else{
$user = array(
'condition'=>'id='.Yii::app()->user->id,
);
}
return array(
'user' => $user,
'active' => array(
'condition'=>'status='.self::STATUS_ACTIVE,
), ...
);
}
我希望解释有所帮助,也许还有其他问题。