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

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

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

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

<!-- Проверка существования файла -->
{{ file_exists('/path/to/file.txt') }}        <!-- true/false -->

<!-- Проверка директории -->
{{ is_dir(MNRFY_UPLOADS) }}                   <!-- true/false -->
{{ is_dir('/nonexistent/path') }}             <!-- false -->

<!-- Проверка прав на чтение/запись -->
{{ is_readable('/path/to/file.txt') }}         <!-- true/false -->
{{ is_writable(MNRFY_TEMP) }}                 <!-- true/false -->

<!-- Размер файла в байтах -->
{{ filesize(MNRFY_SRC ~ '/config/app.json') }}  <!-- размер в байтах -->

<!-- Пример условного включения -->
{% if file_exists(MNRFY_UPLOADS ~ '/avatars/' ~ user.id ~ '.jpg') %}
    <img src="/mnrfy-uploads/avatars/{{ user.id }}.jpg" alt="Аватар">
{% else %}
    <img src="{{ asset('images/default-avatar.png') }}" alt="Аватар по умолчанию">
{% endif %}

Информация о файлах

<!-- Время модификации файла -->
{{ filemtime('/path/to/file.txt') }}           <!-- timestamp -->
{{ filemtime('/path/to/file.txt') | date('d.m.Y H:i') }}  <!-- отформатированная дата -->

<!-- Расширение файла -->
{{ pathinfo('/path/to/file.jpg', PATHINFO_EXTENSION) }}  <!-- jpg -->

<!-- Имя файла без пути -->
{{ basename('/path/to/file.jpg') }}            <!-- file.jpg -->

<!-- Директория файла -->
{{ dirname('/path/to/file.jpg') }}             <!-- /path/to -->

<!-- Информация о загруженном файле -->
{% if user.document %}
    <div class="file-info">
        <p>Файл: {{ basename(user.document) }}</p>
        <p>Размер: {{ filesize(MNRFY_UPLOADS ~ user.document) | filesize }}</p>
        <p>Загружен: {{ filemtime(MNRFY_UPLOADS ~ user.document) | date('d.m.Y') }}</p>
    </div>
{% endif %}

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

Основные математические операции

<!-- Абсолютное значение -->
{{ abs(-42) }}                              <!-- 42 -->
{{ abs(user.balance) }}                     <!-- Модуль баланса -->

<!-- Максимум и минимум -->
{{ max([1, 5, 3, 9, 2]) }}                   <!-- 9 -->
{{ min([1, 5, 3, 9, 2]) }}                   <!-- 1 -->
{{ max(product.price, product.sale_price) }}   <!-- Большая цена -->

<!-- Округление -->
{{ round(3.14159) }}                         <!-- 3 -->
{{ round(3.14159, 2) }}                      <!-- 3.14 -->
{{ ceil(3.2) }}                              <!-- 4 -->
{{ floor(3.8) }}                             <!-- 3 -->

Расширенные математические функции

<!-- Степень и корень -->
{{ pow(2, 8) }}                              <!-- 256 -->
{{ sqrt(16) }}                               <!-- 4 -->

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

<!-- Тригонометрические функции -->
{{ sin(M_PI / 2) }}                          <!-- 1 -->
{{ cos(0) }}                                 <!-- 1 -->

<!-- Логарифмы -->
{{ log(10) }}                                <!-- Натуральный логарифм -->
{{ log10(100) }}                             <!-- 2 -->

Строковые функции

Базовые строковые операции

<!-- Длина строки -->
{{ strlen("Привет, мир!") }}                  <!-- 12 (в байтах) -->
{{ mb_strlen("Привет, мир!", 'UTF-8') }}       <!-- 12 (в символах) -->

<!-- Подстрока -->
{{ substr("Привет, мир!", 0, 6) }}             <!-- "Привет" -->
{{ mb_substr("Привет, мир!", 8, 3, 'UTF-8') }}  <!-- "мир" -->

<!-- Позиция подстроки -->
{{ strpos("Привет, мир!", "мир") }}            <!-- 8 -->
{{ mb_strpos("Привет, мир!", "мир", 0, 'UTF-8') }}  <!-- 8 -->

Преобразования регистра

<!-- Изменение регистра -->
{{ strtoupper("привет") }}                    <!-- "ПРИВЕТ" -->
{{ strtolower("ПРИВЕТ") }}                    <!-- "привет" -->
{{ ucfirst("привет") }}                       <!-- "Привет" -->
{{ ucwords("привет мир") }}                    <!-- "Привет Мир" -->

