我在PHP中尝试做的是加载包含php样式变量的文件,并将其替换为变量的内容。这是我的示例代码,它不会影响我的意图。
module.html
<div class="module">
$moduleText
</div>
的index.php
<?php
$moduleText = "Hello, World!";
$module = file_get_contents ( "module.html" );
echo $module;
?>
index.php输出
<div class="module">
$moduleText
</div>
index.php期望输出
<div class="module">
Hello, World!
</div>
在PHP中有一种简单的方法可以获得所需的输出吗?我正在构建一个CMS,这将使我的模块包含变得轻而易举。任何帮助,讽刺评论或正确方向的点都非常感谢!!
答案 0 :(得分:2)
您可以使用Heredoc string
执行此操作让我举个例子:
的index.php
<?php
$moduleText = "Hello, World!";
include "module.php";
echo $module;
?>
module.php
<?php
$module = <<<EOD
<div class="module">
$moduleText
</div>
EOD;
?>
您可以在任何循环中执行此操作,它将按预期运行。
希望这有帮助!
答案 1 :(得分:0)
我最终创建了一个模板系统。如果您在遵循我的示例目录结构的同时复制并粘贴它,代码应该可以工作。
如果您有任何问题或替代方法,请与我们联系。我总是乐于改进。 :)
示例目录结构:
- templates
---- index.html
---- module.html
- includes
---- functions.php
- index.php
的index.html:
<b>${myVariable}</b>
<div>
${module}
</div>
module.html:
<b>${foo}</b>
<i>${bar}</i>
的functions.php:
<?php
function getTemplate($file, $hooks){
//Read our template in as a string.
$template = file_get_contents($file);
$keys = array();
$data = array();
foreach($hooks as $key => $value){
array_push($keys, '${'. $key .'}');
array_push($data, $value );
}
//Replace all of the variables with the variable
//values.
$template = str_replace($keys, $data, $template);
return $template;
}
?>
的index.php:
<?php
require_once('includes/functions.php');
/*
* Load Modules First so we can get the
* contents as a string and include that string
* into another template represented by a
* variable in the template such as
* ${module}
*/
$moduleHooks = array(
'foo' => 'Oh fooey',
'bar' => 'Chocolate Bar'
);
$moduleTemplate= 'templates/module.html';
$moduleText = getTemplate($moduleTemplate, $moduleHooks);
/*
* Load the module you want to display. Be sure
* to set the contents of the contents to a hook
* in the module that we will display
*/
$indexHooks = array(
'myVariable' => 'Index Variable',
'module' => $moduleText
);
$indexTemplate = 'templates/index.html';
$indexText = getTemplate($indexTemplate, $indexHooks);
/*
* Finally Display the page
*/
echo $indexText;
?>
输出:
<b>Index Variable</b>
<div>
<b>Oh fooey</b><i>Chocolate Bar</i>
</div>
我使用包含的问题是,当我使用说“include module.html;”时,我无法决定将其放在index.html文件中的位置,除非我将index.html转换为php文件。
答案 2 :(得分:0)
是的,这是可能的至今,使所有模板库成为过去。
对于像我一样正在寻找这个问题的人:
将文件加载为包含变量定义的字符串
答案很简单:
<?php echo $myvar ?>
我将以 CSRF保护(!)
为例<强> form.html 强>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Form Template</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-social/5.1.1/bootstrap-social.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-xs-12 col-xs-offset-0 col-sm-8 col-sm-offset-2">
<form method="POST" action="" novalidate="novalidate">
<div class="form-group">
<label for="email" class="control-label">Email</label>
<div class="input-group">
<label for="email" class="input-group-addon" aria-hidden="true"><i class="fa fa-at fa-lg"></i></label>
<input type="text" class="form-control" id="email" name="email" value="" required="" title="Please enter your email" placeholder="example@gmail.com">
</div>
<span class="error help-block">Not acceptable domain</span>
</div>
<div class="form-group">
<label for="password" class="control-label">Password</label>
<div class="input-group">
<label for="password" class="input-group-addon" aria-hidden="true"><i class="fa fa-lock fa-lg"></i></label>
<input type="password" class="form-control" id="password" name="password" value="" required="" title="Please enter your password">
</div>
<span class="error help-block">Wrong password</span>
<p><a href="/auth/newpass">Forgot password?</a></p>
</div>
<input type='hidden' name='csrf' value="<?php echo $arg[0] ?>">
<button class="btn btn-primary btn-block">Sign in</button>
<button class="btn btn-default btn-block">Cancel</button>
</form>
</div>
</div>
</div>
</body>
</html>
特别感兴趣的是行
<input type='hidden' name='csrf' value="<?php echo $arg[0] ?>">
<强>的template.php 强>
session_start();
$csrf = $_SESSION['csrf']; //session stores the value
$arg = array($csrf);
ob_start();
include './form.html';
$include = ob_get_contents();
ob_end_clean();
// do whatever you want with $include
echo $include; // the page is rendered correctly!
我们实现了:
优于已有的php核心功能this
3.1。它意味着解决不同的问题
3.2。它使用一个缓冲区,而在这里我们控制缓冲区并避免一个缓冲区在回显页面时引入的延迟。
希望能帮助有人找这个。