如何使用QuickForm添加禁用的选择选项?

我有使用QuickForm的代码,它使用以下内容创建一个选择小部件:
$form->addElement( 'select', 'state_id', 'State:', statesArray() );
statesArray()
查询数据库以获取可用状态,并返回一个关联数组,其中ID与状态名称相关联。我在整个解决方案中使用了类似的技术。 我想要做的是在这个数组前加上两个被禁用的选项,这样默认情况下,选择菜单会显示“请选择一个状态”,后面跟一个短划线,这两个选项都被禁用。如果我没有使用QuickForm,则select将具有以下两个选项:
  <option value="" disabled="disabled">Select a State</option>
  <option value="" disabled="disabled">-</option>
两个选项都被禁用,如果用户在第一个值上保留选项,则选择窗口小部件将提交一个空值,该值由表单检查代码无效。 有没有办法用QuickForm做到这一点? 谢谢, 查     
已邀请:
好的,在深入研究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' );
我希望这有助于其他人。 :)     
从技术上讲,最好的解决方案是使用
optgroup
,但浏览器通常不会默认为此值,而是默认为
select
组中的第一个
option
。 为什么不让你的
Select State
的值为“None”(类似于你给定的老式解决方案)并保持启用状态,然后让窗口小部件将表单保留为无效,如果它们留空?这是否超出了QuickForm的范围? 我认为大多数用户都没有注意到是否启用了某些功能,并且禁用的唯一好处是使其无法选择。 您的目标是否适合验证输入?如果是这样,为什么不在表单和QuickForm之间添加一些javascript来检查用户是否在提交之前选择了disabled(或value =“Null”)元素? 显然我需要阅读QuickForm文档才能全面了解,但根据我的示例,您可以将
Please Choose State => None
添加到state_array,然后使用您计划使用的任何形式验证器,不接受“无”作为有效的输入。     

要回复问题请先登录注册