这篇教程讲解了怎样不使用代码来实现自动填充模型中的字段值。
场景
我正在做一个大项目的管理面板,在所有的数据库表中几乎都包含4个同样的字段。
-
createdDate (记录的创建时间)
-
createdIp (创建记录者的 IP)
-
updatedDate (记录更新的时间)
-
updatedIp (记录更新者的 IP)
我已经使用 gii 工具创建了 CURD。现在我需要修改每个模型/控制器来为新添加的4个字段来实现CRUD操作。比较好的方法是将这些代码写到一个地方,让其他的模型来继承使用它。
创建一个新模型:
使用一下代码创建新模型 MasterAdmin,此文件应该放到公共模型的目录下。
你可以在代码的注释中理解它。
[php]
<?php
class MasterAdmin extends CActiveRecord
{
public function beforeSave()
{
if($this->isNewRecord) // 只有在新建记录时执行
{
if($this->hasAttribute('createdDate')) // 如果模型有 createDate 字段
$this->createdDate = new CDbExpression('NOW()'); // 设置 createdDate 的值
if($this->hasAttribute('createdIp')) // 如果模型有 createdIp 字段
$this->createdIp = CHttpRequest::getUserHostAddress(); // 设置用户的 IP
}
if($this->hasAttribute('updatedDate')) // 如果模型有 updatedDate 字段
$this->updatedDate = new CDbExpression('NOW()'); // 设置 updatedDate 的值
if($this->hasAttribute('updatedIp')) // 如果模型有 updatedIp 字段
$this->updatedIp = CHttpRequest::getUserHostAddress(); // 设置用户的 IP
return parent::beforeSave();
}
}
?>
也许不是所有的模型都有这四个字段,当你还是可以使用这个模型。hasAttribute 方法会自动判断。
使用新添加的模型:
现在你看到的所有模型都是以下面的方式继承。
[php]
class User extends CActiveRecord
{
现在使用下面的代码修改它,使它继承新创建的模型。 不用担心 CActiveRecord,因为新创建的 MasterAdmin 已经继承了它。
[php]
class User extends MasterAdmin
{
如果你不想每次都向上面一样修改代码,你可以通过修改 CURD 的生成模版来做。
_ 路径: MyProject\framework\gii\generators\model\ModelCode.php
修改
[php]
public $baseClass='CActiveRecord';
为
[php]
public $baseClass='MasterAdmin';
现在你可以不用写关于这4个字段的任何代码,因为 MaserAdmin 会为你做。
点击这里你可以获得更多关于管理面板的帮助
Happy Coding! :)