当前位置:  首页>> 技术小册>> Yii2框架从入门到精通(上)

3.2 项目实现迭代二:创建并使用布局渲染首页视图

在Yii2框架的项目开发过程中,随着功能的逐步增加,合理组织和管理视图文件变得尤为重要。布局(Layouts)作为Yii2 MVC架构中视图(View)层的一个重要组成部分,用于定义应用的公共部分,如头部、导航栏、侧边栏和页脚等,使得开发者能够轻松地复用这些元素,而无需在每个视图中重复编写相同的HTML代码。本章节将详细介绍如何在Yii2项目中创建并使用布局来渲染首页视图,以此提升项目的可维护性和可扩展性。

3.2.1 理解布局(Layouts)

在Yii2中,布局是一种特殊的视图文件,它通常包含一个或多个占位符(placeholders),用于嵌入其他视图内容。这些占位符通过$content变量和可能的其他自定义变量来实现。当控制器渲染一个视图时,Yii2会先渲染该视图文件,然后将渲染结果赋值给布局中的$content变量,最后渲染整个布局文件,从而生成最终的HTML页面。

3.2.2 创建布局文件

在Yii2项目中,布局文件通常位于views/layouts目录下。如果此目录不存在,你需要手动创建它。接下来,我们将创建一个名为main.php的布局文件,该文件将作为我们项目的主要布局模板。

  1. <!-- views/layouts/main.php -->
  2. <?php
  3. /* @var $this \yii\web\View */
  4. /* @var $content string */
  5. use yii\helpers\Html;
  6. use yii\bootstrap\Nav;
  7. use yii\bootstrap\NavBar;
  8. use yii\widgets\Breadcrumbs;
  9. use app\assets\AppAsset;
  10. AppAsset::register($this);
  11. ?>
  12. <?php $this->beginPage() ?>
  13. <!DOCTYPE html>
  14. <html lang="<?= Yii::$app->language ?>">
  15. <head>
  16. <meta charset="<?= Yii::$app->charset ?>">
  17. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  18. <meta name="viewport" content="width=device-width, initial-scale=1">
  19. <?= Html::csrfMetaTags() ?>
  20. <title><?= Html::encode($this->title) ?> | My Yii2 Application</title>
  21. <?php $this->head() ?>
  22. </head>
  23. <body>
  24. <?php $this->beginBody() ?>
  25. <div class="wrap">
  26. <?php
  27. NavBar::begin([
  28. 'brandLabel' => 'My Company',
  29. 'brandUrl' => Yii::$app->homeUrl,
  30. 'options' => [
  31. 'class' => 'navbar-inverse navbar-fixed-top',
  32. ],
  33. ]);
  34. echo Nav::widget([
  35. 'options' => ['class' => 'navbar-nav navbar-right'],
  36. 'items' => [
  37. ['label' => 'Home', 'url' => ['/site/index']],
  38. ['label' => 'About', 'url' => ['/site/about']],
  39. ['label' => 'Contact', 'url' => ['/site/contact']],
  40. Yii::$app->user->isGuest ? (
  41. ['label' => 'Login', 'url' => ['/site/login']]
  42. ) : (
  43. '<li>'
  44. . Html::beginForm(['/site/logout'], 'post')
  45. . Html::submitButton(
  46. 'Logout (' . Yii::$app->user->identity->username . ')',
  47. ['class' => 'btn btn-link logout']
  48. )
  49. . Html::endForm()
  50. . '</li>'
  51. ),
  52. ],
  53. ]);
  54. NavBar::end();
  55. ?>
  56. <div class="container">
  57. <?= Breadcrumbs::widget([
  58. 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
  59. ]) ?>
  60. <?= $content ?>
  61. </div>
  62. </div>
  63. <footer class="footer">
  64. <div class="container">
  65. <p class="pull-left">&copy; My Company <?= date('Y') ?></p>
  66. <p class="pull-right"><?= Yii::powered() ?></p>
  67. </div>
  68. </footer>
  69. <?php $this->endBody() ?>
  70. </body>
  71. </html>
  72. <?php $this->endPage() ?>

在上述布局文件中,我们使用了Yii2的Bootstrap扩展来构建导航栏和面包屑导航,同时包含了页面头部、主体内容和页脚的基本结构。$content变量用于在适当的位置嵌入视图内容。

3.2.3 配置控制器以使用布局

在Yii2中,你可以通过配置控制器或视图文件来指定使用的布局。通常,我们会在控制器的$layout属性中指定布局文件的名称(不包括.php扩展名)。但是,为了更灵活地控制布局的使用,Yii2允许你在视图文件中通过调用$this->layout来动态设置布局。

不过,在本例中,我们假设希望整个应用的视图都使用main.php布局,因此可以在应用的配置文件中统一设置。打开config/web.php文件,在components数组中添加或修改view组件的配置,指定默认布局:

  1. 'components' => [
  2. 'view' => [
  3. 'theme' => [
  4. 'basePath' => '@app/views',
  5. 'pathMap' => ['@app/views' => '@app/themes/basic/views'],
  6. 'baseUrl' => '@web/themes/basic',
  7. ],
  8. 'layout' => 'main', // 指定默认布局为main.php
  9. ],
  10. // 其他组件配置...
  11. ],

注意:上面的配置还包含了主题(Theme)的设置,这是一个可选的功能,用于支持多主题切换。如果你的项目不需要使用主题,可以省略这部分配置。

3.2.4 渲染首页视图

现在,我们已经有了布局文件,并配置了控制器(或全局)以使用它。接下来,我们需要创建一个首页视图文件,并确保它能够被正确渲染。

views/site目录下创建一个名为index.php的文件,该文件将作为首页的视图内容。内容可以非常简单,例如:

  1. <!-- views/site/index.php -->
  2. <div class="site-index">
  3. <div class="jumbotron">
  4. <h1>Congratulations!</h1>
  5. <p class="lead">You have successfully created your Yii-powered application.</p>
  6. <p><a class="btn btn-lg btn-success" href="http://www.yiiframework.com">Get started with Yii</a></p>
  7. </div>
  8. <div class="body-content">
  9. <div class="row">
  10. <div class="col-lg-4">
  11. <h2>Heading</h2>
  12. <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Sed do eiusmod
  13. tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
  14. quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
  15. consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
  16. cillum dolore eu fugiat nulla pariatur.</p>
  17. <p><a class="btn btn-default" href="http://www.yiiframework.com/doc/">Yii Documentation &raquo;</a></p>
  18. </div>
  19. <!-- 更多列内容... -->
  20. </div>
  21. </div>
  22. </div>

当访问首页时(通常是URL的根路径,如http://yourdomain.com/),Yii2会自动找到SiteController中的actionIndex方法(或对应的index动作),渲染views/site/index.php视图文件,并将渲染结果嵌入到views/layouts/main.php布局文件中的$content占位符位置,最终生成完整的HTML页面并发送给客户端。

3.2.5 小结

通过本章节的学习,我们掌握了在Yii2项目中创建和使用布局来渲染首页视图的基本流程。布局的使用不仅提高了代码的重用性,还使得页面的结构和样式更加统一和易于管理。随着项目的深入,你可能会创建多个布局文件以适应不同的页面需求,但基本的原理和步骤是相似的。希望本章节的内容能为你的Yii2项目开发之路提供有力的支持。


该分类下的相关小册推荐: