如何使用php将class ='active'添加到html菜单中

pat*_*tad 20 php

我想将我的html导航放在一个单独的php文件中,所以当我需要编辑它时,我只需要编辑一次.当我想将活动类添加到活动页面时,问题就开始了.

我有三页和一个普通文件.

common.php:

<?php 
$nav = <<<EOD
   <div id="nav">
        <ul>
           <li><a <? if($page == 'one'): ?> class="active"<? endif ?> href="index.php">Tab1</a>/</li>
           <li><a href="two.php">Tab2</a></li>
           <li><a href="three.php">Tab3</a></li>
       </ul>
    </div>
EOD;
?>
Run Code Online (Sandbox Code Playgroud)

index.php: 除了每页的$ page不同外,所有三个页面都是相同的.

  <?php
     $page = 'one';      
     require_once('common.php');
    ?>
    <html>
       <head></head>
       <body>
          <?php echo $nav; ?>
       </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

除非我将导航放在每个页面上,否则这根本不起作用,但是将导航与所有页面分开的整个目的都被破坏了.

我想要完成甚至可能吗?我究竟做错了什么?

谢谢

编辑:当这样做时,里面的PHP代码似乎没有运行,它只是被打印,好像它是html

Mih*_*der 26

你为什么不这样做:

在页面中:

<html>
   <head></head>
   <body>
      <?php $page = 'one'; include('navigation.php'); ?>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

在navigation.php中

<div id="nav">
   <ul>
      <li>
          <a <?php echo ($page == 'one') ? "class='active'" : ""; ?> 
                 href="index1.php">Tab1</a>/</li>
      <li>
          <a <?php echo ($page == 'two') ? "class='active'" : ""; ?> 
                  href="index2.php">Tab2</a>/</li>
      <li>
          <a <?php echo ($page == 'three') ? "class='active'" : ""; ?> 
                  href="index3.php">Tab3</a>/</li>
   </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

实际上,您可以控制导航页面中的位置以及传递给它的参数.

稍后编辑:修复语法错误.


小智 10

解决此问题的一个非常简单的方法就是执行此操作.

<ul>
  <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'index.php'){echo 'current'; }else { echo ''; } ?>"><a href="index.php">Home</a></li>
  <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'portfolio.php'){echo 'current'; }else { echo ''; } ?>"><a href="portfolio.php">Portfolio</a></li>
  <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'services.php'){echo 'current'; }else { echo ''; } ?>"><a href="services.php">Services</a></li>
  <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'contact.php'){echo 'current'; }else { echo ''; } ?>"><a href="contact.php">Contact</a></li>
  <li class="<?php if(basename($_SERVER['SCRIPT_NAME']) == 'links.php'){echo 'current'; }else { echo ''; } ?>"><a href="links.php">Links</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

哪个会输出

<ul>
  <li class="current"><a href="index.php">Home</a></li>
  <li class=""><a href="portfolio.php">Portfolio</a></li>
  <li class=""><a href="services.php">Services</a></li>
  <li class=""><a href="contact.php">Contact</a></li>
  <li class=""><a href="links.php">Links</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)


小智 7

你的index.php代码是正确的.我在下面包含了common.php的更新代码,然后我会解释这些差异.

<?php 
     $class = ($page == 'one') ? 'class="active"' : '';
     $nav = <<<EOD
        <div id="nav">
            <ul>
               <li><a $class href="index.php">Tab1</a>/</li>
               <li><a href="two.php">Tab2</a></li>
               <li><a href="three.php">Tab3</a></li>
           </ul>
        </div>
 EOD;
 ?>
Run Code Online (Sandbox Code Playgroud)

第一个问题是你需要确保你的heredoc的结束声明 - EOD;- 根本没有缩进.如果它是缩进的,那么你将得到错误.

至于你的问题是没有在heredoc语句中运行的PHP代码,那是因为你看错了.使用heredoc语句与关闭PHP标记不同.因此,您无需尝试重​​新打开它们.那对你没什么用.heredoc语法的工作方式是打开和关闭之间的所有内容都与写入完全一样,但变量除外.这些被替换为相关值.我从heredoc中删除了你的逻辑,并使用了一个三级函数来确定类,以便更容易看到(虽然我不相信任何逻辑语句都可以在heredoc中工作)

要理解heredoc语法,它与将它包含在双引号(")中相同,但不需要转义.所以你的代码也可以像这样编写:

<?php 
     $class = ($page == 'one') ? 'class="active"' : '';
     $nav = "<div id=\"nav\">
            <ul>
               <li><a $class href=\"index.php\">Tab1</a>/</li>
               <li><a href=\"two.php\">Tab2</a></li>
               <li><a href=\"three.php\">Tab3</a></li>
           </ul>
        </div>";
 ?>
Run Code Online (Sandbox Code Playgroud)

它会做同样的事情,只是写得有些不同.heredoc和字符串之间的另一个区别是你可以从中间的字符串中逃脱,你不能在heredoc中.使用此逻辑,您可以生成以下代码:

<?php 
     $nav = "<div id=\"nav\">
            <ul>
               <li><a ".(($page == 'one') ? 'class="active"' : '')." href=\"index.php\">Tab1</a>/</li>
               <li><a href=\"two.php\">Tab2</a></li>
               <li><a href=\"three.php\">Tab3</a></li>
           </ul>
        </div>";
 ?>
Run Code Online (Sandbox Code Playgroud)

然后,您可以将逻辑直接包含在字符串中,就像您最初预期的那样.

无论您选择哪种方法,脚本的性能都会产生很小的(如果有的话)差异.它主要归结为偏好.无论哪种方式,您都需要确保了解每种方法的工作原理.