Сайт вебмастера

Немного о работах над Albireo CMS

03-02-2025Время чтения ~ 6 мин.Albireo Framework / CMS 156

Продолжаю работать над Albireo CMS. Сделал несколько доработок в админ-панели, направленных на удобство работы с текстом. В первую очередь — это новый чекбокс «Autosave», которым можно включить автосохранение записи. Я заметил, что уже давно использую автосохранение в разных программах, поэтому решил, что здесь это тоже будет уместно. Сохранение происходит раз в 30 секунд, но можно выставить и любое другое время в конфигурации.

В ядре немного переделал функцию считывания конфигурации — добавил новый параметр, с помощью которого можно не просто считывать конфиг-данные, но и объединять его с системным дефолтом. Раньше такой возможностью обладал только файл config.php, который рекурсивно сливался с системным. Это удобно, потому что для сайта не нужно менять весь конфиг-файл, а поменять только отдельные ключи. Поэтому система считывает системный конфиг-файл, потом этот же файл в website и их объединяет. Я добавил такое же поведение в функцию getConfigFile() опционально и прописал его для admin.php, потому что набралось приличное количество опций, но не все их нужно менять для каждого сайта.

Теперь в админке есть новые опции, с помощью которых можно кастомизивать и поле textarea. Можно прописать любые css-классы и css-стили. Вот например такое баловство:

Пример настройки редактора Albireo CMS

Другое важное изменение в админ-панели — это меню быстрой вставки. Традиционно такие меню работают либо по hover либо по click. В конфигурации даже была такая опция. Но мне давно хотелось сделать так, чтобы меню повторяло поведение стандартных windows-программ. Открытие по click, а потом работает hover. У меня все работает на Alpine JS и, как выяснилось, ChatGPT неплохо в ней разбирается. Сложность задачи в логике открытий/закрытий меню и отслеживания click/hover. Где-то с пятого раза ChatGPT выдал рабочий код, который я и «причесал» для своей задачи. Получилось очень круто.

Другая задача, которую мне не удавалось решить примерно с 2008 года — это возможность отмены вставки фрагмента в поле textarea. То есть когда происходит вставка фрагмента, браузер автоматом обнуляет очередь изменений и поэтому перестаёт работать Ctrl+Z. Проблема очень известная и ей сто лет, поэтому периодически я к ней возвращаюсь, вижу, что решения нет и опять «забиваю». Но тут, опять же, решил подрядить ChatGPT и в какой-то момент он вдруг выдал рабочее решение. Короче, закрыл многолетний гештальт...

На уровне ядра сделал одно улучшение, которое призвано уменьшить потребление памяти. На тестовом сайте я заметил, что память подскочила примерно до 6-7Мб. В принципе по современным лимитам хостингов — мелочь, но я попробовал разобраться. Оказалось, что дело в хранении массива данных. Поскольку Albireo CMS работает на файлах, то ей нужно хранить данные полей всех страниц. Они небольшие, но если записей более 500, то это выливается где-то в 2-3Мб текста. С учётом всех чудес это и заставляет PHP выделять под массив примерно в 2-раза больше рабочей памяти. В итоге я много экспериментировал и выяснил, что данные можно хранить в сжатом виде. Это многократно снижает потребление PHP-памяти. Если раньше было где-то 6-7Мб, то сейчас это 0.7-0.9Мб. Единственный минус — это немного увеличенное время работы, где-то +0.1 секунда. Я решил, что это разумный обмен.

Теперь по шаблону.

Немного поменял логику home.php, где выводится главная страница сайта. Поскольку у меня именно CMS, то логично, что в ней предусмотрен вывод записей. Я делал разные варианты вывода записей — технически это простой алгоритм: несколько строк на получение записей и вызов tpl-файла, который и формирует нужную html-разметку.

