Функции MNRFY

Полный справочник встроенных функций шаблонизатора MNRFY

Системные функции

Конфигурация

<!-- Получение настроек приложения -->
{{ config('app.name') }}                    <!-- Название приложения -->
{{ config('app.debug') }}                   <!-- Режим отладки -->
{{ config('database.host') }}               <!-- Хост БД -->

<!-- Со значением по умолчанию -->
{{ config('app.theme', 'default') }}         <!-- Тема или 'default' -->
{{ config('mail.timeout', 30) }}             <!-- Таймаут или 30 -->

<!-- Проверка существования настройки -->
{% if config('feature.payments') %}
    <a href="/billing">Биллинг</a>
{% endif %}

Даты и время

<!-- Текущие дата и время -->
{{ date('Y-m-d') }}                         <!-- 2024-01-15 -->
{{ date('d.m.Y H:i') }}                     <!-- 15.01.2024 14:30 -->
{{ time() }}                                <!-- 1705334400 (timestamp) -->



<!-- Форматирование даты с локалью -->
{{ strftime('%A, %d %B %Y') }}               <!-- Понедельник, 15 января 2024 -->

Математические функции

{% set numbers = [10, 5, 20, 3] %}
{% set negativeValue = -42 %}
{% set piValue = 3.14159 %}

<!-- Случайные числа -->
{{ rand(1, 100) }}                          <!-- Число от 1 до 100 -->
{{ rand() }}                                 <!-- Случайное число -->

<!-- Математические операции -->
{{ abs(negativeValue) }}                     <!-- 42 -->
{{ max(numbers) }}                           <!-- 20 -->
{{ min(numbers) }}                           <!-- 3 -->
{{ round(piValue, 2) }}                      <!-- 3.14 -->

<!-- Расширенные функции -->
{{ pow(2, 8) }}                              <!-- 256 -->
{{ sqrt(16) }}                               <!-- 4 -->

Функции работы с файлами и ресурсами

Ассеты и URL

<!-- Статические ресурсы -->
{{ asset('css/app.css') }}                   <!-- /mnrfy-common/css/app.css -->
{{ asset('js/script.js') }}                  <!-- /mnrfy-common/js/script.js -->
{{ asset('images/logo.png') }}               <!-- /mnrfy-common/images/logo.png -->

<!-- С версионированием -->
{{ asset('css/app.css', true) }}             <!-- /mnrfy-common/css/app.css?v=1234567890 -->

<!-- Загруженные файлы -->
{{ upload('avatars/user123.jpg') }}          <!-- /mnrfy-uploads/avatars/user123.jpg -->

URL и маршрутизация

{% set user = {
    'id': 123,
    'name': 'John Doe',
    'email': 'john@example.com'
} %}

{% set product = {
    'id': 456,
    'name': 'Laptop Dell XPS',
    'slug': 'laptop-dell',
    'price': 1299.99
} %}

{% set app = {
    'main_lang': 'en',
    'langs': ['en', 'ru', 'de', 'fr']
} %}

{% set locale = 'ru' %}

<!-- Базовые маршруты -->
{{ route('home') }}                           <!-- / -->
{{ route('about') }}                          <!-- /about -->
{{ route('contact') }}                        <!-- /contact -->

<!-- Маршруты с параметрами -->
{{ route('user.profile', {'id': user.id}) }}  <!-- /user/123/profile -->
{{ route('product.show', {'slug': product.slug}) }} <!-- /products/laptop-dell -->
{{ route('blog.post', {'year': 2024, 'month': 12, 'slug': 'new-article'}) }} <!-- /blog/2024/12/new-article -->

<!-- Маршруты с языковыми префиксами -->
{{ route_lang('home', 'ru') }}                <!-- /ru если ru не основной язык -->
{{ route_lang('about', 'en') }}               <!-- /about если en основной язык -->
{{ route_lang('product.show', 'de', {'slug': product.slug}) }} <!-- /de/products/laptop-dell -->
{{ route_lang('home', 'auto') }}              <!-- Использует текущий язык -->

