View name
ビューをレンダリングするときは、ビュー名またはビュー ファイル パス/エイリアスを指定できます。ほとんどの場合、名前付きビューをビュー名と呼びます。前者が使用されます。
ビュー名は、次のルールに従って、対応するビュー ファイル パスに割り当てることができます:ビュー名ではファイル拡張子を省略できます。この場合、ビュー名 about は about.php ファイル名に対応します。 ビュー名は二重スラッシュ // で始まり、対応するビュー ファイルのパスは @app/views/ViewName です。つまり、ビュー ファイルはパス yiibaseApplication::viewPath の下にあります。たとえば、//site/about です。 @app/views/site/about.php に対応します。
ビュー名は単一のスラッシュ / で始まり、ビュー ファイルのパスは現在使用されているモジュールの yiibaseModule::viewPath で始まります。モジュールが存在しない場合は、たとえば、現在のモジュールの場合は @app/views/ViewName で始まります。 module が user の場合、/user/create が対応します。 @app/modules/user/views/user/create.php になります。モジュール内にない場合、/user/create は @app/views/user/create.php に対応します。 。
yiibaseView::context がビューをレンダリングし、コンテキストが yiibaseViewContextInterface を実装する場合、ビュー ファイルのパスはコンテキストの yiibaseViewContextInterface::getViewPath() で始まります。これは主に、たとえばコンテキストがコントローラーの場合にビューをレンダリングするために使用されます。 SiteController、site /about は @app/views/site/about.php に対応します。
ビューが別のビューをレンダリングする場合、他のビューのファイルを含むディレクトリは現在のビューのファイル パスで始まります。たとえば、ビュー @app/views/post/index.php によってレンダリングされる項目は @app/views/post/item に対応します。
上記のルールに従って、コントローラー内で appcontrollersPostController は $this->render('view') を呼び出します。これにより、$this-> が呼び出されるときに、実際に @app/views/post/view.php ビュー ファイルがレンダリングされます。ビュー ファイル、render('_overview') は @app/views/post/_overview.php ビュー ファイルをレンダリングします。
ビュー内のデータにアクセスするには、プッシュとプルの 2 つの方法があります。
プッシュ メソッドは、ビュー レンダリング メソッドの 2 番目のパラメーターを介してデータを渡します。データ形式は、ビューがレンダリングされるときに、PHP の extract() メソッドが呼び出され、配列が変数に変換されます。ビューにアクセスできます。 たとえば、次のコントローラーのレンダリング ビュー コードは、$foo = 1 と $bar = 2 という 2 つの変数をレポート ビューにプッシュします。
リーリープル メソッドを使用すると、ビューで yiibaseView ビュー コンポーネントまたは他のオブジェクト (Yii::$app など) からデータをアクティブに取得できます。ビュー内で次の式 $this->context を使用して、コントローラー ID を取得できます。レポート ビューでコントローラーのプロパティまたはメソッドを取得できます。たとえば、コントローラー ID を取得する次のコードがあります。
リーリープッシュメソッドは、ビューのコンテキストオブジェクトへの依存を少なくし、ビューがデータを取得するための推奨される方法です。欠点は、配列を手動で構築する必要があることであり、これは少し面倒で、別の方法でレンダリングするときにエラーが発生しやすいことです。場所。
ビュー間でデータを共有するyiibaseView ビューコンポーネントは、さまざまなビューがデータを共有できるようにする yiibaseView::params パラメーター属性を提供します。
たとえば、about ビューでは、次のコードを使用して、現在のパンくずリストの現在の部分を指定できます。
リーリーレイアウト ファイル (ビューでもあります) では、yiibaseView::params 配列に追加された値を使用して表示パンくずリストを生成できます:
リーリー レイアウトレイアウトは、複数のビューの共通部分を表す特別なビューです。たとえば、ほとんどの Web アプリケーションは同じヘッダーとフッターを共有し、すべてのビューで同じヘッダーとフッターを繰り返します。これらの共通のオブジェクトをレイアウトに配置するのがより良い方法です。レイアウトを作成し、コンテンツ ビューをレンダリングして、レイアウトの適切な場所に埋め込みます。
レイアウトを作成するレイアウトもビューなので、通常のビューと同じように作成できます。デフォルトでは、レイアウトは @app/views/layouts パスに保存されます。モジュールで使用されるレイアウトは、views/layouts パスに保存されます。 yiibaseModule::basePath モジュール ディレクトリ yiibaseModule::layoutPath を設定して、アプリケーションまたはモジュールのデフォルトのレイアウト パスをカスタマイズできます。
次の例は、大まかなレイアウトです。例として、多くのコードが簡略化されています。実際には、ヘッダー タグやメイン メニューなどのコンテンツを追加することもできます。
リーリー上記のように、レイアウトは各ページに共通の HTML タグを生成します。
内に、$content 変数は、yiibaseController::render() コントローラーのレンダリング時にレイアウトに渡されるコンテンツを表します。レンダリング結果を表示するメソッドが呼び出されます。ほとんどのビューは、上記のコードで次のメソッドを呼び出す必要があります。これにより、レンダリング プロセスに関するイベントがトリガーされ、他の場所で登録されたスクリプトとタグが、これらのメソッドが呼び出される場所に追加されます。
布局中访问数据
在布局中可访问两个预定义变量:$this 和 $content,前者对应和普通视图类似的yii\base\View 视图组件 后者包含调用yii\base\Controller::render()方法渲染内容视图的结果。
如果想在布局中访问其他数据,必须使用视图中访问数据一节介绍的拉取方式, 如果想从内容视图中传递数据到布局,可使用视图间共享数据一节中的方法。
使用布局
如控制器中渲染一节描述,当控制器调用yii\base\Controller::render() 方法渲染视图时,会同时使用布局到渲染结果中,默认会使用@app/views/layouts/main.php布局文件。
可配置yii\base\Application::layout 或 yii\base\Controller::layout 使用其他布局文件, 前者管理所有控制器的布局,后者覆盖前者来控制单个控制器布局。 例如,如下代码使 post 控制器渲染视图时使用 @app/views/layouts/post.php 作为布局文件, 假如layout 属性没改变,控制器默认使用 @app/views/layouts/main.php 作为布局文件。
namespace app\controllers; use yii\web\Controller; class PostController extends Controller { public $layout = 'post'; // ... }
对于模块中的控制器,可配置模块的 yii\base\Module::layout 属性指定布局文件应用到模块的所有控制器。
由于layout 可在不同层级(控制器、模块,应用)配置,在幕后Yii使用两步来决定控制器实际使用的布局。
第一步,它决定布局的值和上下文模块:
如果控制器的 yii\base\Controller::layout 属性不为空null,使用它作为布局的值, 控制器的 yii\base\Controller::module模块 作为上下文模块。
如果 yii\base\Controller::layout 为空,从控制器的祖先模块(包括应用) 开始找 第一个yii\base\Module::layout 属性不为空的模块,使用该模块作为上下文模块, 并将它的yii\base\Module::layout 的值作为布局的值, 如果都没有找到,表示不使用布局。
第二步,它决定第一步中布局的值和上下文模块对应到实际的布局文件,布局的值可为:
路径别名 (如 @app/views/layouts/main).
绝对路径 (如 /main): 布局的值以斜杠开始,在应用的[[yii\base\Application::layoutPath|layout path] 布局路径 中查找实际的布局文件,布局路径默认为 @app/views/layouts。
相对路径 (如 main): 在上下文模块的yii\base\Module::layoutPath布局路径中查找实际的布局文件, 布局路径默认为yii\base\Module::basePath模块目录下的views/layouts 目录。
布尔值 false: 不使用布局。
布局的值没有包含文件扩展名,默认使用 .php作为扩展名。
嵌套布局
有时候你想嵌套一个布局到另一个,例如,在Web站点不同地方,想使用不同的布局, 同时这些布局共享相同的生成全局HTML5页面结构的基本布局,可以在子布局中调用 yii\base\View::beginContent() 和yii\base\View::endContent() 方法,如下所示:
<?php $this->beginContent('@app/views/layouts/base.php'); ?> ...child layout content here... <?php $this->endContent(); ?>
如上所示,子布局内容应在 yii\base\View::beginContent() 和 yii\base\View::endContent() 方法之间,传给 yii\base\View::beginContent() 的参数指定父布局,父布局可为布局文件或别名。
使用以上方式可多层嵌套布局。
使用数据块
数据块可以在一个地方指定视图内容在另一个地方显示,通常和布局一起使用, 例如,可在内容视图中定义数据块在布局中显示它。
调用 yii\base\View::beginBlock() 和 yii\base\View::endBlock() 来定义数据块, 使用 $view->blocks[$blockID] 访问该数据块,其中 $blockID 为定义数据块时指定的唯一标识ID。
如下实例显示如何在内容视图中使用数据块让布局使用。
首先,在内容视图中定一个或多个数据块:
... <?php $this->beginBlock('block1'); ?> ...content of block1... <?php $this->endBlock(); ?> ... <?php $this->beginBlock('block3'); ?> ...content of block3... <?php $this->endBlock(); ?>
然后,在布局视图中,数据块可用的话会渲染数据块,如果数据未定义则显示一些默认内容。
... <?php if (isset($this->blocks['block1'])): ?> <?= $this->blocks['block1'] ?> <?php else: ?> ... default content for block1 ... <?php endif; ?> ... <?php if (isset($this->blocks['block2'])): ?> <?= $this->blocks['block2'] ?> <?php else: ?> ... default content for block2 ... <?php endif; ?> ... <?php if (isset($this->blocks['block3'])): ?> <?= $this->blocks['block3'] ?> <?php else: ?> ... default content for block3 ... <?php endif; ?> ...
使用视图组件
yii\base\View视图组件提供许多视图相关特性,可创建yii\base\View或它的子类实例来获取视图组件, 大多数情况下主要使用 view应用组件,可在应用配置中配置该组件, 如下所示:
[ // ... 'components' => [ 'view' => [ 'class' => 'app\components\View', ], // ... ], ]
视图组件提供如下实用的视图相关特性,每项详情会在独立章节中介绍:
开发Web页面时,也可能频繁使用以下实用的小特性。
设置页面标题
每个Web页面应有一个标题,正常情况下标题的标签显示在 布局中, 但是实际上标题大多由内容视图而不是布局来决定,为解决这个问题, yii\web\View 提供 yii\web\View::title 标题属性可让标题信息从内容视图传递到布局中。
为利用这个特性,在每个内容视图中设置页面标题,如下所示:
<?php $this->title = 'My page title'; ?> 然后在视图中,确保在 <head> 段中有如下代码: <title><?= Html::encode($this->title) ?></title>
注册Meta元标签
Web页面通常需要生成各种元标签提供给不同的浏览器,如
中的页面标题,元标签通常在布局中生成。如果想在内容视图中生成元标签,可在内容视图中调用yii\web\View::registerMetaTag()方法,如下所示:
<?php $this->registerMetaTag(['name' => 'keywords', 'content' => 'yii, framework, php']); ?>
以上代码会在视图组件中注册一个 "keywords" 元标签,在布局渲染后会渲染该注册的元标签, 然后,如下HTML代码会插入到布局中调用yii\web\View::head()方法处:
<meta name="keywords" content="yii, framework, php">
注意如果多次调用 yii\web\View::registerMetaTag() 方法,它会注册多个元标签,注册时不会检查是否重复。
为确保每种元标签只有一个,可在调用方法时指定键作为第二个参数, 例如,如下代码注册两次 "description" 元标签,但是只会渲染第二个。
$this->registerMetaTag(['name' => 'description', 'content' => 'This is my cool website made with Yii!'], 'description'); $this->registerMetaTag(['name' => 'description', 'content' => 'This website is about funny raccoons.'], 'description');
注册链接标签
和 Meta标签 类似,链接标签有时很实用,如自定义网站图标,指定Rss订阅,或授权OpenID到其他服务器。 可以和元标签相似的方式调用yii\web\View::registerLinkTag(),例如,在内容视图中注册链接标签如下所示:
$this->registerLinkTag([ 'title' => 'Live News for Yii', 'rel' => 'alternate', 'type' => 'application/rss+xml', 'href' => 'http://www.yiiframework.com/rss.xml/', ]);
上述代码会转换成
复制代码 代码如下:
和 yii\web\View::registerMetaTag() 类似, 调用yii\web\View::registerLinkTag() 指定键来避免生成重复链接标签。
视图事件
yii\base\View 视图组件会在视图渲染过程中触发几个事件, 可以在内容发送给终端用户前,响应这些事件来添加内容到视图中或调整渲染结果。
例如,如下代码将当前日期添加到页面结尾处:
\Yii::$app->view->on(View::EVENT_END_BODY, function () { echo date('Y-m-d'); });
渲染静态页面
静态页面指的是大部分内容为静态的不需要控制器传递动态数据的Web页面。
可将HTML代码放置在视图中,在控制器中使用以下代码输出静态页面:
public function actionAbout() { return $this->render('about'); }
如果Web站点包含很多静态页面,多次重复相似的代码显得很繁琐, 为解决这个问题,可以使用一个在控制器中称为 yii\web\ViewAction 的独立操作。 例如:
namespace app\controllers; use yii\web\Controller; class SiteController extends Controller { public function actions() { return [ 'page' => [ 'class' => 'yii\web\ViewAction', ], ]; } }
现在如果你在@app/views/site/pages目录下创建名为 about 的视图, 可通过如下rul显示该视图:
http://localhost/index.php?r=site/page&view=about
GET の view パラメータは yiiwebViewAction オペレーションにどのビューをリクエストするかを指示し、その後オペレーションは @app/views/site/pages ディレクトリでビューを検索します。 yiiwebViewAction::viewPrefix を設定してビューを検索するためのディレクトリを変更できます。
ベストプラクティス
ビューは、ユーザーが望む形式でモデルデータを表示する責任があります。つまり、ビュー
です。