Вывод записей происходит не только на главной, но в и рубриках, метках, произвольных разделах, поэтому tpl-файлы хранятся в каталоге шаблона. Но вот для главной, как оказалось, приходится постоянно править home.php под разные сайты и задачи. Поэтому я придумал, что главная будет просто содержать подключение модуля, а модуль уже сам решает что и как выводить. Таким образом можно в конфигурации сайта просто указать какой модуль использовать для главной, а home.php уже сам подхватит эту настройку. Пока сделал три модуля для главной, но чтобы вы понимали есть уже 20 готовых tpl-файлов под разные выводы записей. То есть моя идея в том, что для кастомизации вывода главной достаточно сделать свой модуль, где настроить любой из готовых tpl-файлов.

В процессе работы понял, какая это классная штука — мультисайтинг! Насколько стало удобно работать с сайтами, я даже представить себе не мог. Обновление system — сразу для всех сайтов, новые дефолтные конфиги сразу для всех сайтов. Пока у меня три сайта, но уже это ощутимо.

Ещё по шаблону. Как выяснилось, он тоже может работать в режиме мультисайтинга. Собственно я всегда предполагал, что шаблон должен быть уникальным для каждого сайта. Ну весь Web так и устроен. Но постепенно я обнаружил, что на всех сайтах использую один и тот же шаблон. Устройство его таково, что можно использовать его как есть, но когда стоит задача сделать что-то отличное, то не нужно ничего менять, просто делаем свой модуль, файл или вывод под свою задачу. Свои файлы можно размещать как в каталоге дефолтного шаблона, то есть расширять его, либо вообще отдельно и произвольно.

Например модуль главной совершенно не обязательно размещать в каталоге шаблона. Точно также как и свои tpl-файлы. Это же касается и css/js-файлов. Единственное, что так не сработает, так это parts-файлы — их расположение фиксированное, но я ещё подумаю над этим.

Что это даёт? Шаблон сам по себе достаточно сложная штука. Если мы делаем новый сайт, то предполагаем, что нужно делать и свой шаблон, но в Albireo CMS можно сделать только то, что нужно изменить по сравнению с дефолтным шаблоном. По опыту получается, что даже не изменить, а добавить свои файлы, но при этом они могут быть вне каталога дефолтного шаблона.

Для мультисайтинга это тоже довольно круто, потому что каталог шаблона теперь един для всех сайтов, а значит его обновление будет происходить сразу для всех сайтов. По умолчанию в Albireo CMS шаблон свой для каждого сайта, но для того, чтобы вынести его общим, нужно прописать две строчки в конфиг-файле констант (указать путь и адрес).

Сам шаблон немного «расширился» за счёт новых ресурсов. Я уже упоминал, что сделал 27 лендингов с сайта templatemo.com. В этих лендингах используется jQuery, Bootstrap CSS, поэтому я решил файлы этих библиотек добавить к общедоступным ресурсам шаблонов. Очень много лендингов используют именно эти библиотеки, поэтому в Albireo CMS он доступны «из коробки», хотя сам default-шаблон их не использует. То есть идея в том, что если использовать любой сторонний лендинг, то часть библиотек можно будет подключить через поля страницы.

В теории я бы хотел интегрировать ещё десяток лендингов под Albireo CMS, но останавливает их лицензия. Нужен какой-то 100% открытый код и сайт. Из того, что я вижу, есть только какие-то старенькие или невзрачные лендинги, хотелось бы что-то поновей (хотя бы бутстрап 4 или 5). Если знаете такие сайты, кидайте в комментарии.

Сделал ещё одну классную вещь, наверное опубликую отдельной записью. Это синхронизация удалённого и локального серверов. Синхронизация по FTP с помощью WinSCP. У него есть своя синхронизация, но мне нужно было все сделать полностью управляемым. Строго говоря разработка — это не только Albireo CMS, а вообще любой проект и сервер. Фишка в том, что там всего один файл, только он универсальный для сервера и для локальной консоли. После его отработки получается готовый bat-файл для запуска WinSCP. Смысл в том, чтобы запустил скрипт, он выдал готовый bat-файл, посмотрел его (что и куда будет копироваться) и если всё ок, то запускаем — синхронизация будет выполнена. Удобство в том, что один раз настроил, а дальше работает автоматом.


Слава Украине! Смерть рашистам!

Похожие записи
Оставьте комментарий!