2012-06-18 22 views
0

所以我有这样一个模型:Yii的:避免重复的表单对象从模型的所有属性

class MyClass 
{ 
    public $customer = null; 
    public $address = null; 
} 

而且形式是这样的:

class MyForm extends CFormModel 
{ 
    public $customer = null; 
    public $address = null; 

    /** 
    * Declares the validation rules. 
    */ 
    public function rules() 
    { 
     return array(
     array('customer, address', 'required'), 
     array('verifyCode', 'captcha', 'allowEmpty'=>!CCaptcha::checkRequirements()), 
    ); 

    /** 
     * Declares customized attribute labels. 
     * If not declared here, an attribute would have a label that is 
     * the same as its name with the first letter in upper case. 
    */ 
    public function attributeLabels() 
    { 
     return array(
       'verifyCode'=>'Verification Code', 
     ); 
    } 
} 

我想这样做,在我的表单中扩展模型,但是你不能在PHP中做多个对象继承。

我该如何做到这一点,以避免重复模型中的所有字段属性?

+0

如果您正在考虑制定一个自定义窗体来检索值,各种型号,我建议你通过查看一些空白模型,然后检索他们每个人在提交时在控制器中。 – sucotronic

+0

,如果我扩展了CActiveRecord,它就会工作,但由于我没有,我错过了我模型中的所有验证代码。任何想法如何处理? –

+0

如果'MyClass'对象要存储在数据库中,正确的方式是扩展CActiveRecord,否则可以直接使用CFormModel对象。我不明白为什么你需要一个不同的类来保存两个属性。你能详细说明为什么你需要第一堂课,不能只用第二堂课吗? – sucotronic

回答

1

使用组件行为

甲组件支持mixin图案,并且可以与一个或几个行为被附接。行为是一种对象,其方法可以通过其收集功能而不是专门化(即正常类继承)的方式由其附加组件“继承”。一个组件可以附加几种行为,从而实现“多重继承”。

行为类必须实现IBehavior接口。大多数行为可以从CBehavior基类扩展而来。如果需要将行为附加到模型上,则该行为还可以从CModelBehaviorCActiveRecordBehavior延伸,该模型实现了为模型指定的其他功能。

要使用行为,必须首先通过调用行为的attach()方法将其附加到组件。然后,我们可以通过该组件调用行为的方法:

// $name uniquely identifies the behavior in the component 
$component->attachBehavior($name,$behavior); 
// test() is a method of $behavior 
$component->test(); 

一个附加行为可以像所述部件的正常特性进行访问。例如,如果一个命名树行为被附接到一个组件,我们可以使用获得参考此行为对象:

$behavior=$component->tree; 
// equivalent to the following: 
// $behavior=$component->asa('tree'); 

甲行为可以被暂时禁用,使得它的方法不是通过组件可用。例如,

$component->disableBehavior($name); 
// the following statement will throw an exception 
$component->test(); 
$component->enableBehavior($name); 
// it works now 
$component->test(); 

附加到同一组件的两个行为有可能具有相同名称的方法。在这种情况下,首先附加行为的方法将优先。

当与events一起使用时,行为更加强大。行为在附加到组件时,可以将其某些方法附加到组件的某些事件。通过这样做,行为有机会观察或更改组件的正常执行流程。

行为的属性也可以通过它所连接的组件来访问。这些属性包括公共成员变量和通过getter和/或行为setter定义的属性。例如,如果行为具有名为xyz的属性并且行为被附加到组件$ a。然后我们可以使用表达式$a->xyz来访问行为的属性。

更多阅读:
http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/