如何在代码库中以不重复的方式表示重复的HTML?

时间:2009-08-08 00:21:56

标签: php codebase

大型网站中的大多数HTML都是跨页面重复的(页眉,页脚,导航菜单等)。如何设计代码,以便所有这些重复的HTML在代码中实际上不会重复?例如,如果我想将导航链接从<ul>更改为<ol>,我只想在一个文件中进行更改。

以下是我看到一个特定代码库处理此问题的方法。每个页面的代码如下所示:

print_top_html();

/* all the code/HTML for this particular page */

print_bottom_html();

但是我对这种方法感到不舒服(部分原因是开放标签与结束标签不在同一个文件中)。

有更好的方法吗?

我主要使用PHP网站,但我有兴趣听取其他语言的解决方案(我不确定这个问题是否与语言无关)。

7 个答案:

答案 0 :(得分:4)

我不是一个php程序员,但我知道我们可以使用一个名为Smarty的模板系统,它可以用于模板(视图),就像asp.net mvc和Razor一样。

看这里http://www.smarty.net/

答案 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"

当然,这些部分中的每一部分都可以更加详细地阐述,这只是刷表面。有关更多详细信息,请查看以下内容:

http://guides.rubyonrails.org/layouts_and_rendering.html

答案 5 :(得分:0)

您建议的工作正常。只要print_top_htmlprint_bottom_html保持同步(并且您可以使用自动化测试来检查),那么您再也不用担心它们了,让您专注于真实< / em>网站的内容 - 中间的内容。

或者,您可以将print_top_htmlprint_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(); ?>