2

次の選択ウィジェットを作成するQuickFormを使用するコードがあります。

$form->addElement( 'select', 'state_id', 'State:', statesArray() );

statesArray()データベースにクエリを実行して使用可能な状態を取得し、状態名にリンクされたIDを持つ連想配列を返します。ソリューション全体で同様の手法を使用しています。

私がやりたいのは、この配列の前に無効になっている2つのオプションを追加することです。これにより、デフォルトでは、選択メニューに「状態を選択してください」のように表示され、その後にダッシュが続きます。どちらも無効になっています。QuickFormを使用していなかった場合、selectには最初の2つのオプションとして次のものがあります。

  <option value="" disabled="disabled">Select a State</option>
  <option value="" disabled="disabled">-</option>

両方のオプションが無効になっており、ユーザーが最初の値にオプションを残した場合、選択ウィジェットは空の値を送信しますが、これはフォームチェックコードによって無効になります。

QuickFormでこれを行う方法はありますか?

ありがとう、チャック

4

2 に答える 2

11

OK、QuickFormのドキュメントをさらに深く掘り下げた後、私はこれを理解しました。解決策は、selectウィジェットに配列を入力するのではなく、select要素を手動でフォームに追加することです。

もともと、私はこれを持っていました:

function dbArray( $tableName, $fieldName ) {
    $query = <<< EOT
SELECT   `id`, `$fieldName`
FROM     `$tableName`
ORDER BY `$fieldName`
EOT;

    $link = connectToDatabase();
    $result = mysql_query( $query, $link );
    while ( $rec = mysql_fetch_assoc( $result ) );
    {
        $array[$rec['id']] = $rec[$fieldName];
    }

    return $array;
}

function statesArray() {
    return dbArray( 'states', 'name' );
}

$form = new HTML_QuickForm( 'account', 'POST' );
$form->addElement( 'select', 'state_id', 'State:', statesArray() );

array( 'none' => 'Please select a State' )配列を呼び出し元のコードに戻す前に、呼び出しの前に追加されたバージョンをdbArray実行しましたが、これによってオプションが無効になることはありませんでした。選択が数値であることを確認するルールを追加することが回避策でした($form->addRule( 'state_id', 'You must select a state.', 'numeric' ))。しかし、私はそれが選択可能であることがまだ好きではありませんでした。これが私が見つけた解決策です。

function statesSelect() {
    $select = HTML_QuickForm::createElement( 'select' );
    $select->addOption( 'Select a State', '', array( 'disabled' => 'disabled' ) );
    $select->addOption( '-', '', array( 'disabled' => 'disabled' ) );

    $statesArray = dbArray( 'states', 'name' );
    foreach ( $statesArray as $id => $name ) {
        $select->addOption( $name, $id );
    }

    return $select;
}

$form = new HTML_QuickForm( 'account', 'POST' );
$form->addElement( statesSelect() );
$form->addRule( 'state_id', 'You must select a state.', 'required' );

これが他の誰かに役立つことを願っています。:)

于 2010-01-27T21:11:15.980 に答える
0

技術的には、を使用するのが最善の解決策optgroupですが、ブラウザは通常、デフォルトでこの値に設定されるのではなくoptionselectグループの最初の値に設定されます。

Select State値を「なし」(指定された旧式のソリューションと同様)にして有効のままにしてから、ウィジェットが空白のままにするとフォームを無効として返すようにしないのはなぜですか?これはQuickFormの範囲外ですか?

ほとんどのユーザーは、何かが有効になっているか無効になっているかに気付かないと思います。無効にすることの唯一の利点は、選択できないようにすることです。

あなたの目標は、入力の検証に向けられていますか?もしそうなら、フォームとQuickFormの間にJavaScriptを追加して、送信する前にユーザーが無効な(またはvalue = "Null")要素を選択したかどうかを確認してみませんか?

明らかに、全体像を把握するにはQuickFormのドキュメントを読む必要がありますが、例から得られるものに基づいてPlease Choose State => None、state_arrayに追加し、使用する予定のフォームバリデーターで「None」を有効なものとして受け入れないようにすることができます。入力。

于 2010-01-26T08:11:56.050 に答える