一步一步学Yii开发(三)

一步一步学Yii开发(三)

接上一篇

 

一步一步学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开发的博文。

 

 

 

 

 

 

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *