我正在构建我的第一个PHP网站之一,并且正在玩它。我将使用PHP包含,所以我只需要改变我的元素一次。目前,我拥有从doctype到</head>
。
一位朋友说我不应该在header.php上包含</head>
,而是将其包含在每个页面上,这样我就可以添加特定于页面的内容。这是一个很好的方式吗?
目前,对于像title这样的东西,我正在做
<title><?php echo $page_title; ?>
然后在每页的顶部,我正在做
<?php $page_title = 'Blah'; ?>
如果我这样做,我将如何添加特定于页面的Javascript文件?
答案 0 :(得分:6)
这里发生的是你试图在你的模板中注入逻辑,这不一定是错误的,但它会产生更多令人困惑和难以维护的代码。此问题不仅适用于您的<title>
标记,而且会随着您的网页变得越来越动态和复杂(动态导航,特定于页面的布局等)而不断出现。
MVC方法完美地解决了这个问题。 MVC由模型组成,它们与您的数据源(MySQL,Redis,无论如何)交谈并处理您的逻辑;视图,呈现HTML;和控制器,它们是模型和视图之间的粘合剂。用户做出的每个请求最终都会路由到控制器,然后控制器中的操作方法(例如:/users/login
可能映射到User
控制器和login
操作)。
您可以在控制器的action方法中设置页面标题(或任何其他元信息),该方法知道请求是什么,但在呈现视图之前调用:
$request->setTitle('Home page');
然后在您看来,只需渲染它:
<title><?php echo $request->getTitle(); ?></title>
如果您刚刚开始使用PHP,那么现在是学习MVC的好时机,因为它会让您养成一些不仅影响您的PHP开发而且影响任何其他开发的良好习惯。
我建议您查看CodeIgniter的简单性和出色的文档。我使用了CodeIgniter一段时间,但最终writing my own framework更符合我的需求。
答案 1 :(得分:2)
我不知道你是如何建立自己的网页的。但是在一个简单的站点上,你可以使用这样的关联数组:
$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>
但我只推荐这个只有一堆页面的网站。
答案 2 :(得分:2)
我认为你应该首先做一些逻辑,然后渲染它。像这样:
<?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>
答案 3 :(得分:1)
以下是我如何解决这个问题:
start.php
连接到我的数据库,包括我的类,设置我所有的默认元值
进入$page
对象并启动$_SESSION
header.php
根据<head>
$page
等)
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包含,我会创建一个包含$page->javascript
的网址数组,然后在$page->javascript[] = "http://example.com/js/myScript.js";
和start.php
之间添加header.php
之类的内容