Переменные и вывод данных

Подробное руководство по работе с переменными в шаблонах MNRFY

Типы вывода

Экранированный вывод

По умолчанию все данные автоматически экранируются для предотвращения XSS атак:

<!-- Базовый экранированный вывод -->
{{ user.name }}
{{ post.title }}
{{ comment.text }}

<!-- Пример экранирования -->
Входные данные: "<script>alert('XSS')</script>"
Результат: &lt;script&gt;alert('XSS')&lt;/script&gt;

Сырой вывод

Осторожно! Используйте только для доверенных данных!
<!-- Сырой HTML вывод -->
{!! article.html_content !!}
{!! page.formatted_text !!}

<!-- Пример -->
Входные данные: "<strong>Жирный текст</strong>"
Результат: <strong>Жирный текст</strong>

Доступ к данным

Простые переменные

<!-- Скалярные значения -->
{{ title }}
{{ count }}
{{ price }}
{{ is_active }}

Свойства объектов

<!-- Прямое обращение к свойствам -->
{{ user.name }}
{{ user.email }}
{{ user.created_at }}

<!-- Вложенные свойства -->
{{ user.profile.avatar }}
{{ user.settings.theme }}
{{ order.shipping.address.city }}

Элементы массивов

<!-- Числовые индексы -->
{{ items[0] }}
{{ items[1] }}
{{ colors[2] }}

<!-- Строковые ключи -->
{{ config['app']['name'] }}
{{ menu['home'] }}
{{ translations['welcome'] }}

<!-- Динамические ключи -->
{{ data[user.id] }}
{{ prices[product.currency] }}

Варианты работы с выводом данных из массива


