2010-12-21 5 views
1

으로 덮어 씁니다. 데이터 폼을 관리하기위한 새로운 전략을 사용했습니다.Symfony 프로젝트에서 Doctrine_Record validate 메소드를 Doctrine_Template

Symfony Form 객체를 사용하고 싶지 않지만 모델을 사용하여 모델을 만들고 싶습니다.

기본 Doctrine_Record 클래스를 다시 선언하고 싶지 않으므로 새로운 Doctrine_Template : ExtendedModel을 작성했습니다.

ExtendeModel 템플릿에서 새로운 개체와 메서드가 있지만 Doctrine_Record의 validate() 함수를 재정의해야합니다.

나는

class ExtendedModel extends Doctrine_Template { 

[...] 

public $validatorSchema; 

public function setValidatorSchema(sfValidatorSchema $validatorSchema) { 
    $this->validatorSchema = $validatorSchema; 
} 

public function getValidatorSchema() { 
    return $this->validatorSchema; 
} 

public function validate() { 
    $this->getInvoker()->setup(); 

    $errorStack = $this->getInvoker()->getErrorStack(); 
    if ($this->getValidatorSchema()) { 
     try { 
      $this->getValidatorSchema()->addOption('allow_extra_fields', true); 
      $this->getValidatorSchema()->clean($this->getInvoker()->toArray(false)); 
     } catch (sfValidatorErrorSchema $errorSchema) { 
      $errorStack = $this->getInvoker()->getErrorStack(); 
      foreach ($errorSchema->getErrors() as $key => $error) { 
       /* @var $error sfValidatorError */ 
       $errorStack->add($key, $error->getMessage()); 
      } 
     } 
    } 
    $this->getInvoker()->validate(); 
} 

} 

으로 시도했지만 교리는 원래의 validate() 함수를 사용합니다.

일부 Doctrine_Record 함수를 Doctrine_Template에 선언 된 새로운 메서드로 재정의하려고합니다.

이 문제에 대한 해결책을 제안 해 주시겠습니까?

Tnx!

+0

Doctrine_Record_Listener에서 preValidate (Doctrine_Event $ event) 함수를 사용하여 validate() 메소드에 대한 해결책을 찾았지 만 다른 Doctrine_Record 함수를 대체 할 수는 없습니다 – Ephraim

답변

1

템플릿은 Doctrine_Record 메소드를 오버라이드하지 않으며 원시 메소드가 발견되지 않을 때 PHP 마법을 통해 대체 될 수 있습니다 (__call).

이렇게하려면 Doctrine_Record 상속 체인에 자신의 클래스가 있어야합니다. 다행히이 꽤 간단하다

1.

내가 lib 디렉토리/기록에서이 파일을 배치 myDoctrineRecord

abstract class myDoctrineRecord extends sfDoctrineRecord 
{ 
    public function commonRecordMethod() { } 
} 

만들기,하지만 당신은 오토로더가 그것을 볼 것이다 어디를 넣을 수 있습니다.

2. 심포니는 ProjectConfiguration의 configureDoctrine 콜백이 클래스를 사용합니다 :이 복사됩니다

public function configureDoctrine(Doctrine_Manager $manager) 
{ 
    sfConfig::set('doctrine_model_builder_options', array('baseClassName' => 'myDoctrineRecord')); 
} 

은/내 previous answer to a similar question에서 붙여 넣기. 모델을 다시 빌드해야합니다.