在 PHP 中包含标头时,您如何添加内容


When including your header, in PHP, how do you add things?

我正在构建我的第一个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.phpheader.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.phpheader.php