【问题标题】:highlight navigation PHP高亮导航 PHP
【发布时间】:2011-02-17 19:29:29
【问题描述】:

不久前我推出了一个网站,并成功使用 Javascript + CSS 在导航中突出显示当前页面。但是,它在 Safari 中不起作用,并且在使用 Javascript 时无法很好地验证,所以我决定让 PHP 将 CSS id 分配给 HTML 元素。到目前为止,它工作正常,与在 PHP 中尝试每个链接显示两个的其他时间相比。我的问题是所有链接看起来都很正常并且没有应用 CSS 属性。我感觉这与我的 PHP 代码有关,但我不确定。

网站地址是here

至于PHP代码,这里是:

<?php
echo('<li><span class="bold">Main</span>');
echo('<ul>');
if ($page=="home")
{
echo('<li><a id="current" href="index.shtml">Home</a></li>');
}
else
{
echo('<li><a href="index.shtml">Home</a></li>');
}
if ($page=="faq")
{
echo('<li><a id="current" href="faq.shtml">FAQ</a></li>');
}
else
{
echo('<li><a href="faq.shtml">FAQ</a></li>');
}
if ($page=="about")
{
echo('<li><a id="current" href="about.shtml">About Bryce</a></li>');
}
else
{
echo('<li><a href="about.shtml">About Bryce</a></li>');
}
echo('<li><a href="contact.php">Contact Bryce</a></li>');
if ($page=="sign guestbook")
{
echo('<li><a id="current" href="sign.shtml">Sign Guestbook</a></li>');
}
else
{
echo('<li><a href="sign.shtml">Sign Guestbook</a></li>');
}
if ($page=="view guestbook")
{
echo('<li><a id="current" href="view.shtml">View Guestbook</a></li>');
}
else
{
echo('<li><a href="view.shtml">View Guestbook</a></li>');
}
echo('</ul>');
echo('</li>');
echo('<li><span class="bold">Info</span>');
echo('<ul>');
if ($page=="projects")
{
echo('<li><a id="current" href="projects.shtml">Projects</a></li>');
}
else
{
echo('<li><a href="projects.shtml">Projects</a></li>');
}
if ($page=="books")
{
echo('<li><a id="current" href="books.shtml">Books</a></li>');
}
else
{
echo('<li><a href="books.shtml">Books</a></li>');
}
echo('</ul>');
echo('</li>');
echo('<li><span class="bold">Misc.</span>');
echo('<ul>');
if ($page=="cover designs")
{
echo('<li><a id="current" href="coverdesigns.shtml">Cover Designs</a></li>');
}
else
{
echo('<li><a href="coverdesigns.shtml">Cover Designs</a></li>');
}
echo('<li><a target="_blank" href="http://www.lulu.com/brycecampbellsbooks">Lulu Store</a></li>');
echo('<li><a href="rss/">RSS</a></li>');
echo('</ul>');
echo('</li>');

?>

为了让大家了解高亮效果应该是什么样子,下面是应该应用于当前页面的 CSS:

#current {
   font-style: italic;
   text-decoration: none;
   color: #000000;
  }

当查找我做错了什么时,它告诉我我正在正确实施它,但似乎 PHP 没有获取值。

【问题讨论】:

  • 你能告诉我们 $page 是如何设置的吗?
  • 哎哟。我建议您转而使用 php 模板系统,以确保将显示与表示逻辑分开。
  • @Tchalvak PHP 一个模板系统。这只是意大利面的混乱。
  • 我正在使用 SSI 来处理最有可能发生变化的内容。我宁愿将 PHP 用于诸如导入 RSS 和重定向以及留言簿之类的事情。真正的基于 PHP 的布局可以提供很大帮助,考虑到代码量,它只需要更长的时间。这样做会花费更少的时间,即使它更难。
  • @Timothy PHP 确实是一个模板系统,一旦程序员熟悉了将内容与表示分离所涉及的内容,就可以自己实现这种分离,而无需中间的模板系统。但在 php 程序员清楚了解良好内容分离的好处和过程之前,我建议使用单独的第三方模板系统来掌握最佳实践。

标签: php highlighting


【解决方案1】:

试试:

echo $page;

看看你得到了什么。你能发布分配$page的代码吗?

