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 相关文章推荐
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
php实现在线生成条形码示例分享(条形码生成器)
Dec 30 PHP
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
Jan 14 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
smarty模板引擎从php中获取数据的方法
Jan 22 PHP
php阳历转农历优化版
Aug 08 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
老生常谈PHP面向对象之命令模式(必看篇)
May 24 PHP
php解决crontab定时任务不能写入文件问题的方法分析
Sep 16 PHP
PHP高并发和大流量解决方案整理
Dec 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
将兴奋、喜悦和坎加斯带到戴安娜:亚马逊公主
2020/03/03 欧美动漫
乱谈我对耳机、音箱的感受
2021/03/02 无线电
PHP开发过程中常用函数收藏
2009/12/14 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
php把session写入数据库示例
2014/02/26 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
PHP中SESSION过期设置
2021/03/09 PHP
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jQuery html()方法使用不了无法显示内容的问题
2014/08/06 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
在React中如何优雅的处理事件响应详解
2017/07/24 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
基于js实现的图片拖拽排序源码实例
2020/11/04 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
python logging模块的使用总结
2019/07/09 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
python实现udp聊天窗口
2020/03/31 Python
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
CK巴西官方网站:Calvin Klein巴西
2019/07/19 全球购物
《一株紫丁香》教学反思
2014/02/19 职场文书
互联网创业计划书写作技巧攻略
2014/03/23 职场文书
2014年售票员工作总结
2014/11/19 职场文书