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

Php 如何使用QuickForm添加禁用的选择选项?,php,pear,quickform,Php,Pear,Quickform,我使用QuickForm创建了一个具有以下内容的select小部件的代码: $form->addElement( 'select', 'state_id', 'State:', statesArray() ); statesArray()查询数据库以获取可用状态,并返回一个关联数组,其中ID链接到状态名称。我在整个解决方案中使用了类似的技术 我想做的是在这个数组前面加上两个禁用的选项,这样默认情况下,选择菜单会显示类似“请选择一个状态”的内容,后面是破折号,这两个选项都被禁用。如果我没有

我使用QuickForm创建了一个具有以下内容的select小部件的代码:

$form->addElement( 'select', 'state_id', 'State:', statesArray() );
statesArray()
查询数据库以获取可用状态,并返回一个关联数组,其中ID链接到状态名称。我在整个解决方案中使用了类似的技术

我想做的是在这个数组前面加上两个禁用的选项,这样默认情况下,选择菜单会显示类似“请选择一个状态”的内容,后面是破折号,这两个选项都被禁用。如果我没有使用QuickForm,select将具有以下两个选项:

  <option value="" disabled="disabled">Select a State</option>
  <option value="" disabled="disabled">-</option>
选择一个状态
-
这两个选项都被禁用,如果用户将选项保留在第一个值上,则select小部件将提交一个空值,该空值由表单检查代码设置为无效

有没有办法用QuickForm实现这一点

谢谢,
Chuck

从技术上讲,最好的解决方案是使用
optgroup
,但浏览器通常不会默认为该值,而是默认为
选择
组中的第一个
选项

为什么不让您的
Select State
的值为“None”(类似于您给定的老式解决方案)并使其处于启用状态,然后让小部件将表单返回为无效,如果他们将其保留为空?这是否超出了QuickForm的范围

我认为大多数用户不会注意到某些东西是启用还是禁用的,禁用的唯一好处是使其不可选择

您的目标是否针对验证输入?如果是这样,为什么不在表单和QuickForm之间添加一些javascript来检查用户在提交之前是否选择了禁用(或value=“Null”)元素


显然,我需要阅读QuickForm文档以获得完整的信息,但是根据我从您的示例中得到的信息,您可以将
请选择State=>None
添加到State\u数组中,然后让您计划使用的任何表单验证器都不接受“None”作为有效输入。

好,在深入研究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() );

我希望这对其他人有帮助。:)

这可能是解决办法。谢谢我也在检查Zend框架,因为这对我来说可能是一个更好的解决方案。
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' );