<!-- Многобайтовые версии -->
{{ mb_strtoupper("привет", 'UTF-8') }}          <!-- "ПРИВЕТ" -->
{{ mb_strtolower("ПРИВЕТ", 'UTF-8') }}          <!-- "привет" -->

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

<!-- Разделение и объединение -->
{{ explode(",", "a,b,c,d") }}                 <!-- ["a", "b", "c", "d"] -->
{{ implode(", ", ["a", "b", "c"]) }}           <!-- "a, b, c" -->

<!-- Удаление пробелов -->
{{ trim("  текст  ") }}                       <!-- "текст" -->
{{ ltrim("  текст  ") }}                      <!-- "текст  " -->
{{ rtrim("  текст  ") }}                      <!-- "  текст" -->

<!-- Замена -->
{{ str_replace("мир", "вселенная", "Привет, мир!") }}  <!-- "Привет, вселенная!" -->
{{ str_ireplace("МИР", "вселенная", "Привет, мир!") }}  <!-- Без учета регистра -->

Функции работы с массивами

Информация о массивах

<!-- Количество элементов -->
{{ count([1, 2, 3, 4, 5]) }}                  <!-- 5 -->
{{ sizeof($users) }}                          <!-- Аналог count -->

<!-- Проверка существования элемента -->
{{ in_array('apple', ['apple', 'banana', 'orange']) }}  <!-- true -->
{{ array_key_exists('name', user) }}           <!-- true/false -->

<!-- Ключи и значения -->
{{ array_keys(user) }}                        <!-- Массив ключей -->
{{ array_values(user) }}                      <!-- Массив значений -->

<!-- Первый и последний элементы -->
{{ reset(users) }}                            <!-- Первый элемент -->
{{ end(users) }}                              <!-- Последний элемент -->

Обработка массивов

<!-- Фильтрация -->
{{ array_filter([1, 2, 3, 0, 4, null, 5]) }}    <!-- [1, 2, 3, 4, 5] -->

<!-- Уникальные значения -->
{{ array_unique([1, 2, 2, 3, 3, 4]) }}          <!-- [1, 2, 3, 4] -->

<!-- Сортировка -->
{% set numbers = [3, 1, 4, 1, 5, 9] %}
{% php %}sort($numbers);{% endphp %}
{{ numbers }}  <!-- [1, 1, 3, 4, 5, 9] -->

<!-- Объединение массивов -->
{{ array_merge([1, 2], [3, 4], [5, 6]) }}       <!-- [1, 2, 3, 4, 5, 6] -->

<!-- Срез массива -->
{{ array_slice([1, 2, 3, 4, 5], 1, 3) }}       <!-- [2, 3, 4] -->

Функции хеширования и шифрования

Хеширование данных

<!-- MD5 хеш -->
{{ md5('hello world') }}                      <!-- 5d41402abc4b2a76b9719d911017c592 -->
{{ md5(user.email | lower) }}                 <!-- Хеш email для Gravatar -->

<!-- SHA1 хеш -->
{{ sha1('hello world') }}                     <!-- 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed -->

<!-- SHA256 и другие алгоритмы -->
{{ hash('sha256', 'secret data') }}            <!-- SHA256 хеш -->
{{ hash('sha512', 'very secret') }}           <!-- SHA512 хеш -->

<!-- Проверка целостности файла -->
{% set fileHash = md5_file(MNRFY_UPLOADS ~ '/important-file.pdf') %}
<p>Контрольная сумма: {{ fileHash }}</p>

Генерация уникальных идентификаторов

<!-- Уникальный ID -->
{{ uniqid() }}                               <!-- 507f1f77bcf86cd799439011 -->
{{ uniqid('user_') }}                        <!-- user_507f1f77bcf86cd799439011 -->

<!-- Случайные байты -->
{{ bin2hex(random_bytes(16)) }}               <!-- 32 символа hex -->
{{ base64_encode(random_bytes(32)) }}         <!-- Base64 строка -->

<!-- Пример генерации токена сессии -->
{% set sessionToken = bin2hex(random_bytes(32)) %}
<input type="hidden" name="session_token" value="{{ sessionToken }}">

Функции кодирования

Base64 кодирование

<!-- Base64 кодирование/декодирование -->
{{ base64_encode('hello world') }}            <!-- aGVsbG8gd29ybGQ= -->
{{ base64_decode('aGVsbG8gd29ybGQ=') }}        <!-- hello world -->

