Как работает сайт Ильи Бирмана
Вычленяем из его рассказа самое интересное для меня, чтобы получше разобраться и запомнить.
Метаданные
Задача движка — понять, на какой из моих многочисленных доменов и по какому адресу зашёл пользователь, определиться с языком, найти файл нужной страницы, выполнить его, пропустить через шаблонизатор и типограф и отдать наружу.
Там умная и гибкая система, которая позволяет делать отличия между сайтами на разных языках (ilyabirman.ru и ilyabirman.net) только там, где они нужны: домен, текст, правила типографики, твиттер-акаунт для шаринга; но всё остальное хранить в одном месте один раз.
OK.
Самое главное в файле метаданных — это поле logo. Это постоянный идентификатор страницы, который не поменяется, если я вдруг решу перенести её в другую папку. На нём завязаны многочисленные макросы.
У меня это будет поле id.
Макросы
Важно то, что этот код (html-шаблона) ничего не знает про урлы, названия и папки отдельных штук, на которые ссылается. Всё делают несколько умных макросов:
HREF ($logo)возвращает полный урл страницы по её идентификатору;FOLDER ($logo)возвращает путь к папке, в которой лежит страница;TITLE ($logo)возвращает название страницы;EX ($what, $logo)возвращает значение поля x-something из файла метаданных.Я это называю макросами, а не функциями, потому что это точнее передаёт смысл, и ещё их можно вызывать без параметра $logo и без скобок (если других параметров нет), и тогда они сработают для текущей собираемой страницы:
<h1><?= TITLE ?></h1>
OK.
Есть и другие макросы.
CHILDRENвернёт массив всех дочерних для данной страниц. Например, в разделе проектов их список автоматически дополнится новымА ещё у меня на страницах бывают переключалки между связанными страницами, вот, например, такой переключалкой провязаны несколько рассказов про Лондон. Это работает, потому что эти страницы связаны в одну группу через поле
group. Их просто вернётGROUPLINGS. Если одна из страниц группы окажется недоступна на одном из языков — не беда, значит не попадёт в список.Или вот есть ещё
WITHIN. Удобно использовать в меню, например, в котором плашку у текущего раздела надо поставить если мы в нём или любых его подразделах.Есть макрос
LANG, который возвращает текущий язык. Его удобно использовать, если страницы на разных языках отличаются двумя-тремя строками текста.if (LANG == ’russian’) { ... }Ещё есть
TAIL,OFFSET,SIBLINGS,NEIGHBOURSи всякие другие, которые позволяют компактно и внятно выражаться в коде.
Шаблоны
У любой страницы в файле метаданных может быть поле
apply-template— оно говорит движку, что надо пропустить страницу через определённый шаблон перед тем, как заворачивать в обёртку из меню и подвала.
О, у меня тоже в зачатке есть что-то подобное! Так например, страница с чатом про Git у меня отображается не так, как обычные статьи.
Блог
Теперь про блог. Блог работает на Эгее и живёт своей жизнью, несмотря на внешнее сходство с остальным сайтом. Сайту никак не мешает, что в папке /meanwhile/ у него живёт что-то «неродное». Он не находит там файла _meanwhile.php и поэтому считает, что эта папка для него не представляет ценности.
OK. Я не знаю, будет ли у меня блог и как я его буду делать.