Spec-Zone.ru › Yii 2.0

Представления

  1. Создание представлений
  2. Отображение представлений
  3. Макеты
  4. Использование компонентов представлений
  5. События представления
  6. Отображение статических страниц
  7. Рекомендации по лучшим практикам

Представления являются частью архитектуры MVC. Они представляют собой код, ответственный за предоставление данных конечным пользователям. В веб-приложении представления обычно создаются в виде шаблонов представлений, которые являются файлами скриптов PHP, содержащими в основном HTML-код и презентационный PHP-код. Они управляются компонентом приложения представления приложения, который предоставляет общеиспользуемые методы для облегчения композиции и отображения представлений. Для простоты мы часто называем шаблоны представлений или файлы шаблонов представлений просто представлениями.

Создание представлений

Как уже упоминалось, представление представляет собой просто PHP-скрипт, смешанный с HTML и PHP-кодом. Ниже приведено представление, отображающее форму входа. Как видите, PHP-код используется для генерации динамического содержимого, такого как заголовок страницы и форма, а HTML-код организует их в презентабельную HTML-страницу.

<?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(); ?>

Внутри представления вы можете получить доступ к $this, что относится к компоненту представления, управляющему и отображающему этот шаблон представления.

Помимо $this, в представлении могут быть другие предварительно определенные переменные, такие как $model в приведенном выше примере. Эти переменные представляют данные, переданные в представление контроллерами или другими объектами, которые вызывают отображение представления.

Подсказка: Предварительно определенные переменные перечислены в блоке комментариев в начале представления для того, чтобы их можно было распознать IDE. Это также хороший способ документирования ваших представлений.

Безопасность

При создании представлений, генерирующих HTML-страницы, важно кодировать и/или фильтровать данные, поступающие от конечных пользователей, перед их отображением. В противном случае ваше приложение может подвергнуться атакам скриптинга на межсайтовых подключениях (XSS).

Для отображения обычного текста сначала закодируйте его, вызвав yii\helpers\Html::encode(). Например, следующий код кодирует имя пользователя перед отображением:

<?php
use yii\helpers\Html;
?>

<div class="username">
    <?= Html::encode($user->name) ?>
</div>

Для отображения HTML-содержимого используйте yii\helpers\HtmlPurifier для фильтрации содержимого перед отображением. Например, следующий код фильтрует содержимое публикации перед отображением:

<?php
use yii\helpers\HtmlPurifier;
?>

<div class="post">
    <?= HtmlPurifier::process($post->text) ?>
</div>

Подсказка: Хотя HtmlPurifier отлично справляется с обеспечением безопасности вывода, он не быстрый. Вы должны рассмотреть возможность кеширования результата фильтрации, если ваше приложение требует высокой производительности.

Организация представлений

Как и контроллеры и модели, существуют соглашения по организации представлений.

  • Для представлений, отображаемых контроллером, они по умолчанию должны храниться в каталоге @app/views/ControllerID, где ControllerID ссылается на идентификатор контроллера. Например, если класс контроллера PostController, каталог будет @app/views/post; если это PostCommentController, каталог будет @app/views/post-comment. В случае, если контроллер принадлежит модулю, каталог будет views/ControllerID в каталоге модуля.
  • Для представлений, отображаемых в виджете, они по умолчанию должны храниться в каталоге WidgetPath/views , где WidgetPath обозначает каталог, содержащий файл класса виджета.
  • Для представлений, отображаемых другими объектами, рекомендуется следовать аналогичному соглашению, как и для виджетов.

Вы можете настроить эти каталоги представлений по умолчанию, переопределяя метод yii\base\ViewContextInterface::getViewPath() контроллеров или виджетов.

Отображение представлений

Вы можете отображать представления в контроллерах, виджетах или в других местах, вызывая методы отображения представлений. Эти методы имеют похожую сигнатуру, показанную ниже,

/**
 * @param string $view view name or file path, depending on the actual rendering method
 * @param array $params the data to be passed to the view
 * @return string rendering result
 */
methodName($view, $params = [])

Отображение в контроллерах

В контроллерах вы можете вызвать следующие методы контроллера для отображения представлений:

  • render(): отображает имя представления и применяет макет к результату отображения.
  • renderPartial(): отображает имя представления без макета.
  • renderAjax(): отображает имя представления без макета и вставляет все зарегистрированные скрипты/CSS-файлы. Обычно используется в ответ на AJAX-запросы.
  • renderFile(): отображает представление, указанное в виде пути к файлу представления или псевдонима.
  • renderContent(): отображает статическую строку, встраивая её в текущий применимый макет. Этот метод доступен с версии 2.0.1.

