4

我正在构建我的第一个 PHP 网站,并且只是在玩弄它。我将使用 PHP 包含,所以我只需要更改我的元数据一次。目前,我拥有从 doctype 到</head>.

一位朋友说我不应该</head>在 header.php 中包含 ,而是在每个页面上都包含它,这样我就可以添加页面特定的内容。这是一个好方法吗?

目前,对于标题之类的东西,我正在做

<title><?php echo $page_title; ?>

然后在每一页的顶部,我在做

<?php $page_title = 'Blah'; ?> 

如果这是我这样做的方式,我将如何添加页面特定的 Javascript 文件?

4

4 回答 4

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,但最终编写了自己的框架来更好地满足我的需求。

于 2012-07-04T20:20:55.347 回答
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>
于 2012-07-04T20:30:24.743 回答
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>

但我只会将这个推荐给只有一堆页面的网站。

于 2012-07-04T19:57:58.060 回答
1

这是我解决这个问题的方法:

  • start.php连接到我的数据库,包括我的类,将我所有的默认元值设置为一个$page对象并启动$_SESSION
  • header.php<head>根据_$page
  • 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

于 2012-07-04T20:09:01.827 回答