<!-- Кодирование для data URI -->
{% set imageData = base64_encode(file_get_contents('/path/to/image.png')) %}
<img src="data:image/png;base64,{{ imageData }}" alt="Встроенное изображение">

URL кодирование

<!-- URL кодирование -->
{{ urlencode('Привет мир!') }}                 <!-- %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82... -->
{{ rawurlencode('hello world') }}              <!-- hello%20world -->

<!-- URL декодирование -->
{{ urldecode('%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82') }}  <!-- Привет -->

<!-- Использование в ссылках -->
<a href="/search?q={{ search_query | urlencode }}">Поиск</a>

HTML кодирование

<!-- HTML экранирование -->
{{ htmlspecialchars('<script>alert("XSS")</script>') }}
<!-- Результат: &lt;script&gt;alert(&quot;XSS&quot;)&lt;/script&gt; -->

<!-- HTML entities -->
{{ htmlentities('Café & Restaurant') }}        <!-- Caf&eacute; &amp; Restaurant -->

<!-- Декодирование HTML entities -->
{{ html_entity_decode('&lt;strong&gt;Bold&lt;/strong&gt;') }}  <!-- <strong>Bold</strong> -->

JSON функции

JSON кодирование и декодирование

<!-- JSON кодирование -->
{{ json_encode(user) }}                       <!-- {"id":1,"name":"John"} -->
{{ json_encode(config, JSON_PRETTY_PRINT) }}    <!-- Отформатированный JSON -->

<!-- JSON декодирование -->
{% set jsonData = '{"name":"John","age":30}' %}
{% set userData = json_decode(jsonData, true) %}
{{ userData.name }}  <!-- John -->

<!-- Для JavaScript -->
<script>
    var userData = {{ user | json_encode }};
    var config = {{ app_config | json_encode }};
    
    console.log('User:', userData);
</script>

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

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

<!-- Проверка типов -->
{{ is_array([1, 2, 3]) }}                     <!-- true -->
{{ is_string("hello") }}                      <!-- true -->
{{ is_int(42) }}                              <!-- true -->
{{ is_float(3.14) }}                          <!-- true -->
{{ is_bool(true) }}                           <!-- true -->
{{ is_null(null) }}                           <!-- true -->

<!-- Числовые проверки -->
{{ is_numeric("123") }}                       <!-- true -->
{{ is_numeric("abc") }}                       <!-- false -->

<!-- Условное отображение на основе типа -->
{% if is_array(data) %}
    <ul>
    {% foreach data as item %}
        <li>{{ item }}</li>
    {% endforeach %}
    </ul>
{% else %}
    <p>{{ data }}</p>
{% endif %}

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

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

<!-- Проверка определения переменной -->
{{ isset(user.name) }}                        <!-- true/false -->
{{ empty(user.bio) }}                         <!-- true если пустая -->

<!-- Условное отображение -->
{% if isset(user.phone) and not empty(user.phone) %}
    <p>Телефон: {{ user.phone }}</p>
{% endif %}

<!-- Установка значений по умолчанию -->
{% set userName = isset(user.nickname) ? user.nickname : user.name %}
{% set userTheme = isset(user.theme) ? user.theme : 'default' %}

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

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

<!-- Версия PHP -->
{{ phpversion() }}                            <!-- 8.1.0 -->

<!-- Информация о системе -->
{{ php_uname() }}                             <!-- Полная информация о системе -->
{{ php_uname('s') }}                          <!-- Название ОС -->
{{ php_uname('m') }}                          <!-- Архитектура -->
{{ php_uname('n') }}                          <!-- Имя хоста -->

<!-- Загрузка системы (Linux/Mac) -->
{% if function_exists('sys_getloadavg') %}
    {% set loadAvg = sys_getloadavg() %}
    <p>Средняя загрузка: {{ loadAvg[0] | round(2) }}</p>
{% endif %}

<!-- Доступные расширения PHP -->
{% if extension_loaded('gd') %}
    <p>Обработка изображений доступна</p>
{% endif %}

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

Валидатор данных

