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 相关文章推荐
mysq GBKl乱码
Nov 28 PHP
source.php查看源文件
Dec 09 PHP
phpnow php探针环境检测代码
Nov 04 PHP
php使用递归计算文件夹大小
Dec 24 PHP
php实现过滤字符串中的中文和数字实例
Jul 29 PHP
php+ajax实现无刷新的新闻留言系统
Dec 21 PHP
教你php如何实现验证码
Jan 20 PHP
php封装的mongodb操作类代码
Aug 06 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
php扩展开发入门demo示例
Sep 23 PHP
PHP7 错误处理机制修改
Mar 09 PHP
laravel使用redis队列实例讲解
Mar 23 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使用codebase生成随机数
2014/03/25 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
2014/10/16 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
2016/06/13 PHP
微信自定义分享php代码分析
2016/11/24 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
jQuery操作select的实例代码
2012/06/14 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
2014/01/09 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
Vue el-autocomplete远程搜索下拉框并实现自动填充功能(推荐)
2019/10/25 Javascript
解决VUE项目localhost端口服务器拒绝连接,只能用127.0.0.1的问题
2020/08/14 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
tensorflow输出权重值和偏差的方法
2018/02/10 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python3 selenium 切换窗口的几种方法小结
2018/05/21 Python
Python面向对象类的继承实例详解
2018/06/27 Python
使用sklearn之LabelEncoder将Label标准化的方法
2018/07/11 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
大学生毕业自我鉴定
2013/11/06 职场文书
开会迟到检讨书
2014/02/03 职场文书
2014厂务公开实施方案
2014/02/17 职场文书
2014年采购部工作总结
2014/11/20 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
中班上学期个人总结
2015/02/12 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书