Например,

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;
        }

        // renders a view named "view" and applies a layout to it
        return $this->render('view', [
            'model' => $model,
        ]);
    }
}

Отображение в виджетах

В виджетах вы можете вызвать следующие методы виджета для отображения представлений.

  • render(): отображает имя представления.
  • renderFile(): отображает представление, указанное в виде пути к файлу представления или псевдонима.

Например,

namespace app\components;

use yii\base\Widget;
use yii\helpers\Html;

class ListWidget extends Widget
{
    public $items = [];

    public function run()
    {
        // renders a view named "list"
        return $this->render('list', [
            'items' => $this->items,
        ]);
    }
}

Отображение в представлениях

Вы можете отобразить представление внутри другого представления, вызвав один из следующих методов, предоставляемых компонентом представления:

  • render(): отображает имя представления.
  • renderAjax(): отображает имя представления и вставляет все зарегистрированные скрипты/CSS-файлы. Обычно используется в ответ на AJAX-запросы.
  • renderFile(): отображает представление, указанное в виде пути к файлу представления или псевдонима.

Например, следующий код в представлении отображает файл представления _overview.php, который находится в той же директории, что и текущее отображаемое представление. Помните, что $this в представлении относится к компоненту представления:

<?= $this->render('_overview') ?>

Отображение в других местах

В любом месте вы можете получить доступ к компоненту приложения представления с помощью выражения Yii::$app->view и затем вызвать его вышеуказанные методы для отображения представления. Например,

// displays the view file "@app/views/site/license.php"
echo \Yii::$app->view->renderFile('@app/views/site/license.php');

Имена представлений

Когда вы отображаете представление, вы можете указать представление, используя либо имя представления, либо путь к файлу представления/псевдоним. В большинстве случаев вы будете использовать первое, потому что это более кратко и гибко. Мы называем представления, заданные с помощью имён, именованными представлениями.

Имя представления разрешается в соответствующий путь к файлу представления в соответствии со следующими правилами:

  • Имя представления может опускать имя расширения файла. В этом случае используется .php в качестве расширения. Например, имя представления about соответствует имени файла about.php.
  • Если имя представления начинается с двойных слэшей //, соответствующий путь к файлу представления будет @app/views/ViewName. То есть представление ищется в каталоге пути представления приложения. Например, //site/about будет разрешено в @app/views/site/about.php.
  • Если имя представления начинается с одного слэша /, путь к файлу представления формируется путём добавления имени представления к пути представления активного модуля. Если активный модуль отсутствует, используется @app/views/ViewName. Например, /user/create будет разрешено в @app/modules/user/views/user/create.php, если активный модуль — user. Если активного модуля нет, путь к файлу представления будет @app/views/user/create.php.
  • Если представление отображается с контекстом и контекст реализует yii\base\ViewContextInterface, путь к файлу представления формируется путём добавления пути представления контекста к имени представления. Это в основном относится к представлениям, отображаемым внутри контроллеров и виджетов. Например, about будет разрешено в @app/views/site/about.php если контекст — контроллер SiteController.
  • Если представление отображается внутри другого представления, каталог, содержащий файл другого представления, добавляется в начало имени нового представления для формирования фактического пути к файлу представления. Например, item будет разрешено в @app/views/post/item.php если оно отображается в представлении @app/views/post/index.php.

Согласно этим правилам, вызов $this->render('view') в контроллере app\controllers\PostController фактически отобразит файл представления @app/views/post/view.php, а вызов $this->render('_overview') в этом представлении отобразит файл представления @app/views/post/_overview.php.

Доступ к данным в представлениях

Существует два подхода к доступу к данным в представлении: push и pull.

Передавая данные в качестве второго параметра методам отображения представлений, вы используете подход push. Данные должны быть представлены в виде массива пар "имя-значение". При отображении представления вызывается PHP-функция extract() для этого массива, чтобы данные извлекались в переменные в представлении. Например, следующий код отображения представления в контроллере передаст две переменные в представление report: $foo = 1 и $bar = 2.

echo $this->render('report', [
    'foo' => 1,
    'bar' => 2,
]);

Подход pull активно извлекает данные из компонента представления или других объектов, доступных в представлениях (например, Yii::$app). Используя пример кода ниже, внутри представления вы можете получить объект контроллера с помощью выражения $this->context. В результате вы можете получить доступ к любым свойствам или методам контроллера в представлении report, таком как идентификатор контроллера, показанный ниже:

The controller ID is: <?= $this->context->id ?>

