SKY / WINGS / SECOND /
VIEW1

Для генерации HTML обычно используются файлы view, располагающиеся чаще всего в папке view, например: view/_main.php. Это правило применимо не только к схеме построения веб-приложений с использованием MVC паттерна, но также и к другим, не MVC. Исключением могут быть веб-приложения наподобие WORK.SKY. Это приложение предназначено исключительно для программистов, в нем нет особых требований к дизайну, дизайнеры потенциально не могут быть привлечены к работе плюс есть другое важное требование: функционал приложения выбирается программистами по необходимости из большой базы, в которой каждый отдельный функционал умещается в один файл (и код и отображение). Это удобно для такого приложения, учитывая что может существовать много простых функционалов-модулей кастомизации.

Чаще всего же, архитектура SKY приложений использует view файлы, даже если MVC не используется. Для управления генерацией "вида" используются:

001
002
003
004
005
006
007
<?php
 
$sky->layout
$sky->style
$sky->body
$sky->_y # массив переменных вида, используемых на всех страницах
$sky->_v # массив переменных вида, разный для каждой отдельной страницы

Приложения редко используют множественные стили, поэтому $sky->style часто не используется и по умолчанию 
содержит пустую строку. Для приложений со стилями $sky->style содержит имя стиля, а view файлы помещаются в папку view/имя стиля, файлы в папке pub, также: pub/имя стиля, например view/summer/_main.php или pub/summer/front.css. Выбранные пользователями стили можно помещать в $user->v_style или $user->u_style. После идентификации, присваивать стиль: $sky->style = $user->v_style;

$sky->layout - содержит имя layout, по умолчанию это `main` и находится в index.php. Если $sky->layout имеет другое значение, например 'mobile', то используется view/y_mobile.php, где префикс y_ указывает на то что это файл layout.

Рассмотрим управление генерацией HTML на примере MVC. При запросе http://site-domain/user?edit переменная $PAGE получает значение 'user', а $PVAL 'edit'. Управление получает контроллер main/mvc/c_user.php и метод в нем c_edit(). Если контроллера c_user.php нет, то управление получает контроллер main/mvc/default_c.php и метод в нем c_user(). При это свойство $sky->body по умолчанию равно 'user', т.е. значению $PAGE и для формирования тела станицы будет использоваться view файл view/_user.php. Для стандартных AJAX запросов (с помощью JS функции ajax() из pub/wing.js), по умолчанию $sky->layout = $sky->body = '', т.е. ожидается, что тело ответа полностью генерируется в контроллере. Возвращаемые значения из контроллеров присваиваются $sky->body, поэтому вернув строку, например return 'user_row';, можно все-же активировать view тело отображения, в.т. числе и для AJAX.

Возврат из контроллера null ничего не изменяет (равносильно отсутствию инструкции return). Возврат `true` намерено отключает $sky->layout, $sky->body присваивая пустую строку. Возвратив 404 будет использован файл view/_404.php - "Страница не найдена". Если такого файла нет, страница ошибки будет сгенерирована автоматически ядром.

Маленькие шаблоны отображения можно объединять в один файл, например view/_pieces.php. Начало области и конец помечаются в PHP области кода так: #name#. Чтобы использовать часть файла для отображения нужно вернуть из контроллера (присвоить $sky->body) return 'pieces.name'; Это широко употребимо и для обычных view схем. Например при запросе AJAX часто нужно сгенерировать часть HTML, той страницы которая перед ним была выдана в браузер. Эти кусочки можно помечать в комментариях и использовать:
001
002
003
004
005
006
007
008
009
010
011
012
/* начало файла */
<div class="one-com"><?=$h_content?></div>
<div class="pad-com">
    <? #vote# ?>
    <span<?=$row->vote_p?> title="<?=t('голосовать положительно')?>">&nbsp;+&nbsp;</span>
    <span><?=$row->votes?></span>
    <span<?=$row->vote_m?> title="<?=t('голосовать отрицательно')?>">&nbsp;-&nbsp;</span>
    <a href="javascript:;" onclick="sky.com(this,<?=$row->px?>)" class="com"><?=t('ответить')?></a>
    <? #vote# ?>
</div>
/* продолжения файла */
 
В примере выше можно использовать кусочек: 'comments.vote';

Возвращая из контроллера массив PHP, $sky->layout и $sky->body автоматически отключатся, а в браузер будет отправлена JSON кодирование этого массива.

Возвращая из контроллера объект (stdObject), можно генерировать ответ для браузера составленный из разных кусочков view файлов. Например:
001
002
003
004
005
006
007
008
009
010
<?php
return (object)[
    'company' => ['id' => $id], # используется весь файл view/_company.php
    'sale.list' => ['e_sale' => $this->t_sale->listing("s.contact_id=$id")], # кусочек файла view/_sale.php
    '<p>'# тэг p передается напрямую
    'company.list' => ['e_company' => $this->t_company->listing("c.parent_id=$id")],
    'contact.list' => ['e_contact' => $this->t_contact->listing("c.contact_id=$id")],
    'project.list' => ['e_project' => $this->t_project->listing("p.customer_id=$id")],
];
 
В примере выше ключами массива, который преобразуется в объект, указываются кусочки состовляющие часть отображения, а значения этих ключей - массивы присваиваемые переменной $sky->_v из значения которой генерируются переменные для шаблонов.

В $sky->_y помещаются значения переменных, которые доступны на всех страницах, а в $sky->_v - текущей (или текущей составной части). Если в этих массивах определены переменные с префиксом, то они такими и будут во view файлах. А если без префикса, то он добавится автоматически. Например:
001
002
003
004
005
006
007
008
009
010
011
<?php
$this->_v = [
    'k_title' => $row->title,
    'k_metak' => "$row->meta_k, other keywords",
    'k_metad' => $row->meta_d,
    'title' => "$row->title - $row->file",
    'h_content' => $row->content,
    'e_com' => $this->t_coment->listing($row->id'core'),
    'y_js' => "sky.id = $row->id; sky.type = 'core';",
];
 
Для ключа 'title' сгенерируется переменная $v_title в файле view. Остальные ключи массива будут прямо соответствовать переменным, которые сгенерируются, точнее смотрите узел PREF

Если считать (а так делать часто наиболее уместно), что основная масса переменных $this->_y заполнилась в common_c::head_c(), а $this->_v заполнился в основном методе активного контроллера, то второе заполнение будет происходить позже первого и переменная $y_js переопределится при заполнении $this->_v.
опубликовано ENERGY - 18 Mar 2016 13:36 GMT
последнее редактирование - 18 Mar 2016 16:07 GMT
комментировать