FFCMS Wiki

Официальная документация разработчика и администратора

Инструменты пользователя

Инструменты сайта


core:mvc:viewer

Представление(вид)

Представления в FFCMS так же являются частью MVC архитектуры и являются конечными реализациями отображения бизнес-логики и прочих данных для пользователя. По большей части, виды представляют собой совокупность HTML/PHP и прочего кода, который отвечает за отображение и внешний вид. Все модели наследуют(неявно) класс Ffcms\Core\Arch\View и могут вызывать его методы и глобальные атрибуты через $this.

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

Как уже было сказано ранее, представление это простой набор php/html кода, который отвечает за конечное отображение части(или всей) страницы. Представления должны быть расположены в директории /Apps/Views в зависимости от типа интерфейса приложения и текущего пользовательского шаблона. К примеру, для интерфейса Front и пользовательского шаблона default представления должны располагаться в Apps/Views/Front/default/. Кроме того, желательно указывать директорию в зависимости от контроллера, который вызывает приложение, для примера выше и контроллера Demo полный путь будет следующим: Apps/Views/Front/default/demo/. Простой пример представления: file: /Apps/View/Front/default/demo/index.php

<?php
    /** @var $this Ffcms\Core\Arch\View */
    /** @var $model Apps\Model\Front\DemoModel */
 
    use Ffcms\Core\Helper\HTML\Form;
 
    $this->title = "Заголовок страницы";
?>
<h1><?= \App::$Security->strip_tags($this->title); ?></h1>
<hr />
<p>Это демонстрация представления в ffcms</p>
<?php $form = new Form($model, ['class' => 'form-horizontal', 'method' => 'post', 'action' => '']) ?>
<?= $form->field('login', 'inputText', ['class' => 'form-control'], __('Enter you login'));
<?= $form->submitButton('Send', ['class' => 'btn btn-success']);
<?= $form->finish() ?>

Как видите, в данном представлении используется как классическая html-разметка, так и динамическая php-шаблонизация. Здесь так же используется переменная $this, унаследованная от объекта класса представления. Так же используется переданный объект $model, который должен быть указан при инициации модели. Так же используется помощник (хэлпер) Form, который генерирует простой объект формы ввода данных.

Рендеринг из контроллера

Представления могут быть инициированы и обработаны в контроллере, где для них могут быть так же переданы различные объекты и переменные (см. пример выше для $model). Ниже предоставлен простой пример рендеринга из действия actionDemo в контроллере Demo:

public function actionDemo()
{
    $model = new Apps\Model\Front\DemoModel();
 
    $this->response = App::$View->render('index', [
        'model' => $model
    ]);
}

Обратите внимание, что в действии контроллера рендеринг модели должен быть обозначен в $this→response. Кроме возможности вывода через App::$View→render() представления могут быть вызваны и путем инициации изолированного объекта вида:

public function actionDemo()
{
    $model = new Apps\Model\Front\DemoModel();
 
    $this->response = (new View('index', [
        'model' => $model
    ]))->render();
}

Рендеринг из вида

Зачастую, практика организация представлений требует создания 2х или более представлений для 1ой страницы отображения, в виду того, что некоторые элементы могут повторяться и быть вторично использованными, или в виду сложности каркаса одного представления. Внутри представления, самым простым способом рендеринга является вызов метода render():

echo \App::$View->render('demo/other'); 

или из наследования $this:

echo $this->render('index', ['param1' => 'value']) 

Функция render принимает 2 аргумента: 1ый - это название представления, относительно текущего рабочего окружения, 2ой - набор параметров(не обязателен). Обратите внимание! Если ваше представление было вызвано через объектную модель инициации, как например:

public function actionAction()
{
    return (new View('index', []))->render()
}

то внутри представления index.php невозможно использовать включения других представлений через $this→render(), необходимо использовать аналогично динамические включения: (new View('file', []))→render()

Глобальные каркасы

На ряду с блоковыми представлениями, для организации вывода результата обработки приложения так же используются глобальные каркасы. Они представляют собой те же самые представления, однако применимы они для одного или нескольких блоков представлений в качестве глобального шаблона. По умолчанию при рендеринге представлений используется глобальный каркас layout/main.php, который обозначается в текущем контроллере, из которого вызвано представление. Глобальный каркас может быть изменен в теле контроллера: в методах before(), магическом __construct() или в определенном действии action. Примеры изменения глобального шаблона в теле контроллера:

namespace Apps\Controller\Front;
 
use Extend\Core\Arch\FrontController as Controller;
 
class Demo extends Controller 
{
    public function before()
    {
        $this->layout = 'other'; // @views/layout/other.php
    }
}

в данном примере произойдет изменение стандартного каркаса на layout/other.php для всех действий контроллера. Однако изменить стандартный каркас можно и только для одного (или нескольких) действий контроллера:

public function actionIndex()
{
    $this->layout = 'other';
 
    return 'hello world';
}

Глобальные переменные

Все представления в ffcms наследуют класс родитель Ffcms\Core\Arch\View и могут, как уже говорилось ранее, обращаться к его реализациям по средствам вызова $this. Кроме того, при помощи динамического обращения к $this→variable могут быть назначены глобальные переменные для всех представлений. Яркий пример такого глобального обозначения переменной - присвоение значений для $this→title в теле представлений и последующее отображение в глобальном каркасе. Рассмотрим наглядный пример. Допустим, у нас имеется представление user/login.php в котором мы устанавливаем заголовок страницы следующим образом:

<?php
$this->login = "Login page";
?>
<h1>Login page</h1>
<hr />
....

а в теле layout/main.php мы отображаем данный заголовок:

...
<?php 
if (null !== $this->title) {
    echo '<title>' . \App::$Security->strip_tags($title) . '</title>';
} else {
    echo '<title>Title is undefined!</title>';
}
?>
...

Таким образом мы назначили глобальную переменную для представлений (и не только, в том числе она доступна и для моделей и контроллеров).

Пост-рендеринг JS/CSS кода

Учитывая архитектуру приложений FFCMS и тенденции в развитии веб-технологий существует специальный алгоритм систематизации css/javascript кода и библиотек, которые будут использованы только в случае необходимости и будут вызваны именно в том месте страницы, где их загрузка вызовет минимум неудобств у пользователя.

Лучшие концепции

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

  • в основном содержать код, отвечающий за представление, такой как HTML и простой PHP
  • избегать содержания кода запросов к базе данных, данным сессии, cookie, входящим данным (post/get)
  • читать бизнес-данные моделей, однако избегать их изменения
  • использовать классы-хелперы для быстрого прототипирования объектов реализации, избегая сложного html и php кода

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

core/mvc/viewer.txt · Последние изменения: 2016/05/27 08:09 (внешнее изменение)