Функции PHP
Из шаблона можно звать функции PHP:
{count($items)} элементов
{json_encode(['foo' => 'bar'])}
{strip_tags($html)}
{profile('fullname')}В PageBlocks белый список выключен
Понимать это надо буквально: из шаблона доступна любая существующая функция PHP — strrev, file_get_contents, exec, unlink. Белый список у движка есть, но он включается опцией disable_native_funcs, а View::init() её не задаёт. Пока она не задана, проверка выглядит как function_exists() и пропускает всё.
Практический вывод: шаблон равносилен PHP-коду. Кто может править чанк в менеджере, тот может выполнить на сервере что угодно. Права на редактирование элементов выдавайте соответственно — как доступ к файловой системе, а не как доступ к вёрстке.
Белый список, когда он включён
Опция disable_native_funcs включает проверку по списку. Это разумно для площадок, где чанки правят редакторы, а не разработчики.
Базовый список движка — 18 функций:
count | is_string | is_array |
is_numeric | is_int | is_double |
is_object | gettype | constant |
strtotime | json_encode | json_decode |
ip2long | long2ip | strip_tags |
nl2br | explode | implode |
Поверх него компонент добавляет свои хелперы: asset, langs, language, languages, lang_url, multilingual, resources, pbresources, pbResources, users.
Свои функции дописываются в файле сайта:
core/App/Helpers/fenom/php_functions.phpreturn [
'file_exists',
'profile',
'person_name',
];Проверка регистрозависимая
contactDefaults и contactdefaults — для этого списка разные имена. Функцию, которую в шаблонах пишут camelCase, перечисляйте в обоих написаниях.
Пока disable_native_funcs не включена, этот файл ни на что не влияет: всё и так разрешено. Смысл его — заранее описать набор, на котором площадка должна работать, чтобы включение проверки ничего не сломало.
Модификатор вместо функции
Функция PHP в шаблоне — не единственный и обычно не лучший вариант. Свой модификатор в modifiers.php работает и фильтром, и функцией, не зависит от белого списка и не тащит в шаблон имена из глобального пространства:
// core/App/Helpers/fenom/modifiers.php
return [
'excerpt' => fn ($text, int $n = 100) => mb_substr(strip_tags((string) $text), 0, $n),
];{$page.introtext|excerpt:200}
{excerpt($page.introtext, 200)}{$.php} и {$.call}
Эти аксессоры зовут произвольный callable. В upstream они доходили до call_user_func_array() вообще без проверок — опция запрета существовала, а код её не спрашивал. В форке и disable_php_calls, и белый список нативных функций соблюдаются; подробности — во введении.