4

大規模なWebサイトのほとんどのHTMLは、ページ間(ヘッダー、フッター、ナビゲーションメニューなど)で複製されます。この重複するHTMLがすべてコード内で実際に重複しないように、コードをどのように設計しますか?たとえば、ナビゲーションリンクをからに変更したい場合は<ul><ol>1つのファイルでその変更を行いたいと思います。

これが、ある特定のコードベースがこの問題を処理するのを見た方法です。すべてのページのコードは次のようになります。

print_top_html();

/*この特定のページのすべてのコード/HTML* /

print_bottom_html();

しかし、私はこのアプローチに不快感を覚えます(部分的には、開始タグが終了タグと同じファイルにないためです)。

もっと良い方法はありますか?

私は主にPHPサイトで作業していますが、他の言語のソリューションを聞くことに興味があります(この質問が言語に依存しないかどうかはわかりません)。

4

7 に答える 7

4

私はphpプログラマーではありませんが、テンプレート(ビュー)で動作するSmartyと呼ばれるテンプレートシステムを使用できることは知っています。これは、asp.netmvcがRazorで実行するようなものです。

こちらをご覧くださいhttp://www.smarty.net/

于 2009-08-08T00:40:04.353 に答える
2

これは、一般的なメソッドの非常に単純化されたバージョンです。

layout.php

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

それで

whatever_page.php

<?php

$content = "Hello World";

include( 'layout.php' );
于 2009-08-08T00:38:55.913 に答える
2

少なくともPHP(および他のプログラミング言語)の場合の1つの解決策は、テンプレートです。上記のように2つの関数を使用する代わりに、このように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

include()またはrequire()を使用する必要があるようです

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

output html code for page

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

ヘッダーファイルとフッターファイルには、サイトのすべての一般的なHTMLを含めることができます。

于 2009-08-08T00:42:57.133 に答える
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>

これにより、アプリケーションは、コントローラーに基づいて異なるルックアンドフィールまたは異なるナビゲーションを持つことができます。実際には、コントローラーごとに異なるレイアウトファイルを使用していませんが、代わりに「アプリケーション」という名前のデフォルトのレイアウトに依存しています。

ただし、「情報」、「ブログ」、「管理者」のコントローラーが別々になっている会社のWebサイトがあるとします。次に、コントローラーに対応するそれぞれのレイアウトファイルでさまざまなレイアウトビューを処理することにより、それぞれのナビゲーションをわかりやすく目立たない方法で変更できます。

次のように指定することで、コントローラーメソッドでいつでもカスタムレイアウトを設定できます。

render :layout => 'custom_layout'

Railsには優れたヘルパーメソッドも組み込まれているため、開発環境(dev、staging、prodなど)に応じてCSSとJavascriptのパスが正しいことを確認するためにPHPの$global変数に依存する必要はありません。最も一般的なものは次のとおりです。

#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 に答える
0

あなたが提案したことはうまくいきます。同期している限り(print_top_htmlそしてprint_bottom_html自動テストを使用してこれをチェックできます)、それらについて心配する必要はなく、サイトの実際のコンテンツ(真ん中のもの)に集中することができます。

または、結合print_top_htmlprint_bottom_htmlて1つの呼び出しにまとめ、HTMLコード(またはコールバック)を送信して中央に配置することもできます。

于 2009-08-08T00:40:24.090 に答える
0

Zend_View私は(Railsと非常によく似た)のパーシャルシステムを使用しています。パーシャルは基本的に、独自の可変スコープを持つ小さな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 に答える