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 危险函数全解析
Sep 09 PHP
PHP 远程关机实现代码
Nov 10 PHP
写出高质量的PHP程序
Feb 04 PHP
PHP管理内存函数 memory_get_usage()使用介绍
Sep 23 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
PHP实现的多进程控制demo示例
Jul 22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 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中MD5函数使用实例代码
2008/06/07 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
JavaScript实现的简单烟花特效代码
2015/10/20 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
详解通过JSON数据使用VUE.JS
2017/05/26 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
jQuery实现checkbox的简单操作
2017/11/18 jQuery
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
解决使用layui的时候form表单中的select等不能渲染的问题
2019/09/18 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
React+EggJs实现断点续传的示例代码
2020/07/07 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
JS实现放大镜效果
2020/09/21 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python实用代码片段收集贴
2015/06/03 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python 读取文件并把矩阵转成numpy的两种方法
2019/02/12 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
简历中个人自我评价范文
2013/12/26 职场文书
计算机求职信
2014/07/02 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
初中家长意见
2015/06/03 职场文书
CSS3实现的文字弹出特效
2021/04/16 HTML / CSS
redis数据结构之压缩列表
2022/03/21 Redis
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
css3 文字断裂效果
2022/04/22 HTML / CSS