Принцип построения шаблонов

Пример работы с шаблоном новостей

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

Но как показала наша практика, в 90% случаев он не нужен.

Если вы придерживаетесь правила, что все данные готовятся до передачи в шаблон, то сам шаблон остается "чистым".


Рассмотрим на пример работу с шаблоном в MIND CMS

По умолчанию в системе, любой php файл может быть шаблоном. Принцип передачи данных в шаблон, крайне прост и выполняется примитивным классом HTML.

Для вызова класса, предусмотрена глобальная функция html().

Пример вызова шаблона:

html()->render(ФАЙЛ, ДАННЫЕ);

Как получить данные внутри шаблона?

можно просто их распечатать:

<? print_r($data); ?> / * в шаблоне они всегда будут в этой переменной */

И затем использовать в шаблоне, как пример:

<div class="panel">
<div class="panel-heading clearfix">
<div class="pull-left"><a href="#" class="btn btn-xs btn-primary"> Управление кодами</a></div>

</div>
<div class="panel-body">
.....
<input type="text" name="string" value="<?= $data['string']; ?>" class="form-control">
<label for="length">Количество символов в коде</label>
<input type="number" name="length" value="<?= $data['length']; ?>" class="form-control">
<label for="num">Общее количество кодов для генерации</label>
<input type="number" name="num" value="<?= $data['num']; ?>" class="form-control">
.....
</form>
</div>
</div>


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

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

<?php if (class_exists('modules\backupdb\controllers\Admin')) { ?>
<div class="col-sm-3">
<div class="panel">
<div class="panel-heading"><a href="/backupdb/admin" class="btn btn-xs btn-primary">Бэкап
</a> - базы данных (DB)
</div>
<div class="panel-body">
Рекомендуем, делать бэкап Базы данных, хотя бы раз в месяц.
</div>
</div>
</div>
<?php } ?>


При правильном составлении кода, все остается, более чем читаемо. И именно этой идеи мы и пытались добиться.


Где и как хранить шаблоны


Как мы уже проговорили, шаблон это всего лишь PHP скрипт. Соотвественно лежать он может где угодно. Но лучше соблюдать простые правила:

1. Шаблон всего дизайна должен лежать в папке system->templates->front->НАЗВАНИЕ ШАБЛОНА->НАЗВАНИЕ ШАБЛОНА.php. Обратите внимание, что название папки должно быть такое же, как и у файла. В этом случае, система сможет подсвечивать ваш шаблон, в многих модулях. Например, тех же страницах.

2. Все ccs, js, картинки и шриты должны лежать в папке www->assets->templates->НАЗВАНЕ ШАБЛОНА

Обращаем внимание, что это скорее соглашение, нежели требование.


Где хранить шаблоны модуля


Модуль как правило, выводит свою информацию в "контент зону". Тем самым он скорее готовит информацию, для кусочка основного шаблона. Более того, модуль как правило ставится автономно, поэтому шаблоны модуля должны лежать в папке модуля, соответственно путь будет такой:

system->modules->ВАШ МОДУЛЬ->templates

А уже внутри этой папки, вы можете создавать любую структуру.

Все стили шаблона, картинки, шрифты и т.д. должны лежать в папке:

www->assets->modules->ВАШ МОДУЛЬ

Опять же, это скорее соглашание, нежели требование.


Для получения данных для шаблона можно использовать:

Модели

Хардкод

Хелперы

Регистрация JS и CSS файлов дя шаблона

Регистрация CSS

В процессе работы вам надо из своих модулей "пробрасывать" скрипты и стили в основной шаблон. Для этого в системе в классе Html предусмотрен целый ряд методов.

Рассмотрим их на примере:

html()->css(); // может регистрировать и выводить
html()->setCss(); //только регистрирует

Методы синонимы, но немножно отличаются поведением. Об этом позже.

Главное что на вход можете передать ссылку на свой Css файл, например так:

html->setCss("/assets/vendors/Jquery/jquery-3.2.1.min.css");
html->setCss("/assets/vendors/mystyle/style.css");

Эта строка зарегистрирует ваш Css файл, и затем отобразит уже на странице в дизайне. Для отрисовки всех зарегистрированных файлов используется методо showCss() или просто css(). Рассмотрим на примере:

html->showCss();

В месте вызова отобразит:

<link rel="stylesheet" href="/assets/vendors/Jquery/jquery-3.2.1.min.css">
<link rel="stylesheet" href="/assets/vendors/mystyle/style.css">

Если же вызвать с параметром кэширования:

html->showCss(true); 
*Вместо этого вызова можно сделать просто: html()->css();

C параметром TRUE он выведет иной результат:

<link rel="stylesheet" type="text/css" href="public/cache/css/7dd16ce4005097323bcf605e9c1f56f9.css?1600936589">

Регистрация JS файлов

Работа с js файлами практически полностью идеинтична работе с CSS файлами, примеры:

Регистрация JS файлов:

html()->js("/assets/vendors/Jquery/jquery-3.2.1.min.js"); // может регистрировать и выводить

html()->setJs("/assets/vendors/my/custom.js"); //только регистрирует

Затем в шаблоне делаем вывод

html()->showJs();

html()->js();

Еще одной особеноность метода setJs, это возможность передать inline скприт, в шаблон, пример:

html()->setJs('console.log("ALARM!");',false,true); //первый параметр код, 
//второй - что выводим в конце,
//третий что это inline code

при таком вызове в коде шаблона появится:

<script language="JavaScript" type="text/javascript">
<!--
console.log("ALARM!");//-->
</script>


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