如何从内容包含页面<title>到前端控制器</title>

时间:2015-02-10 19:07:33

标签: php front-controller

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

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

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

此布局的问题在于,由于所有页面信息都在页面包含中,因此无法填充<title>元素。我可以在每个包含中添加一个$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";
?>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果假设标题始终位于第一行: &#34;我的页面标题&#34 ;;

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

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