Maksoft.net

Максофт е основа на headless CMS система. Целта на новия рендерер на теми е да осигури лесна адаптация и визуализация на сайтове, създадени както за legacy Maksoft CMS, така и за нови дизайни и теми, писани за Maksoft CMS, WordPress, Joomla и други системи.

Темите работят върху стандартизиран слой от данни (ViewData), предоставен от CMS. Темата не комуникира директно с базата данни или CMS класове.

Създаването на нова тема започва със създаване на директория в /themes/ms/... и записване на основния index.php файл в нея.

index.php зарежда engine bootstrap файла /themes/ms/_bootstrap.php, получава готовите ViewData променливи и използва предоставения обект $o_page за достъп до CMS hooks.

Темата се регистрира в CMS чрез запис в таблица Templates. Това я прави достъпна за конкретен сайт (SiteID) или за всички сайтове (SiteID = 0).

CSS/JS активите се управляват централизирано чрез cms_assets.php, което предотвратява дублиране на зависимости и осигурява контрол на версиите.


/themes – Official Theme Architecture Spec (v1.4)

1. Цел на директорията /themes

/themes е стандартният слой за рендериране на Maksoft CMS.

  • Съдържа теми, групирани по engine / renderer.
  • Осигурява споделени helpers и assets на ниво engine.
  • Позволява темите да работят със стандартизиран ViewData слой.

/themes не заменя legacy /Templates, а съществува паралелно с него за backward compatibility.


2. Основен принцип

CMS подава ViewData → Theme engine рендерира → Theme определя структурата
  • Темите не четат директно база данни.
  • Темите не инстанцират CMS класове.
  • Темите не съдържат бизнес логика.
  • Темите рендерират подадените данни.

3. Основна ViewData структура

view
 ├ context
 ├ auth
 ├ user
 ├ user_context
 ├ site
 ├ page
 │   └ streams
 │       ├ main
 │       │   └ items[]
 │       └ subpages
 │           └ items[]
 └ theme

streams.main.items съдържа основните content blocks на страницата.

streams.subpages съдържа relation stream с подстраниците. Темата решава къде да го визуализира.


4. Йерархия на директориите

/themes
    /ms
    /wp
    /joomla

Всеки engine определя:

  • формата на ViewData;
  • helpers;
  • asset registry;
  • render conventions;
  • default blocks и components.

5. Engine-level структура: /themes/ms

/themes/ms
    _bootstrap.php
    theme.json
    cms_assets.php
    functions.php

    /helpers
        block_dom.php
        meta_tags.php
        footer_inc.php
        breadcrumbs.php

    /blocks
        text.php
        image.php

    /components
        menu.php
        navigation.php
        subpages.php

    /base
        theme.json
        /none
            theme.json
            index.php
            meta_tags.php
            footer_inc.php

            /blocks
                text.php
                image.php

            /components
                menu.php
                navigation.php
                subpages.php

            /layout
                head.php
                header.php
                footer.php
                scripts.php

            /partials
                menu.php
                breadcrumbs.php
                banners.php

            /assets
                /css
                /js
                    theme.js
                    /blocks
                        text.js
                        image.js
                    /components
                        subpages.js
                /images

            README.md

6. Blocks

Blocks са основните content елементи на страницата.

Те се намират в:

$page['streams']['main']['items']

Всеки block съдържа:

[
    'id'   => 1,
    'type' => 'text',
    'data' => [...],
    'dom'  => [
        'data-block'    => 'text',
        'data-id'       => '1',
        'data-editable' => '0'
    ]
]

Blocks се рендерират чрез:

 

BlockResolver чете $page['streams']['main']['items'], намира подходящия template и връща HTML.

Block template resolution

theme/blocks/{pageType}/{block}.php
theme/blocks/{block}.php
themes/ms/blocks/{pageType}/{block}.php
themes/ms/blocks/{block}.php

7. Components

Components са визуални елементи, които не са задължително част от основния body content.

Примери:

  • menu;
  • navigation;
  • breadcrumbs;
  • subpages;
  • banners;
  • footer elements.

Components позволяват на темата да контролира къде точно се рендерира даден елемент.


8. Subpages contract

Subpages не се добавят автоматично в streams.main.items.

Официалният source за подстраници е:

