我正在构建我的第一个PHP网站之一,只是玩弄它。我将使用 PHP 包含,所以我只需要更改一次我的元内容。目前,我拥有从文档类型到</head>
末尾的所有内容。
一个朋友说我不应该在标题.php中包含</head>
,而是将其包含在每个页面上,这样我就可以添加特定于页面的内容。这是个好方法吗?
目前,对于标题之类的东西,我正在做
<title><?php echo $page_title; ?>
然后在每一页的顶部,我正在做
<?php $page_title = 'Blah'; ?>
如果这是我这样做的方式,我将如何添加特定于页面的 Javascript 文件?
这里发生的事情是你试图将逻辑注入到你的模板中,这不一定是错误的,但它会产生更混乱和更难维护的代码。此问题不仅与您的<title>
标签有关,而且随着您的页面变得越来越动态和复杂(动态导航、特定于页面的布局等),这个问题会不断出现。
MVC 方法完美地解决了这个问题。MVC 由模型组成,这些模型与您的数据源(MySQL、Redis 等)通信并处理您的逻辑;视图,呈现 HTML;和控制器,它们是模型和视图之间的粘合剂。用户发出的每个请求最终都会路由到控制器,然后路由到控制器中的操作方法(例如:/users/login
可能映射到User
控制器和login
操作)。
您将在控制器的操作方法中设置页面标题(或任何其他元信息),该方法知道请求是什么,但在呈现视图之前被调用:
$request->setTitle('Home page');
然后在您的视图中,只需将其呈现:
<title><?php echo $request->getTitle(); ?></title>
如果你刚刚开始PHP,现在是学习MVC的好时机,因为它会让你养成一些好习惯,不仅影响你的PHP开发,还影响任何其他开发。
我建议您查看CodeIgniter,因为它的简单性和出色的文档。我使用CodeIgniter有一段时间,但最终编写了更适合我需求的框架。
我认为你应该先做一些逻辑,然后渲染它。像这样:
<?php
$page = array(
'title' => 'Title',
'js' => array(
'jquery.min.js',
),
'copyright' => 'Copyright 2012',
);
if ( $needed ) {
$page[ 'js' ][] = 'some-other.js';
}
include( 'header.php' );
include( 'content.php' );
include( 'footer.php' );
// header.php
<html>
<head>
<title><?= $page[ 'title' ]; ?></title>
<? foreach ( $page[ 'js' ] as $js ) { ?>
<script src="<?= $js"></script>
<? } ?>
</head>
,你是如何建立你的页面的。但是在一个简单的站点上,您可以使用如下的关联数组:
$pages = array(
'home' => array(
'title' => 'Home',
'metaDescription' => 'This is the home of my website',
'metaKeywords' => 'A,B,C',
'scripts' => '<script src="src/js/com.jquery/1.7/jquery-1.7.min.js"></script>',
'content' => 'home.phtml'
),
'page_1' => …
);
然后你可以这样回忆它:
<head>
[…]
<title><?php print $pages['home']['title']; ?></title>
[…]
<?php print $pages['home']['scripts']; ?>
[…]
</head>
<body>
<?php require '/pathToIncludes/' . $pages['home']['content]; ?>
</body>
但我只推荐给只有一堆页面的网站。
这是我解决这个问题的方法:
-
start.php
连接到我的数据库,包括我的类,设置我所有的默认值进入$page
对象并开始$_SESSION
-
header.php
根据$page
中的值吐出我所有的 html 顶部内容(文档类型、<head>
等) -
top.php
包括start.php
和header.php
对于大多数文件,默认值都很好。我只包括top.php
.对于我需要特殊值的特殊情况,我的页面如下所示:
<?php
include("start.php");
$page->title = "My special title";
include("header.php");
// The rest of my content
?>
这还有一个额外的优势,即页面可以访问 $_SESSION 和其他自定义类,并使用该信息修改标头,而不会收到"标头已发送"错误。例如,您可以验证某些用户输入并使用location('header: foo.php');
重定向它们,或者根据其登录状态更改标题。
对于特定于页面的javascript包含,我会创建一个URL数组来包含$page->javascript
然后放入以下内容:$page->javascript[] = "http://example.com/js/myScript.js";
start.php
和header.php