2011-02-02 5 views
0

ZF 1.11.2
ほとんどの構文を試しました。彼らはクリックしなかった。世界であなたは上記の構文でalnumのカスタムエラーメッセージを設定するにはどうすればよい(配列構文を使用して)入力バリデータのカスタムエラーメッセージ

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

'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
  • の下にあなたの翻訳を維持するよう指示
  • アレイアダプタ(最も簡単)を使用
  • 言語/ロケールの翻訳ディレクトリをスキャン

(すなわち、ユーザがen_AUをpreferesいますが、その言語の特定の翻訳ファイルを持っていない)、未知の翻訳に関するエラーを無視、あなたがサポートするすべての言語用のフォルダを作成します。最低でもapplication/lang/enが必要です。たとえば、

application 
    lang 
     en 
     en_AU 
     en_US 

translate.phpファイルを作成します。このファイルには、各翻訳のキーと値のペアの配列が含まれています(および返されます)。各バリデーター・メッセージのキーは、バリデーター・クラスで見つけることができます。あなたは、単にのための検証メッセージを変更しようとしている場合はここでの例では、例えば

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

+1クール!私はこれを知らなかった。しかし、2つの異なるバリデーターがメッセージキーに同じ値を使用すると、これは問題になりませんでしたか? –

+0

@David Zendは紛争を避けるために世話をしたと思います。クラスを見ると、メッセージキーには接頭辞または接尾辞のいずれかのクラス名が付きます(例: 'Zend_Validate_Alnum :: INVALID == 'alnumInvalid'') – Phil

+0

Aaah、gotcha。うん、それらのZendボーイズはかなり賢いです。ですから、私は、 'Zend_Translate'を意識していることを主張する外部開発のバリデータが何らかの類似の '名前空間'スキームに従う必要があることを確かめる必要があります。ありがとう! ;-) –

2

、AlnumバリデータのすべてのZendのバリデータについては

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

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

のためだ、あなたもあなたのメッセージに%value%プレースホルダを使用することができます

$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

いいえ、私は$バリデーター内の単一の配列に保持したいと思います。すべてのテンプレートメッセージを上書きする 'messages'キーです。 @Phil Brownの提案は良いですが、私は今それを使用しません。 @ Maxenceの答えを巡って、何か新しいバリデーターをインスタンス化せずに。 – nevvermind

+0

ああ、私は見ると思う。与えられた要素に対して、 "無効な値"のような*単一の*メッセージテンプレートが*その要素の*すべての*バリデータに使用されることを望みますか?その場合、標準のErrorデコレータを置き換えるためのカスタムデコレータを作成できると思います。バリデーションに失敗した場合は、バリデーターから来たメッセージをすべて*表示するのではなく、単に*単一の*メッセージをレンダリングするだけです。 Whaddyaは思う? –

+0

[私の以前のコメントを少し言い換えて、私が意図したことをよりよく反映する] Aaah、私は思う。与えられた要素に対して、バリデーターの* any *がその要素で失敗した場合に使用される、*単一の*エラーメッセージテンプレート(「無効な値」など)が必要ですか?その場合、標準のErrorデコレータを置き換えるためのカスタムデコレータを作成できると思います。検証に失敗した場合、個々のバリデータが要素にアタッチしたすべてのメッセージをレンダリングするのではなく、目的の単一メッセージをレンダリングするだけです。 Whaddyaは思う? –

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

要素でトランスレータを無効にすると、すべてのバリデータメッセージの翻訳が無効になります。フォームまたは要素でトランスレータを使用することはできず、1つのバリデータメッセージだけを上書きします。要素が検証されると、トランスレータはすべてのバリデータに注入されます。バリデータが設定されている場合は、バリデータが使用されます。これによりカスタムエラーメッセージは使用されません。

が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) 
関連する問題