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 相关文章推荐
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
php printf输出格式使用说明
Dec 05 PHP
PHP MySQL应用中使用XOR运算加密算法分享
Aug 28 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
Nov 07 PHP
PHP include任意文件或URL介绍
Apr 29 PHP
PHP将进程作为守护进程的方法
Mar 19 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
Yii核心验证器api详解
Nov 23 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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服务器实现多session并发运行
2006/10/09 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
php获取系统变量方法小结
2015/05/29 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
2019/07/08 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
laravel入门知识点整理
2020/09/15 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
[00:03]DOTA2新版本PA至宝展示
2014/11/19 DOTA
Python中字典和JSON互转操作实例
2015/01/19 Python
python实现的简单窗口倒计时界面实例
2015/05/05 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
2018/01/08 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
利用CSS3伪元素实现逐渐发光的方格边框
2017/05/07 HTML / CSS
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
学校安全工作制度
2014/01/19 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
会计核算科岗位职责
2014/03/19 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书