<div class="form-validator">
    {% set email = request.input('email') %}
    {% set phone = request.input('phone') %}
    {% set age = request.input('age') %}
    
    <div class="validation-results">
        <h3>Результаты валидации</h3>
        
        <!-- Email валидация -->
        {% if email %}
            {% if filter_var(email, FILTER_VALIDATE_EMAIL) %}
                <p class="valid">✓ Email корректный: {{ email }}</p>
            {% else %}
                <p class="invalid">✗ Email некорректный: {{ email }}</p>
            {% endif %}
        {% endif %}
        
        <!-- Телефон валидация -->
        {% if phone %}
            {% set cleanPhone = preg_replace('/[^0-9]/', '', phone) %}
            {% if strlen(cleanPhone) == 11 and substr(cleanPhone, 0, 1) == '8' %}
                <p class="valid">✓ Телефон корректный: {{ phone }}</p>
            {% else %}
                <p class="invalid">✗ Телефон некорректный: {{ phone }}</p>
            {% endif %}
        {% endif %}
        
        <!-- Возраст валидация -->
        {% if age %}
            {% if is_numeric(age) and age >= 18 and age <= 120 %}
                <p class="valid">✓ Возраст корректный: {{ age }} лет</p>
            {% else %}
                <p class="invalid">✗ Возраст должен быть от 18 до 120 лет</p>
            {% endif %}
        {% endif %}
    </div>
</div>

Генератор паролей

<div class="password-generator">
    <h3>Сгенерированные пароли</h3>
    
    {% for i in 1..5 %}
        {% set chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*' %}
        {% set password = '' %}
        {% set charsLength = strlen(chars) %}
        
        {% for j in 1..12 %}
            {% set randomIndex = rand(0, charsLength - 1) %}
            {% set password = password ~ substr(chars, randomIndex, 1) %}
        {% endfor %}
        
        <div class="password-item">
            <span class="password">{{ password }}</span>
            <span class="strength">
                {% set hasUpper = password != strtolower(password) %}
                {% set hasLower = password != strtoupper(password) %}
                {% set hasNumbers = preg_match('/[0-9]/', password) %}
                {% set hasSpecial = preg_match('/[!@#$%^&*]/', password) %}
                {% set strength = 0 %}
                {% if hasUpper %}{% set strength = strength + 1 %}{% endif %}
                {% if hasLower %}{% set strength = strength + 1 %}{% endif %}
                {% if hasNumbers %}{% set strength = strength + 1 %}{% endif %}
                {% if hasSpecial %}{% set strength = strength + 1 %}{% endif %}
                
                {% switch strength %}
                    {% case 4 %}<span class="very-strong">Очень сильный</span>
                    {% case 3 %}<span class="strong">Сильный</span>
                    {% case 2 %}<span class="medium">Средний</span>
                    {% default %}<span class="weak">Слабый</span>
                {% endswitch %}
            </span>
        </div>
    {% endfor %}
</div>

Анализатор файловой системы

<div class="filesystem-analyzer">
    <h3>Анализ файловой системы</h3>
    
    {% set directories = [
        {'path': MNRFY_ROOT, 'name': 'Корень проекта'},
        {'path': MNRFY_SRC, 'name': 'Исходный код'},
        {'path': MNRFY_COMMON, 'name': 'Общие файлы'},
        {'path': MNRFY_TEMP, 'name': 'Временные файлы'},
        {'path': MNRFY_UPLOADS, 'name': 'Загруженные файлы'}
    ] %}
    
    <table class="filesystem-table">
        <thead>
            <tr>
                <th>Директория</th>
                <th>Существует</th>
                <th>Права чтения</th>
                <th>Права записи</th>
                <th>Файлов</th>
            </tr>
        </thead>
        <tbody>
            {% foreach directories as dir %}
                <tr>
                    <td>{{ dir.name }}</td>
                    <td>
                        {% if is_dir(dir.path) %}
                            <span class="status-ok">✓</span>
                        {% else %}
                            <span class="status-error">✗</span>
                        {% endif %}
                    </td>
                    <td>
                        {% if is_readable(dir.path) %}
                            <span class="status-ok">✓</span>
                        {% else %}
                            <span class="status-error">✗</span>
                        {% endif %}
                    </td>
                    <td>
                        {% if is_writable(dir.path) %}
                            <span class="status-ok">✓</span>
                        {% else %}
                            <span class="status-warning">✗</span>
                        {% endif %}
                    </td>
                    <td>
                        {% if is_dir(dir.path) %}
                            {% set fileCount = count(glob(dir.path ~ '/*')) %}
                            {{ fileCount }}
                        {% else %}
                            -
                        {% endif %}
                    </td>
                </tr>
            {% endforeach %}
        </tbody>
    </table>
</div>
Следующий шаг: Изучите безопасность и CSRF защиту.