2011-09-14 15 views
1

ASP.NET MVCを使用している場合、RenderBodyをよく知っているはずです。基本的に、1つのレイアウトページと複数の本文ページがあります。このような何か:RenderBody in php

layout.cshtml:

<html> 
    <head> 
    <title>Your Title</title> 
    </head> 
    <body> 
    @RenderBody() 
    </body> 
</html> 

index.cshtml:あなたはindex.cshtmlを呼び出すとき

@{ 
    layout = "layout.cshtml"; 
} 

<p>Hello World!</p> 

だから、その内容のすべては、レイアウトの@RenderBodyセクションに表示されます。これは、ページが1つのレイアウトを使用する場合には非常に便利です。

今、私の質問は、私はPHPで上記のコードに似た何かを達成することができますか?その後

@{ 
    layout = "layout.cshtml"; 
} 

<p>Hello World, once again!</p> 

あなたはindex2.cshtmlこの時間を呼ぶ '

ASP.NETに慣れていない人のために

EDIT

に、あなたはこのようなindex2.cshtmlファイルを持っていますこんにちは、もう一度、世界!印刷されます。基本的に、ページのレイアウトを定義すると、そのレイアウトのすべてのコンテンツが@RenderBodyセクションに表示されます。レイアウトに含めるページを明示的に定義する必要はありません。

+0

テンプレートを使用しないとどういう意味ですか? –

+0

申し訳ありませんが私の悪い、私はフレームワークを意味しました:) – Shaokan

答えて

2

私はASP.NETを知っているが、ここであなたはおそらくPHPで同じことをしたい方法ですしていない:

<html> 
    <head> 
    <title>Your Title</title> 
    </head> 
    <body> 
    <?php include('body.php'); ?> 
    </body> 
</html> 

body.phpその後、非常に(

<p>Hello World!</p> 

を含めることができます)簡単なルーティングの例:

$router = new RequestRouter; //this class would route a request to a set of templates stored in a persistent storage engine like a database 
$request = $_SERVER['QUERY_STRING']; 
$templates = $router->resolve($request); //would return an array with the templates to be used 
include('master.php'); 

master.php:

<html> 
    <head> 
    <title>Your Title</title> 
    </head> 
    <body> 
    <div> 
     <?php include($templates['top']); ?> 
    </div> 
    <div> 
     <?php include($templates['middle']); ?> 
    </div> 
    <div> 
     <?php include($templates['bottom']); ?> 
    </div> 
    </body> 
</html> 

あなたは、あなたのデータベース内の各ページについてtopmiddlebottomテンプレートを定義することができます:)

+0

多分私はより具体的でなければなりませんでした。同じレイアウトの2番目のページを呼び出すと、その内容が表示されます。つまり、index2.cshtmlを持っていて、そのコンテンツが「Hello World、again」だったら、それが表示されます。だから、おそらくあなたの提案にしたがって、最も近いものがスイッチを使って異なるファイルを異なるケースに入れることになります。 – Shaokan

+0

ルーティングエンジンを作成し、そのURLを含まれるボディテンプレートのセットにルーティングしてください:) – thwd

+0

これを行う方法の例を教えてもらえますか? – Shaokan

2

あなたはTwigで(も)それを行うことができます。

main_layotを.twig:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Example</title> 
    </head> 
    <body> 
      {% block content %}{% endblock %} 
    </body> 
</html> 

と内容:

{% extends "main_layout.twig" %} 

{% block content %} Content {% endblock %} 
1

これは古い質問ですが、ASP.net + MVC3の開発から来て、私はより良い解決策を見出しました。

(などのdoctypeおよび任意の他、とあなたがアイデアを得る)このような、

マスターをmaster.phpページを作成します。PHP:

<head> 
    my_stuff, meta tags, etc. 
    <title><?php echo $page_title; ?></title> 
</head> 
<body> 
    <?php include('$page_content') ?> 
</body> 

私はちょうどあなたがあなたのASP.netに含めるものを、このフォルダ内に(例えばコンテンツ/) Placeに、すべてのコンテンツファイルを必要としない、きちんとそれを維持するために別のフォルダを持って次のあなたはページのコンテンツをロードするためにヒットするファイルを作成し、私は

index.phpが地雷と呼ぶことにします次に

<div> 
    Hello World 
</div> 

:ページが、私はdefault.php

default.php鉱山を呼ぶことにします

のindex.php:

<?php 
    $page_title = 'Hello Example'; 
    $page_content = 'Content/default.php'; 
    include('master.php'); 
?> 

短所:各ページごと

  • 二つのファイル、これは変数に直接ページコンテンツを置くことによって回避することができますが、私は清楚に別々のファイルを好みます。

利点:

  • 余分な.htaccessファイルまたは任意の追加のサーバー要件
  • は、変数の無限の数は、各ページで
  • 模倣ASP.net RenderBody()関数を渡すことができませんあなたとまったく同じように:D

これは決してオリジナルのアイデアではなく、私はこのアプローチを利用した別のWebページを見つけました。私のウェブページでやりたかったことを実感してください。

このSO投稿は、同じことをやり遂げる方法をグーグルで見つけたときに見つけたのと同じことです。そのため、私の解決策に答えたいと思っていました。