一步一步学Yii开发(三)
接上一篇
我们接续讲解如何写数据。
13. 创建form
为什么要创建form呢?因为我们让用户自己输入创建的数据,而收集用户的数据,那就是通过的form来实现的。那有人问,这个不是通过普通的html就可以实现了吗,这个你就不需要讲了。但是我要说的是,这里的那种方式会有点乱,并且后期维护也比较麻烦,而Yii提供给我们的创建form的方式很方便,也容易后期的维护。
创建form的方式,Yii提供了3种方式,我们这里只讲解一种方式,叫做
form builder
如果想了解更多关于form创建的知识,请参看:
http://www.yiiframework.com/doc/guide/1.1/en/form.builder
创建form,需要2个步骤,创建form model和form本身。
a. 创建form model
Yii规定自定义的form model需要继承自CFormModel,如下:
class CreateFrom extends CFormModel
这个类往往包含了要用户提交的数据,此例中只有一个数据要提交,那就是name,因此CreateForm就只包含一个数据成员
class CreateFrom extends CFormModel
{
public $name;
}
还有一个函数需要重载的是rules,这个函数也是Yii框架调用的,用来验证数据的。用户最后提交的数据会进入到我们的这个model里面,在进入之前,框架会调用这个函数取得规则来验证数据。我们所要做的就是返回一个数组,这个数组中定义一些规则,这个规则是根据数据成员来定 的。
此例中只有一个成员,我们不能让它为空,否则你插入什么数据,因此我们的规则就是这个成员不能为空,我们这样定义规则
array( 'name', 'required' )
这样只定义一个规则,我们可能还有很多规则,就会有很多这样的数组,然后这些数组再组成一个数组,而这个数组就是我们要返回给框架的规则,好了这样我们model就应该定义成这样
<?php class CreateForm extends CFormModel { public $name; public function rules() { return array( array( 'name', 'required' ), ); } } ?>
b. 创建form本身
接下来我们就要创建form,或者定义form了。这个form按照Yii的惯例,是放在view下面,此例中就放在
/views/test这个目录下面。
名字不做限定,假设是createform.php
这个文件就是返回一个数组,这个数组定义了form的所有的field,以及title,还有提交按钮。
<?php return array( 'title'=>'Here you can create a user', 'elements'=>array( 'name'=>array( 'type'=>'text', 'maxlength'=>32, ), ), 'buttons'=>array( 'create'=>array( 'type'=>'submit', 'label'=>'Create', ), ), ); ?>
上面定义了title,唯一的field-name,定义这个field的时候也是一个数组,数组中指定了它的类型是text,最大长度是32。下面的几行是定义了提交按钮。
接下来创建对应的视图,视图文件应该放在哪里,我想你已经了解了吧。去 viewstest目录创建create.php,这个叫什么名字也无所谓。这个视图要做的事情就是渲染一下我们刚才创建的form,因此代码很简单。如下:
<div> <?php echo $form; ?> </div>
简单吧,就2,3行。不过你仔细看看,这里面是不是有个form变量,这个是哪里来的,想想前面我们的视图中是不是也访问了一个变量model,那个变量从哪里来的?是从controller里面来的,因此要从controller定义一个form,这个form就是刚才我们定义的CreateForm这个model。
14. 获取并且保存数据
定义这个form的代码如下:
$form = new CreateForm;
那么这句代码我们要放在什么地方呢?我们现在在做create一个新的记录,是不是一个action,因此我们定义一个新的action,叫做create
public function actionCreate()
这个action当然是应该在我们TestController里面是不是?因此在TestController里添加:
public function actionCreate() { $model = new CreateForm; $form = new CForm( 'application.views.test.createform', $model ); if ( $form->submitted('create') && $form->validate()) { $test = new Test(); $test->name = $model->name; $test->save(); $this->redirect(array('test/read')); } else { $this->render( 'create', array( 'form'=>$form )); } }
这里
$form = new CForm( 'application.views.test.createform', $model );
其实就是把我们的刚才创建的form和model关联在一起,并创建一个form。这个form能够帮我从web请求中获取数据并且使用我们前面定义的规则校验数据。
接下来的数据就是看是否提交了数据,并且数据校验通过。如果是直接访问这个页面,而不是提交数据到这个页面那么就会走else的分支,也就是render我们方才定义的create.php这个view,如果是提交数据我们就获取数据,并且保存数据,然后redirect到查看所有记录的页面,这样刚好可以看到我们新创建的记录。
现在使用下面这个url来create记录
http://localhost/testpro/index.php?r=test/create
发现是不是有个错误:
这是因为我们在定义Test这个model的时候,没有写校验的规则,确切的说,我们只写了函数定义,没有在函数体中return任何东西,而框架需要返回值。因此我们回到
models/Test.php
修改如下rules()函数如下:
public function rules() { return array(); }
现在再次访问是不是可以添加数据了。
这里有个小问题,当我们创建一个了记录,成功后就会返回显示所有记录的页面,如果此时想继续创建一条记录的话,需要手动更改url到的create的页面,这样很麻烦,因此我们在显示所有记录的页面,添加一个按钮能够直接到create的页面,在 viewstestread.php中添加一行:
echo "<input type='button' onclick='window.location.href="; echo '"create"'; echo"' value='Create' />";
这样整个文件变成:
<div> <?php for ( $i = 0; $i < count( $model ); ++$i ) { echo $model[$i]->name; echo '<br>'; } echo "<input type='button' onclick='window.location.href="; echo '"create"'; echo"' value='Create' />"; ?> </div>
好了,至此M, V, C我们都玩过了。
Yii简单开发的基本的过程就这样了。后面如果有时间,我会发布进阶的Yii开发的博文。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.