Yii使用CLinkPager分页实例详细解释_php实例_脚本之家

本文主要讲解了YII中使用CLinkPager分页的方法,这里我们采用物件的形式来定义分页:

本文实例讲述了yii去掉必填项中星号的方法。分享给大家供大家参考,具体如下:

视图: cdnauto/views/config/index.php 复制代码 代码如下: echo
CHtml::dropDownList(‘node’, ”,
CHtml::listData->findAll,array(’empty’=>’–请选择节点–‘, ‘id’
=> ‘node’, ‘ajax’=>array( ‘type’=>’POST’,
‘url’=>Yii::app()->createUrl(‘cdnauto/config/getNodeServersByNodeName’),
‘update’=>’#servers’, ‘data’=>array(‘node_name’=>’js:$ );
echo “”; echo CHtml::dropDownList(‘servers’, ”, array; 控制器:
cdnauto/controllers/ConfigController.php 复制代码 代码如下: public function
actionGetNodeServersByNodeName->request->isAjaxRequest) // throw
new CHttpException; $node_name = $_POST[‘node_name’]; $nodeid =
Node::model()->getNodeId; //通过节点名称获取该节点ID $server =
GossServer::model()->getServerByNodeid; //通过节点ID获取服务器信息
//$server 为array类型,形如 $server =
array(array,array;所以需要两次foreach if{ foreach { foreach{ echo
CHtml::tag(‘option’, array, CHtml::encode; } } }else{ echo
CHtml::tag(‘option’, array, ‘servers’, true); } } 模型: GossServer.php
复制代码 代码如下: /** *
通过节点ID获取该节点下所有的服务器名称 * @author ysdaniel */ public
static function getServerByNodeid { $sql = “SELECT name FROM OSS_Server
WHERE nodeid = ‘{$nodeid}’ “; ///$sql = “SELECT name,nodeid FROM
OSS_Server WHERE nodeid = ‘{$nodeid}’ “; //both ok $cmd =
Yii::app()->db->createCommand; $ret = $cmd->queryAll{ throw new
Exception; } return $ret; } Node.php 复制代码 代码如下: /** *
通过nodename获取nodeid名 * @author */ public static function getNodeId
{ $sql = “SELECT id FROM OSS_Node WHERE name = ‘{$name}'”; $cmd =
Yii::app()->db->createCommand; $ret = $cmd->queryAll{ return
null; //throw new Exception; } return $ret[0][‘id’]; } 其它:
数据表结构 效果: 没有选择节点前: 细节有空再补上了。

CActiveForm讲解

首先在components中自定义LinkPager,并继承CLinkPager

如何去掉必填项里的星号呢?

CActiveForm提供了一些方法,这些方法能够方便的去创建一个与数据模型相关联的Form表单。CActiveForm继承自CWidget,所以他需要实现CWidget的init() 和 run() 方法,同时它也实现了一些自己的封装方法。CActiveForm很重要的一个特性就是它支持Ajax校验。我们可以设置CActiveForm的enableAjaxValidation属性为ture来启动Ajax校验。例如,当用户在input框中输入一些值后就会触发Ajax校验。CActiveForm会向服务器提交Ajax请求,用来校验用户当前输入的值。服务器的校验一般是调用模型类Model的validate()方法。如果校验失败,相对应的错误信息将会被返回并显示给用户。即使用户在浏览器禁用javascript,他也会通过整个页面的提交自动回滚到传统的页面验证。

>'. */ public $totalRowLabel; /** * Creates the page buttons. * @return array a list of page buttons . */ protected function createPageButtons() { $this->maxButtonCount=8; $this->firstPageLabel="首页"; $this->lastPageLabel='末页'; $this->nextPageLabel='下一页'; $this->prevPageLabel='上一页'; $this->header=""; if(($pageCount=$this->getPageCount; list=$this->getPageRange(); $currentPage=$this->getCurrentPage; // currentPage is calculated in getPageRange; // first page $buttons[]=$this->createPageButton($this->firstPageLabel,0,self::CSS_FIRST_PAGE,$currentPage<=0,false); // prev page if(<0) $page=0; $buttons[]=$this->createPageButton($this->prevPageLabel,$page,self::CSS_PREVIOUS_PAGE,$currentPage<=0,false); // internal pages for($i=$beginPage;$i<=$endPage;++$i) $buttons[]=$this->createPageButton($i+1,$i,self::CSS_INTERNAL_PAGE,false,$i==$currentPage); // next page if(>=$pageCount-1) $page=$pageCount-1; $buttons[]=$this->createPageButton($this->nextPageLabel,$page,self::CSS_NEXT_PAGE,$currentPage>=$pageCount-1,false); // last page $buttons[]=$this->createPageButton($this->lastPageLabel,$pageCount-1,self::CSS_LAST_PAGE,$currentPage>=$pageCount-1,false); // 页数统计 $buttons[]=$this->createTotalButton."/{$pageCount}",self::CSS_TOTAL_PAGE,false,false); // 条数统计 $buttons[]=$this->createTotalButton("共{$this->getItemCount()}条",self::CSS_TOTAL_ROW,false,false); return $buttons; } protected function createTotalButton($label,$class,$hidden,$selected) { if $class.=' '.($hidden ? self::CSS_HIDDEN_PAGE : self::CSS_SELECTED_PAGE); return '
public function labelEx($model,$attribute,$htmlOptions=array{ return CHtml::activeLabelEx($model,$attribute,$htmlOptions);}public static function activeLabelEx($model,$attribute,$htmlOptions=array{ $realAttribute=$attribute; self::resolveName; // strip off square brackets if any $htmlOptions['required']=$model->isAttributeRequired; return self::activeLabel($model,$realAttribute,$htmlOptions);}

 

‘.CHtml::label.’

当属性是必填的时候,它将渲染额外的CSS类个标记。特别的,它调用CModel::isAttributeRequired来决定属性是否为必填的。如果是,它将添加一个CSS类CHtml::requiredCss
(public static
$requiredCss=’required’;)到标签上,用CHtml::beforeRequiredLabel(public
static $beforeRequiredLabel=”;)和CHtml::afterRequiredLabel (public
static $afterRequiredLabel=’*’;)来装饰标签。

在客户端,Yii认为input框可以存在四个状态:初始化,校验,错误和成功。为了区分这些状态,CActiveForm自动指定了不同的CSS样式给包含此input框的HTML
element。默认情况下,这些CSS样式类的名字为:validating,error,success。当然我们可以使用CActiveForm的options属性去自定义他们。

‘; } /** * Registers the needed client scripts . */ public function
registerClientScript() { if($this->cssFile!==false)
self::registerCssFile; } /** * Registers the needed CSS file. *
@param string $url the CSS URL. If null, a default CSS URL will be used.
*/ public static function registerCssFile { if
$url=CHtml::asset(Yii::getPathOfAlias(‘application.components.views.LinkPager.pager’).’.css’);
Yii::app->registerCssFile; }}

public function isAttributeRequired{ foreach($this->getValidators as $validator) { if($validator instanceof CRequiredValidator) return true; } return false;}

 

定义CSS样式

所以要去掉星号
或者换成别的可以再view中直接重新定义CHtml::requiredCss、CHtml::beforeRequiredLabel、CHtml::afterRequiredLabel即可

CActiveForm的提交和校验是基于Ajax模式的。如果你的Form表单中有很大量的数据需要提交,那么这种Ajax模式的提交可能就不那么好了。这种情况下,你可以设计自己轻量级的Ajax校验。使用Yii对JQuery的支持?

/** * 翻页样式 */.page_blue{ margin: 3px; padding: 3px; text-align: center; font: 12px verdana, arial, helvetica, sans-serif;}ul.bluePager,ul.yiiPager{ font-size:11px; border:0; margin:0; padding:0; line-height:100%; display:inline; text-aligin:center;}ul.bluePager li,ul.yiiPager li{ display:inline;}ul.bluePager a:link,ul.yiiPager a:link,ul.bluePager a:visited,ul.yiiPager a:visited,ul.bluePager .total_page label,ul.yiiPager .total_page label,ul.bluePager .total_row label,ul.yiiPager .total_row label{ border: #ddd 1px solid; color: #888888 !important; padding:2px 5px; text-decoration:none;}ul.bluePager .page a,ul.yiiPager .page a{ font-weight:normal;}ul.bluePager a:hover,ul.yiiPager a:hover{ color:#FFF !important; border:#156a9a 1px solid; background-color:#2b78a3}ul.bluePager .selected a,ul.yiiPager bluePager .selected a{ color:#3aa1d0 !important; border: 1px solid #3aa1d0;}ul.bluePager .selected a:hover,ul.yiiPager .selected a:hover{ color:#FFF !important;}ul.bluePager .hidden a,ul.yiiPager .hidden a{ border:solid 1px #DEDEDE; color:#888888;}ul.bluePager .hidden,ul.yiiPager .hidden{ display:none;}
labelEx; ?>

 

controller中操作:

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

使用CActiveForm来做Ajax校验,我们需要使用两个JS库:jquery.js和jquery.yiiactiveform.js。他们的位置在工程根目录下:assets5ce53e17文件夹中。不用担心,这些JS库Yii会自动发布到你的工程中。虽然这些动作Yii会悄悄的做,当你必须知道。

//分页操作$criteria=new CDbCriteria;$criteria->order='id DESC';$criteria->select=array('id','uid','username','title','thumb','url','clicks','time','dateline','countfavorite','quality');$criteria->condition=$sql;$total = Video::model;$pages = new CPagination; $pages->pageSize=self::PAGE_SIZE;$pages->applyLimit; $list = Video::model;$title = CommonClass::model()->find(array( 'select'=>array, 'condition'=>'id = '.$id,)); $this->render('application.views.video.list',array( 'array'=>$array, 'arr'=>$arr, 'result'=>$result, 'list'=>$list, 'pages'=>$pages, 'title'=>$title,));

 

在views/video/list.php中引用:

首先我们来看我们的模型类,这里我们使用CFormModel:

widget('LinkPager', array; ?>

图片 1

 1 class LoginForm extends CFormModel
 2 {
 3        public $username;
 4        public $password;
 5        public function rules()
 6        {
 7               return array(
 8                      array('username, password', 'required'),
 9                      array('username', 'authenticate'),
10               );
11        }
12        public function authenticate($attribute,$params)
13        {
14               if($this->username=='admin')
15               $this->addError('username','can not login with admin!');
16        }
17 }

图片 2

 

 

我们的模型类非常简单,只有username和passsword两个属性。username的校验规则是不为空,且不能是“admin”,而password的校验规则只是不为空。注意,当我们检查到用户输入的username的值为“admin”时候,校验失败,我们添加错误信息为“can
not login with admin”,这段信息会在页面中的Yii提供的error元素中输出。

我们可以在rules方法中指定任何一条验证规则的错误信息,我们需要使用message属性。例如:array(‘username’,
‘required’,’message’=>’not
null’),当‘username’的内容为空的时候,我们会使用message指定的内容在页面上显示错误信息。当然我们可以使用中文,如果出现乱码,可以这样设置:array(‘username’,
‘required’,’message’=>iconv(“gb2312″,”utf-8″,”不能为空“))

你将main.php里的app配置加上language=>’zh_cn’,系统默认的提示就是中文的了!

其他验证规则案例:

array(‘title, content,
status’, ‘required’),

array(‘title’, ‘length’,
‘max’=>128),

array(‘status’, ‘in’,
‘range’=>array(0, 1, 2)),

array(‘tags’, ‘match’,
‘pattern’=>’/^[ws,]+$/’,’message’=>’Tags can only contain
word
characters.’),

 

我们的页面代码如下:

 

图片 3

 1 <div class="form">
 2 <?php $form=$this->beginWidget('CActiveForm',
 3 array('id'=>'login-form','enableAjaxValidation'=>true,'action'=>array('site/login'))); ?>
 4        <div class="row">
 5               <?php echo $form->labelEx($model,'username'); ?>
 6               <?php echo $form->textField($model,'username'); ?>
 7               <?php echo $form->error($model,'username'); ?>
 8        </div>
 9        <div class="row">
10               <?php echo $form->labelEx($model,'password'); ?>
11               <?php echo $form->passwordField($model,'password'); ?>
12               <?php echo $form->error($model,'password'); ?>
13        </div>
14        <div class="row submit">
15               <?php echo CHtml::submitButton('Login'); ?>
16        </div>
17 <?php $this->endWidget(); ?>
18 </div>

图片 4

 

对于每一个模型属性的页面表示来说,我们都会有一个Label来说明其属性名,还有一个input框用来输入该属性值,最后有个error元素来显示校验失败时的错误信息。Yii对Form及其子元素封装的太多,我们将以上php代码翻译成静态页面为:

 

图片 5

 1 <div class="form">
 2 <form id="login-form" action="/validator/index.php?r=site/login" method="post">
 3 <div class="row">
 4 <label for="LoginForm_username" class="required">Username
 5 *</label>
 6 <input name="LoginForm[username]" id="LoginForm_username" type="text" value="" />
 7 <div id="LoginForm_username_em_" class="errorMessage" style="display:none"></div>
 8 </div>
 9 <div class="row">
10 <label for="LoginForm_password" class="required">Password
11 *</label>
12 <input name="LoginForm[password]" id="LoginForm_password" type="password" value="" />
13 <div id="LoginForm_password_em_" class="errorMessage" style="display:none"></div>
14 </div>
15 <div class="row submit">
16 <input type="submit" name="yt0" value="Login" />
17 </div>
18 </form>
19 </div>

图片 6

 

Yii的Ajax的校验效果是通过CSS来实现的,上文提到一个input框可以存在四个状态:初始化,校验,错误和成功。每个状态对应不同CSS样式类。初始化和校验这两个状态我们不需要关心,我们只注重用户校验失败和成功时,该input框的CSS样式。此外当校验失败的时候,我们还要定义错误信息的样式,从翻译过来的静态文本来来,我们需要定义errorMessage类。以下是我的CSS类:

 

/*标签是否换行*/

.form label {
font-size:12px; display:block; }

 

/*属性是否必填项,客户端根据model的rule方法而定*/

.form span.required {
color:red; }

 

/*校验出错时标签CSS样式*/

.form .error label {
color:#FFCC33; }

/*校验出错时输入框的CSS样式*/

.form .error input {
background:#FEE; border-color:#C00; }

/*校验出错时错误信息的CSS样式,我们可以设置其display属性让其不换行。*/

.form .errorMessage {
display:inline; color:red; font-size:12px; }

 

/*校验成功时标签CSS样式*/

.form .success label {
color:#000000; }

/*校验成功时输入框的CSS样式*/

.form .success input {
background:#E6EFC2; border-color:#C6D880; }

 

以上的CSS注释已经很详细了,我们来看看校验流程,首先我们需要先渲染我们的页面:

$model = new LoginForm;

$this->render(‘index’,array(‘model’=>$model));

注意,这里我们必须使用render()方法对其进行渲染。

我们的actionLogin如下:

图片 7

public function actionLogin()
{
       $model = new LoginForm;
       //ajax validate
       if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
       {
              echo CActiveForm::validate($model);
              Yii::app()->end();
       }
//submit handle and validate
       if(isset($_POST['LoginForm']))
       {
              $model->attributes = $_POST['LoginForm'];
              if($model->validate()){
                     //no business logic handle
                     $this->renderPartial('success');
                     Yii::app()->end();
              }
       }
       $this->render('index',array('model'=>$model));
}

图片 8

 

 

当input框失去焦点的时候,页面会向服务器提交Ajax请求,服务器端就会根据模型类LoginForm中定义的校验规则就其就行验证。如果校验成功,则input框会按指定的success样式类去显示,如果校验失败,则input框会按指定的error样式类去显示,同时还会按照errorMessage指定的样式类显示错误信息。

需要注意的是,如果我们对用户输入的信息进行了校验,而且有可能校验失败,但是用户在校验失败的情况下,仍然可以提交Form表单。所以当用户提交Form表单的处理代码中,我们仍需要对用户的输入进行校验。

 

CActiveForm其他组件的使用

1.  textArea

发表评论

电子邮件地址不会被公开。 必填项已用*标注