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和javascript之间变量的传递实现代码
Dec 19 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
memcache一致性hash的php实现方法
Mar 05 PHP
php强制用户转向www域名的方法
Jun 19 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
Mar 20 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
thinkphp3.x中display方法及show方法的用法实例
May 19 PHP
PHP中的表达式简述
May 29 PHP
Laravel中间件实现原理详解
Oct 09 PHP
laravel-admin的图片删除实例
Sep 30 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 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
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
thinkPHP5框架中widget的功能与用法详解
2018/06/11 PHP
php swoft框架实例用法
2020/12/22 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
jQuery 幻灯片插件(带缩略图功能)
2011/01/24 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
javascript中substring()、substr()、slice()的区别
2015/08/30 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
用JS动态改变表单form里的action值属性的两种方法
2016/05/25 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Angular4 Select选择改变事件的方法
2018/10/09 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
Vue 封装防刷新考试倒计时组件的实现
2020/06/05 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python中decorator使用实例
2015/04/14 Python
详解Python的Django框架中的模版继承
2015/07/16 Python
python3 拼接字符串的7种方法
2018/09/12 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
德国机车企业:FC-Moto
2017/10/27 全球购物
临床医学系毕业生推荐信
2013/11/09 职场文书
期末自我鉴定
2014/02/02 职场文书
学生自我评价范文
2014/02/02 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
我们的节日春节活动方案
2014/08/22 职场文书
幼儿园感恩节活动方案
2014/10/06 职场文书
旷课检讨书范文
2014/10/30 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书