Подход push обычно является предпочтительным способом доступа к данным в представлениях, потому что он делает представления менее зависимыми от объектов контекста. Его недостатком является то, что вам нужно вручную создавать массив данных каждый раз, что может стать утомительным и подверженным ошибкам, если представление используется и отображается в разных местах.

Обмен данными между представлениями

Компонент представления предоставляет свойство params, которое можно использовать для обмена данными между представлениями.

Например, в представлении about можно использовать следующий код, который определяет текущий сегмент хлебных крошек.

$this->params['breadcrumbs'][] = 'About Us';

Затем, в файле макета, который также является представлением, можно отобразить хлебные крошки, используя передаваемые данные params:

<?= yii\widgets\Breadcrumbs::widget([
    'links' => isset($this->params['breadcrumbs']) ? $this->params['breadcrumbs'] : [],
]) ?>

Макеты

Макеты — это специальный тип представлений, представляющий общие части нескольких представлений. Например, страницы большинства веб-приложений используют одинаковый заголовок и подвал страницы. Хотя вы можете повторять заголовок и подвал страницы на каждой странице, лучший способ сделать это — один раз в макете и встроить результат рендеринга представления содержимого в нужное место в макете.

Создание макетов

Поскольку макеты также являются представлениями, они могут быть созданы аналогичным образом, как и обычные представления. По умолчанию макеты хранятся в каталоге @app/views/layouts. Для макетов, используемых в рамках модуля, они должны храниться в каталоге views/layouts в каталоге модуля. Можно настроить каталог макета по умолчанию, настроив свойство yii\base\Module::$layoutPath приложения или модулей.

Следующий пример показывает, как выглядит макет. Для наглядности код в макете сильно упрощен. На практике вы можете добавить в него больше содержимого, например, теги head, основное меню и т. д.

<?php
use yii\helpers\Html;

/* @var $this yii\web\View */
/* @var $content string */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
    <header>My Company</header>
    <?= $content ?>
    <footer>&copy; 2014 by My Company</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>

Как видите, макет генерирует HTML-теги, общие для всех страниц. Внутри раздела <body> макет отражает переменную $content, которая представляет результат рендеринга представления содержимого и передается в макет при вызове yii\base\Controller::render().

Большинство макетов должны вызывать следующие методы, как показано в приведенном выше коде. Эти методы в основном вызывают события относительно процесса рендеринга, чтобы скрипты и теги, зарегистрированные в других местах, могли быть должным образом вставлены в места, где вызываются эти методы.

  • beginPage(): Этот метод должен вызываться в самом начале макета. Он вызывает событие EVENT_BEGIN_PAGE, которое указывает на начало страницы.
  • endPage(): Этот метод должен вызываться в конце макета. Он вызывает событие EVENT_END_PAGE, которое указывает на конец страницы.
  • head(): Этот метод должен вызываться в разделе <head> HTML-страницы. Он генерирует заполнитель, который будет заменен зарегистрированным HTML-кодом (например, тегами link, мета-тегами) после завершения рендеринга страницы.
  • beginBody(): Этот метод должен вызываться в начале раздела <body>. Он вызывает событие EVENT_BEGIN_BODY и генерирует заполнитель, который будет заменен зарегистрированным HTML-кодом (например, JavaScript), предназначенным для начала тела.
  • endBody(): Этот метод должен вызываться в конце раздела <body>. Он вызывает событие EVENT_END_BODY и генерирует заполнитель, который будет заменен зарегистрированным HTML-кодом (например, JavaScript), предназначенным для конца тела.

Доступ к данным в макетах

Внутри макета вы можете получить доступ к двум предопределенным переменным: $this и $content. Первая относится к компоненту представления, как и в обычных представлениях, а вторая содержит результат рендеринга представления содержимого, который рендерится при вызове метода render() в контроллерах.

Если вам нужно получить доступ к другим данным в макетах, вам необходимо использовать метод pull, как описано в разделе «Доступ к данным в представлениях». Если вы хотите передать данные из представления содержимого в макет, вы можете использовать метод, описанный в разделе «Обмен данными между представлениями».

Использование макетов

Как описано в разделе «Рендеринг в контроллерах», при рендеринге представления вызовом метода 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';
    
    // ...
}

Для контроллеров, принадлежащих модулю, можно также настроить свойство макета модуля для использования определенного макета для этих контроллеров.

Поскольку свойство layout может настраиваться на разных уровнях (контроллеры, модули, приложение), Yii выполняет два шага, чтобы определить фактический используемый файл макета для конкретного контроллера.

