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 和 COM
Oct 09 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
Feb 17 PHP
php获取新浪微博数据API实例
Nov 12 PHP
ThinkPHP关于session的操作方法汇总
Jul 18 PHP
PHP针对JSON操作实例分析
Jan 12 PHP
php生成与读取excel文件
Oct 14 PHP
PHP对象、模式与实践之高级特性分析
Dec 08 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
Sep 30 PHP
PHP实现websocket通信的方法示例
Aug 28 PHP
ThinkPHP框架实现定时执行任务的两种方法分析
Sep 04 PHP
PHP中遍历数组的三种常用方法实例分析
Jun 24 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 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 escape URL编码
2008/12/10 PHP
PHP Class SoapClient not found解决方法
2018/01/20 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
javascript加号&quot;+&quot;的二义性说明
2013/03/04 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
jQuery、layer实现弹出层的打开、关闭功能
2017/06/28 jQuery
详解使用React全家桶搭建一个后台管理系统
2017/11/04 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
Angular开发实践之服务端渲染
2018/03/29 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
python使用marshal模块序列化实例
2014/09/25 Python
Python中的高级函数map/reduce使用实例
2015/04/13 Python
ubuntu安装mysql pycharm sublime
2018/02/20 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
Python 进程操作之进程间通过队列共享数据,队列Queue简单示例
2019/10/11 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
详解python datetime模块
2020/08/17 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
2014两会优秀的心得体会范文
2014/03/17 职场文书
新文化运动的基本口号
2014/06/21 职场文书
2014年体育部工作总结
2014/11/13 职场文书
土地租赁协议书
2015/01/29 职场文书
岗位聘任报告
2015/03/02 职场文书
仓库统计员岗位职责
2015/04/14 职场文书
入党申请书怎么写?
2019/06/21 职场文书