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 に答える