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 连接mssql数据库 初学php笔记
Mar 01 PHP
并发下常见的加锁及锁的PHP具体实现代码
Oct 12 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
php字符串截取的简单方法
Jul 04 PHP
Yii调试SQL的常用方法
Jul 09 PHP
PHP连接MySQL数据库并以json格式输出
May 21 PHP
PHP封装的分页类与简单用法示例
Feb 25 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
laravel withCount 统计关联数量的方法
Oct 10 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
PHP简单获取视频预览图的方法
2015/03/12 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
laravel框架的安装与路由实例分析
2019/10/11 PHP
PHP设计模式入门之状态模式原理与实现方法分析
2020/04/26 PHP
动态调用css文件——jquery的应用
2007/02/20 Javascript
在textarea中屏蔽js的某个function的javascript代码
2007/04/20 Javascript
使用jQuery的ajax功能实现的RSS Reader 代码
2009/09/03 Javascript
让元素在网页中可拖动示例代码
2013/08/13 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
vue 实现通过手机发送短信验证码注册功能
2018/04/19 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
Python数据类型之Tuple元组实例详解
2019/05/08 Python
react+django清除浏览器缓存的几种方法小结
2019/07/17 Python
python yield关键词案例测试
2019/10/15 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
工作骂脏话检讨书
2014/10/05 职场文书
Python装饰器详细介绍
2022/03/25 Python
Go语言grpc和protobuf
2022/04/13 Golang