На первом шаге определяется значение макета и контекстный модуль:

  • Если свойство yii\base\Controller::$layout контроллера не null, используйте его в качестве значения макета и модуль контроллера в качестве контекстного модуля.
  • Если свойство yii\base\Controller::$layout контроллера null, перебирайте все родительские модули (включая само приложение) контроллера и найдите первый модуль, чье свойство макета не null. Используйте этот модуль и его значение макета в качестве контекстного модуля и выбранного значения макета. Если такой модуль не найден, это означает, что макет не будет применен.

На втором шаге определяется фактический файл макета в соответствии со значением макета и контекстным модулем, определенными на первом шаге. Значение макета может быть:

  • псевдонимом пути (например, @app/views/layouts/main).
  • абсолютным путем (например, /main): значение макета начинается с косой черты. Фактический файл макета будет искаться в каталоге макета приложения, который по умолчанию равен @app/views/layouts.
  • относительным путем (например, main): фактический файл макета будет искаться в каталоге макета контекстного модуля, который по умолчанию находится в каталоге views/layouts в каталоге модуля.
  • логическое значение false: макет не будет применен.

Если значение макета не содержит расширения файла, оно будет использовать значение по умолчанию .php.

Вложенные макеты

Иногда может потребоваться вложить один макет в другой. Например, в разных разделах веб-сайта вы хотите использовать разные макеты, но все эти макеты используют один и тот же базовый макет, который генерирует общую структуру HTML5 страницы. Этого можно достичь, вызвав beginContent() и endContent() во вложенных макетах, как показано ниже:

<?php $this->beginContent('@app/views/layouts/base.php'); ?>

...child layout content here...

<?php $this->endContent(); ?>

Как показано выше, содержимое вложенного макета должно быть заключено в beginContent() и endContent(). Параметр, передаваемый в beginContent(), определяет родительский макет. Он может быть файлом макета или псевдонимом.

Используя приведенный выше подход, вы можете вкладывать макеты на нескольких уровнях.

Использование блоков

Блоки позволяют определить содержимое представления в одном месте, а отобразить его в другом. Они часто используются вместе с макетами. Например, вы можете определить блок в представлении содержимого и отобразить его в макете.

Вы вызываете beginBlock() и endBlock() для определения блока. К блоку затем можно получить доступ через $view->blocks[$blockID], где $blockID обозначает уникальный идентификатор, который вы назначаете блоку при его определении.

Следующий пример показывает, как можно использовать блоки для настройки определенных частей макета в представлении содержимого.

Сначала в представлении содержимого определите один или несколько блоков:

...

<?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 или его дочернего класса, в большинстве случаев вы будете использовать компонент приложения view. Этот компонент можно настроить в настройках приложения, как показано ниже:

[
    // ...
    'components' => [
        'view' => [
            'class' => 'app\components\View',
        ],
        // ...
    ],
]

Компоненты представлений обеспечивают следующие полезные функции, связанные с представлениями, каждая из которых описана более подробно в отдельном разделе:

  • темы: позволяет разрабатывать и изменять темы вашего веб-сайта.
  • кеширование фрагментов: позволяет кешировать фрагмент на веб-странице.
  • обработка клиентских скриптов: поддерживает регистрацию и рендеринг CSS и JavaScript.
  • обработка пакетов ресурсов: поддерживает регистрацию и рендеринг пакетов ресурсов.
  • альтернативные движки шаблонов: позволяет использовать другие движки шаблонов, такие как Twig, Smarty.

При разработке веб-страниц вы можете часто использовать следующие полезные, но небольшие, функции.

Установка заголовков страниц

Каждая веб-страница должна иметь заголовок. Обычно тег title отображается в макете. Однако на практике заголовок часто определяется в представлениях контента, а не в макетах. Для решения этой проблемы yii\web\View предоставляет свойство title, чтобы передавать информацию о заголовке из представлений контента в макеты.

Чтобы использовать эту функцию, в каждом представлении контента вы можете установить заголовок страницы следующим образом:

<?php
$this->title = 'My page title';
?>

Затем в макете убедитесь, что у вас есть следующий код в разделе <head>:

<title><?= Html::encode($this->title) ?></title>

Регистрация мета-тегов

Веб-страницы обычно должны генерировать различные мета-теги, необходимые различным сторонам. Как и заголовки страниц, мета-теги появляются в разделе <head> и обычно генерируются в макетах.

Если вы хотите указать, какие мета-теги генерировать в представлениях контента, вы можете вызвать 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');

Регистрация тегов link

