2012-02-17 15 views
4

私はドロップダウンフィールドを持つZend_Formを持っています。 ユーザーがURLに値を設定すると、この値がこのドロップダウンでデフォルト値として選択されます。Zend_Formフィールド値を手動で設定して検証します

は、だから私は、現時点では何をすべきかは、このされていない:

$parlang = $this->getRequest()->getParam('lang'); 
if($parlang){ 
    $this->view->filterForm->getElement('ddLanguage')->setValue($parlang); 
} 

if ($this->getRequest()->isPost()) { 
     if($this->view->filterForm->isValid($_POST)){ 
... 
... 
... 

私は、変数の値が偶数ドロップダウンリストの有効な値であるかどうかを確認したいん?フォームの検証と一緒にこれをチェックするにはどうすればいいですか?はい、私は配列などと変数を確認することができますが、これは "フレームワークとの戦い"と思われる。

このようなことを行うためのZendの方法は何ですか?

編集: 興味を持っているすべての人のための私の最終的な解決策は、次のとおりです。

$parlang = $this->getRequest()->getParam('lang'); 
if($parlang){ 
    $ddLanguage = $this->view->filterForm->ddLanguage; 
    if($ddLanguage->isValid($parlang)){ 
     $ddLanguage->setValue($parlang); 
     $language = $parlang; 
    } 
} 
+0

MultiSelectフィールドの他の値は何ですか?彼らは国のリストですか? – Liyali

答えて

1

私は簡単なテストを実行し、使用することができます一つの方法は、Zend_Form_Element_Select::getMultiOption()であるように、それは言語が選択に存在するかどうかを確認することになります値。

<?php 

$parlang = $this->getRequest()->getParam('lang'); 

if ($parlang) { 
    $el = $this->view->filterForm->getElement('ddLanguage'); 

    // attempt to get the option 
    // Returns null if no such option exists, otherwise returns a 
    // string with the display value for the option 
    if ($el->getMultiOption($parlang) !== null) { 
     $el->setValue($parlang); 
    } 
} 
+0

ありがとう、あなたのポストリード私は正しい方向に私はそれを別のlitteにしました。値がリストにあるかどうかを調べるのではなく、フォーム要素のisValidメソッドを使用しています。 – Johni

+0

それもうまくいく、私はその可能性も考えていたが、それが無効に戻った場合は、エラーのフォームまたは要素をクリアする必要があるかもしれない。しかし、私は確信していませんが、私はそのようにしなかった。 – drew010

1

マルチセレクト要素に国の一覧が含まれている場合は、URLの要素値に基づいて要素値にデフォルト値を設定します。

そうするためには、次のようにカスタムをZend_Form_Elementを作成することができます。

class My_Form_Element_SelectCountry extends Zend_Form_Element_Select 
{ 
    protected $_translatorDisabled = true; 

    public function init() 
    { 
     $locale = Zend_Registry::get('Zend_Locale'); 

     if (!$locale) { 
      throw new Exception('No locale set in registry'); 
     } 

     $countries = Zend_Locale::getTranslationList('territory', $locale, 2); 
     unset($countries['ZZ']); 

     // fetch lang parameter and set US if there is no param 
     $request = Zend_Controller_Front::getInstance()->getRequest(); 
     $lang = $request->getParam('lang', 'US'); 

     // sort your country list 
     $oldLocale = setlocale(LC_COLLATE, '0'); 
     setlocale(LC_COLLATE, 'en_US'); 
     asort($countries, SORT_LOCALE_STRING); 
     setlocale(LC_COLLATE, $oldLocale); 

     // check weither the lang parameter is valid or not and add it to the list 
     if (isset($countries[$lang])) { 
      $paramLang = array($lang => $countries[$lang]); 
      $countries = array_merge($paramLang, $countries); 
     }   

    $this->setMultiOptions($countries); 
} 

}

あなたはこのカスタムフォームからアイデアを得ます。 あなたがしようとしているのは、国リストではなく言語リストではなく、ロジックが同じであるMultiselectフィールドではなく、静的メソッドZend_Locale::getTranslationList()への呼び出しを変更して、あなたが必要です。

もう1つのことは、マルチセレクト要素に1つの要素が必要な場合は、Zend_Form_Element_Hiddenに移動します。

これは「if」がたくさんありますが、質問から多変量要素のように見えます。

Multiselect要素を使用している場合、Zend_Frameworkは自動的にInArrayバリデーターを追加します。つまり、送信されたデータが正しいかどうかを確認することはありませんない。 isValidはあなたのためにそれを行うつもりです。

ユーザーがデフォルトのパラメータを許可し、すべてが正常であるか、このパラメータとデフォルトパラメータ(この場合はen_US)が変更または削除されても、マルチ選択のデフォルト値として設定されますフィールド。

あなたの最後の質問に答えるために、ユーザーが設定した変数をチェックし、配列(例:getTranslationList())と比較するのはフレームワークではありません。私はそれをすることも推奨される方法だと言います。

+0

そのタスクのためにフォーム要素を拡張するのは間違っています。この新しい要素はそのタスクにしか使用できないため、モジュールを可能な限り一般的な形で記述したいと考えています。しかし、あなたの考えに感謝します。 – Johni

関連する問題