Yii不依赖Model的表单生成器用法实例


Posted in PHP onDecember 04, 2014

本文实例讲述了Yii不依赖Model的表单生成器用法。分享给大家供大家参考。具体实现方法如下:

默认的Yii的表单生成器只需要这样就可以了:

$form = new CForm('application.views.site.loginForm', $model);

这里的application.views.site.loginForm也可以是配置数组。但是如果$model参数不传的话是会报错的:Fatal error: Call to a member function isAttributeSafe()
比如我要生成一个组表单,但是我不想依赖于model,根据配置就可以生成一组表单该怎么办,

默认生成的表单的label是根据$model->attributes来显示的,所以我做了2件事:

1.继承CFormInputElement覆盖renderLabel方法,将label显示成自己配置的element的label

2.继承CForm覆盖renderElement方法,$element instanceof UCFormInputElement,并覆盖render方法,将Elements和getButtons循环输出
直接上代码:
app/protected/extensions/UCForm.php

<?php

/**

 * @author Ryan <yuansir@live.cn/yuansir-web.com>

 */

class UCForm extends CForm

{

 public function render()

 {

  $output = $this->renderBegin();

  foreach ($this->getElements() as $element)

  {

   $output .= $element->render();

  }

  foreach ($this->getButtons() as $button)

  {

   $output .= $button->render();

  }

  $output .= $this->renderEnd();

  return $output;

 }

 public function renderElement($element)

 {

  if (is_string($element))

  {

   if (($e = $this[$element]) === null && ($e = $this->getButtons()->itemAt($element)) === null)

    return $element;

   else

    $element = $e;

  }

  if ($element->getVisible())

  {

   //UCFormInputElement 代替 CFormInputElement

   if ($element instanceof UCFormInputElement)

   {

    if ($element->type === 'hidden')

     return "<div style="visibility:hidden">n" . $element->render() . "</div>n";

    else

     return "<div class="row field_{$element->name}">n" . $element->render() . "</div>n";

   }

   else if ($element instanceof CFormButtonElement)

    return $element->render() . "n";

   else

    return $element->render();

  }

  return '';

 }

}

再来个简单的调用示例:
<?php

/**

 * @author Ryan <yuansir@live.cn/yuansir-web.com>

 */

class PlayerSearchController extends Controller

{

 public function actionIndex()

 {

  $config = array(

      'class' => 'ddd',

      'action'=>'',

      'elements' => array(

   '<br><br>',

   'username' => array(

       'label'=>'用户名啊',//注意这里的label

       'type' => 'text',

       'maxlength' => 32,

       'value' => ''

   ),

   '<br><br>',

   'password' => array(

       'label'=>'昵称啊',//注意这里的label

       'type' => 'password',

       'maxlength' => 32,

       'value' => ''

   ),

      ),

      'buttons' => array(

   'login' => array(

       'type' => 'submit',

       'label' => 'Login',

   ),

      ),

  );

  $model = new CFormModel();

  $form = new UCForm($config, $model);

  $this->render('index', compact('form'));

 }

}

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

PHP 相关文章推荐
Zend Guard一些常见问题解答
Sep 11 PHP
完美解决令人抓狂的zend studio 7代码提示(content Assist)速度慢的问题
Jun 20 PHP
php获取数组中重复数据的两种方法
Jun 28 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
Mar 19 PHP
php实现zip文件解压操作
Nov 03 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
PHP简单遍历对象示例
Sep 28 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 PHP
Yii分页用法实例详解
Dec 04 #PHP
Yii配置文件用法详解
Dec 04 #PHP
yii实现图片上传及缩略图生成的方法
Dec 04 #PHP
Dwz与thinkphp整合下的数据导出到Excel实例
Dec 04 #PHP
yii的CURD操作实例详解
Dec 04 #PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 #PHP
php生成随机颜色方法汇总
Dec 03 #PHP
You might like
php生成的html meta和link标记在body标签里 顶部有个空行
2010/05/18 PHP
使用PHP计算两个路径的相对路径
2013/06/14 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
2017/01/12 PHP
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
封装了jQuery的Ajax请求全局配置
2015/02/05 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
[06:48]DOTA2-DPC中国联赛2月26日Recap集锦
2021/03/11 DOTA
python远程登录代码
2008/04/29 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
2015/03/30 Python
python3 shelve模块的详解
2017/07/08 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python使用re模块验证危险字符
2020/05/21 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
荷兰最大的多品牌男装连锁店:Adam Brandstore
2019/12/31 全球购物
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
拾金不昧的表扬信
2014/01/16 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
安全生产月宣传标语
2014/10/06 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
大学运动会通讯稿
2015/07/18 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书