读书人

Yii技术框架学习之路(5)

发布时间: 2013-11-25 13:22:27 作者: rapoo

Yii技术框架学习之路(五)

表单生成器

?

  1. 基本概念
  2. 创建一个简单的表单
  3. 指定表单元素
  4. 访问表单元素
  5. 创建一个嵌套表单
  6. 定制表单显示

当创建 HTML 表单时,经常我们发现我们在写很多重复而且在不同项目中很难重用的视图代码。 例如,对于每个输入框, 我们需要以一个文本标签和显示可能的验证错误来关联它。 为了改善这些代码的重用性,我们可以使用自版本 1.1.0 可用的表单生成器特征。

1. 基本概念?

Yii 表单生成器使用?CForm?对象来代表描述一个HTML表单所需的内容,包括哪些数据模型关联到此表单, 表单中有哪些输入框,以及如何渲染整个表单。开发者主要需要创建和配置这个?CForm?对象,然后调用它的渲染方法来显示表单。

表单的输入框参数被组织为根据表单元素的分层结构。 在结构的顶层,是?CForm?对象。此对象的成员分为两大类:?CForm::buttons?和?CForm::elements。前者包含 按钮元素(例如提交按钮,重设按钮),后者包含输入元素,静态文本和子表单。子表单也是?CForm?对象,只是它存在于 另一个表单的?CForm::elements?中。子表单可以有它自己的数据模型,?CForm::buttons?和?CForm::elements?集合。

当用户提交一个表单时,整个表单结构中填写的数据被提交, 也包含子表单中填写的数据。?CForm?提供了便利方法,可以自动赋值输入的数据到对应的数据属性并执行数据验证。

2. 创建一个简单的表单?

下面,我们展示如何使用表单生成器来创建一个登录表单。

首先,我们编写登录 action 代码:

public function actionLogin(){    $model = new LoginForm;    $form = new CForm('application.views.site.loginForm', $model);    if($form->submitted('login') && $form->validate())        $this->redirect(array('site/index'));    else        $this->render('login', array('form'=>$form));}

在上面的代码中,我们使用由路径别名?application.views.site.loginForm?(将会简要解释) 指定的参数创建了?CForm?对象。?CForm?对象和?LoginForm?模型(在Creating Model中已介绍)关联。

如代码所示,若表单被提交并且所有的输入经过了验证而没有错误,我们将转向用户的浏览器到?site/index?页面。否则, 我们以此表单渲染?login?视图。

路径别名?application.views.site.loginForm?实际指的是 PHP 文件protected/views/site/loginForm.php。此文件应当返回一个 PHP 数组,这个数组代表了?CForm?所需的配置, 如下所示:

return array(    'title'=>'Please provide your login credential',     'elements'=>array(        'username'=>array(            'type'=>'text',            'maxlength'=>32,        ),        'password'=>array(            'type'=>'password',            'maxlength'=>32,        ),        'rememberMe'=>array(            'type'=>'checkbox',        )    ),     'buttons'=>array(        'login'=>array(            'type'=>'submit',            'label'=>'Login',        ),    ),);

配置是一个由键值对组成的关联数组,被用来初始化?CForm?的对应属性。要配置的最重要的属性,如之前所述,是?CForm::elements?和?CForm::buttons。 它们的每一个是一个指定了表单元素列表的数组。在下一小节我们将给出更多细节关于如何配置表单元素。

最后,我们编写?login?视图,可以简洁地如下所示,

<h1>Login</h1> <div class="form"><?php echo $form; ?></div>

提示:?上面的代码?echo $form;?相当于?echo $form->render();。 这是因为?CForm?执行了__toString?魔术方法,它调用?render()?并返回它的结果为代表此表单对象的字符串。

3. 指定表单元素?

使用表单生成器,我们大部分的工作由编写视图脚本代码转为指定表单元素。在这一小节中,我们讲述如何指定CForm::elements?属性。 我们不准备讲述?CForm::buttons?因为它的配置和?CForm::elements?的配置几乎相同。

CForm::elements?属性接受一个数组作为它的值。每个数组元素指定了一个单独的表单元素,这个表单元素可以是一个输入框,一个静态文本字符串或一个子表单。

指定输入元素

一个输入元素主要由标签,输入框,提示文字和错误显示组成。 它必须和一个模型属性关联。一个输入元素的规格被代表为一个?CFormInputElement?实例。?CForm::elements?数组中的如下代码指定了一个单独的输入元素:

'username'=>array(    'type'=>'text',    'maxlength'=>32,),

它说明模型属性被命名为?username,输入框的类型为?text,它的?maxlength?属性为 32。

任何?CFormInputElement?可写的属性都可以如上配置。例如,我们可以指定?hint?选项来显示提示信息,或者我们可以指定?items?选项若输入框是一个 list box,一个下拉列表,一个多选列表或一个单选按钮列表。 若选项的名字不是一个?CFormInputElement?属性,它将被认为是对应 HTML 输入元素的属性, 例如,因为上面的?maxlength不是一个?CFormInputElement?属性,它被渲染作为 HTML 文本输入框的?maxlength?属性。

type?选项需要特别注意。它指定了输入框的类型。 例如,text?类型意味着将渲染一个普通的文本输入框;password?类型意味着将渲染一个密码输入框。?CFormInputElement?识别如下内置的类型:

读书人网 >互联网

热点推荐