在提交HTML表单中的下拉列表后,是否有更优雅的方法来记住用户输入?

时间:2013-06-25 22:46:17

标签: php html forms optimization option

我有一个数字字段和一个下拉列表,我将其用作表单的一部分,如下所示:

<label for="height">Height/Thickness</label>:
<input <?php if (empty($messages) == false) {echo 'value="'.htmlentities($_POST['height'], ENT_QUOTES).'"';} ?> type="number" name="height" id="height" />
                <select class="dimensions" name="heightunit">
                    <option value="">Select...</option>
                    <option value="mm">mm</option>
                    <option value="cm">cm</option>
                    <option value="m">m</option>
                    <option value="in">in</option>
                </select>

$messages变量是一个数组,用于存储表单生成的任何错误消息。 <?php&amp;之间的位?>标签用于确保如果出现错误,它将回显用户在提交之前输入的值,从而节省他们再次输入数据的时间(和挫败感)。

我想对下拉列表做同样的事情。目前,我在每个选项标签中添加以下行(类似于this answer):

<?php if ((empty($messages) == false) && ($_POST['lengthunit'] == 'mm') {echo 'selected="selected"';} ?>

然而它真的不整洁:

....
<select class="dimensions" name="lengthunit">
    <option value="" <?php if ((empty($messages) == false) && ($_POST['lengthunit'] == '') {echo 'selected="selected"';} ?>>Select...</option>
    <option value="mm" <?php if ((empty($messages) == false) && ($_POST['lengthunit'] == 'mm') {echo 'selected="selected"';} ?>>mm</option>
    <option value="cm" <?php if ((empty($messages) == false) && ($_POST['lengthunit'] == 'cm') {echo 'selected="selected"';} ?>>cm</option>
    <option value="m" <?php if ((empty($messages) == false) && ($_POST['lengthunit'] == 'm') {echo 'selected="selected"';} ?>>m</option>
    <option value="in" <?php if ((empty($messages) == false) && ($_POST['lengthunit'] == 'in') {echo 'selected="selected"';} ?>>in</option>
</select>

我的问题是 - 有没有更优雅的方法来做到这一点,而不在每个选项标签中添加php标签?

(我的想法是: if (OPTION_VALUE === $_POST['heightunit']) {echo 'selected="selected"';}。有没有什么可以替代OPTION_VALUE?)

编辑:我想这样做的原因是因为我想将其应用于200多个国家/地区列表,我只想写“好代码”。

**编辑:现在回想一下,它看起来很容易......无论如何,谢谢你的帮助,这就是我最终的目的:

function lengthlist($selectname) {
    $distanceunits = array('','mm','cm','m','in');
    foreach ($distanceunits as $value) {
    if ($value == '') {$value = '...';}
        if ($value == $_POST["$selectname"]) {
            echo "<option value=\"$value\" selected=\"selected\">$value</option>";
        } else {
            echo "<option value=\"$value\">$value</option>";
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果你想要更优雅的方式 - 以相反的方式做 - 将php移到选项标签之外。

您可以使用php中的标记生成整个列表,例如:

<?
/*some loop*/
    echo "<option value='a' {$selected} >aaa</option>"; 
/*end of the loop*/
?>

其中$selected先前已设置为“已选中”或仅为空字符串。并在适当时使用数组。

答案 1 :(得分:1)

或者您也可以在数组中加载尺寸值,然后在while循环中写入它们

 <select class="dimensions" name="lengthunit">
<option>Select...</option>
<?php 
 $i=0;
 $array=array("mm", "cm", "m", "in");
while ($i<4){ ?>
<option value="<?php echo $array[$i];?>"<?php if ((empty($messages) == false) && 
($_POST['lengthunit'] == $array[$i])) {echo 'selected="selected"';} ?>><?php echo 
$array[$i];?></option>
<?php $i++; } ?>

</select>

因为在其他情况下,您可能希望为用户添加更多选项,因此您只需将它们添加到数组中即可。您也可以使用foreach循环而不是一会儿