Как я могу использовать QuickForm для добавления отключенных опций выбора? - PullRequest
2 голосов
/ 26 января 2010

У меня есть код, использующий QuickForm, который создает виджет со следующим:

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

statesArray() запрашивает базу данных, чтобы получить доступные состояния, и возвращает ассоциативный массив с идентификаторами, связанными с именами состояний. Я использую похожую технику во всем решении.

Я хотел бы добавить в этот массив две отключенные опции, чтобы по умолчанию в меню выбора было что-то вроде «Пожалуйста, выберите состояние», за которым следовала бы тире, обе из которых отключены. Если бы я не использовал QuickForm, у выбора было бы следующее как первые два варианта:

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

Обе опции отключены, и если пользователь оставляет опцию для первого значения, виджет выбора отправляет пустое значение, которое становится недействительным из-за кода проверки формы.

Есть ли способ сделать это с помощью QuickForm?

Спасибо, Чак

Ответы [ 2 ]

11 голосов
/ 28 января 2010

ОК, после более глубокого изучения документации 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' );

Надеюсь, это поможет кому-то еще.:)

0 голосов
/ 26 января 2010

Технически, лучшим решением было бы использование optgroup, но браузеры обычно не используют это значение по умолчанию, а вместо первого option в группе select.

Почему бы вашим 1006 * не иметь значение "Нет" (аналогично вашему заданию старой школы) и оставить его включенным, а затем вернуть виджет как недействительную форму, если они оставят ее пустой? Это выходит за рамки QuickForm?

Я думаю, что большинство пользователей не замечают, что-то включено или отключено, и единственное преимущество отключения - сделать его недоступным для выбора.

Ваша цель направлена ​​на проверку ввода? Если так, то почему бы просто не добавить некоторый javascript между формой и QuickForm, чтобы проверить, выбрал ли пользователь отключенный (или value = "Null") элемент перед его отправкой?

Очевидно, что мне нужно прочитать документацию QuickForm, чтобы получить полную картину, но, основываясь на том, что я могу получить из вашего примера, вы можете просто добавить Please Choose State => None в state_array, а затем иметь любой валидатор форм, который вы планируете использовать, не принимать «Нет» в качестве допустимого значения.

...