在PHP中的RenderBody

时间:2011-09-14 12:56:11

标签: php asp.net

如果您使用过ASP.NET MVC,那么您对RenderBody很熟悉。基本上,您有一个布局页面和几个正文页面。像这样:

layout.cshtml:

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

index.cshtml:

@{
   layout = "layout.cshtml";
}

<p>Hello World!</p>

因此,当您调用index.cshtml时,其所有内容都将显示在布局的@RenderBody部分中。当您的页面使用单个布局时,这非常有用。

现在,我的问题是,我怎么能在php中实现类似上面代码的东西?

修改

对于那些不熟悉ASP.NET的人,当你有这样的index2.cshtml文件时:

@{
   layout = "layout.cshtml";
}

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

然后当你再次调用index2.cshtml'Hello World,再次!'会被打印出来。基本上,当您定义页面的布局时,其所有内容都显示在其布局的@RenderBody部分中。您不必明确定义要在布局中包含的页面。

3 个答案:

答案 0 :(得分:3)

我不知道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模板:)

答案 1 :(得分: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 %}

答案 2 :(得分:1)

我知道这是一个较老的问题,但是从ASP.net + MVC3开发我发现了一个更好的解决方案。

创建一个master.php页面,例如这个(使用doctype和其他任何内容等等,你会得到这个想法)

master.php:

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

接下来我有一个单独的文件夹只是为了保持整洁,你不需要(例如Content /) 将所有内容文件放在此文件夹中,包含在ASP.net页面中的内容,我将其称为默认文件.php

如default.php:

<div>
    Hello World
</div>

然后创建要点击的文件以加载页面内容,我将调用我的index.php

的index.php:

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

缺点:

  • 每页两个文件,这可以通过将页面内容直接放在变量中来规避,但我更喜欢单独的文件来保持整洁。

优点:

  • 没有额外的.htaccess或任何其他服务器要求
  • 允许每页传递无数个变量
  • 完全模仿ASP.net RenderBody()函数:D

这绝不是一个原创的想法,我找到了另一个使用这种方法的网页,这正是我想在我的网页上做的。

这个SO帖子与我在谷歌上搜索如何做同样的事情是一样的,所以我想用我的解决方案回答。