使用继承变量生成HTML - 更简洁的方法?

时间:2012-07-19 15:18:16

标签: php

我的网站的导航位于页面顶部,包含在我的所有页面中。看起来像:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>My Title</title>
</head>
<body>

<? 
 $selected = 'home';
 include('include/header.php'); 
?>

header.php文件基本上显示了每个页面上标准的顶部导航。上面是header.php文件继承的变量,用于“告诉”用户所在的头文件,以便可以选择相应的导航选项卡。

我的header.php文件类似于:

<div id="main_navigation">
      <ul id="nav">
        <li><a href="#">HOME</a></li>
        <li><a href="#">ABOUT US</a></li>
        <li><a href="#">PURCHASE</a></li>
        <li><a href="#">SOMETHING ELSE</a></li>
      </ul>
</div>

我想要做的是将HTML添加到<li>标记以显示将突出显示导航标签的css类。除了投掷这个丑陋的snippit之外,还有更有说服力的方法吗?

<div id="main_navigation">
      <ul id="nav">
        <li <? if($selected == 'home'){ print "class = \"select"\"; ?> ><a href="#">HOME</a></li>
        <li <? if($selected == 'about'){ print "class = \"select"\"; ?> ><a href="#">ABOUT US</a></li>
        <li <? if($selected == 'purchase'){ print "class = \"select"\"; ?> ><a href="#">PURCHASE</a></li>
        <li <? if($selected == 'something'){ print "class = \"select"\"; ?> ><a href="#">SOMETHING ELSE</a></li>
      </ul>
</div>

2 个答案:

答案 0 :(得分:1)

这似乎是相当标准的,但你可以使用三元运算符更加简洁地做到这一点:

<li class="<?php echo ($selected == 'home') ? 'select' : ''; ?>">

但我认为这主要是风格问题。更好的方法是在html之外处理这些位。然后将4个变量传递给header.php,然后像这样编写列表:

<li class="<?php echo $home_class; ?>"> . . .
<li class="<?php echo $about_class; ?>"> . . .

通过这种方式,你可以保留所有逻辑。在这种情况下,最大的收获可能是您可以将逻辑转换为类似于以下的函数:

function get_menu_item_class($menu_item) {
  if (/* whatever logic to determine if it's selected based on passed parameter */) {
    return 'select';
  }

  return '';
}

然后你可以很容易地填充变量:

$home_class = get_menu_item_class('home');
$about_class = get_menu_item_class('about');

或者可能完全放弃变量并直接调用函数:

<li class="<?php echo get_menu_item_class('home'); ?>"> ...

答案 1 :(得分:0)

使用循环和数组:

$nav = array( '#' => 'HOME');

echo '<ul id="nav">';
foreach( $nav as $href => $text) {
    $class = ($selected == 'home') ? ' class="select"' : '';
    echo '<li' . $class . '><a href="' . $href . '">' . $text . '</a></li>';
}
echo '</ul>';

如果所有href值确实都是#,那么您可以在数组的定义中省略它们:

$nav = array( 'HOME', 'ABOUT US');

然后,省略将其包含在循环中:

    echo '<li' . $class . '><a href="#">' . $text . '</a></li>';