【问题标题】:Yii: Render action using different layout than controller's layoutYii:使用与控制器布局不同的布局渲染动作
【发布时间】:2011-09-10 03:11:58
【问题描述】:

在 Yii 中,有没有办法使用与控制器定义的 layout 不同的 layout 来呈现单个动作?我有一个动作,我想以与其他动作不同的格式进行格式化,如果可能的话,从文档中不清楚。

【问题讨论】:

    标签: php model-view-controller yii


    【解决方案1】:

    我相信您可以直接调用 $layout 变量。

    public function actionYourAction()
    {
        $this->layout = 'nameOfYourAltLayout';
    }
    

    下面链接中的说明表明,您必须为每个操作设置此变量,因为您不能只设置默认公共变量并期望其他操作默认返回此变量。

    http://www.yiiframework.com/wiki/28/how-to-implement-multiple-page-layouts-in-an-application/

    ::编辑::

    这里的最佳实践似乎是在视图脚本中为调用它的特定操作定义$layout 变量。例如,如果您的操作调用 viewscriptone.php,那么 viewscriptone 视图文件将包含:

    $this->layout = 'nameOfYourAltLayout';
    

    在此处覆盖而不是在控制器操作中更有意义。但是,正如 LDG 所说,如果布局是有条件的,您可能应该将其保留在控制器中。仍然可以在页面“使用布局”部分下的上述链接中找到此信息。

    【讨论】:

    • +1 - 我建议从这里下载 pdf 手册和博客示例 pdf。 yiiframework.com/download 它被列为文档。
    • 尼克,我对 SO 有点陌生。 +1 速记是什么意思?
    • 我想在视图中定义布局是有意义的,具体取决于您的应用程序的具体情况。如果特定视图的布局是有条件的,我会将逻辑保留在控制器中。但是,能够将其作为异常/覆盖放在特定视图中当然很好,事实上,您甚至可以在 Yii 中做到这一点,就像其他一些框架一样。
    • @Idg,条件点完全有效。谢谢你提出来。我会把它添加到我的答案中。
    • @k to the z - +1 只是我说我同意这个帖子,我正在全力以赴。因此,任何阅读它的人都知道它不仅是一个人在说垃圾,而且其他人(即我)也同意。
    【解决方案2】:

    该 wiki 条目在描述如何使用布局方面做得非常好,绝对值得一读。我确实认为您可以在控制器类的开头设置布局默认值,然后在特定的操作函数中覆盖它,而不必在每个操作中定义布局,至少它对我有用。您还可以将beforeAction 函数用于任何复杂的情况。而且,您可能已经知道,您可以使用 renderPartial 完全绕过布局。

    【讨论】:

    • 由于布局与渲染视图有关,IMO,beforeRender() 是比 beforeAction() 更合适的地方。
    猜你喜欢
    • 2011-11-07
    • 1970-01-01
    • 2013-05-16
    • 2015-01-28
    • 2013-05-18
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多