2011-02-02 2 views
0

ZF 1.11.2
대부분의 구문을 시도했습니다. 그들은 클릭하지 않았다. 입력 유효성 검사기에 대한 사용자 정의 오류 메시지 (배열 구문 사용)

$validators = array('product_name' => array('alnum'));
//...
$input = new Zend_Filter_Input($filters, $validators, $_POST);

어떻게 세계에서 당신은 위의 구문 alnum에 대한 사용자 지정 오류 메시지를 설정합니까? 'messages' => array('Not alnum!!')을 사용 하시겠습니까? 그래, 뭐 ... 어떻게? 나는 중첩 된 배열을 100 개 시도했을 것입니다.

답변

2

내장 된 변환기를 사용하십시오. 예를 들어

는 간단한 배열이 알려줍니다

; Translations 
resources.translate.data = APPLICATION_PATH "/lang" 
resources.translate.adapter = "Array" 
resources.translate.options.scan = "directory" 
resources.translate.options.disableNotices = "1" 

를 사용하도록 설정 파일에 변환기를 구성하면 APPLICATION_PATH/lang 아래에 번역을 계속

  • 원하는 응용 프로그램 자원 플러그인을 번역
  • 어레이 어댑터 (가장 단순) 사용
  • 언어/로캘의 번역 디렉터리를 검색하십시오
  • 알 수없는 번역에 대한 오류 무시 (즉, 사용자 preferes EN_AU을하지만 당신은 해당 언어에 대한 구체적인 번역 파일이없는),

이제 당신이 지원하고자하는 모든 언어에 대한 폴더를 만들 수 있습니다. 최소한 application/lang/en을 원할 것입니다. 예 :

application 
    lang 
     en 
     en_AU 
     en_US 

각 언어 폴더에 translate.php 파일을 만듭니다. 이 파일은 각 변환에 대한 키/값 쌍의 배열을 포함하고 반환합니다. 유효성 검사기 클래스에서 각 유효성 검사기 메시지의 키를 찾을 수 있습니다. 여기에 Alnum 유효성 검사기 모든 젠드 유효성 검사기를 들어

<?php 
// application/lang/en/translate.php 

return array(
    Zend_Validate_Alnum::NOT_ALNUM => 'Not alnum!!', 
    Zend_Validate_Alnum::INVALID => 'Not valid!!' 
); 

에 대한 예, 당신은 또한 당신의 메시지에 %value% 자리를 사용할 수 있습니다 예를 들어

Zend_Validate_Alnum::NOT_ALNUM => "'%value%' is not alpha-numeric" 
+0

+1 쿨! 나는 이것을 몰랐다. 그러나 두 개의 서로 다른 유효성 검사기가 메시지 키에 대해 동일한 값을 사용하면 문제가되지 않을 수 있습니까? –

+0

@ David 나는 Zend가 충돌을 피하려고 돌 보았다고 생각합니다. 클래스를 들여다 보면 메시지 키 앞에 접두사 나 접미사가 붙습니다 (예 :'Zend_Validate_Alnum :: INVALID == 'alnumInvalid'') – Phil

+0

Aaah, gotcha. 네, 젠드 보이즈는 꽤 영리합니다. 그래서 나는 단지'Zend_Translate' 인식을 목적으로하는 외부에서 개발 된 유효성 검사기가 비슷한 '네임 스페이스'체계를 따라야한다는 것을 확신 할 필요가 있습니다. 감사! ;-) –

2

당신은 단순히에 대한 확인 메시지를 변경하려는 경우

$this->addElement('text', 'myTextField', array(
    'label' => 'The Label', 
    'description' => 'The description for the field...', 
    'filters' => array(
     'StringTrim', 
     // etc 
    ), 
    'validators' => array(
     array('NotEmpty', true, array(
      'messages' => 'This field is required', 
     )), 
     array('AnotherValidator', true, array(
      'messages' => 'Bad value', 
     )), 
    // etc 
    ), 
)); 

는 SA가 당신에게 위치 : 형태 요소는, 난 항상 (Zend_Form를 확장하는 클래스 내에서) 이런 식으로 일을했다 이것이 작동하지 않았다는 것을 말하는가? 또는 좀 더 일반적인 맥락에서 유효성 검사기를 사용하고 계시다면 @Phil Brown (굉장한!) 대답이 그 일을 할 것입니다.

+0

아니요, 저는 $ validators에 단일 배열로 보관하고 싶습니다. 모든 메시지를 덮어 쓰는 'messages'키가 있습니다. @Phil Brown의 제안은 훌륭하지만 지금은 사용하지 않을 것입니다. @ Maxence의 답변을 회전 시키지만 모든 새 유효성 검사기를 인스턴스화하지는 않습니다. – nevvermind

+0

아아, 알았어. 주어진 요소의 경우, "유효하지 않은 값"과 같은 * 단일 * 메시지 템플릿이 * 해당 요소의 * 모든 * 유효성 검사기에 사용되기를 원합니까? 이 경우 표준 오류 데코레이터를 대체 할 사용자 정의 데코레이터를 만들 수 있다고 상상합니다. 유효성 검사가 실패하면 유효성 검사기에서 온 메시지를 모두 * 렌더링하지 않고 원하는 * 단일 메시지 만 렌더링하면됩니다. 생각하니? –

+0

[내 이전 의견을 약간 바꾸어서 내가 의도 한 바를 좀 더 자세히 반영] Aaah, 나는 생각합니다. 주어진 요소에 대해 유효성 검사기의 * any *가 해당 요소에서 실패 할 경우 "잘못된 값"과 같은 * * 오류 메시지 템플릿이 필요합니다. 이 경우 표준 오류 데코레이터를 대체 할 사용자 정의 데코레이터를 만들 수 있다고 상상합니다. 유효성 검사가 실패하면 개별 유효성 검사기가 요소에 첨부 한 모든 메시지를 렌더링하는 대신 원하는 단일 메시지 만 렌더링하면됩니다. 생각하니? –

0

번역기가있는 경우 setMessage를 사용하고 번역기를 사용하지 않도록 설정하십시오.

$alnum = new Zend_Validate_Alnum(); 
$alnum->setDisableTranslator(true); 
$alnum->setMessage(
    'Not alnum!!', 
    Zend_Validate_Alnum::NOT_ALNUM 
); 
$validators = array('product_name' => array($alnum)); 

양식 요소에서 유효성 검사기를 사용하는 경우 요소에서 변환기를 사용 중지해야합니다.

2

요소에서 변환기를 사용하지 않으면 모든 유효성 검사기 메시지의 번역이 비활성화됩니다. 양식 또는 요소에서 변환기를 사용하여 하나의 유효성 검사기 메시지를 겹쳐 쓸 수는 없습니다. 요소가 확인되면 변환기가 모든 유효성 검사기에 주입됩니다. 유효성 검사기는 변환기가 설정된 경우 변환기를 사용합니다.따라서 사용자 정의 오류 메시지는 사용되지 않습니다.

Zend_Validate_Abstract :: _ createMessage의()

// $message is your custom error message 
$message = $this->_messageTemplates[$messageKey]; 

if (null !== ($translator = $this->getTranslator())) { 
    // your custom error message gets overwritten because the messageKey can be translated 
    if ($translator->isTranslated($messageKey)) { 
     $message = $translator->translate($messageKey); 
    } else { 
     $message = $translator->translate($message); 
    } 
} 

나는 요소에 번역자를 비활성화하여 사용자 지정 오류 메시지를 사용하는 경우에만 가능하다 생각합니다.

$element->setDisableTranslator(true) 
관련 문제