将Javascript移出模板文件

时间:2014-07-22 11:08:48

标签: javascript php html

我有一个我正在使用的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中?

我确定有办法,我无法绕过它。

1 个答案:

答案 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;渲染函数