Системные функции
Полный справочник системных функций, доступных в шаблонах 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>') }}
<!-- Результат: <script>alert("XSS")</script> -->
<!-- HTML entities -->
{{ htmlentities('Café & Restaurant') }} <!-- Café & Restaurant -->
<!-- Декодирование HTML entities -->
{{ html_entity_decode('<strong>Bold</strong>') }} <!-- <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 защиту.