4

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

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

print_top_html();

/* 此特定页面的所有代码/HTML */

print_bottom_html();

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

有没有更好的办法?

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

4

7 回答 7

4

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

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

于 2009-08-08T00:40:04.353 回答
2

这是一个非常非常简化的通用方法版本。

布局.php

<html>
  <body>
    <?php echo $content; ?>
  </body>
</html>

然后

不管页面.php

<?php

$content = "Hello World";

include( 'layout.php' );
于 2009-08-08T00:38:55.913 回答
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 模板引擎或多或少地以这种方式运行。

您为通常会反复使用的 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

这是一种非常灵活的做事方式,许多框架和内容管理系统都使用这种方式。

于 2009-08-08T00:45:19.630 回答
1

您询问其他语言如何处理此问题,除了 PHP,我没有看到任何其他语言,因此我鼓励您查看 Rails。Rails 约定很优雅,反映了@codeincarnate 在 PHP 中的版本。

在 MVC 框架中,当前视图呈现在特定于控制器的布局文件中,该布局文件封装了当前方法的相应视图。它使用“yield”方法来标识应插入视图内容的部分。一个常见的布局文件如下所示:

<html>
  <head>
    <% #stylesheet and js includes %>
   <body>
     <div id="header">Header content, menus, etc…&lt;/div>
    <%= yield %>
    <div id="footer">Footer content</div>
   </body>   
</html>

这使应用程序能够根据控制器具有不同的外观和感觉或不同的导航。在实践中,我并没有为每个控制器使用不同的布局文件,而是依赖于默认布局,即名为“应用程序”的布局。

但是,假设您有一个公司网站,有单独的“信息”、“博客”和“管理员”控制器。然后,您可以通过在与它们的控制器对应的各自布局文件中处理不同的布局视图来以干净且不显眼的方式更改每个的导航。

您始终可以通过以下方式在控制器方法中设置自定义布局:

render :layout => 'custom_layout'

Rails 中还内置了很好的辅助方法,因此您不必依赖 PHP 中的 $global 变量来确保您的 CSS 和 Javascript 路径根据您的开发环境(开发、登台、生产……)是正确的。最常见的是:

#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

于 2010-01-24T16:24:39.257 回答
1

听起来您需要使用 include() 或 require()

<?php
include("header.inc.php");

output html code for page

include("footer.inc.php");
?>

页眉和页脚文件可以包含站点的所有常见 HTML。

于 2009-08-08T00:42:57.133 回答
0

你建议的工作正常。只要保持同步(print_top_html并且print_bottom_html您可以使用自动化测试来检查这一点),那么您就不必再担心它们,让您专注于网站的真实内容——中间的东西。

或者,您可以将print_top_htmlandprint_bottom_html合并到一个调用中,并将其发送 HTML 代码(或回调)以放置在中间。

于 2009-08-08T00:40:24.090 回答
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(); ?>
于 2010-01-24T17:11:32.030 回答