2

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

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

statesArray()查询数据库以获取可用的状态并返回一个关联数组,其中 id 链接到状态名称。我在整个解决方案中使用了类似的技术。

我想做的是在这个数组前面加上两个被禁用的选项,所以默认情况下,选择菜单会说“请选择一个状态”后跟一个破折号,这两个选项都被禁用。如果我不使用 QuickForm,则选择将具有以下作为前两个选项:

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

这两个选项都被禁用,如果用户将选项留在第一个值上,则选择小部件会提交一个空值,该值被表单检查代码设为无效。

有没有办法用 QuickForm 做到这一点?

谢谢,查克

4

2 回答 2

11

好的,在深入研究 QuickForm 文档之后,我发现了这一点。解决方案是不使用数组填充选择小部件,而是手动构建选择元素将其添加到表单中。

最初,我有这个:

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,但浏览器通常不会默认使用这个值,而是option使用select组中的第一个。

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

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

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

显然,我需要阅读 QuickForm 文档以了解完整情况,但根据我从您的示例中可以得到的信息,您可以添加Please Choose State => None到 state_array,然后让您计划使用的任何表单验证器不接受“无”作为有效输入。

于 2010-01-26T08:11:56.050 回答