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函数解决SQL injection
Oct 09 PHP
MySQL中create table语句的基本语法是
Jan 15 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 PHP
遭遇php的in_array低性能问题
Sep 17 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
PHP通过串口实现发送短信
Jul 08 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
php数据序列化测试实例详解
Aug 12 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
Nov 14 PHP
PHP中-&gt;和=&gt;的含义及使用示例解析
Aug 06 PHP
php+js实现点赞功能的示例详解
Aug 07 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即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
php中出现空白页的原因及解决方法汇总
2014/07/08 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
php字符集转换
2017/01/23 PHP
基于Laravel(5.4版本)的基本增删改查操作方法
2019/10/11 PHP
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
JS对大量数据进行多重过滤的方法
2016/11/04 Javascript
巧用Javascript的逻辑运算符
2016/12/02 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
js实现常见的工具条效果
2017/03/02 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
深入浅析vue组件间事件传递
2017/12/29 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
JS实现吸顶特效
2020/01/08 Javascript
jQuery操作选中select下拉框的值代码实例
2020/02/07 jQuery
JS实现简易留言板增删功能
2020/02/08 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
用Python操作字符串之rindex()方法的使用
2015/05/19 Python
python的keyword模块用法实例分析
2015/06/30 Python
浅谈python内置变量-reversed(seq)
2017/06/21 Python
Pandas Shift函数的基础入门学习笔记
2018/11/16 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
Ref与out有什么不同
2012/11/24 面试题
物流管理专业毕业生自荐信
2014/03/04 职场文书
三方协议书范本
2014/04/22 职场文书
网站推广策划方案
2014/06/04 职场文书
经理任命书模板
2014/06/06 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
电话营销开场白
2015/05/29 职场文书
趣味运动会加油词
2015/07/18 职场文书
干部考核工作总结2015
2015/07/24 职场文书
SpringBoot Http远程调用的方法
2022/08/14 Java/Android