【问题标题】:How to get page <title> from content include into front controller如何从内容中获取页面 <title> 包含到前端控制器中
【发布时间】:2015-02-10 19:07:33
【问题描述】:

我正在使用基于 PHP 的前端控制器模式,以便 index.php 提供页面结构和模板,并且每个页面的所有内容都包含在 /pages/ 中的包含文件中。

index.php 
/pages/home.inc
/pages/about.inc
/pages/contact.inc

包含页面大多是简单的 HTML,因此客户端可以编辑页面而无需进行任何过于复杂的操作。

此布局的问题在于,由于所有页面信息都在页面包含中,因此无法填充 &lt;title&gt; 元素。我可以在每个包含中放置一个$title 变量,但它在头部之后加载,这为时已晚:

<html>
  <head>
    <title><?php echo $title; ?></title>     #$title is not set yet!
  </head>
  <body>
    <?php include($content); ?>              #now $title is set
  </body>
</html>

重要的是内容文件是自包含的并且主要是 HTML,但也具有 PHP 代码的能力,正如我所提到的,因为客户将修改这些文件并增加太多的复杂性是一个问题。因此,例如,设置单独的页面标题数据库是行不通的,因为客户在创建新页面时不会更新数据库。

编辑:典型的页面包含可能如下所示。

<h1>Welcome</h1>
<p>blah</p>
<?php include("nav.php"); ?>
<p>more blah</p>
<p>more blah</p>
<p>more blah</p>
<?php
  $pageJavascript = "alert('js!');";
  $pageTitle = "Cyberdyne Welcome Page";
?>

【问题讨论】:

  • .inc 文件都是文本吗?还是他们也使用变量?
  • 它们是 HTML 和 PHP。通常 PHP 只是包含导航菜单等,但可能是一个小的独立 PHP 脚本。他们还执行&lt;?php $pageJavascript = "function runAfterOtherJS(){demo}"; ?&gt; 之类的操作,在页面底部包含echo'd,所有其他JS 都包括在内。
  • 我假设你包含它的那一刻,它会直接做一些输出,内容相关。对吗?
  • 是的,例如&lt;h1&gt;Welcome&lt;/h1&gt;&lt;?php include('nav.php'); ?&gt;

标签: php front-controller


【解决方案1】:

选项:

1:使用输出缓冲

<?php
ob_start();
include($content);
$body = ob_get_contents();
ob_end_clean();
?>
<html>
 <head>
  <title><?php echo $title; ?></title>
 </head>
 <body>
 <?php echo $body; ?>
 </body>
</html>

优点

  • 浏览器获得完全呈现的页面
  • 对 SEO 更友好(比 javascript 标题更新)
  • 无需 JS

缺点

  • 需要缓冲内存中的所有页面

2:设置某种通用标题,稍后用 javascript 更新。

<script type="text/javascript">
with(document) {
  window.title = <?php echo json_encode($title); ?>;
}
</script>

优点

  • 您保持与现在相同的流量。

缺点

  • 对 SEO 不友好
  • 需要使用 javascript

【讨论】:

    【解决方案2】:

    如果假设标题总是在第一行: “我的页面标题”;

    $filename = '/pages/home.inc';
    $fileLines = file($filename, FILE_SKIP_EMPTY_LINES);
    $title = yourFunctionThatStripsKomma($fileLines[0]);
    

    唯一不好的是,你必须确保第一行有标题。

    【讨论】:

    • 谢谢。刚刚找到this,它显示了其他一些仅获取第一行的方法。这是一个不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2021-08-08
    • 1970-01-01
    • 2012-01-13
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多