携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
视图
- 内容
- 应主要包含展示代码,如HTML, 和简单的PHP代码来控制、格式化和渲染数据;
- 不应包含执行数据查询代码,这种代码放在模型中;
- 应避免直接访问请求数据,如 $_GET, $_POST,这种应在控制器中执行, 如果需要请求数据,应由控制器推送到视图.
- 可读取模型属性,但不应修改它们
- 遵循方法
- 使用 布局 来展示公共代码(如,页面头部、尾部);
- 将复杂的视图分成几个小视图,可使用上面描述的渲染方法将这些 小视图渲染并组装成大视图;
- 创建并使用 小部件 作为视图的数据块;
- 创建并使用助手类在视图中转换和格式化数据.
创建视图
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
/* @var $this yii\web\View */
/* @var $form yii\widgets\ActiveForm */
/* @var $model app\models\LoginForm */
$this->title = 'Login';
?>
<h1><?= Html::encode($this->title) ?></h1>
<p>Please fill out the following fields to login:</p>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'password')->passwordInput() ?>
<?= Html::submitButton('Login') ?>
<?php ActiveForm::end(); ?>
渲染视图
- 控制器中渲染
- render(): 渲染一个 视图名 并使用一个 布局 返回到渲染结果.
- renderPartial(): 渲染一个 视图名 并且不使用布局
- renderAjax(): 渲染一个 视图名 并且不使用布局, 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下.别名下的视图文件.
namespace app\controllers; use Yii; use app\models\Post; use yii\web\Controller; use yii\web\NotFoundHttpException; class PostController extends Controller { public function actionView($id) { $model = Post::findOne($id); if ($model === null) { throw new NotFoundHttpException; } // 渲染一个名称为"view"的视图并使用布局 return $this->render('view', [ 'model' => $model, ]); } } - 小部件中渲染
- render(): 渲染一个 视图名.
- 别名下的视图文件.
namespace app\components; use yii\base\Widget; use yii\helpers\Html; class ListWidget extends Widget { public $items = []; public function run() { // 渲染一个名为 "list" 的视图 return $this->render('list', [ 'items' => $this->items, ]); } } - 视图中渲染
- render(): 渲染一个 视图名.
- renderAjax(): 渲染一个 视图名 并注入所有注册的JS/CSS脚本和文件,通常使用在响应AJAX网页请求的情况下.
- 别名下的视图文件
<?= $this->render('_overview') ?> - 其他地方渲染
//在任何地方都可以通过表达式 Yii::$app->view 访问 view 应用组件 // 显示视图文件 "@app/views/site/license.php" echo \Yii::$app->view->renderFile('@app/views/site/license.php'); 系统定义的路径别名 复制代码 @yii ——框架的目录. @app——当前正在运行的应用程序的基本路径. @common -公共文件目录. @frontend——前端web应用程序目录. @backend ——后端web应用程序目录. @console -控制台目录. @runtime——当前正在运行的web应用程序的运行时目录 @vendor ——基础框架目录. @web ——当前正在运行的web应用程序的url @webroot——当前正在运行的web应用程序的web根目录. - 视图名
- 视图名可省略文件扩展名,这种情况下使用 .php 作为扩展, 视图名 about 对应到 about.php 文件名
- 视图文件对应在view/控制器名/文件夹内
- 视图中访问数据
echo $this->render('report', [ 'foo' => 1, 'bar' => 2, ]); - 视图间共享数据
$this->params['breadcrumbs'][] = 'About Us'; <?= yii\widgets\Breadcrumbs::widget([ 'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [], ]) ?>
布局
布局是一种特殊的视图,代表多个视图的公共部分
模块中使用的布局应存储在 yii\base\Module::basePath模块目录下的views/layouts路径下,
可配置yii\base\Module::layoutPath来自定义应用或模块的布局默认路径.
使用视图组件
- 主题 : 允许为你的Web站点开发和修改主题;
- 片段缓存 : 允许你在Web页面中缓存片段;
- 客户脚本处理 : 支持CSS 和 JavaScript 注册和渲染;
- 资源包处理 : 支持 资源包的注册和渲染;
- 模板引擎 : 允许你使用其他模板引擎,如 Twig, Smarty.
- 设置页面标题
<?php $this->title = 'My page title'; ?> <head> <title><?= Html::encode($this->title) ?></title> </head> - 注册Meta元标签
<?php $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php']); ?> - 注册链接标签
$this->registerLinkTag([ 'title' => 'Live News for Yii', 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.yiiframework.com/rss.xml/', ]);