在我的应用程序中,我经常使用AJAX调用来获取某些变量以及html代码,示例JSON:
{
'result': '1',
'error': '0',
'someVar': 'abc',
'outputHTML': '<table>....</table>',
}
Run Code Online (Sandbox Code Playgroud)
要创建这样的JSON,我必须在关联数组中分配每个值并对其进行编码(服务器端:PHP代码)。
$response=array(
'result' => 1,
'error' => 0,
'someVar' => 'abc',
'outputHTML' => '<table>....</table>',
);
echo @json_encode($response);
die();
Run Code Online (Sandbox Code Playgroud)
我将HTML代码直接放在类中,但是我想将其移到单独的模板文件中,以减小类大小,并从html代码中分离类代码。问题是我无法将模板代码放入变量样本中:
function ajax_response()
{
$response=array();
//of course below code doesn't work
$response['outputHTML']=include('table-html.php');
echo @json_encode($response);
die();
}
Run Code Online (Sandbox Code Playgroud)
其中table-html.php文件包括:
<table>
...
</table>
Run Code Online (Sandbox Code Playgroud)
解决该问题的一种方法是使用输出缓冲来捕获table-html.php文件的内容并将其插入变量中。不利之处在于,并非总是在服务器上启用输出缓冲,因此在某些主机上,此类代码将无法正常工作。您对问题的替代解决方案有何建议?
注意:模板文件使用PHP代码动态生成HTML代码,因此必须对包含的PHP文件进行解析。
更新
实际上,此代码将起作用:
$response['outputHTML']=include('table-html.php');
Run Code Online (Sandbox Code Playgroud)
如果table-html.php具有以下内容:
<?php
$output = '<table>'.$some_var.'</table>';
return $output;
Run Code Online (Sandbox Code Playgroud)
include并且require用于将PHP代码加载到您的应用程序中。
要获取文件的内容并将其存储在变量中,请file_get_contents改用。
请注意,文件的给定路径是相对于输入脚本的。当您的脚本从其他位置包含进来时,这可能会产生意外的结果。要解决此问题,请使用__DIR__魔术常数。
最终代码如下所示:
$response['outputHTML'] = file_get_contents(__DIR__ . '/table-html.php');
Run Code Online (Sandbox Code Playgroud)
首先,您可能想看看像Twig这样的模板引擎,从而省去了一些麻烦。
如果您想自己执行此操作,则只需更改代码中的唯一内容就是在的末尾返回一个变量table-html.php。我建议使用Heredoc创建易于阅读的模板。
例
<?php
return <<<EOT
<table>
<tr><td>$firstname</td><td>$lastname</td></tr>
</table>
EOT;
Run Code Online (Sandbox Code Playgroud)