【问题标题】:Yii add another $content to templateYii 向模板添加另一个 $content
【发布时间】:2013-03-28 13:34:28
【问题描述】:

我有结构是这样的 Yii 模板:

  1. 中包含 CSS 文件
  2. 之后回显 $content
  3. 在 $content 之后包含 Javascript 文件(如 JQPlot)

我想做的是在包含所有 Javascript 文件后添加自定义的 Javascript/PHP 代码组合。我知道这可以通过将代码添加到模板中来完成。

但我有很多页面包含自定义 JS/PHP 代码,我想只包含该页面的特定代码以避免加载时间过长。

我可以创建像 $content 一样工作的新元素,但它会包括例如来自与“index.php”相同的视图文件夹中的“js.php”? “js.php”将位于我需要自定义代码的每个视图文件夹中,并包含该特定页面的 js/php 代码组合。

感谢您的帮助!

【问题讨论】:

标签: php javascript yii


【解决方案1】:

剪辑是您最好的选择,正如 @jfrej 建议的那样,它会将您指向讨论剪辑的论坛主题。

在常规情况下,每个控制器都关联一个文件夹,所有视图都放置在该文件夹中,您希望在 layout 末尾包含这种情况(这就是它们的引用方式, 而不是 templates) 一些 PHP+Javascript 内容,这些内容对控制器中的所有操作都是通用的。

我会覆盖CController::afterRender() 方法来为您的剪辑捕获内容;让我们打电话给你的剪辑controller_content

afterRender(string $view, string &$output)
    $this->beginClip('controller_content');
    // output here any content you want to capture into your clip
    // e.g. renderPartial, echo, etc.
    ...
    $this->endClip();
    parent::afterRender($view, $output);
}

然后,在您的布局中,您将在始终存在的所有内容之后渲染您的剪辑,例如:

// register your CSSs
// output $content variable
// register Javascript
...
<?= $this->clips['controller_content'] ?>

当然,您可以通过多种方式生成剪辑内容。这里我覆盖了CController::afterRender() 方法,但您也可以使用过滤器、行为或任何其他最适合您需求的方法。

【讨论】:

    【解决方案2】:

    你可以试试:

    Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl.'/css/example.css');
    Yii::app()->clientScript->registerScriptFile(Yii::app()->baseUrl.'/css/example.js');

    你可以从控制器调用它

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2015-02-15
      • 2020-02-11
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多