{% set test_array1 = {"name":"Данило"} %}
{% set test_array2 = ["Данило"] %}
{% set test_array3 = {"danilo":{"name":"Данило"}} %}
{% set test_array4 = {"danilo":["Данило"]} %}
1 - {{ test_array1["name"] }}
2 - {{ test_array1['name'] }}
3 - {{ test_array1.name }}
4 - {{ test_array2[0] }}
5 - {{ test_array3.danilo.name }}
6 - {{ test_array3["danilo"]["name"] }}
7 - {{ test_array3['danilo']["name"] }}
8 - {{ test_array3["danilo"]['name'] }}
9 - {{ test_array3.danilo.name }}
10 - {# test_array3["danilo"].name - не работает тк микс разных форматов обращений #}
11 - {# test_array3.danilo[name] - не работает name не как ключ а как переменная указана #}
12 - {{ test_array3.danilo["name"] }}
13 - {{ test_array3.danilo['name'] }}
14 - {# test_array3[danilo.name]  - не выводит тк это переменная а не ключ danilo.name #}
15 - {{ test_array4.danilo[0] }}
16 - {# test_array4[danilo][0] - не выводит тк это переменная а не ключ danilo #}
17 - {{ test_array4['danilo'][0] }}
18 - {{ test_array4["danilo"][0] }}

Вызов методов

<!-- Методы без параметров -->
{{ user.getName() }}
{{ article.getSlug() }}
{{ date.format() }}

<!-- Методы с параметрами -->
{{ user.hasPermission('admin') }}
{{ product.getPrice('USD') }}
{{ text.substring(0, 100) }}

Операторы

Арифметические операторы

<!-- Основные операции -->
{{ 10 + 5 }}         <!-- 15 -->
{{ 10 - 3 }}         <!-- 7 -->
{{ 4 * 5 }}          <!-- 20 -->
{{ 20 / 4 }}         <!-- 5 -->
{{ 17 % 3 }}         <!-- 2 -->

<!-- С переменными -->
{{ product.price * quantity }}
{{ total - discount }}
{{ price * (1 + tax_rate) }}

Операторы сравнения

<!-- Сравнение -->
{% if user.age > 18 %} >18 {% endif %}
{% if price > budget %} price > {% endif %}
{% if status == 'active' %} active {% endif %}
{% if role != 'guest' %} noguest {% endif %}

<!-- Строгое сравнение -->
{% if id === '123' %} id === '123' {% endif %}
{% if value !== null %} value !== null {% endif %}

Операторы объединения

<!-- Конкатенация строк -->
{{ user.first_name ~ ' ' ~ user.last_name }}
{{ 'Hello, ' ~ user.name ~ '!' }}

<!-- Null coalescing (значение по умолчанию) -->
{{ user.nickname ?? user.name }}
{{ product.sale_price ?? product.regular_price }}
{{ config.title ?? 'Без названия' }}

Тернарный оператор

<!-- Базовый тернарный оператор -->
{{ user.is_premium ? 'Премиум' : 'Обычный' }}
{{ count > 0 ? count ~ ' товаров' : 'Нет товаров' }}

<!-- Сложные условия -->
{{ user.balance > 1000 ? 'VIP клиент' : (user.balance > 100 ? 'Постоянный клиент' : 'Новый клиент') }}

<!-- В HTML атрибутах -->
<div class="{{ user.is_online ? 'online' : 'offline' }}">
<button {{ user.can_edit ? '' : 'disabled' }}>Редактировать</button>

Присвоение переменных

Простое присвоение

<!-- Скалярные значения -->
{% set name = 'Иван Петров' %}
{% set age = 25 %}
{% set is_active = true %}

<!-- Использование -->
<p>Пользователь: {{ name }}, возраст: {{ age }}</p>

Вычисления

<!-- Арифметические вычисления -->
{% set total = price * quantity %}
{% set discount = total * 0.1 %}
{% set final_price = total - discount %}

<!-- Строковые операции -->
{% set full_name = user.first_name ~ ' ' ~ user.last_name %}
{% set greeting = 'Привет, ' ~ full_name ~ '!' %}

Сложные структуры

<!-- Массивы -->
{% set colors = ['red', 'green', 'blue'] %}
{% set numbers = [1, 2, 3, 4, 5] %}

<!-- Ассоциативные массивы -->
{% set user_data = {
    'name': 'Иван',
    'age': 25,
    'city': 'Москва'
} %}

<!-- Результаты функций -->
{% set current_time = time() %}
{% set users = db('1752665380840')->getItems('users') %}

Работа с массивами и объектами

Проверка существования

<!-- Проверка на null -->
{% if is_null(user.avatar) %}
    no avatar
{% else %}
    <img src="{{ user.avatar }}" alt="Аватар">
{% endif %}

Встроенные функции для работы с типами данных

MNRFY предоставляет широкий набор встроенных PHP функций для проверки типов и работы с данными.

Проверка типов данных

<!-- isset() - проверка существования переменной -->
{% if isset(user.email) %}
    Email: {{ user.email }}
{% endif %}

<!-- empty() - проверка на пустоту -->
{% if empty(comments) %}
    <p>Комментариев пока нет</p>
{% else %}
    <p>Всего комментариев: {{ count(comments) }}</p>
{% endif %}

<!-- is_array() - проверка на массив -->
{% if is_array(products) %}
    {% foreach products as product %}
        <div>{{ product.name }}</div>
    {% endforeach %}
{% endif %}

<!-- is_object() - проверка на объект -->
{% if is_object(user) %}
    <p>Пользователь: {{ user.getName() }}</p>
{% endif %}

<!-- is_string() - проверка на строку -->
{% if is_string(message) %}
    <div class="alert">{{ message }}</div>
{% endif %}

<!-- is_numeric() - проверка на число -->
{% if is_numeric(price) %}
    <span class="price">₽{{ price }}</span>
{% else %}
    <span class="error">Неверная цена</span>
{% endif %}

<!-- is_bool() - проверка на булево значение -->
{% if is_bool(is_active) %}
    Статус: {{ is_active ? 'Активен' : 'Неактивен' }}
{% endif %}

<!-- is_null() - проверка на null -->
{% if is_null(deleted_at) %}
    <span class="badge badge-success">Активен</span>
{% else %}
    <span class="badge badge-danger">Удален {{ deleted_at | date('d.m.Y') }}</span>
{% endif %}

Работа с массивами

<!-- count() / sizeof() - количество элементов -->
<p>Товаров в корзине: {{ count(cart.items) }}</p>
<p>Размер массива: {{ sizeof(data) }}</p>

<!-- array_key_exists() - проверка существования ключа -->
{% if array_key_exists('premium', user.features) %}
    <span class="premium-badge">Premium</span>
{% endif %}

<!-- in_array() - проверка наличия значения -->
{% if in_array('admin', user.roles) %}
    <a href="/admin">Панель администратора</a>
{% endif %}

<!-- array_search() - поиск значения -->
{% set position = array_search('gold', medals) %}
{% if position !== false %}
    Золотая медаль на позиции: {{ position + 1 }}
{% endif %}

<!-- array_merge() - объединение массивов -->
{% set all_permissions = array_merge(default_permissions, user_permissions) %}

<!-- array_values() - получение значений -->
{% set values = array_values(associative_array) %}
{% foreach values as value %}
    <li>{{ value }}</li>
{% endforeach %}

<!-- array_keys() - получение ключей -->
{% set keys = array_keys(settings) %}
<p>Доступные настройки: {{ implode(', ', keys) }}</p>

<!-- array_push() / array_pop() - добавление/удаление в конец -->
{% set items = ['apple', 'banana'] %}
{% set length = array_push(items, 'orange', 'grape') %}
<!-- items теперь содержит 4 элемента -->

<!-- array_shift() / array_unshift() - добавление/удаление в начало -->
{% set first = array_shift(queue) %}
{% set new_length = array_unshift(queue, 'priority_task') %}

Работа со строками

<!-- strlen() - длина строки -->
{% if strlen(password) < 8 %}
    <p class="error">Пароль должен содержать минимум 8 символов</p>
{% endif %}

<!-- strpos() - поиск подстроки -->
{% if strpos(email, '@') !== false %}
    <p>Email корректный</p>
{% endif %}

<!-- substr() - получение подстроки -->
<p>Превью: {{ substr(article.content, 0, 150) }}...</p>

<!-- trim() - удаление пробелов -->
{% set clean_input = trim(user_input) %}

<!-- explode() - разбиение строки -->
{% set tags = explode('/',product.tags) %}
{% foreach tags as tag %}
    <span class="tag">{{ trim(tag) }}</span>
{% endforeach %}

<!-- implode() - объединение массива в строку -->
{% set categories_string = implode(' / ', breadcrumbs) %}
<nav>{{ categories_string }}</nav>

Работа с датой и временем

<!-- date() - форматирование даты -->
<p>Сегодня: {{ date('d.m.Y') }}</p>
<p>Время: {{ date('H:i:s') }}</p>

<!-- time() - текущая временная метка -->
{% set now = time() %}
<p>Unix timestamp: {{ now }}</p>

<!-- strtotime() - преобразование строки в timestamp -->
{% set next_week = strtotime('+1 week') %}
{% set event_date = strtotime('2024-12-31 23:59:59') %}
<p>Событие через: {{ (event_date - time()) / 86400 | round }} дней</p>

<!-- microtime() - микросекунды -->
{% set start = microtime(true) %}
<!-- ... какой-то код ... -->
{% set execution_time = (microtime(true) - start) * 1000 %}
<p>Время выполнения: {{ execution_time | round(2) }} мс</p>

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

<!-- rand() / mt_rand() - случайные числа -->
{% set random = rand(1, 100) %}
{% set mt_random = mt_rand(1000, 9999) %}
<p>Код подтверждения: {{ mt_random }}</p>

<!-- floor() - округление вниз -->
{% set pages = floor(total_items / items_per_page) %}
<p>Страниц: {{ pages }}</p>

<!-- ceil() - округление вверх -->
{% set total_pages = ceil(count / per_page) %}
<p>Всего страниц: {{ total_pages }}</p>

<!-- round() - обычное округление -->
{% set rating = round(4.567, 1) %}
<p>Рейтинг: {{ rating }}</p>

<!-- abs() - абсолютное значение -->
{% set difference = abs(price1 - price2) %}
<p>Разница в цене: {{ difference }} руб.</p>

<!-- min() / max() - минимум/максимум -->
{% set lowest_price = min(prices) %}
{% set highest_score = max(player1_score, player2_score, player3_score) %}

<!-- pow() - возведение в степень -->
{% set volume = pow(radius, 3) * 4.189 %}

Проверка существования функций и методов

<!-- function_exists() - проверка функции -->
{% if function_exists('custom_helper') %}
    {{ custom_helper(data) }}
{% endif %}

<!-- method_exists() - проверка метода -->
{% if method_exists(user, 'getFullName') %}
    <p>Полное имя: {{ user.getFullName() }}</p>
{% endif %}

<!-- property_exists() - проверка свойства -->
{% if property_exists(product, 'discount') %}
    <span class="discount">-{{ product.discount }}%</span>
{% endif %}

<!-- class_exists() - проверка класса -->
{% if class_exists('App\\Models\\User') %}
    <p>Модель User доступна</p>
{% endif %}

Комплексный пример использования

<div class="product-list">
    {% if isset(products) and is_array(products) and count(products) > 0 %}
        <h2>Найдено товаров: {{ count(products) }}</h2>
        
        {% foreach products as product %}
            {% if is_object(product) %}
                <div class="product-card">
                    <h3>{{ product.name }}</h3>
                    
                    {% if is_numeric(product.price) %}
                        {% set formatted_price = round(product.price, 2) %}
                        <p class="price">₽{{ formatted_price }}</p>
                    {% endif %}
                    
                    {% if property_exists(product, 'description') and strlen(product.description) > 0 %}
                        <p>{{ substr(product.description, 0, 100) }}...</p>
                    {% endif %}
                    
                    {% if isset(product.tags) and is_string(product.tags) %}
                        {% set tags_array = explode('/',product.tags) %}
                        <div class="tags">
                            {% foreach tags_array as tag %}
                                <span class="tag">{{ trim(tag) }}</span>
                            {% endforeach %}
                        </div>
                    {% endif %}
                    
                    {% set random_discount = mt_rand(5, 30) %}
                    {% if random_discount > 20 %}
                        <span class="special-offer">Скидка {{ random_discount }}%!</span>
                    {% endif %}
                </div>
            {% endif %}
        {% endforeach %}
        
        {% set avg_price = array_sum(array_column(products, 'price')) / count(products) %}
        <p>Средняя цена: ₽{{ round(avg_price, 2) }}</p>
    {% else %}
        <p>Товары не найдены</p>
    {% endif %}
</div>

Примеры использования

Карточка пользователя

<div class="user-card">
    {% set full_name = user.first_name ~ ' ' ~ user.last_name %}
    {% set avatar_url = user.avatar ?? asset('images/default-avatar.png') %}
    
    <img src="{{ avatar_url }}" alt="{{ full_name }}">
    <h3>{{ full_name }}</h3>
    
    <div class="status {{ user.is_online ? 'online' : 'offline' }}">
        {{ user.is_online ? 'В сети' : 'Не в сети' }}
    </div>
    
    {% if user.last_seen %}
        <p>Последний визит: {{ user.last_seen | date('d.m.Y H:i') }}</p>
    {% endif %}
</div>

Информация о товаре

<div class="product">
    {% set original_price = product.original_price %}
    {% set sale_price = product.sale_price %}
    {% set discount = sale_price ? ((original_price - sale_price) / original_price * 100) : 0 %}
    
    <h2>{{ product.name }}</h2>
    
    <div class="price">
        {% if sale_price %}
            <span class="sale-price">{{ sale_price | money('₽') }}</span>
            <span class="original-price">{{ original_price | money('₽') }}</span>
            <span class="discount">-{{ discount | round }}%</span>
        {% else %}
            <span class="price">{{ original_price | money('₽') }}</span>
        {% endif %}
    </div>
    
    <div class="availability">
        {% set stock_text = product.stock > 0 ? 
            (product.stock ~ ' шт. в наличии') : 'Нет в наличии' %}
        <span class="{{ product.stock > 0 ? 'in-stock' : 'out-of-stock' }}">
            {{ stock_text }}
        </span>
    </div>
</div>

Отладка переменных

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

<!-- Дамп одной переменной -->
{{ var_dump(user) }}

<!-- JSON представление -->
<pre>{{ user | json }}</pre>

Условная отладка

{% if config('app.debug') %}
    <div class="debug-panel">
        <h3>Отладочная информация</h3>
        <p>Текущий пользователь: {{ user.id ?? 'Гость' }}</p>
        <p>Путь запроса: {{ request.path }}</p>
        <p>Время выполнения: {{ (microtime(true) - MNRFY_START_TIME) * 1000 | round(2) }}ms</p>
    </div>
{% endif %}
Следующий шаг: Изучите условия и операторы switch/case.