2012-06-18 2 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'개체가 db에 올바른 방식으로 저장되면 CActiveRecord 형식을 확장하는 것이고, 그렇지 않으면 직접 CFormModel 개체를 사용할 수 있습니다. 왜 두 가지 속성을 유지하기 위해 다른 클래스가 필요한지 이해할 수 없습니다. 첫 번째 수업이 필요한 이유를 자세히 설명하고 두 번째 수업 만 사용할 수는 없습니까? – sucotronic

답변

1

사용

구성 요소는 mixin 패턴을 지원하며 하나 또는 여러 행동에 부착 할 수 있습니다. 비헤이비어는 특수화 (예 : 정상 클래스 상속) 대신 기능을 수집하는 방법을 통해 첨부 된 구성 요소에 의해 메소드가 '상속'될 수있는 객체입니다. 구성 요소는 여러 가지 동작과 연결되어 '다중 상속'을 얻을 수 있습니다.

동작 클래스는 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(); 

첨부 행동

구성 요소의 일반적인 특성처럼 액세스 할 수 있습니다. 행동라는 이름의 트리가 구성 요소에 연결되어있는 경우, 예를 들어, 우리는 사용하여이 비헤이비어 객체에 대한 참조를 얻을 수 있습니다

$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/

관련 문제