2010-12-09 7 views
1

SymfonyForm에 1 : n embedForm (s)이 있습니다. 기본 폼과 embedForm 클래스는 조건부 유효성 검사를 구현하는 자체 PreValidation을가집니다. EmbedForm 클래스의 일부는 다음과 같습니다symfony 1.4에서 sfValidatorCallback을 사용하는 embedForm에 대한 PreValidation

private function configurePreValidators() { 
    $validator = new sfValidatorCallback(array('callback'=> array($this, 'preValidation'))); 
    $this->getValidatorSchema()->setPreValidator(new sfValidatorOr(array($validator))); 
} 

public function preValidation(sfValidatorCallback $validator, array $values){ 
... 
    $this->getValidator(self::SOME_FIELD)->setOption('required', false); 
... 
} 
public function configure() { 
    ... 
    $this->configurePreValidators(); 
    parent::configure(); 
} 

기본 폼의 prevalidation이 유사하다.

양식을 제출하면 주 양식 유효성 검사가 정상적으로 작동합니다.

embed-form에서는 embedForm의 preValidation에서 setOption ('required', false)으로 명시 적으로 설정했지만 "SOME_FIELD"는 필수 유효성 검사 오류를 가져옵니다.

embedForm에서 사전 유효성 검사를 사용할 때 고려해야 할 것이 있습니까? mergePreValidator은 어떻습니까? 그것에 관한 어떤 힌트?

미리 감사드립니다.

답변

3

문제는 이전 및 이후의 유효성 검사기가 실행되고 있지 않다는 것입니다.이 유효성 검사기는 발사되지 않습니다 (또는 적어도 있어야합니다). 문제는 수정하려는 유효성 검사기가 preValidate가 최상위 유효성 검사기 스키마에서 참조 된 유효성 검사기, 즉 최상위 양식의 유효성 검사기 스키마가 아니라는 것입니다.

하나의 해결책은 : preValidate에서 검증을 수정하기보다는 단순히 유효성 검사를 수행

public function preValidation(sfValidatorCallback $validator, array $values) 
{ 
    if (!$this->getValidator(self::SOME_FIELD)->isEmpty($values[self::SOME_FIELD]) 
    { 
    throw new sfValidatorErrorSchema(self::SOME_FIELD => new sfValdiatorError($validator, 'msg')); 
    } 
} 

참고,이 솔루션은 약간의 위험이 있습니다 는 최상위 형태의 내부 SOME_FIELD에 대한 검증을 수정하는 경우 이 사전 유효성 검사기에서 수정되지 않으며 그 반대의 경우입니다.

이유를 살펴 보겠습니다. sfForm :: embedForm :

public function embedForm($name, sfForm $form, $decorator = null) 
{ 
    ... 
    $this->validatorSchema[$name] = $form->getValidatorSchema(); 
    ... 
} 

Symfony는 단순히 유효성 검사기를 중첩합니다. 이런 이유로 사전 및 게시물이 호출됩니다. 왜 참조가 바뀌는가? sfValidatorSchema :: offsetSet :

public function offsetSet($name, $validator) 
{ 
    ...  
    $this->fields[$name] = clone $validator; 
} 

따라서 양식이 포함되면 유효성 검사기 스키마가 복제됩니다. 따라서 내장 된 양식 내부의 유효성 검사기 수정 사항은 최상위 유효성 검사기 스키마에 영향을주지 않습니다.

+0

설명해 주셔서 감사합니다 ... – hasentopf

+0

이것은 내 최상위 양식 클래스에서 도움이되지 않습니까? foreach ($ this-> getEmbeddedForm ('my_embeded_forms') -> getEmbeddedForms() $ form_id => $ form) { $ this-> mergePreValidator ($ form-> getValidatorSchema()); } ??? – hasentopf

+0

아니요, sfForm :: embedForm이 이미 위에 붙여 넣은 코드의 스키마를 병합합니다. preValidators는 단순히 잘못된 유효성 검사기 인스턴스를 수정하는 것입니다. –

관련 문제