<!-- URL текущей страницы на других языках -->
{{ current_url_lang('en') }}                  <!-- Текущая страница на английском -->
{{ current_url_lang('ru') }}                  <!-- Текущая страница на русском -->
{{ current_url_lang('de') }}                  <!-- Текущая страница на немецком -->

<!-- Абсолютные URL с языком -->
{{ absolute_url_lang('/about', 'ru') }}       <!-- https://domain.com/ru/about -->
{{ absolute_url_lang('/contact', 'en') }}     <!-- https://domain.com/contact -->

<!-- Проверка текущего маршрута -->
{{ is_current_route('ProductShow') }}         <!-- true/false по имени маршрута -->
{{ is_current_route('UserProfile') }}         <!-- true/false -->
{{ is_current_route('BlogPost') }}            <!-- true/false -->

<!-- Проверка текущего языка -->
{{ is_current_lang('ru') }}                   <!-- true/false -->
{{ is_current_lang('en') }}                   <!-- true/false -->

<!-- Получение всех языков с метаданными -->
{% set languages = get_languages() %}
{% foreach languages as lang %}
    <a href="{{ lang.url }}" 
       class="{{ lang.is_current ? 'active' : '' }}">
        {{ lang.name }} <!-- English, Русский, Deutsch, etc -->
        {% if lang.is_main %}(Основной){% endif %}
    </a>
{% endforeach %}

<!-- Простой переключатель языков -->
<div class="lang-switcher">
    {% foreach app.langs as lang %}
        <a href="{{ current_url_lang(lang) }}" 
           class="lang-item {{ is_current_lang(lang) ? 'active' : '' }}">
            {{ lang }}
        </a>
    {% endforeach %}
</div>

<!-- Проверка необходимости показа языкового префикса -->
{% if should_show_lang_prefix() %}
    <p>Текущий язык отличается от основного</p>
{% endif %}

<!-- Работа с ассетами -->
{{ asset('css/app.css') }}                    <!-- /mnrfy-common/css/app.css -->
{{ asset('js/script.js') }}                  <!-- /mnrfy-common/js/script.js -->
{{ asset('images/logo.png') }}               <!-- /mnrfy-common/images/logo.png -->

<!-- Навигационное меню с языковой поддержкой -->
<nav class="language-nav">
    {% foreach get_languages() as lang %}
        <a href="{{ lang.url }}" 
           class="lang-link {{ lang.is_current ? 'current' : '' }}">
            {{ lang.code | upper }}
            {% if lang.is_main %}
                <span class="main-lang-indicator">*</span>
            {% endif %}
        </a>
    {% endforeach %}
</nav>

<!-- Хлебные крошки с языковой поддержкой -->
<nav class="breadcrumbs">
    <a href="{{ route_lang('home', locale) }}">{{ t('nav.home') }}</a>
    {% if is_current_route('ProductShow') %}
        <span>&gt;</span>
        <a href="{{ route_lang('products.index', locale) }}">{{ t('nav.products') }}</a>
        <span>&gt;</span>
        <span class="current">{{ product.name }}</span>
    {% endif %}
</nav>

<!-- Главное меню с активными элементами -->
<ul class="main-menu">
    <li class="{{ is_current_route('Home') ? 'active' : '' }}">
        <a href="{{ route_lang('home', locale) }}">{{ t('menu.home') }}</a>
    </li>
    <li class="{{ is_current_route('ProductIndex') ? 'active' : '' }}">
        <a href="{{ route_lang('products.index', locale) }}">{{ t('menu.products') }}</a>
    </li>
    <li class="{{ is_current_route('About') ? 'active' : '' }}">
        <a href="{{ route_lang('about', locale) }}">{{ t('menu.about') }}</a>
    </li>
    <li class="{{ is_current_route('Contact') ? 'active' : '' }}">
        <a href="{{ route_lang('contact', locale) }}">{{ t('menu.contact') }}</a>
    </li>
</ul>

Функции авторизации и сессий

Пользователь

{% set loggedInUser = {
    'id': 123,
    'name': 'John Doe',
    'email': 'john@example.com',
    'role': 'admin',
    'permissions': ['edit_users', 'delete_posts', 'admin_panel']
} %}