$page['streams']['subpages']

Примерна структура:

$page['streams']['subpages'] = [
    'id'      => 'children',
    'name'    => 'subpages',
    'kind'    => 'relation',
    'binding' => 'strong',
    'role'    => 'subpages',
    'display' => [
        'enabled'  => 1,
        'layout'   => 'auto',
        'columns'  => 3,
        'elements' => ['image', 'title', 'excerpt'],
        'links'    => 'full',
        'limit'    => null,
        'order'    => 'manual'
    ],
    'items' => [...]
];

Темата рендерира subpages чрез:

 

Това позволява на темата да избере дали подстраниците да се покажат:

  • след основния текст;
  • преди основния текст;
  • в отделна секция;
  • в sidebar;
  • в slider;
  • в grid/gallery зона.

Default renderer-ът за subpages се намира в:

/themes/ms/components/subpages.php

Темата може да го презапише чрез:

theme/components/subpages.php

9. Main content и subpages

main_content и sub_pages са отделни render hooks.

Препоръчителна структура в тема:

<main>
    <?= $o_page->hook('main_content') ?>
    <?= $o_page->hook('phpcode') ?>
    <?= $o_page->hook('sub_pages') ?>
    <?= $o_page->hook('pageurl') ?>
</main>

Така темата запазва контрол върху реда и мястото на отделните секции.


10. DOM Integration

CMS добавя стандартни DOM markers:

data-block
data-id
data-editable

DOM markers се генерират чрез helper:

block_dom($block)

Пример:

<section<?= block_dom($block) ?>>
    ...
</section>

Резултат:

<section data-block="text" data-id="1" data-editable="0">
    ...
</section>

DOM markers са официалният JS API между CMS и темата.


11. JavaScript lifecycle

Темите могат да инициализират JS поведение чрез DOM markers.

document.querySelectorAll("[data-block]").forEach(function(el) {
    var type = el.getAttribute("data-block");

    if (window.Theme && Theme.blocks && typeof Theme.blocks[type] === "function") {
        Theme.blocks[type](el);
    }
});

Пример:

window.Theme = window.Theme || {};
Theme.blocks = Theme.blocks || {};

Theme.blocks.text = function(el) {
    console.log("Text block init", el.getAttribute("data-id"));
};

За components може да се използва отделен namespace:

window.Theme = window.Theme || {};
Theme.components = Theme.components || {};

Theme.components.subpages = function(el) {
    console.log("Subpages component init", el.getAttribute("data-id"));
};

12. Assets

Assets се управляват на две нива.

Engine-level

/themes/ms/cms_assets.php

Дефинира споделени зависимости:

  • Bootstrap;
  • Tailwind;
  • Alpine;
  • Core JS runtime;
  • общи component styles.

Theme-level

theme/assets/css
theme/assets/js
theme/assets/images

Темите не трябва да enqueue-ват assets директно в templates. Те използват asset registry и hooks.


13. Theme configuration: theme.json

theme.json е незадължителен конфигурационен файл. CMS използва overwrite cascade.

Използва се първият намерен theme.json, тръгвайки от директорията на темата нагоре.

/themes/ms/base/none/theme.json
/themes/ms/base/theme.json
/themes/ms/theme.json
/themes/theme.json

14. Maksoft Template Language (MTL)

Maksoft Template Language (MTL) е compatibility и extension слой върху стандартните PHP templates.

MTL позволява legacy PHP include файлове като edit.php, PageURL и phpCode да декларират JavaScript, CSS и други embedded code blocks без да нарушават нормалното PHP изпълнение.

MTL не заменя PHP. Legacy Maksoft CMS PHP остава валиден execution layer.

Directive marker

<!-- @push('js') -->
<script>
$j(document).ready(function(){
    // Legacy JavaScript code
});
</script>
<!-- @endpush -->

MTL-aware engine премества този блок към:

 

Asset declaration

<!-- @asset('jquery') -->
<!-- @asset('jquery-alias-j') -->
<!-- @asset('fancybox') -->

Engine behavior:

$o_page->add_asset('jquery');
$o_page->add_asset('jquery-alias-j');
$o_page->add_asset('fancybox');