Как и мета-теги, теги link полезны во многих случаях, таких как настройка favicon, указание ссылки на RSS-ленту или делегирование OpenID на другой сервер. Вы можете работать с тегами link аналогично мета-тегам, используя yii\web\View::registerLinkTag(). Например, в представлении контента вы можете зарегистрировать тег link следующим образом:

$this->registerLinkTag([
    'title' => 'Live News for Yii',
    'rel' => 'alternate',
    'type' => 'application/rss+xml',
    'href' => 'http://www.yiiframework.com/rss.xml/',
]);

Вышеприведенный код приведет к

<link title="Live News for Yii" rel="alternate" type="application/rss+xml" href="http://www.yiiframework.com/rss.xml/">

Аналогично registerMetaTag(), вы можете указать ключ при вызове registerLinkTag(), чтобы избежать генерации повторяющихся тегов link.

События представлений

Компоненты представлений вызывают несколько событий во время процесса рендеринга представления. Вы можете реагировать на эти события, чтобы вставлять контент в представления или обрабатывать результаты рендеринга перед отправкой их конечным пользователям.

  • EVENT_BEFORE_RENDER: срабатывает в начале рендеринга файла в контроллере. Обработчики этого события могут установить yii\base\ViewEvent::$isValid в false для отмены процесса рендеринга.
  • EVENT_AFTER_RENDER: срабатывает после рендеринга файла вызовом yii\base\View::afterRender(). Обработчики этого события могут получить результат рендеринга через yii\base\ViewEvent::$output и могут изменить это свойство для изменения результата рендеринга.
  • EVENT_BEGIN_PAGE: срабатывает при вызове yii\base\View::beginPage() в макетах.
  • EVENT_END_PAGE: срабатывает при вызове yii\base\View::endPage() в макетах.
  • EVENT_BEGIN_BODY: срабатывает при вызове yii\web\View::beginBody() в макетах.
  • EVENT_END_BODY: срабатывает при вызове yii\web\View::endBody() в макетах.

Например, следующий код вставляет текущую дату в конец тела страницы:

\Yii::$app->view->on(View::EVENT_END_BODY, function () {
    echo date('Y-m-d');
});

Рендеринг статических страниц

Статические страницы — это веб-страницы, основной контент которых в основном статичен, без необходимости доступа к динамическим данным, передаваемым из контроллеров.

Вы можете выводить статические страницы, поместив их код в представление, а затем используя код следующим образом в контроллере:

public function actionAbout()
{
    return $this->render('about');
}

Если веб-сайт содержит много статических страниц, повторять похожий код многократно будет очень утомительно. Для решения этой проблемы вы можете ввести автономное действие standalone action, называемое yii\web\ViewAction, в контроллере. Например,

namespace app\controllers;

use yii\web\Controller;

class SiteController extends Controller
{
    public function actions()
    {
        return [
            'page' => [
                'class' => 'yii\web\ViewAction',
            ],
        ];
    }
}

Теперь, если вы создадите представление с именем about в каталоге @app/views/site/pages, вы сможете отобразить это представление по следующему URL:

http://localhost/index.php?r=site%2Fpage&view=about

Параметр GET view сообщает yii\web\ViewAction, какое представление запрашивается. Затем действие будет искать это представление в каталоге @app/views/site/pages. Вы можете настроить yii\web\ViewAction::$viewPrefix, чтобы изменить каталог для поиска этих представлений.

Рекомендации по лучшим практикам

Представления отвечают за представление моделей в формате, который желают конечные пользователи. В общем, представления

  • должны содержать в основном код представления, такой как HTML, и простой PHP-код для обхода, форматирования и рендеринга данных.
  • не должны содержать код, выполняющий запросы к базе данных. Такой код должен выполняться в моделях.
  • должны избегать прямого доступа к данным запроса, например к $_GET, $_POST. Это относится к контроллерам. Если данные запроса необходимы, они должны передаваться в представления контроллерами.
  • могут считывать свойства модели, но не должны их изменять.

Чтобы сделать представления более управляемыми, избегайте создания слишком сложных представлений или представлений, содержащих слишком много повторяющегося кода. Вы можете использовать следующие методы для достижения этой цели:

  • используйте макеты для представления общих разделов представления (например, заголовок страницы, подвал).
  • разделите сложное представление на несколько меньших. Меньшие представления могут быть рендерированы и объединены в более крупное с использованием методов рендеринга, которые мы описали.
  • создавайте и используйте виджеты в качестве строительных блоков представлений.
  • создавайте и используйте вспомогательные классы для преобразования и форматирования данных в представлениях.

© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc-2.0/guide-structure-views.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API