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 相关文章推荐
用PHP将数据导入到Foxmail
Oct 09 PHP
15种PHP Encoder的比较
Mar 06 PHP
淘宝ip地址查询类分享(利用淘宝ip库)
Jan 07 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
php发送与接收流文件的方法
Feb 11 PHP
为你总结一些php信息函数
Oct 21 PHP
CI框架支持$_GET的两种实现方法
May 18 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
Nov 14 PHP
Laravel框架文件上传功能实现方法示例
Apr 16 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
咖啡知识大全
2021/03/03 新手入门
第十二节 类的自动加载 [12]
2006/10/09 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
php 常用算法和时间复杂度
2013/07/01 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
简单的JS多重继承示例
2008/03/13 Javascript
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
JS获取父节点方法
2009/08/20 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
微信小程序input抖动问题的修复方法
2021/03/03 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
[01:20:05]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第二场 2月5日
2021/03/11 DOTA
Python 字符串中的字符倒转
2008/09/06 Python
python 爬虫 批量获取代理ip的实例代码
2018/05/22 Python
python实现简单多人聊天室
2018/12/11 Python
Python简单I/O操作示例
2019/03/18 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
python中几种自动微分库解析
2019/08/29 Python
面向对象编程的优势是什么
2015/12/17 面试题
《雷鸣电闪波尔卡》教学反思
2014/02/23 职场文书
学生党员公开承诺书
2014/05/28 职场文书
2014年小学工作总结
2014/11/26 职场文书
会计岗位职责范本
2015/04/02 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
Java版 单机五子棋
2022/05/04 Java/Android