我有一个我正在使用的PHP应用程序,它在视图文件中包含很多内联javascript。我假设这样做的原因是内联脚本经常包含由控制器传递给视图的php变量。
我希望能够从视图文件中删除javascript并将它们放入单独的文件中,但仍然可以解析文件中的php。
我有一个现有的Document类,所以我添加了一个方法renderScript
,以便我可以传入所需的文件:
public function renderScript($script) {
$this->scripts[md5($script)] = $this->script_directory . $script;
}
然后我的目的是构建一个可以调用的控制器,它将迭代任何添加的脚本,解析php,然后将其添加到dom。
在我的控制器中:
public function index() {
$scripts = $this->document->getScripts();
$files = '';
foreach ($scripts as $key => $value):
$files .= file_get_contents ($value);
endforeach;
$data['script'] = $files;
header('Content-Type: application/javascript');
return $this->load->view('common/javascript', $data);
}
然后在我看来:
<script>
<?= $script; ?>
</script>
然后我将控制器加载到我的页脚控制器中:
$data['javascript'] = $this->load->controller('common/javascript');
这有点......因为它确实将整个文件回显到我的应用程序的页脚中,但这不是我想要的。
我宁愿只能在我的页脚视图中使用脚本标记直接调用控制器,但这不起作用,因为javascript控制器通过index.php传递并被调度并重置文档。 / p>
所以...有没有办法可以包含这些js文件,解析它们中的php,然后将它们添加到dom而不将整个内容打印到渲染的html中?
我确定有办法,我无法绕过它。
答案 0 :(得分:0)
好吧,我没有看到做你想做的好方法。
如果脚本位于单独的文件中,则会将其加载到单独的get请求中,这意味着您已经发现,控制器中没有任何数据可用。
如果你打算用php json后端移动到完整的JS前端(Angular),那么这个中间步骤似乎毫无意义,只需坚持使用内联js,同时你将角色更改为。
那就是说,这是一个(不太好)的解决方案:
在主控制器中,在渲染视图之前,将js所需的所有数据转储到会话中:
$_SESSION['jsData']=array(...);
创建一个javascript控制器,用数据呈现js:
function renderJs($script){
$jsData = $_SESSION['jsData'];
$this->view->render($script, $jsData, 'application/javascript');
在视图中添加脚本标记:
<script src=/jcontroller/renderjs/somescript.php
注意js文件有一个php扩展,所以php vars可以在你的视图中解释 - &gt;渲染函数