大型网站中的大多数HTML都是跨页面重复的(页眉,页脚,导航菜单等)。如何设计代码,以便所有这些重复的HTML在代码中实际上不会重复?例如,如果我想将导航链接从<ul>
更改为<ol>
,我只想在一个文件中进行更改。
以下是我看到一个特定代码库处理此问题的方法。每个页面的代码如下所示:
print_top_html(); /* all the code/HTML for this particular page */ print_bottom_html();
但是我对这种方法感到不舒服(部分原因是开放标签与结束标签不在同一个文件中)。
有更好的方法吗?
我主要使用PHP网站,但我有兴趣听取其他语言的解决方案(我不确定这个问题是否与语言无关)。
答案 0 :(得分:4)
我不是一个php程序员,但我知道我们可以使用一个名为Smarty的模板系统,它可以用于模板(视图),就像asp.net mvc和Razor一样。
答案 1 :(得分:2)
这是一个真正的真正简化版的常用方法。
<强> layout.php中强>
<html>
<body>
<?php echo $content; ?>
</body>
</html>
然后
<强> whatever_page.php 强>
<?php
$content = "Hello World";
include( 'layout.php' );
答案 2 :(得分:2)
至少在PHP(和其他编程语言)的情况下,一种解决方案是模板。而不是像上面那样拥有两个函数,而是像这样混合使用HTML和PHP。
<html>
<head>
<title><?php print $page_title ?></title>
<?php print $styles ?>
<?php print $scripts ?>
</head>
<body>
<div id="nav">
<?php print $nav ?>
</div>
<div id="content">
<?php print $content ?>
</div>
</body>
</html>
此模板中的每个变量都包含由另一个模板生成的HTML,由函数生成的HTML或来自数据库的内容。有许多PHP template engines以这种方式或多或少地运作。
您可以为HTML创建一个通常会反复使用的模板。然后使用它将是这样的。
<?php
$vars['nav'] = _generate_nav();
$vars['content'] = "This is the page content."
extract($vars); // Extracts variables from an array, see php.net docs
include 'page_template.php'; // Or whatever you want to name your template
这是一种非常灵活的做事方式,也是许多框架和内容管理系统使用的方式。
答案 3 :(得分:1)
听起来你需要使用include()或require()
<?php
include("header.inc.php");
output html code for page
include("footer.inc.php");
?>
页眉和页脚文件可以包含网站的所有常用HTML。
答案 4 :(得分:1)
你问过其他语言如何处理这个问题,除了PHP之外我什么也没看到,所以我建议你查看Rails。 Rails惯例很优雅,反映了@codeincarnate在PHP中的版本。
在MVC框架中,当前视图在特定于控制器的布局文件中呈现,该文件封装了当前方法的相应视图。它使用“yield”方法来标识应插入视图内容的部分。常见的布局文件如下所示:
<html>
<head>
<% #stylesheet and js includes %>
<body>
<div id="header">Header content, menus, etc…</div>
<%= yield %>
<div id="footer">Footer content</div>
</body>
</html>
这使应用程序具有不同的外观或基于控制器的不同导航。实际上,我没有为每个控制器使用不同的布局文件,而是依赖于默认布局,即名为“application”。
但是,假设你有一个公司网站,有“信息”,“博客”和“管理员”的独立控制器。然后,您可以通过处理与其控制器对应的各自布局文件中的不同布局视图,以干净且不显眼的方式更改每个导航。
您始终可以通过声明:
在控制器方法中设置自定义布局render :layout => 'custom_layout'
Rails中还内置了很好的辅助方法,因此您不必依赖PHP中的$ global变量来确保您的CSS和Javascript路径是正确的,具体取决于您的开发环境(dev,staging,prod ...)。最常见的是:
#looks in public/stylesheets and assumes it's a css file
stylesheet_link_tag "filename_without_extension"
#looks in public/javascripts and assumes it's a js file
javascript_include_tag "jquery"
当然,这些部分中的每一部分都可以更加详细地阐述,这只是刷表面。有关更多详细信息,请查看以下内容:
答案 5 :(得分:0)
您建议的工作正常。只要print_top_html
和print_bottom_html
保持同步(并且您可以使用自动化测试来检查),那么您再也不用担心它们了,让您专注于真实< / em>网站的内容 - 中间的内容。
或者,您可以将print_top_html
和print_bottom_html
合并为一个调用,然后将HTML代码(或回调)发送到中间。
答案 6 :(得分:0)
我使用Zend_View
的部分系统(非常类似于Rails)。 partial本质上是一个小的HTML模板,它有自己的变量范围。它可以从内部视图调用,如:
<?php echo $this->partial('my_partial.phtml', array( 'var1' => $myvar ));
传递给构造的变量绑定到局部本身内的局部变量。非常方便重复使用。
如果你正在编写一个辅助对象,你可以在普通代码中渲染一个局部,你有一个比你通常觉得放在视图中更复杂的逻辑。
public function helperFunction()
{
// complex logic here
$html = $this->getView()->partial('my_partial.phtml', array('var1' => $myvar ));
return $html;
}
然后在你看来
<?php echo $this->myHelper()->helperFunction(); ?>