Yii表单生成器不依赖Model

我也不知道标题该怎么写才能描述我要说明的问题,意思就是可以放Yii的表单生成器功能更加灵活。

默认的Yii的表单生成器只需要这样就可以了:

 

 代码如下 复制代码

1 $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'));
 }

}

时间: 2024-10-30 13:01:57

Yii表单生成器不依赖Model的相关文章

Yii不依赖Model的表单生成器用法实例_php实例

本文实例讲述了Yii不依赖Model的表单生成器用法.分享给大家供大家参考.具体实现方法如下: 默认的Yii的表单生成器只需要这样就可以了: 复制代码 代码如下: $form = new CForm('application.views.site.loginForm', $model); 这里的application.views.site.loginForm也可以是配置数组.但是如果$model参数不传的话是会报错的:Fatal error: Call to a member function

Extjs表单生成器

背景 随着Extjs的不断成熟,它也在不断的被开发人员所接受和使用 .Extjs是一个完全的UI框架,它自带的控件已经能很好的满足日常开发的需要 ,并且它底层仍是以html和样式为基础,在不满意需求特殊需求的情况,我们也 非常方便的进行扩展.所以,我一贯的态度是,要使用extjs就要用的彻底,UI 部分应该完全使用Extjs来实现,完全摈弃传统的ASP.NET前台模式.当然,现在 也有一些把Extjs封装成ASP.NET Server Control的实现,如:coolite, ExtAspNe

Yii初学者必看-yii 表单验证规则

对yii深入了解总结出:希望对初学者有些帮助 Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行. 常见的 CRUD 操作作为 AR 的方法实现.因此,我们可以以一种更加面向对象的方式访问数据. 例如,我们可以使用以下代码向 tbl_post 表中插入一个新行. yii 表单验证规则 <?php classContactFormexten

PHP Yii框架之表单验证规则大全_php实例

Yii是一个基于组件的高性能PHP框架,用于开发大型Web应用.Yii采用严格的OOP编写,并有着完善的库引用以及全面的教程. 废话不多说了,直接给大家贴代码了. <?php class ContactForm extends CFormModel { public $_id; public $contact;//联系人 public $tel;//电话 public $fax;//传真 public $zipcode;//邮编 public $addr;//地址 public $mobile;

yii用户注册表单验证实例_php实例

本文实例讲述了yii用户注册表单验证实现方法.分享给大家供大家参考,具体如下: 视图层:register.php <?php //使用小物件生成form元素 $form=$this->beginWidget('CActiveForm'); ?> <!--用户名--> <?php echo $form->labelEx($model,'username');?> <?php echo $form->textField($model,'usernam

yii框架表单模型使用及以数组形式提交表单数据示例_php实例

按Yii文档里的描述,Yii在处理表单的一般过程是: 创建表单对应的模型类,设置字段验证规则创建表单提交对应的action,处理提交的内容在视图中创建表单form在刚刚的一个小项目里,想使用ajax提交表单信息并验证保存,又不想用隐藏iframe来做无刷新提交,并且action中能够用到模型类的校验方法,就想到使用表单数组提交的方式,举个例子: form代码: 复制代码 代码如下: <form action='' method='post' name='form_test'>    <i

Yii中表单用法实例详解_php实例

本文实例讲述了Yii中表单用法.分享给大家供大家参考,具体如下: 在 Yii 中处理表单时,通常需要以下步骤: 1. 创建用于表现所要收集数据字段的模型类. 2. 创建一个控制器动作,响应表单提交. 3. 在视图脚本中创建与控制器动作相关的表单. 一.创建模型 在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则.模型类可用于记录这些信息.正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置. 取决于使用用户所输入数据的方式

BootStrap智能表单实战系列(六)表单编辑页面的数据绑定_javascript技巧

什么是 Bootstrap? Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 历史 Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的.Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品. Bootstrap 包的内容 基本结构:Bootstrap 提供了一个带有网格系统.链接样式.背景的基本结构.这将在 Bootst

Symfony2框架学习笔记之表单用法详解_php实例

本文实例讲述了Symfony2框架表单用法.分享给大家供大家参考,具体如下: 对于一个Web开发者来说,处理HTML表单是一个最为普通又具挑战的任务.Symfony2集成了一个Form组件,让处理表单变的容易起来.在这一节里,我们将 从基础开始创建一个复杂的表单,学习表单类库中最重要的内容. Symfony2 的Form组件是一个独立的类库,你可以在Symfony2项目之外使用它. 创建一个简单的表单: 假设你要创建一个应用程序的todo列表,需要显示一些任务.因为你的用户需要编辑和创建任务,所