15. Theme development checklist

  • Създайте директория в /themes/ms/....
  • Добавете index.php.
  • Заредете /themes/ms/_bootstrap.php.
  • Използвайте $o_page->hook('main_content') за основните blocks.
  • Използвайте $o_page->hook('sub_pages'), ако темата трябва да показва подстраници.
  • Добавете block overrides в /blocks само за основни content blocks.
  • Добавете component overrides в /components за menu, navigation, subpages и други relation/render components.
  • Използвайте block_dom($block) за DOM markers.
  • Инициализирайте JS чрез Theme.blocks и/или Theme.components.

16. Key principles

  • Single page object: $o_page.
  • CMS управлява data layer.
  • Theme управлява HTML и визуализацията.
  • Blocks са част от streams.main.items.
  • Subpages са отделен relation stream: streams.subpages.
  • Theme контролира layout и позициониране.
  • DOM markers са JS integration API.
  • Page cache кешира крайния HTML.

17. Theme runtime flow

HTTP Request
      ↓
page.php
      ↓
loader.php
      ↓
$o_page->init_page_blocks()
      ↓
PageData
      ↓
ThemeMapper
      ↓
ViewData
      ↓
resolveTheme()
      ↓
include theme/index.php
      ↓
$o_page->hook('main_content')
      ↓
BlockResolver
      ↓
block templates
      ↓
$o_page->hook('sub_pages')
      ↓
Subpages component renderer
      ↓
HTML output
      ↓
page cache

18. Status

  • Version: v1.4
  • Change: ViewData streams contract, BlockResolver, Components, Subpages relation stream, DOM helper.
  • Backward compatible: Да.
  • Runtime cost: минимален.

Основният принцип остава:

CMS управлява данните → Theme управлява HTML и визуализацията

Файлова структура теми (templates)


# Themes Architecture

This document defines the official filesystem structure, rules and contracts
for the `/themes` directory.

The `/themes` layer is responsible only for presentation.
All business logic, plugins and data access are handled by the CMS core.

Themes consume runtime data objects provided by the CMS and render output using
engine-specific conventions.

---

# DIRECTORY STRUCTURE

/themes

├── README.md

├── ms/
│ ├── _bootstrap.php
│ ├── theme.json
│ ├── cms_assets.php
│ ├── functions.php

│ ├── helpers/
│ │ ├── block_dom.php
│ │ ├── meta_tags.php
│ │ ├── footer_inc.php
│ │ └── breadcrumbs.php

│ ├── blocks/
│ │ ├── text.php
│ │ ├── image.php
│ │ ├── menu.php
│ │ ├── navigation.php
│ │ └── subpages.php

│ └── base/
│ ├── theme.json
│ │
│ └── none/
│ ├── theme.json
│ ├── index.php
│ ├── meta_tags.php
│ ├── footer_inc.php

│ ├── blocks/
│ │ ├── text.php
│ │ ├── image.php
│ │ ├── menu.php
│ │ ├── navigation.php
│ │ └── subpages.php

│ ├── layout/
│ │ ├── head.php
│ │ ├── header.php
│ │ ├── footer.php
│ │ └── scripts.php

│ ├── partials/
│ │ ├── breadcrumbs.php
│ │ └── banners.php

│ ├── assets/
│ │ ├── css/
│ │ │ ├── theme.css
│ │ │ └── blocks/
│ │ │ ├── text.css
│ │ │ ├── image.css
│ │ │ ├── menu.css
│ │ │ ├── navigation.css
│ │ │ └── subpages.css
│ │ │
│ │ ├── js/
│ │ │ ├── theme.js
│ │ │ └── blocks/
│ │ │ ├── text.js
│ │ │ ├── image.js
│ │ │ ├── menu.js
│ │ │ ├── navigation.js
│ │ │ └── subpages.js
│ │ │
│ │ └── images/

│ └── README.md

├── wp/
└── joomla/

Maksoft Template Language (MTL)


Около 70% от проблемите при CMS миграции идват от несъвместими шаблони и inline код. Maksoft CMS решава това чрез Maksoft Template Language (MTL), който запазва PHP и добавя структуриран контрол върху JavaScript, CSS и ресурси.

MTL запазва PHP като основа. MTL добавя декларативни директиви. MTL осигурява преносимост между теми. Това позволява съществуващи файлове като edit.php, PageURL и phpCode да продължат да работят, без да се пренаписват.

