您的位置:首页 > 职场人生

职场箴言

2011-10-10 08:58 288 查看
创建动作

我们创建了模型之后,我们就需要写一些逻辑代码来操纵这个模型。我们把这部分的逻辑代码放在控制器(controller)的动作(action)中。例如在用户登录过程中,我们编写以下代码:

public function actionLogin()

{

$model=new LoginForm;

if(isset($ POST['LoginForm']))

{

// collects user input data

$model->attributes=$ POST['LoginForm'];

// validates user input and redirect to previous page if validated

if($model->validate())

$this->redirect(Yii::app()->user->returnUrl);

}

// displays the login form

$this->render('login',array('model'=>$model));

}

在上面的代码中,我们首先创建一个模型LoginForm的实例,如果请求是_POST(表明login form已经提交),然后我们用 $ POST['LoginForm']的表单数据来给这个实例赋值,然后再对这些数据进行校验,如果校验通过了,就重定向到之前的用户界面,如果失败了,就回到用户登录的界面(这时的用户界面跟之前就不一样了,有错误提示啊)

在上面的这些代码中,让我们来重点关注一下这句:

$model->attributes=$ POST['LoginForm'];

在之前的安全设置属性章节中,我们提到过这个是用终端用户提交的数据来给模型实例进行集体赋值的。这些属性的特点是在CModel中定义的,采用一组name-values的参数来进行赋值。所以如果$ POST['LoginForm']给我们一个数组,上面的这行代码就等同于:

$model->username=$ POST['LoginForm']['username'];

$model->password=$ POST['LoginForm']['password'];

$model->rememberMe=$ POST['LoginForm']['rememberMe'];

创建窗体

写登录的表单相对来说就很简单了。我们先从form这表标签开始,他的动作属性就是之前我们提到过的登录动作的URL。然后我们插入一些登录用到的标签,以及输入框。最后,我们放置一个提交按钮。所有这些工作都可以用纯的HTML语句来实现。

Yii,我们伟大的Yii框架,提供了一些帮助类来简化这些编码工作。例如,我们要插入一个文本输入框,就可以调用CHtml::textField();想弄一个下拉框,就可以调用CHtml::dropDownList().

有些人可能会问了,我们这么做,跟直接用html比起来,有什么好处呢?答案是这些帮助类,不仅可以提供html代码,还可以做更多的事情。例如,以下的代码在用户改变输入框的内容时,会触发提交动作:

CHtml::textField($name,$value,array('submit'=>''));

如果不这样的话,我们必须写一大堆的JS来实现这个功能了。

下面,我们来看一个实例,用CHtml创建登录表单。我们假设$model就是LoginForm的实例。

<div class="form">

<?php echo CHtml::beginForm(); ?>

<?php echo CHtml::errorSummary($model); ?>

<div class="row">

<?php echo CHtml::activeLabel($model,'username'); ?>

<?php echo CHtml::activeTextField($model,'username') ?>

</div>

<div class="row">

<?php echo CHtml::activeLabel($model,'password'); ?>

<?php echo CHtml::activePasswordField($model,'password') ?>

</div>

<div class="row rememberMe">

<?php echo CHtml::activeCheckBox($model,'rememberMe'); ?>

<?php echo CHtml::activeLabel($model,'rememberMe'); ?>

</div>

<div class="row submit">

<?php echo CHtml::submitButton('Login'); ?>

</div>

<?php echo CHtml::endForm(); ?>

</div><!-- form -->

上例中代码生成的是一个动态的表单。例如,CHtml::activeLabel()生成的标签是关联模型中的特定属性的。如果这个属性的输入有误,标签的CSS样式就会跳到错误提示的样式。同样的,CHtml::activeTextField生成的文本输入框,当有错误输入时,也会提示相应的错误信息。

从Yii的1.1.1版本开始,一个新的工具CActiveForm用来简化表单的创建工作。这个工具可以用来实现客户端与服务器之间的无缝校验!强大!如果用CActiveForm来实现以上的表单,可以代码如下:

<div class="form">

<?php $form=$this->beginWidget('CActiveForm'); ?>

<?php echo $form->errorSummary($model); ?>

<div class="row">

<?php echo $form->label($model,'username'); ?>

<?php echo $form->textField($model,'username') ?>

</div>

<div class="row">

<?php echo $form->label($model,'password'); ?>

<?php echo $form->passwordField($model,'password') ?>

</div>

<div class="row rememberMe">

<?php echo $form->checkBox($model,'rememberMe'); ?>

<?php echo $form->label($model,'rememberMe'); ?>

</div>

<div class="row submit">

<?php echo CHtml::submitButton('Login'); ?>

</div>

<?php $this->endWidget(); ?>

</div><!-- form -->

采集表格化输入数据

有时候,我批量的采集用户的输入信息。例如,用户可以同时输入有关很多个模型的数据内容,然后依次提交。我们称之为表格化数据输入,因为这些输入框一般都是在html的table标签里。

在使用表格化输入之前,我们要先创建或者填充一组模型的对象,是新建还是填充,取决于我们是插入数据或者是更新数据来着。 然后我们从用户输入的数据中,给各模型对象的属性赋值。与单一模型对象比起来,差别在于我们赋值是用$ POST['ModelClass'][$i], 而非之前的$ POST['ModelClass'].

public function actionBatchUpdate()

{

// retrieve items to be updated in a batch mode

// assuming each item is of model class 'Item'

$items=$this->getItemsToUpdate();

if(isset($ POST['Item']))

{

$valid=true;

foreach($items as $i=>$item)

{

if(isset($ POST['Item'][$i]))

$item->attributes=$ POST['Item'][$i];

$valid=$item->validate() && $valid;

}

if($valid) // all items are valid

// ...do something here

}

// displays the view to collect tabular input

$this->render('batchUpdate',array('items'=>$items));

}

在这个动作准备好以后,我们要在batchUpdate这个视图里,呈现HTML的输入表格。

<div class="form">

<?php echo CHtml::beginForm(); ?>

<table>

<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>

<?php foreach($items as $i=>$item): ?>

<tr>

<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>

<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>

<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>

<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>

</tr>

<?php endforeach; ?>

</table>

<?php echo CHtml::submitButton('Save'); ?>

<?php echo CHtml::endForm(); ?>

</div><!-- form -->

注意,在上面的代码中,用"[$i]name"而不是"name"作为CHtml::activeTextArea的第二个参数。(以上这个例子,虽然是批量赋值没错,但是还是单一的模型的多对象而已啊)

如果校验器检测有任何错误,当前的输入框就会自动高亮,就像之前提到过的错误提示。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: