Yii中在没有ActiveRecord的情况下给你的CForm设置model

2010年6月14日 | 分类: PHP | 标签: , ,

刚刚写的一个扩展,已经发布在Yii扩展中心了。

当你使用form builder来创建一个表单的时候,你必须传送一个数组和一个model给CForm。

$array = include('blogEditForm.php'); // blogEditForm.php return a array
$model = new BlogActiveRecord();
$form = CForm($array, $model);
//after this you can use $form and display it
$form->render();

但是,如果$model不是一个CModel就不行了。比如说,你想储存一些信息到文件里,或者储存到一个表的一个字段里面。就不像有一个CActiveRecord那么简单了。

这个时候,为什么不使用一个数组来通过来生成model,就像用一个数组通过CForm生成一个表单一样呢。于是我写了一个简单的类来实现这个功能。

首先,写一个类似CForm的配置文件,返回数组。

return array(
  'email_address'=>array(
     'type'=>'text',
     'label'=>'The email address',
     'default'=>'you@example.com',
     'rules'=>array(
          array('email', 'email'),
     ),
     // other attribute for CForm
   ),
   // other fields
);

这个数组就是在CForm的配置文件的基础上增加了label、default和rules。而且只返回elements,不返回其他的。

接下来创建一个Model文件

Yii::import('ext.XVirtualModel');
class YourVirtualModel extends XVirtualModel
{
   //override save()
   public function save()
   {
       //save the data in your way
       //data is stored in $this->_values
   }

   //override loadValues()
   public function loadValues()
   {
       //load the data in your way
   }
}
 

你需要重写上面的这两个函数,在原文件中有注释可以参考。

接下来你就可以使用了:

$config = 'application.config.YourVirtualModel';
Yii::import('application.extensions.YourVirtualModel');
$model = new YourVirtualModel($config);
//$model->formMap 返回可以用于CForm的配置数组,不过返回的数组只有elements,所以你需要添加action等
$formMap = $model->formMap;
$formMap['action'] = array('save');
$formMap['title'] => 'Input your email here';
$form = new CForm($formMap, $model);
//随便使用吧

下载之后看看源代码就知道这个类是多么简单了,用起来也不难。

目前还没有任何评论.