Skip to content

Функции PHP

Из шаблона можно звать функции PHP:

fenom
{count($items)} элементов
{json_encode(['foo' => 'bar'])}
{strip_tags($html)}
{profile('fullname')}

В PageBlocks белый список выключен

Понимать это надо буквально: из шаблона доступна любая существующая функция PHPstrrev, file_get_contents, exec, unlink. Белый список у движка есть, но он включается опцией disable_native_funcs, а View::init() её не задаёт. Пока она не задана, проверка выглядит как function_exists() и пропускает всё.

Практический вывод: шаблон равносилен PHP-коду. Кто может править чанк в менеджере, тот может выполнить на сервере что угодно. Права на редактирование элементов выдавайте соответственно — как доступ к файловой системе, а не как доступ к вёрстке.

Белый список, когда он включён

Опция disable_native_funcs включает проверку по списку. Это разумно для площадок, где чанки правят редакторы, а не разработчики.

Базовый список движка — 18 функций:

countis_stringis_array
is_numericis_intis_double
is_objectgettypeconstant
strtotimejson_encodejson_decode
ip2longlong2ipstrip_tags
nl2brexplodeimplode

Поверх него компонент добавляет свои хелперы: asset, langs, language, languages, lang_url, multilingual, resources, pbresources, pbResources, users.

Свои функции дописываются в файле сайта:

core/App/Helpers/fenom/php_functions.php
php
return [
    'file_exists',
    'profile',
    'person_name',
];

Проверка регистрозависимая

contactDefaults и contactdefaults — для этого списка разные имена. Функцию, которую в шаблонах пишут camelCase, перечисляйте в обоих написаниях.

Пока disable_native_funcs не включена, этот файл ни на что не влияет: всё и так разрешено. Смысл его — заранее описать набор, на котором площадка должна работать, чтобы включение проверки ничего не сломало.

Модификатор вместо функции

Функция PHP в шаблоне — не единственный и обычно не лучший вариант. Свой модификатор в modifiers.php работает и фильтром, и функцией, не зависит от белого списка и не тащит в шаблон имена из глобального пространства:

php
// core/App/Helpers/fenom/modifiers.php
return [
    'excerpt' => fn ($text, int $n = 100) => mb_substr(strip_tags((string) $text), 0, $n),
];
fenom
{$page.introtext|excerpt:200}
{excerpt($page.introtext, 200)}

{$.php} и {$.call}

Эти аксессоры зовут произвольный callable. В upstream они доходили до call_user_func_array() вообще без проверок — опция запрета существовала, а код её не спрашивал. В форке и disable_php_calls, и белый список нативных функций соблюдаются; подробности — во введении.

© PageBlocks 2019-present