2010-12-21 2 views
1

でオーバーライドするデータフォームを管理する新しい戦略を使用します。私のSymfonyプロジェクトでDoctrine_RecordのvalidateメソッドをDoctrine_Template

私はSymfonyフォームオブジェクトを使いたくありませんが、モデルを使ってモデルを作成したいと思っています。

私はBase Doctrine_Recordクラスを再宣言したくないので、新しいDoctrine_Template:ExtendedModelを書きました。

ExtendeModelテンプレートでは、新しいオブジェクトとメソッドがありましたが、Doctrine_Recordのvalidate()関数をオーバーライドする必要があります。

Iは

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

} 

と試みたが、教義は、オリジナルの検証()関数を使用します。

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. myDoctrineRecord

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

を作成し、私はlibに/レコードにこのファイルを配置しますが、オートローダはそれを見るだろうというどこにでも置くことができます。

2.設定symfonyのあなたにProjectConfigurationのconfigureDoctrineコールバックでこのクラスを使用するには:

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

これは私のprevious answer to a similar questionから貼り付け/コピーされます。モデルを再構築する必要があります。

関連する問題