将Javascript移出模板文件


Moving Javascript Out of Template Files

我有一个PHP应用程序,我在视图文件中包含了很多内联javascript。我认为这样做的原因是内联脚本经常包含由控制器传递给视图的php变量。

我希望能够从视图文件中删除javascript,并将它们放在单独的文件中,但仍然能够解析文件中的php。

我有一个现有的Document类,所以我添加了一个方法renderScript,这样我就可以传入所需的文件:

public function renderScript($script) {
    $this->scripts[md5($script)] = $this->script_directory . $script;
}

然后我的意图是构建一个可以调用的控制器,它将遍历任何添加的脚本,解析php,然后将其添加到dom。

In my controller:

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传递,并被分派和文档重置。

所以…是否有一种方法,我可以包括这些js文件,解析其中的php,然后将它们添加到dom,而不打印整个内容到渲染的html?

我肯定有办法,只是我不明白。

好吧,我没有看到你想要的好方法。

如果脚本在单独的文件中,它将在单独的get请求中加载,这意味着控制器中的任何数据都不可用,正如您已经发现的那样。

如果你打算用php json后端移动到完整的JS前端(Angular),那么这个中间步骤似乎相当没有意义,只要坚持使用内联JS,同时你改变了Angular。

也就是说,这里有一个(不太好的)解决方案:

在主控制器的

中,在渲染视图之前,将js所需的所有数据转储到session中:

$_SESSION['jsData']=array(...);

创建一个javascript控制器,用以下数据渲染js:

function renderJs($script){
    $jsData = $_SESSION['jsData'];
    $this->view->render($script, $jsData, 'application/javascript');

在视图中添加script标签:

<script src=/jcontroller/renderjs/somescript.php

注意js文件有一个php扩展名,所以php变量可以在你的视图中解释