【讨论】:

  • 它应该在源代码中,可以从给出 URL 的页面访问,因为它放在 HTML 文件中的所有内容之前。不过,我正在考虑尝试这样做。
  • 好吧,它没有显示任何东西。
  • 虽然它在 URL 中可见,但导航中的每个页面在最顶部都有这个 " ?>
  • php文件是否以.php结尾?看起来 php 没有解析你的文件,所以里面的 php 代码不起作用。
  • 将数据分配给 $page 变量的 PHP 在 HTML 文件中,因为页面之间没有通用名称,而用于突出显示的 PHP 在其自己的文件中。在与 HTML 分开的文件中使用 PHP_SELF 也可能没有任何帮助。
【解决方案2】:

我在您的 php 代码中没有发现任何问题。更好的是你能改变你的CSS如下...

。当前的 { 字体样式:斜体; 文字装饰:无; 颜色:#000000; }

【讨论】:

  • 否; Kira 通过id 属性定位元素,而不是classid 属性的定位是使用八角来完成的,而class 的定位是使用句点来完成的。
  • 我是在调用一个 id,而不是一个类。
【解决方案3】:

看在上帝的份上,不要使用该代码!!!!这样做!

<li><a href=""<?php if($page=='about'): ?> id="current"<?php endif; ?>>about</a></li>
<li><a href=""<?php if($page=='otherpage'): ?> id="current"<?php endif; ?>>other page</a></li>

你给了 php 仇恨者更多的弹药!

【讨论】:

  • 按照我的方式阅读要简单得多,但我可以在一定程度上看出其中发生了什么,因为我以前在 C 编程课上见过它。
  • 我试过你的方法,还是不行。导航在每个链接之前显示“id=current”。也许会有不同的变化,否则我的方法非常接近。
  • 它确实有效。您的 $page 变量可能是错误的。更新您的问题并告诉我们您是如何获得 $page 变量的。
  • 我也用短标签来表示视图,代码更简洁。当然,您需要确保它们已启用。
【解决方案4】:

在使用 php 编程多年,并通过长时间的反复试验了解了哪些事情不该做之后,这里有一些总体建议,可以让您的调试和生活更轻松,基于该代码:

  • 在你的 php 和你的 html 之间做一个非常清晰的区分。换句话说,将您的应用程序的 html 放在模板中。这些模板至少可以是您包含的 php 文件,这些文件具有最少的实际所需 php。除了最低限度之外,如果您使用第三方模板系统,它可能会更容易。我推荐聪明的。完全有可能通过良好的纪律将所有内容很好地分开,但一开始使用良好的模板系统将事情分开更容易

  • 一般来说,在 php 中,当我们从 $_REQUEST 提取输入以及从数据存储/数据库中提取数据并对它们进行操作时,我们通常可以知道页面应该是什么样子。因此,一旦我们完全按照我们想要的方式获得了所有数据,我们应该能够拥有一个涉及操作输入数据的整个部分,然后只需将所有内容传递给一个模板,其中包含一些最小的显示逻辑来显示最终页面的外观.例如。而不是

    if($page == 'about'){ echo "&lt;a href='about.php'&gt;About&lt;/a&gt;"; }

    确定 html 之外的数据类型,并且只有 然后 传递该确定,例如

    $possible_links = array('about'=>array('href'='about.php', 'text'=>'About'), 'other'=>array('href'=>'other.php', 'text'='other pages')); $current_link = $possible_links[$current]; ... ... in separate script, optimally: ... echo "<a href='".$current_link['href'].">".$current_link['text']."";

`

  • 在您自己的代码中,尝试使用 MVC 模式查看框架,以获得非常强大的分离技术。显然,如果您正在处理其他人的遗留代码,这并不容易,所以在这种情况下,请尽量将事情分开(尤其是 php 中的 html)。

【讨论】:

    【解决方案5】:

    这可能是做你想做的更简单的方法:

    <?php
    // heredoc syntax ftw!
    $menu = <<<MENU
    <ul id="nav">
     <li><a href="/">Home</a></li>
     <li><a href="/foo">Foo</a></li>
     <li><a href="/bar">Bar</a></li>
     <li><a href="/baz">Baz</a></li>
     <li><a href="/inga">Inga</a></li>
    </ul>
    MENU;
    $lines = split("\n", $menu);
    foreach ($lines as $line) {
     $current = false;
     preg_match('/href="([^"]+)"/', $line, $url);
     if (substr($_SERVER['REQUEST_URI'], 0, 5) === substr($url[1], 0, 5)) {
      $line = str_replace('<li><a h', '<li class="current"><a h', $line);
     }
     echo $line."\n";
    }
    ?>
    

    只需编辑顶部的$menu,脚本将处理其余部分。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2016-05-26
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多