我想将我的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)
然后,您可以将逻辑直接包含在字符串中,就像您最初预期的那样.
无论您选择哪种方法,脚本的性能都会产生很小的(如果有的话)差异.它主要归结为偏好.无论哪种方式,您都需要确保了解每种方法的工作原理.