{% set guestUser = null %}

<!-- Текущий пользователь -->
{{ auth() }}                                 <!-- Объект пользователя или null -->
{{ auth().name }}                            <!-- Имя пользователя -->
{{ auth_id() }}                              <!-- ID пользователя -->

<!-- Проверка авторизации -->
{% if auth() %}
    <p>Добро пожаловать, {{ auth().name }}!</p>
{% else %}
    <a href="/login">Войти</a>
{% endif %}

<!-- Проверка ролей -->
{{ user_has_role('admin') }}                 <!-- true/false -->
{{ user_has_role(['admin', 'moderator']) }}    <!-- Любая из ролей -->

Права доступа

{% set user = {
    'id': 123,
    'name': 'John Doe',
    'role': 'moderator',
    'permissions': ['edit_users', 'moderate_comments', 'delete_posts']
} %}

<!-- Проверка прав -->
{{ can('edit_users') }}                       <!-- Может редактировать пользователей -->
{{ can('delete_posts') }}                     <!-- Может удалять посты -->
{{ cannot('admin_panel') }}                   <!-- Не может зайти в админку -->

<!-- Условное отображение -->
{% if can('moderate_comments') %}
    <button class="btn-moderate">Модерировать</button>
{% endif %}

Сессии

{% set sessionData = {
    'user_id': 123,
    'cart_items': [
        {'id': 1, 'name': 'Product 1', 'price': 25.99, 'quantity': 2},
        {'id': 2, 'name': 'Product 2', 'price': 15.50, 'quantity': 1}
    ]
} %}

{% set flashMessages = {
    'success': 'Ваш профиль обновлен успешно!',
    'error': 'Возникла ошибка при обработке запроса.'
} %}

{% set oldInput = {
    'email': 'user@example.com',
    'name': 'John Doe'
} %}

<!-- Данные сессии -->
{{ session('user_id') }}                      <!-- Значение из сессии -->
{{ session('cart_items', []) }}               <!-- Со значением по умолчанию -->

<!-- Flash сообщения -->
{{ flash('success') }}                        <!-- Сообщение об успехе -->
{{ flash('error') }}                          <!-- Сообщение об ошибке -->

<!-- Старые значения форм -->
{{ old('email') }}                            <!-- Предыдущее значение поля -->
{{ old('name', user.name) }}                  <!-- С fallback значением -->

Функции безопасности

CSRF защита

{% set csrf_token_value = 'a1b2c3d4e5f6g7h8i9j0' %}

<!-- CSRF токен -->
{{ csrf_token() }}                           <!-- Токен в виде строки -->
{{ csrf() }}                                 <!-- HTML поле с токеном -->

<!-- В формах -->
<form method="POST" action="/users">
    {{ csrf() }}
    <!-- Остальные поля -->
</form>

<!-- Для AJAX -->
<meta name="csrf-token" content="{{ csrf_token() }}">

Хеширование и шифрование

{% set sensitive_data = "Это важная информация" %}
{% set email = "email@example.com" %}

<!-- Хеширование -->
{{ hash('sha256', sensitive_data) }}          <!-- SHA256 хеш -->
{{ md5(email) }}                              <!-- MD5 хеш -->

<!-- Генерация уникальных ID -->
{{ uniqid() }}                               <!-- Уникальный ID -->
{{ uuid() }}                                 <!-- UUID -->

Функции работы с БД

Подключение к базе

{% set dbConnId = '1752665380840' %}
{% set userId = 123 %}

<!-- Получение подключения -->
{% set database = db(dbConnId) %}

<!-- Простые запросы -->
{% set users = db(dbConnId)->getItems('users', {'active': 1}) %}
{% set user = db(dbConnId)->getItem('users', {'id': userId}) %}
{% set count = db(dbConnId)->countItems('users') %}

Сложные запросы

{% set dbConnId = '1752665380840' %}
{% set requestData = {'page': 2} %}

