0

だから私はこのようなモデルを持っています:

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では複数のオブジェクトの継承を行うことはできません。

モデルのすべてのフィールドプロパティがフォームに重複しないようにするには、どうすればよいですか?

4

1 に答える 1

1

コンポーネントの動作の使用

コンポーネントはミックスインパターンをサポートし、1つまたは複数の動作でアタッチできます。ビヘイビアーは、特殊化(つまり、通常のクラス継承)の代わりに機能を収集する手段を介して、アタッチされたコンポーネントによってメソッドを「継承」できるオブジェクトです。コンポーネントはいくつかの動作でアタッチできるため、「多重継承」を実現できます。

ビヘイビアークラスはIBehaviorインターフェースを実装する必要があります。ほとんどの動作はCBehavior基本クラスから拡張できます。ビヘイビアーをモデルにアタッチする必要がある場合は、モデルに固有の追加機能を実装するCModelBehaviorまたはCActiveRecordBehaviorから拡張することもできます。

ビヘイビアーを使用するには、ビヘイビアーのattach()メソッドを呼び出して、最初にビヘイビアーをコンポーネントにアタッチする必要があります。次に、コンポーネントを介して動作メソッドを呼び出すことができます。

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

アタッチされた動作には、コンポーネントの通常のプロパティのようにアクセスできます。たとえば、treeという名前のビヘイビアがコンポーネントにアタッチされている場合、次を使用してこのビヘイビアオブジェクトへの参照を取得できます。

$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();

同じコンポーネントにアタッチされた2つのビヘイビアーに、同じ名前のメソッドがある可能性があります。この場合、最初にアタッチされた動作の方法が優先されます。

イベントと一緒に使用すると、動作はさらに強力になります。ビヘイビアーは、コンポーネントにアタッチされると、そのメソッドの一部をコンポーネントの一部のイベントにアタッチできます。そうすることで、動作はコンポーネントの通常の実行フローを監視または変更する機会を得ます。

ビヘイビアのプロパティには、接続されているコンポーネントを介してアクセスすることもできます。プロパティには、パブリックメンバー変数と、動作のゲッターやセッターを介して定義されたプロパティの両方が含まれます。たとえば、ビヘイビアーに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/

于 2012-06-19T06:22:49.103 に答える