渲染javascript文件,同时使其可用作静态文件

时间:2013-04-22 04:37:55

标签: php javascript yii rendering

我有一个从“/js/someFile.js”这样的网址访问的javascript文件。但是我希望Yii在请求时呈现javascript文件,这样我就可以在其中包含相关数据,例如数据库表中的已解析列表。

据我所知,一个解决方案就是让文件保持静态,并在初始化时从服务器请求数据,但我希望不要这样做。

有没有人知道如何在不将JS内联放在当前视图中的情况下实现这一目标?或者为什么这是一个可怕的想法?

2 个答案:

答案 0 :(得分:1)

你可以有一个名为js或javascript的特殊控制器并调用它而不是调用静态js文件:

class JsController extends Controller{
   public function init() {
       header('Content-Type: application/javascript');
   }

   public function actionSome_action(){
      $this->render('some_action_view_file');
   }
}

您甚至可以为其定义重写规则,以便您可以为您的网址设置.js扩展名。

接下来,从您的控制器中说:

class SiteController extends Controller {
   public function actionIndex() {
      // register the script
      Yii::app()->clientScript->registerScriptFile($this->createUrl('js/some_action'));
      // do other things here...
   }
}

答案 1 :(得分:1)

可以呈现视图,如Twisted1919所示。但我确实认为通过Yii呈现javascript并不是一个好主意。你的问题已经暗示,javascript文件几乎是静态的。因此,将其视为静态文件,以便您的网络服务器可以更快地为其服务。并且在客户端缓存此文件更容易。

然后,如您所建议尝试以某种方式编写它,您只需将动态部分作为参数传递给您的javascript。但是,您不必像隐含的那样从服务器请求数据。您可以将内嵌配置添加到页面中:

<?php
$data = json_encode(array(
    'userId'    => Yii::app()->user->id,
    'whatever'  => $someThing,
));
Yii::app()->clientScript->registerScriptFile('my.js');
Yii::app()->clientScript->registerScript(
    'initJs',
    "myJs.init($data)", 
    CClientScript::POS_READY
);
?>