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' );
これが他の誰かに役立つことを願っています。:)