Страница за 10 строк
Вот целая страница блога на Universal Engine - выборка из базы, заголовок, тело, футер. Читается сверху вниз, как обычный скрипт, потому что это и есть обычный скрипт:
<?php
declare(strict_types=1);
Sogerien::Page()->set_templates([TemplateBlog::class]);
function h(mixed $v): string {
return htmlspecialchars((string)$v, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
$json = Sogerien::DbController()->sql_request('main', [
'sql' => "SELECT title, data FROM sogerien
WHERE entity = 'post' ORDER BY created_at DESC LIMIT 20",
'params' => [],
]);
$posts = json_decode($json, true);
Sogerien::Page()->title = 'Инженерный блог';
Sogerien::Page()->header();
Sogerien::Page()->mainmenu();
?>
<main class="container">
<h1>Инженерный блог</h1>
<?php foreach ($posts as $post): ?>
<article class="post-card">
<h2><?= h($post['title']) ?></h2>
<p><?= h($post['data']['excerpt']) ?></p>
</article>
<?php endforeach; ?>
</main>
<?php Sogerien::Page()->footer();Разбор по строкам
declare(strict_types=1)- первым же оператором. Строгие типы обязательны по всему ядру.set_templates([TemplateBlog::class])- выбираем скин. Лёгкий холст для контента, а не тяжёлая админка.function h()- локальный экранизатор. Любой вывод в разметку проходит через него, без исключений.DbController()->sql_request()- данные строкой JSON, тут жеjson_decode. Это одноразовый код, поэтому он живёт прямо в странице, а не в классе.header()- здесьTemplateгенерит<!DOCTYPE>, весь<head>, подключает шрифты ядра и ассеты скина.mainmenu()- меню рисует скин, страница про него ничего не знает.footer()- закрывает<body>и документ.
Почему это десять строк, а не сто
Всю оболочку - doctype, мета, шрифты Archivo / Figtree / IBM Plex Mono, порядок подключения скриптов, шелл <body> - несут Template и скин. Между header() и footer() страница пишет только своё тело. Ничего лишнего в неё физически не поместить.
Что сюда не пишут
В теле страницы нет ни одного <script src> и ни одного <link rel=stylesheet> на стороннюю библиотеку. Ассеты подключаются через скин, через класс Affects или через Page()->add_head_js() - но это отдельный разговор, ему посвящён следующий пост.
И ещё: файл сохраняется в UTF-8 без BOM. BOM перед <?php ломает strict_types - PHP ругается, что declare должен быть самым первым оператором. Первые байты файла обязаны быть 3C 3F 70 68 70.