<!-- SQL запросы -->
{% set stats = db(dbConnId)->query('
    SELECT COUNT(*) as total, 
           SUM(balance) as total_balance 
    FROM users 
    WHERE active = 1
') %}

<!-- Пагинация -->
{% set page = request.input('page', 1) %}
{% set users = db(dbConnId)->paginate('users', page, 20) %}

Функции переводов

Базовые переводы

{% set user = {
    'name': 'John Doe',
    'email': 'john@example.com'
} %}

{% set order = {
    'id': 12345,
    'total': 2599.99,
    'status': 'paid'
} %}

<!-- Простые переводы -->
{{ t('welcome') }}                           <!-- Добро пожаловать -->
{{ t('menu.home') }}                         <!-- Главная -->
{{ t('user.profile') }}                      <!-- Профиль пользователя -->

<!-- С параметрами -->
{{ t('greeting', {'name': user.name}) }}       <!-- Привет, :name! -->
{{ t('order.total', {'amount': order.total, 'currency': 'RUB'}) }}

Множественные формы

{% set message_count = 5 %}
{% set online_count = 12 %}

{% set users = [
    {'name': 'John', 'notification_count': 1},
    {'name': 'Alice', 'notification_count': 3},
    {'name': 'Bob', 'notification_count': 0},
    {'name': 'Mary', 'notification_count': 15}
] %}

<!-- Склонение по числительным -->
{{ t('messages.count', message_count) }}       <!-- 5 сообщений -->
{{ t('users.online', online_count) }}          <!-- 12 пользователей онлайн -->

<!-- В цикле -->
{% foreach users as user %}
    <p>{{ user.name }} имеет {{ t('notifications.count', user.notification_count) }}</p>
{% endforeach %}

Языковые настройки

{% set locale = 'ru' %}
{% set available_locales = ['ru', 'en', 'de', 'fr', 'es'] %}

<!-- Текущий язык -->
{{ locale }}                                 <!-- ru -->
{{ current_locale() }}                        <!-- ru -->

<!-- Доступные языки -->
{% foreach available_locales as lang %}
    <a href="?lang={{ lang }}">{{ lang | upper }}</a>
{% endforeach %}

<!-- URL для другого языка -->
{{ current_url_lang('en') }}                 <!-- Текущая страница на английском -->

Функции HTTP запроса

Параметры запроса

{% set request = {
    'input': {
        'page': 2,
        'search': 'laptop',
        'filter': 'price_desc'
    },
    'query': {
        'search': 'laptop'
    },
    'all': {
        'page': 2,
        'search': 'laptop',
        'filter': 'price_desc'
    },
    'path': '/users/profile',
    'method': 'GET'
} %}

<!-- GET параметры -->
{{ request.input('page', 1) }}                <!-- Параметр page или 1 -->
{{ request.query('search') }}                 <!-- Поисковый запрос -->
{{ request.all() }}                           <!-- Все параметры -->

<!-- Информация о запросе -->
{{ request.path }}                            <!-- /users/profile -->
{{ request.method }}                          <!-- GET, POST, etc -->
{{ request.ip() }}                            <!-- IP адрес клиента -->
{{ request.userAgent() }}                     <!-- User-Agent -->

Проверки запроса

{% set request = {
    'method': 'POST',
    'isAjax': function() { return true; },
    'isMobile': function() { return false; },
    'isMethod': function(method) { return method === 'POST'; }
} %}

<!-- Проверка метода -->
{% if request.isMethod('POST') %}
    <p>Данные были отправлены</p>
{% endif %}

<!-- AJAX запрос -->
{% if request.isAjax() %}
    <!-- Упрощенный вывод для AJAX -->
{% endif %}

<!-- Мобильное устройство -->
{% if request.isMobile() %}
    <!-- Мобильная версия -->
{% endif %}

Функции отладки

Вывод отладочной информации

{% set user = {
    'id': 123,
    'name': 'John Doe',
    'email': 'john@example.com',
    'role': 'admin'
} %}

{% set product = {
    'id': 456,
    'name': 'Laptop Dell XPS',
    'price': 1299.99
} %}

{% set order = {
    'id': 789,
    'total': 1299.99,
    'status': 'pending'
} %}

<!-- Дамп переменных -->
{{ dump(user) }}                             <!-- Отладочный вывод переменной -->
{{ dd(user, product, order) }}                <!-- Die and dump -->

<!-- В режиме отладки -->
{% if debug() %}
    <div class="debug-info">
        {{ dump() }}  <!-- Все переменные -->
    </div>
{% endif %}

Производительность

{% set appConfig = {
    'debug': true
} %}

<!-- Информация о производительности -->
{% if config('app.debug') %}
    <div class="performance-info">
        <p>Время выполнения: {{ execution_time() }}ms</p>
        <p>Память: {{ memory_usage() }}</p>
        <p>Пиковое использование: {{ memory_peak() }}</p>
    </div>
{% endif %}

Системные переменные

Константы фреймворка

{% set MNRFY_ROOT = '/var/www/html/myproject' %}
{% set MNRFY_COMMON = '/var/www/html/myproject/mnrfy-common' %}
{% set MNRFY_UPLOADS = '/var/www/html/myproject/mnrfy-uploads' %}
{% set MNRFY_START_TIME = 1705330000.5678 %}

<!-- Пути к директориям -->
{{ MNRFY_ROOT }}                             <!-- Корень проекта -->
{{ MNRFY_COMMON }}                           <!-- mnrfy-common/ -->
{{ MNRFY_UPLOADS }}                          <!-- mnrfy-uploads/ -->

<!-- Информация о запуске -->
{{ MNRFY_START_TIME }}                       <!-- Время начала выполнения -->
{{ (microtime(true) - MNRFY_START_TIME) * 1000 | round(2) }}ms

Практические примеры

Навигационное меню

{% set auth_user = {
    'id': 123,
    'name': 'John Doe',
    'email': 'john@example.com',
    'role': 'admin',
    'permissions': ['admin_panel', 'edit_users']
} %}


{% set current_route = 'home' %}
{% set is_current_route = function(route) {
    return route === current_route;
} %}


{% set translations = {
    'menu.home': 'Главная',
    'menu.profile': 'Профиль',
    'menu.admin': 'Админ-панель',
    'menu.logout': 'Выход',
    'menu.login': 'Вход',
    'menu.register': 'Регистрация'
} %}

<nav class="main-nav">
    <a href="{{ route('home') }}" 
       class="{{ is_current_route('home') ? 'active' : '' }}">
        {{ t('menu.home') }}
    </a>
    
    {% if auth() %}
        <a href="{{ route('profile') }}" 
           class="{{ is_current_route('profile') ? 'active' : '' }}">
            {{ t('menu.profile') }}
        </a>
        
        {% if can('admin_panel') %}
            <a href="{{ route('admin') }}">{{ t('menu.admin') }}</a>
        {% endif %}
        
        <a href="{{ route('logout') }}">{{ t('menu.logout') }}</a>
    {% else %}
        <a href="{{ route('login') }}">{{ t('menu.login') }}</a>
        <a href="{{ route('register') }}">{{ t('menu.register') }}</a>
    {% endif %}
</nav>

Форма с валидацией

{% set user = {
    'id': 123,
    'email': 'john@example.com',
    'name': 'John Doe'
} %}

{% set old_values = {
    'email': 'john.doe@example.com',
    'name': 'Johnny Doe'
} %}

{% set flash_messages = {
    'success': 'Профиль успешно обновлен!',
    'errors': {
        'email': 'Этот email уже используется другим пользователем'
    }
} %}


{% set translations = {
    'form.email': 'Email',
    'form.name': 'Имя',
    'button.save': 'Сохранить'
} %}

<form method="POST" action="{{ route('user.update') }}">
    {{ csrf() }}
    
    <div class="form-group">
        <label>{{ t('form.email') }}</label>
        <input type="email" name="email" 
               value="{{ old('email', user.email) }}" required>
        {% if flash('errors.email') %}
            <div class="error">{{ flash('errors.email') }}</div>
        {% endif %}
    </div>
    
    <div class="form-group">
        <labe