你怎么能在PHP中创建一个“content_for”等价物?

时间:2010-12-15 05:00:09

标签: php content-for

我一直在使用PHP中的一个小页面,它不需要它背后的完整框架的强大功能。我之前在Ruby-on-Rails中工作中缺少的一件事就是能够使用“content_for”有效地将内容传递到页面上。

我想知道的是,你如何创建一个可以在PHP中实现同样效果的页面生命周期?

所以,这是一个简单的例子:

假设您有一个模板,用于定义索引页面,只是您想要在所有页面上使用的重复标题和菜单。所以你的index.php文件看起来基本上是这样的:

...header stuff...
<body>
<?php include $file.'.php'; ?>
</body>
...footer stuff...

编辑:感谢您提供有关网址安全的提示,但我们假设我正在安全地收到用户请求:)

现在,让我们在标题中说出这个:

<head>
<title><?php echo $page_title; ?></title>
</head>

能够在包含的文件中指定标题会很高兴,因此在网址http://example.com/index.php?p=test您正在加载test.php,该文件如下所示:

<?php $page_title = 'Test Page'; ?>
... rest of content ...

现在,显然这不起作用,因为在设置变量之前加载了包含页面(index.php)。

在Rails中,您可以使用content_for函数在页面上传递内容。

我的问题是:你们都能想到在PHP中实现这种“content_for”功能的最简单,最简洁的方法是什么?

理想情况下,我想要的建议不涉及一些大框架,而是一些相对较轻的样板代码,可用于许多不同的应用程序。

3 个答案:

答案 0 :(得分:4)

  1. 从不执行include $_GET['p']。这会在您的站点中打开一个巨大的安全漏洞,因为包含接受文件名和URL,因此任何人都可以读取您站点上的任何文件并执行服务器上的任何代码。您可能希望首先检查并清理该值。
  2. 如果您需要简单的东西,可以将页眉和页脚放在单独的文件中,执行test.php设置变量,使用output buffering捕获其输出,然后包含标题,输出中间部分并包括页脚。例如:

    <?php ob_start(); ?>
    <body>
    <?php include $filename.'.php'; ?>
    </body>
    <?php $content = ob_get_clean(); 
     include 'header.php';
     echo $content;
     include 'footer.php';
     ?>
    

答案 1 :(得分:1)

如果我理解正确(我没有广泛使用过RoR),您可以将数据放在变量或函数中。如果你的内容是变量,你的“test.php”可以简单地保存你所有的变量,你可以在索引文件的最开头加载它(同样的功能取决于你的需求有多复杂;如果你是做了很多额外的工作,你可能需要使用一个函数作为变量不起作用)。

例如,你的test.php看起来像这样:

<?php
$page_title = "Test Page";
$page_content = "Some sort of content";

// Or

function page_content()
{
    // Run some functions and print content at the end
}

?>

然后,在你的index.php

<?php include $_GET['p'].'.php'; ?>
...header stuff...
<title><?php print $page_title; ?></title>
<body>
<?php print $page_content; ?>
<!-- OR if function -->
<?php page_content(); ?>
</body>
...footer stuff...

这样一切都应该正确加载。你也可以拆分,但这会使你的结构复杂化(特别是如果不需要精心设计的框架,这是不必要的)。

祝你好运!
丹尼斯M。

答案 2 :(得分:1)

你担心XSS吗?或者您要从查询字符串中过滤/列入“文件名”白名单吗?

我的回答是使用mod_rewrite - 如果你使用的是PHP,你可能会使用Apache!

您可以使用RewriteCond过滤掉文件,您的RewriteRule可以是:

RewriteRule /index.php?p=(.*)$ $ 1 [L,QSA]

这可能与您正在寻找的PHP功能不同,但我想到了......

相关问题