1

我正在尝试将我的 PHP 和 HTML 分开。我将一组 PHP 变量传递给我的 HTML 代码。我正在创建一个选择下拉列表并尝试根据我的变量选择一个特定选项。像这样:

//example vars from PHP array (uses magic getter and accessed by $this->varName)
//$array = array('aaa' => '123', 'bbb' => '456', 'ccc' => '789');
//$selected = 'bbb';

<select name="name" id="id">
<option value="0">Choose n Option</option>
<?
foreach($this->array as $key => $value)
{
    ?>
    //$selected may not be set
    <option value="<?=$key?>" <? echo isset($this->selected) ? (strcmp($key,$this->selected)==0 ? 'selected' : '') : '' ?> ><?=$value?></option>
    <?
}
?>
</select>

结果是:

<select name="name" id="id">
    <option value="0">Choose an Option</option>
    <option value="aaa"  >123</option>
    <option value="bbb" selected >456</option> //'selected' determined by code above
    <option value="ccc"  >789</option>
</select>

有没有更好的方式写应该选择哪个选项?使用 PHP 还是更改我的逻辑?<? echo isset($this->selected) ? (strcmp($key,$this->selected)==0 ? 'selected' : '') : '' ?>似乎不太可读。我想知道在 HTML/view 代码需要使用嵌套循环和 if 的情况下是否有更好的方法来编写代码,尤其是在这种情况下的 HTML 标记内。

我想把结果<? echo isset($this->selected) ? (strcmp($key,$this->selected)==0 ? 'selected' : '') : '' ?>放入一个变量中,然后我就可以了

$newSelectVar = <? echo isset($this->selected) ? (strcmp($key,$this->selected)==0 ? 'selected' : '') : '' ?>;
<option value="<?=$key?>" <?=$newSelectVar?> ><?=$value?></option>

我不想这样做,因为我试图只使用内联 PHP(我读到这使得 HTML 更具可读性和可维护性),但我想我已经用foreach.

4

2 回答 2

1

大多数人会开始对您使用模板系统大喊大叫……但是由于 PHP是模板系统,因此这是多余的。与其跳出 PHP 模式来输出几个字符的文本,不如试试类似的方法:

foreach($this->array as $key => $value)
   $sel = isset($this->selected) ? (strcmp($key,$this->selected)==0 ? 'selected' : '') : '';
   echo <<<EOL
<option value="{$key}" {$sel}>{$value}></option>
EOL;
}
于 2013-04-03T15:22:19.767 回答
1

您永远不应该绑定您的业务逻辑和表示层(在这种情况下为HTML 模板)。你现在所做的一切都已经破坏了SoC

好吧,为了让这个东西更易于维护,你需要HTML Helper class之类的东西。这避免了演示中的任何类型的逻辑。

class HTMLHelper
{
   public static function isSelected($actual, $expected)
   {
       if ($actual === $expected){
           print 'selected="selected"';
       }
   }

   public static function isChecked()
   {
      // The same goes for checkbox, but you want
      // checked="checked" instead of selected="selected" here
   }
}

注意:您应该对专用于它们的模板使用完整的替代品,而不是<?php { ... ?>

然后在您的演示文稿中

<select>

<?php foreach($this->array as $key => $value) : ?>

    <option value="<?php echo $key;?>" <?php HTMLHelper::isSelected($this->selected, $key);?> ><?php echo $value; ?></option>

<?php endforeach; ?>

</select>


您获得的主要好处是:

1) 模块化。同样HTMLHelper::isSelected也可以用于其他模板。

2)关注点分离

3) 代码变得易于维护

于 2013-04-03T15:55:48.760 回答