我一直在学习PHP的语法并练习它。我来自.NET背景,所以当页眉和页脚出现时,masterpages总是让我很容易。
到目前为止,我有一个mainHeader.php和mainFooter.php,它有我的头部菜单和我的页脚html。我创建了一个mainBody.php,在顶部我放了
<?php include "mainHeader.php" ?>
和我放的页脚
<?php include "mainFooter.php" ?>
这完美地工作,让我微笑,因为我的网页很好地融合在一起。 mainHeader有<html>
和<body>
,我的mainFooter有我的结束标记。
这是好习惯吗?
答案 0 :(得分:49)
我从控制器中包含了我的观点。我还定义了文件位置,以便于维护。
<强>的config.php 强>
define('DIR_BASE', dirname( dirname( __FILE__ ) ) . '/');
define('DIR_SYSTEM', DIR_BASE . 'system/');
define('DIR_VIEWS', DIR_SYSTEM . 'views/');
define('DIR_CTLS', DIR_SYSTEM . 'ctls/');
define('DIR_MDLS', DIR_SYSTEM . 'mdls/');
define('VIEW_HEADER', DIR_VIEWS . 'header.php');
define('VIEW_NAVIGATION', DIR_VIEWS . 'navigation.php');
define('VIEW_FOOTER', DIR_VIEWS . 'footer.php');
现在我只需要包含config.php
即可获得所有信息。
<强> Controller.php这样强>
require( '../config.php' );
include( DIR_MDLS . 'model.php' );
$model = new model();
if ( $model->getStuff() ) {
$page_to_load = DIR_VIEWS . 'page.php';
}
else {
$page_to_load = DIR_VIEWS . 'otherpage.php';
}
include( VIEW_HEADER );
include( VIEW_NAVIGATION );
include( DIR_VIEWS . $page_to_load );
include( VIEW_FOOTER );
答案 1 :(得分:5)
你也可以反过来做。有一个带页眉/页脚的主页,只包含正文。
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<?php include $page ?>
</body>
</html>
答案 2 :(得分:3)
现在的好习惯是使用模板引擎,例如smarty。对于整个应用程序,请考虑使用framework,例如codeigniter。
答案 3 :(得分:3)
在您开始使用“视图”或“模板”之前,您所做的是正常的,在这种情况下,您不再将内容HTML安排在“控制器”或“操作”中运行。
相反,您将加载一个视图并使用值填充它,这会将所有HTML源排序保留到视图而不是PHP文件。
$view = new View('layout.php');
$view->header = $header;
$view->content = 'This is the main content!';
$view->footer = $footer;
print $view;
然后加载看起来像这样的布局文件:
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<div id="header"><?php print $header; ?></div>
<div id="content"><?php print $content; ?></div>
<div id="footer"><?php print $footer; ?></div>
</body>
</html>
答案 4 :(得分:3)
总结以上所有内容 这是使用的好方法,但不要忘记使用页面内容的模板页面。
部分基于Galen和Balus':
page.php
require $_SERVER['DOCUMENT_ROOT'].'/../config.php';
$data = get_data(); // assume we get all required data here.
$pagetitle = "This is a sample page";
$template = "page.tpl.php";
include "main.tpl.php";
main.tpl.php
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $pagetitle?></title>
</head>
<body>
<?php include $template ?>
</body>
</html>
page.tpl.php
这样的事情:
<h1><?php echo $pagetitle?></h1>
<?php if (!$data): ?>
No news yet :-(
<?php else: ?>
<ul>
<? foreach ($data as $row): ?>
<li><a href="news.php?id=<?php echo $row['name']?>"><?php echo $row['name']?></a></li>
<?php endforeach ?>
</ul>
<?php endif ?>
答案 5 :(得分:0)
这是一个非常好的方法,只要您的网站不超过20页阈值。然而,我建议在函数样式中使用include(),而不是构造,并将这些模板放在单独的子文件夹中。如果其中没有PHP代码,也可以使用.htm文件扩展名(htm指定部分html)。
include("template/main/header.htm"); // would still parse PHP code!
这种方法的缺点是,你最终会通过全局变量将HTML注入其中。 $HEAD='<link...>'; include("../header.htm")
。这本身并不坏,但可以很快积累起来。
答案 6 :(得分:0)
我喜欢使用函数来打印页眉和页脚而不是包含。您可以通过这种方式更好地调整变量范围。
答案 7 :(得分:0)
对于小型网站,include / include_once和require / require_once都很棒,多年来我没有建立一个没有它们的网站。但是,我建议确保每个包含文件都是一个有效XML的离散代码块。我的意思是不要在一个包含中打开标记并在另一个包含中关闭它,反之亦然 - 它会使更改变得复杂并且更容易破坏,因为文件之间存在依赖关系。快乐的编码!
答案 8 :(得分:0)
我知道这已经很晚了,只是想在这个问题上加上我的“便士价值”。
我的建议是为此创建方法,例如我的根目录是:var / www / htdocs /,函数文件位于includes / functions / template-parts.php。
我的功能看起来像这样:
<?php
define("DOC_ROOT", "/var/www/htdocs/"); # Add a trailing slash to make it a little easier
function GetHeader()
{
return include DOC_ROOT . 'includes/parts/header.htm'; # Header found at include/parts/header.htm
}
function GetFooter()
{
return include DOC_ROOT . 'includes/parts/footer.htm'; # Footer found at include/parts/footer.htm
}
?>
并按原样使用:
<?php
# From the main page (/var/www/htdocs/index.php)
require_once 'includes/functions/template-parts.php';
GetHeader();
?>
<!-- Page content -->
<?php
GetFooter();
?>
答案 9 :(得分:0)
公认的答案是2010年表格,在过去十年中情况发生了变化。
现在的方法是composer取代了大多数手动有线自动装带器,最佳实践是在已知的固定位置使用单个require_once
,利用脚本中的__DIR__
:
require_once __DIR__ . '/vendor/autoload.php';
使用define()
不再常见。
根据环境不可知方法,使用.env
或类似方法将来自环境的依赖项注入到应用程序中。