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 相关文章推荐
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
Oct 09 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
php正则表达式使用的详细介绍
Apr 27 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php实现压缩多个CSS与JS文件的方法
Nov 11 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
php遍历解析xml字符串的方法
May 05 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP中单例模式的使用场景与使用方法讲解
Mar 18 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
TP5框架简单登录功能实现方法示例
Oct 31 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
thinkphp模板用法和内容输出实例
2014/11/28 PHP
php打印输出棋盘的实现方法
2014/12/23 PHP
PHP中的session安全吗?
2016/01/22 PHP
workerman结合laravel开发在线聊天应用的示例代码
2018/10/30 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
2010/05/06 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
微信小程序网络请求的封装与填坑之路
2017/04/01 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
python opencv实现切变换 不裁减图片
2018/07/26 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
Django 查询数据库并返回页面的例子
2019/08/12 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
2020/06/17 Python
如何查看python关键字
2021/01/17 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
英国二手物品交易网站:Preloved
2017/10/06 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
服务整改报告
2014/11/06 职场文书
万里长城导游词
2015/01/30 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
信用卡工资证明范本
2015/06/19 职场文书
《比的意义》教学反思
2016/02/18 职场文书
导游词之湖北武当山
2019/09/23 职场文书
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python