Какво представлява Maksoft Template Language

Maksoft Template Language е съвместим слой върху стандартните PHP шаблони. Той не заменя PHP, а позволява шаблоните да декларират JavaScript, CSS и други блокове по начин, който CMS engine може да обработи централизирано.

  • Templates декларират съдържанието.
  • Engine интерпретира MTL директивите.
  • Themes визуализират крайния резултат.

Темите не трябва да парсват или интерпретират MTL. Темите само извикват стандартни точки за визуализация като render_assets(), hook('css') и hook('js').

JavaScript пример с @push('js')

MTL позволява JavaScript кодът да бъде деклариран в PHP шаблон, без да се нарушава legacy изпълнението.

<!-- @push('js') -->
<script type="text/javascript">
$j(document).ready(function(){
    // Legacy JavaScript code
});
</script>
<!-- @endpush -->

Очаквано поведение

  • Legacy CMS рендерира JavaScript блока inline.
  • MTL-aware engine извлича блока и го премества към hook('js').
  • Темата визуализира JavaScript чрез стандартен hook.

CSS пример с @push('css')

CSS блоковете се декларират по същия начин. Това позволява стиловете да бъдат преместени към правилната зона в страницата, без промени в стария PHP код.

<!-- @push('css') -->
<style>
.edit-page-form {
    margin-top: 10px;
}
</style>
<!-- @endpush -->

MTL engine регистрира този блок към hook('css'). Така CSS кодът може да бъде изведен в <head>, а основното съдържание остава чисто.

Деклариране на ресурси с @asset

MTL управлява JavaScript и CSS зависимости чрез asset декларации. Разработчикът посочва нужните ресурси, а CMS engine ги регистрира централизирано.

<!-- @asset('jquery') -->
<!-- @asset('jquery-alias-j') -->
<!-- @asset('fancybox') -->

Поведение на engine слоя

$o_page->add_asset('jquery');
$o_page->add_asset('jquery-alias-j');
$o_page->add_asset('fancybox');

CMS engine регистрира ресурсите. Темата извежда ресурсите. Разработчикът избягва ръчно дублиране на зависимости.

Rendering flow при legacy и MTL режим

Legacy поведение

main_content
→ include(edit.php)
→ HTML + PHP + CSS + JS render inline

MTL-aware поведение

main_content
→ capture include output
→ extract @push blocks
→ render remaining HTML/PHP

head
→ hook('css')

footer
→ render_assets('js')
→ hook('js')

Maksoft CMS разделя логика, декларация и визуализация. Това подобрява преносимостта между теми и намалява риска при бъдещи обновления.

Разширяемост с други езици

MTL позволява внедряване на други езици, без да се нарушава PHP съвместимостта. Обработката остава задача на CMS engine слоя.

<!-- @lang('twig') -->
...
<!-- @endlang -->

<!-- @lang('scss') -->
...
<!-- @endlang -->

Така PHP остава базовият template език, а MTL добавя отворен механизъм за бъдещи разширения.

Ползи за разработчици и клиенти

  • Разработчиците получават предвидима структура за JS, CSS и assets.
  • Клиентите получават по-преносима CMS архитектура при смяна на тема или дизайн.
  • Legacy кодът остава валиден и не изисква пълно пренаписване.
  • Темите остават независими от вътрешната логика на MTL.

Грешният избор на CMS често води до трудна поддръжка, скъпи миграции и несъвместими теми. Maksoft CMS намалява този риск, като запазва съществуващия PHP слой и добавя ясен модел за модерна theme архитектура.

Основният принцип е прост: templates declare, engine interprets, themes render.

Проверете подходящите ключови думи за тази тема чрез seo.maksoft.net. За по-добро позициониране комбинирайте съдържанието с вътрешна SEO оптимизация и органичен линк билдинг чрез Активен сайт от Максофт: https://maksoft.net.

Ключови изрази: Maksoft CMS, Maksoft Template Language, MTL PHP шаблони, преносима CMS архитектура, управление на JS и CSS в CMS


Начало /  /  / Документация / Създаване на теми (темплейти)
Maksoft.Bg Maksoft.Net BrandIT