2011-02-24 4 views
6

두 개의 별도 컨텍스트에서 폼 클래스를 사용하고 있습니다. 둘 다 새 레코드를 만들고 해당 레코드를 편집하는 것입니다. URL 필드가 고유한지 확인하기 위해 다음과 같이 게시 유효성 검사기를 설정했습니다.sfValidatorDoctrineUnique 업데이트/편집 컨텍스트에서

$this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
    new sfValidatorDoctrineUnique(array('model' => 'Page', 'column' => array('url')), array('invalid' => 'This URL already exists.')) 
))); 

새 레코드를 만들 때 유효성 검사기는 훌륭하게 작동합니다. 그러나 기존 레코드를 편집 할 때 자체를 중복으로 탐지하므로 오류가 발생합니다. 즉, 레코드를 편집하지만 URL을 변경하지 않으면 중복 오류가 발생합니다.

이것은 일반적인 문제이기 때문에 Symfony에서이 문제를 처리하는 방법이 궁금합니다. 기본적으로 나는 그것이 저장 될 때 (중복이 존재하지 않을 때) 자체를 무시하고 싶지만 여전히 실제 복제본이 존재하지 않도록하기 위해 사후 - 유효성 검사기를 실행한다.

+0

톰, 내가 찾은 해결책을 알려주세요 문제. 감사. – tipu

+1

내 솔루션을 찾았습니다 : sfValidatorDoctrineUnique 첫 번째 매개 변수는 'primary_key'키가 있어야하며 값은 테이블의 기본 키이어야합니다. 그런 다음 이름이 기본 키와 일치하는 양식의 값을 가지고 있는지 확인해야합니다. 그래서 만약 당신이 Id 3을 가진 모델 페이지를 편집한다면 필요합니다. 마지막으로 primary_key 열을 내 양식에도 넣으므로 $ this-> setValidator ('id', new sfValidatorString (array ('required'=> true))). 모두 3 개의 파일을 변경하면 작업이 완료됩니다. – tipu

답변

6

업데이트 상황은 실제로 sfValidatorDoctrineUnique에 의해 처리됩니다.

주어진 URL이있는 개체가 이미 존재하는 경우 유효성 검사기가 업데이트 작업을 수행하고 있는지 확인합니다. 확인은 sfValidatorDoctrineUnique :: isUpdate() 메소드로 이루어집니다.

기본 키가 제출 된 값이어야합니다.

기본적으로 기본 키는 인트로 스됩니다. 유효성 검사기에 전달 된 * primary_key * 옵션을 제공 할 수 있습니다.

다른 답변에서 언급 한 바와 같이
+0

고마워, 정확히 내가 뭘 찾고있는 것 같아. 사용법에 대한 간단한 예제를 제공 할 수 있습니까? 잘 문서화되지 않은 것 같습니다. – Tom

+0

.... 걱정하지 마, 알아 냈어. 처음에는 그 방법을 호출해야한다고 생각했습니다. 당신의 도움을 주셔서 감사합니다. – Tom

+1

hi kuba, 당신은 sfValidatorDoctrineUnique :: isUpdate() 또는 primary_key 옵션 –

4

, 다음을 확인하는 것이 중요하다 : 업데이트 된 개체에 대한

  • 는 PK 값이 제출 양식 값에 있어야합니다.
  • sfValidatorDoctrineUnique 유효성 검사기는 양식과 함께 값을 알고 있어야합니다.

, 다음 단계를 수행해야합니다 이러한 목표를 달성하기 위해 :

class MyModelForm extends BaseMyModelForm 
{ 
    public function configure() 
    { 
    if(! $this->isNew()) 
    { 
     $this->widgetSchema['id'] = new sfWidgetFormInputHidden(); 
     $this->validatorSchema['id'] = new sfValidatorNumber(array(
      'required' => true 
     , 'min'  => 1 
    )); 
    } 

    ... 
    } 

    ... 
} 
    :

    1. (보통) 개체의 PK 값을 포함 숨겨진 입력을 추가

    2. 이 추가 입력은 업데이트하는 경우에만 추가해야합니다.
       
  • 이동 후 검증 단계에 sfValidatorDoctrineUnique :

    class MyModelForm extends BaseMyModelForm 
    { 
        public function configure() 
        { 
        $this->widgetSchema['unique_column'] = new sfWidgetFormInputText(); 
        $this->validatorSchema['unique_column'] = new sfValidatorPass(); 
    
        ... 
    
        $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
         'required' => true 
         , 'model' => 'MyModel' 
         , 'column' => 'unique_column' 
        ))); 
        } 
    
        ... 
    } 
    
    • 당신은 사후 검증 단계에 검사기를 추가 할 $this->mergePostValidator()를 사용해야합니다 모든 을되도록 제출 된 값이 유효성 검사기에 제공됩니다.

    • 고유 한 열 위젯의 유효성 검사기를 제공해야합니다. 그렇지 않으면 양식을 제출할 때 "예상치 않은 추가 양식 필드"오류가 발생합니다.

  • 개체를 전달하는하는 것은 폼의 생성자에 업데이트되고 있는지 확인 : 나는 같은 데 같이

    $this->form = new MyModelForm($this->getRoute()->getObject()); 
    
  • 관련 문제