Интерфейсы
Во Flute по стандарту используется шаблонизатор BladeOne. Он идентичен с Blade от Laravel, так что если вы не знакомы с ним, рекомендую ознакомиться.
Как работают интерфейсы
Объясню принцип работы интерфейсов. Каждый запрос у нас идет рендер одного шаблона (home.blade.php
), который отдает нам sidebar
, navbar
и все мета-теги. Но как он это делает? Вряд ли в каждом модуле надо будет пр описывать все это.
Да, каждый шаблон делает @extends()
основного шаблона. По сути, в шаблоне идет не отрисовка контента, а добавление контента в другой шаблон, который и будет отрисован.
Понимаю трудно, давайте к практике скорее. Посмотрим стандартный layout
шаблона:
@cookie_alert
@lang_alert
<!DOCTYPE html>
<html lang="{{ app()->getLang() }}" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="icon" type="image/x-icon" href="@asset('favicon.ico')">
<title>@yield('title', page()->title)</title>
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="description" content="{{ page()->description }}">
<meta name="keywords" content="{{ page()->keywords }}">
<meta name="robots" content="{{ page()->robots }}">
<meta property="og:title" content="{{ page()->og_title }}">
<meta property="og:description" content="{{ page()->og_description }}">
<meta property="og:image" content="{{ page()->og_image }}">
<link rel='stylesheet' href='@asset('montserrat')' type='text/css'>
<link rel='stylesheet' href='@asset('sfpro')' type='text/css'>
<link rel="stylesheet" href="@asset('animate')" type='text/css'>
<link rel="stylesheet" href="@asset('grid')" type='text/css'>
<link rel="stylesheet" href="@asset('assets/css/libs/driver.css')">
<script src="@asset('phosphor')"></script>
@at(tt('assets/styles/main.scss'))
@stack('header')
</head>
<body>
<main>
@stack('content')
</main>
<footer>
<script src="@asset('jquery')"></script>
<script src="@asset('assets/js/sweetalert.js')"></script>
<script src="@asset('assets/js/driver.js')"></script>
<script src="@asset('assets/js/forms.js')"></script>
<script src="@asset('assets/js/app.js')"></script>
@at(tt('assets/js/modal.js'))
@at(tt('assets/js/template.js'))
@stack('footer')
</footer>
<div class="toast-container">
@stack('toast-container')
</div>
</body>
</html>
Теперь посмотрим пример главной страницы:
@extends(tt('layout.blade.php'))
@section('title')
{{ !empty(page()->title) ? page()->title : __('def.home') }}
@endsection
@push('content')
@navbar
<div class="container">
@navigation
@breadcrumb
@flash
@editor
</div>
@endpush
@if (tip_active('editor'))
@push('footer')
<script>
const IS_EDITING = {{ (int) page()->isEditMode() }};
</script>
@at(tt('assets/js/pages/home.js'))
@endpush
@endif
@footer
Давайте разберем все по порядку.
В основном шаблоне есть @stack()
, который служит "контейнером" для сбора данных со всех шаблонов.
@push()
как раз и добавляет данные в наш "контейнер". Просто ведь, да?
@navbar
, @navigation
и т.п. - Это произвольные функции, добавляемые самим шаблоном. Подробнее об этом расписано в разделе о разработке шаблонов
И сверху есть сам @extends
, в котором есть layout.blade.php
обернутый в функцию tt()
.
Функция tt()
отдает полный путь до текущего шаблона. К примеру Themes/standard/
Грубо говоря, @extends
просто вызывает основной шаблон, в который уже будет добавлен контент. Все просто. В модулях мы делаем по аналогии с главной страницей для создания своих страниц.
Скажу по секрету, что в шаблонах модулей можно вообще не делать @extends()
основного шаблона. Вы ни в чем не ограничены. Вы можете создать свой layout
, либо не использовать его вовсе. Все в ваших руках
Отрисовка интерфейсов
Для того, чтобы отрисовать интерфейс, нам достаточно сделать рендер нашего интерфейса и вернуть его в качестве Response
внутри контроллера:
/** Допустим, мы уже создали роуты для этого контроллера */
class ViewController
{
public function index()
{
// Мы просто отдаем рендер нашего шаблона в качестве Response
return view('Modules/Monitoring/Resources/Views/index');
}
}
Подробнее про строение шаблонов
А вот какие функции, возможности и ограничения шаблонов существуют - описаны в разделе разработки шаблонов
Дополнение стандартных шаблонов
Если у Вас возникло желание дополнять какой-то блок глобально в шаблоне, Вы можете сделать это очень просто.
Просто рендерите свой шаблон на каждой странице!
Кхм-кхм... Что прости?
Да, вы не ослышались. Для того, чтобы добавлять какой-то один блок на страницу, вы можете ставить глобально на рендер ваш шаблон в ServiceProvider'e:
template()->render('Modules/Monitoring/Resources/Views/test', [], false);
Сам шаблон бы имел подобную структуру:
@push('container')
Я добавляюсь в контейнер, поздравьте меня!!!!
@endpush
Если вы хотите вставлять данные только на одной странице (к примеру вам надо вставить данные только на главной), то вы можете сделать проверку:
if( request()->is('/') ) { // Проверяем, является ли текущая страница главной
template()->render('Modules/Monitoring/Resources/Views/test', [], false);
}