Maksoft.net




  • Блоковете в страница са независими части информация, преместваеми в рамките съдържанието на всяка страница, които позволяват вграждането и позиционирането на отделни функционалности и части информация в различните редактируеми елементи на страницата. 

    Реализацията е свързана с 3 таблици 

    • block_types дефинира глобално наличните типове.

    • page_blocks казва: този тип блок е разрешен за този сайт/страница.

    • page_blocks_data казва: този разрешен блок е реално включен в страница X, на позиция Y.

    🧱 1️⃣ Таблица: block_types

    Описва глобалните типове блокове и техните зависимости.

    Поле Тип Описание
    block_type_id INT AUTO_INCREMENT Уникален идентификатор на типа блок
    block_key VARCHAR(50) Уникален код на типа (напр. hero, custom, gallery)
    block_name VARCHAR(100) Име за показване в админ панела
    description TEXT Подробно описание на предназначението на типа
    icon_class VARCHAR(50) Bootstrap икона за визуализация в админ интерфейса
    css_assets TEXT Външни CSS ресурси (от cms_assets.php), разделени със запетая
    js_assets TEXT Външни JS зависимости
    php_init TEXT Глобален PHP код за инициализация на типа блок
    editable_fields JSON Определя кои полета поддържа блокът (напр. ["init","html","css","js","php","data"])
    created_at TIMESTAMP Дата на създаване
    updated_at TIMESTAMP

    Последна промяна

    🧩 2️⃣ Таблица: page_blocks

    Описва кои типове блокове са разрешени за конкретен сайт и/или страница (каталог на достъпните блокове).

    Поле Тип Описание
    blk_id INT AUTO_INCREMENT Уникален идентификатор на разрешения блок
    site_id INT DEFAULT 0 ID на сайта (0 = публичен, достъпен за всички сайтове)
    page_n INT DEFAULT 0 ID на страницата, за която блокът е разрешен (0 = глобален в сайта)
    block_type_id INT NOT NULL Връзка към block_types
    block_key VARCHAR(100) Уникален ключ за блока (напр. promo_banner, custom_footer)
    block_name VARCHAR(100) Име за админ интерфейса
    config_json JSON Настройки/параметри за блока
    access_level INT Ниво на достъп, необходимо за използване на блока.
    0 = общодостъпен (гости), 1+ = минимално ниво на потребителя, което му позволява да вижда/редактира блока.
    sort_order INT DEFAULT 0 Ред на показване в админ списъка (не влияе на рендеринга)
    is_active TINYINT DEFAULT 1 Статус на блока (1 = активен, 0 = неактивен)
    created_at TIMESTAMP Дата на създаване
    updated_at TIMESTAMP Последна промяна

    🧾 3️⃣ Таблица: page_blocks_data

    Съдържа реалните инстанции на блокове, включени от потребителя в страниците и определя реда им на визуализация.

    Поле Тип Описание
    data_id INT AUTO_INCREMENT Уникален идентификатор на инстанцията
    blk_id INT NOT NULL Връзка към page_blocks (кой блок е инстанциран)
    site_id INT NOT NULL ID на сайта
    page_n INT NOT NULL ID на страницата
    lang_id INT DEFAULT 0 Езикова версия
    data_json JSON Съдържание на блока (init, css, html, php, js, data и др.)
    sort_order INT NOT NULL Редът, в който блокът се визуализира в рамките на страницата.

    Системата използва три взаимносвързани таблици — block_types , page_blocks и page_blocks_data .

    Таблицата block_types дефинира глобалните типове блокове и техните зависимости (CSS, JS, init PHP, template файлове и конфигурационни полета).

    Таблицата page_blocks описва кои блокове от даден тип са разрешени за конкретен сайт или страница и служи като каталог, от който потребителят избира.

    Таблицата page_blocks_data съдържа реалните инстанции на блоковете, които потребителят е включил на страница, с техните данни (data), параметри и позиция (sort_order).

    При визуализация CMS-ът зарежда активните инстанции от page_blocks_data, изпълнява init логиката и преобразува всеки запис в стандартен SSR блок със структура:

    $block = array(
        'id'   => ...,
        'type' => 'block_type',
        'data' => array(...)
    );
    

    Всички блокове се подават към темата чрез $page['blocks'] и са достъпни и в основния поток:

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

    В темата всеки блок се достъпва чрез обхождане:

    foreach ($page['streams']['main']['items'] as $block) {
    
        if ($block['type'] === 'experience') {
            $data = $block['data'];
    
            echo $data['title'];
            echo $data['items'][0]['value'];
        }
    }
    

    HTML визуализацията се извършва чрез template файлове (напр. blocks/experience.php), които получават директен достъп до $block['data'].

    Наличен е универсален loader render_engine_file(), който рендерира template файлове (HTML/PHP) с подадените данни и поддържа {{placeholders}}.

     

    ...

    Блокове в страница (page_blocks)
    Начало /  /  / Документация...


  • Функция fetch извлича стойността на заявката query съответно като обект, асоциативен масив и стандартен масив с числови и асоциативни стойности. 

    function fetch($type, $db_query=false){
    if(!$db_query){
    return false;
    }
    switch($type){
    case "object":
    return mysql_fetch_object($db_query);
    case "assoc":
    return mysql_fetch_assoc($db_query);
    default:
    return mysql_fetch_array($db_query);
    }
    }...

    Функция fetch
    Начало /  /  / Документация /  / Библиотека SITE...


  • Максофт е основа на 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 и визуализацията
    ...

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


  • PAGE Structure (v2)


    PAGE (данни за страница)

    • id – вътрешно уникално ID
    • n – номер на страница (Maksoft CMS)
    • type – тип съдържание page | post | product | offer | testimonial | faq | system | stream_item
    • status – статус на публикуване
    • name – кратко име (меню)
    • title – SEO заглавие
    • url – пълен адрес
    • parent_id – родителска страница (0 = корен)
    • order – ред на подредба
    • page_type – семантичен тип страница
    • view_mode – режим на визуализация

    content (съдържание)

    • text – plain текст
    • html – пълно HTML съдържание, както е въведено/рендерирано
    • sections – извлечени семантични секции от html
    • excerpt – кратък откъс
    • description – описание (за meta/preview)

    content.sections

    sections е асоциативен масив със стандартни и разширяеми semantic slots. Секциите се извличат от HTML блокове с класове:

    <section class="section section-hero">...</section>
    <section class="section section-solution">...</section>
    <section class="section section-faq">...</section>

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

    $page['content']['sections'] = [
        'hero'        => '',
        'main'        => '',
        'intro'       => '',
        'problem'     => '',
        'solution'    => '',
        'benefits'    => '',
        'features'    => '',
        'proof'       => '',
        'offer'       => '',
        'action'      => '',
        'faq'         => '',
    
        'summary'     => '',
        'content'     => '',
        'related'     => '',
    
        'gallery'     => '',
        'specs'       => '',
        'price'       => '',
        'delivery'    => '',
    
        'testimonial' => '',
        'reviews'     => '',
        'logos'       => '',
    
        'notice'      => '',
        'error'       => '',
        'success'     => ''
    ];
    • main съдържа HTML-а, който остава след извличането на section-* блоковете.
    • Повтарящи се секции от един тип се обединяват в същия slot в реда на срещане.
    • Нови секции са позволени без промяна в структурата.
    • content.html остава наличен непроменен за обратна съвместимост.

    Пример за ползване в тема:

    <?= $page['content']['sections']['hero'] ?>
    <?= $page['content']['sections']['main'] ?>
    <?= $page['content']['sections']['solution'] ?>
    <?= $page['content']['sections']['action'] ?>

    meta (SEO данни)

    • title – SEO title
    • description – SEO description
    • keywords – масив ключови думи
    • tags – суров текст с тагове

    media (медия ресурси)

    main_image (основна снимка)

    • id – ID на медия
    • kind – тип медия (image/video/other)
    • src – URL / път
    • alt – alt текст

    origin (произход медия)

    • type – local | external | proxy
    • provider – име на източник
    • original_url – оригинален URL

    prices (списък с цени)

    Масив с ценови обекти.


    breadcrumbs (навигационна пътека)

    Масив от:

    • id
    • name
    • url

    streams (потоци съдържание)

    Масив от Stream обекти.

    Потоците се рендерират последователно от темата.


    Stream

    • id – идентификатор на потока
    • kind – relation | group | feed | search | custom
    • binding – strong | weak | virtual
    • role – семантична роля subpages | group_pages | feed_items | search_results | related | custom

    Stream: children (директни подстраници)

    • kind = relation
    • binding = strong

    items → Card[]


    Stream: group_pages (страници от асоциирана група)

    • kind = group
    • binding = weak

    group (данни за група)

    • id – ID група
    • title – име група

    items → Card[]


    Stream: feeds (външни потоци)

    Масив от StreamFeed.


    StreamFeed

    • id – ID feed
    • kind – feed
    • binding – virtual
    • source – db | http | api
    • type – тип достъп (rss/json/api/custom)
    • url – адрес на API / източник

    cache (правила за кеширане)

    • ttl_sec – време на живот
    • stale_while_revalidate_sec – подновяване

    index (правила за индексиране)

    • enabled – включено/изключено
    • key – ключ за индекс

    items → Card[]


    raw (debug данни)

    • kept – пази ли се raw
    • hash – версия / хеш

    Card (унифициран елемент)

    Всички items в streams използват единен модел Card.

    • id – уникален ключ
    • n – номер в Maksoft (ако има)
    • type – тип карта page | article | product | place | custom
    • title – заглавие
    • url – линк
    • summary – кратко резюме

    media (за карта)

    main_image → Media


    origin (произход на картата)

    • stream – от кой поток идва
    • source – db | http
    • binding – strong | weak | virtual
    • group_id – ID група (ако е group)
    • feed_id – ID feed (ако е feed)

    meta (карта)

    • external_canonical – каноничен външен URL

    children (preview под-елементи)

    • items – масив от Card (лек preview модел)

    extensions

    Engine-specific данни (например extensions.ms)


    show_group_id (Maksoft специфично)

    Поле в PAGE, което указва асоциирана група.

    • Ако > 0 → генерира се stream group_pages

    Йерархичен приоритет при рендериране

    1. search_results (ако съществува)
    2. children (subpages)
    3. group_pages
    4. feed_items
    5. custom

    Темата може да пропуска, но редът е препоръчителен.


    Основни принципи

    • PAGE управлява display
    • content.html остава пълният HTML източник
    • content.sections е semantic extraction layer за темите
    • Streams нямат display логика
    • Card е унифициран публичен модел
    • Media е отделен унифициран обект
    • Йерархията чрез parent_id е задължителна
    • Virtual страници използват същата PAGE структура
    • Extensions изолират Maksoft-specific данни
    ...

    Страница и card - SSR структура
    Начало /  /  / Документация / ...


  • feed.map.json съдържа дефиниции за всяка таблица, от която се подава информация чрез Feed API. Позволява настройка на полетата, връзките (JOIN), TTL, филтри и изчисляеми стойности.

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

    {
      "pages": {
        "table": "pages",
        "site_key": "SiteID",
        "ttl": 120,
    
        "access_filter": "pages.SecLevel <= {ACCESS_LEVEL}",
    
        "fields": [
          "*",
          "CONCAT('/page.php?n=', n, '') AS long_url",
          "date_modified AS updated_at"
        ],
    
        "fields_to_exclude": [
          "PageURL"
        ],
    
        "computed": {
          "url": "feed_pageurl(n)",
          "lastmod": "feed_date('Y-m-d', date_modified)"
        },
    
        "joins": {
          "+text": {
            "type": "LEFT",
            "table": "pages_text",
            "on": "pages.n = pages_text.n",
            "fields": ["lang_id", "title", "content"],
            "nested": true
          }
        },
    
        "order": {
          "field": "sort_n",
          "direction": "ASC"
        }
      }
    }
    

    Описание на ключовете в feed.map.json:

    Ключ Тип Описание
    table string Име на основната таблица в базата данни.
    site_key string Име на полето, което идентифицира сайта (например SiteID).
    ttl integer Време за живот на кеша (в секунди).
    access_filter string Филтър за ниво на достъп, използващ променливата {ACCESS_LEVEL}.
    fields array Списък от полета, които ще бъдат включени в SELECT заявката. Поддържа * за всички полета.
    fields_to_exclude array Списък от полета, които ще бъдат премахнати от резултата.
    computed object Дефинира изчисляеми полета чрез функции от feed.safe.func.php.
    joins object Дефинира JOIN връзки с други таблици (LEFT, INNER, RIGHT). Поддържа вложени резултати.
    order object Дефинира сортиране по подразбиране.

    Пример за няколко таблици:

    {
      "articles": {
        "table": "articles",
        "site_key": "SiteID",
        "fields": ["*", "author", "date_published"],
        "computed": {
          "url": "feed_concat('/articles/', slug)"
        }
      },
    
      "gallery": {
        "table": "gallery",
        "site_key": "SiteID",
        "fields": ["*", "image_path", "caption"],
        "order": { "field": "sort_n", "direction": "ASC" }
      }
    }
    

    Примери за заявки

    /feed/pages
    /feed/pages?status=1
    /feed/pages?preview>100
    /feed/pages?title~услуги
    /feed/pages?order_by=date_modified&order_dir=DESC
    /feed/pages?debug=1
    

    Примерен JSON отговор

    {
      "meta": {
        "table": "pages",
        "site_id": 2,
        "limit": 50,
        "offset": 0,
        "count": 2,
        "access_level": 0,
        "result": "ok",
        "debug_sql": "SELECT * FROM `pages` WHERE `SiteID`=2 ..."
      },
      "data": [
        {
          "n": "2",
          "name": "Начало",
          "url": "https://www.maksoft.bg/",
          "lastmod": "2025-07-26"
        }
      ]
    }
    

    Пример за PHP потребление

    <?php
    $json = file_get_contents('https://maksoft.net/feed/pages?limit=10');
    $data = json_decode($json, true);
    foreach ($data['data'] as $row) {
        echo $row['name'] . " - " . $row['url'] . "<br>";
    }
    ?>
    
    ...

    Feed Конфигурационен файл
    Начало /  /  / Документация / ...


  • Maksoft CMS – Theme v1 Architecture дефинира ясна граница между engine логиката и theme представянето. Архитектурата гарантира:

    • Единен runtime поток
    • Един обект на страница ($o_page)
    • Без дублиране на pipeline логика
    • Hooks като основен механизъм за разширяване
    • Theme слой само за presentation
    • Blocks се подават като ViewData (streams), не като HTML
    • DOM markers (data-*) се генерират от ThemeMapper

    Maksoft CMS – Theme v1 Pipeline

    Maksoft CMS – Theme v1 Architecture

    Engine Layer

    /engine
        /app
            /runtime
                ThemeRuntime.php
                LegacyExecution.php
            /render
                ShortcodeEngine.php
            /extensions
                LegacyPageUrlExtension.php
            /theme
                (future: ThemeBootstrap.php)
    

    Theme Layer

    /themes
        /ms
            _bootstrap.php
            /base
                /none
                    index.php
                    /blocks
                        gallery.php
                        hero.php
                        cta.php
                cms_assets.php
                functions.php
    

    Runtime Flow

    page.php
        ↓
    resolveTheme()
        ↓
    load theme.json
        ↓
    include theme index.php
        ↓
    ThemeRuntime::boot()
        ↓
    $o_page->hook(...)
        ↓
    render_assets()
    

    Data Pipeline

    loader.php
        ↓
    init_page_blocks()
        ↓
    PageData
        ↓
    ThemeMapper
        ↓
    ViewData
        ↓
    theme/index.php
        ↓
    block templates
        ↓
    HTML
        ↓
    page cache
    

    ViewData Structure

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

    Block Rendering

    foreach ($view['page']['streams']['main']['blocks'] as $block) {
        include $view['theme']['dir'].'/blocks/'.$block['type'].'.php';
    }
    

    DOM Integration

    ThemeMapper добавя стандартни DOM markers за JS lifecycle:

    data-block
    data-id
    data-editable
    

    Theme JavaScript инициализира функционалност чрез:

    document.querySelectorAll("[data-block]")
    

    Key Principles

    • Single page object ($o_page)
    • No duplicated pipeline
    • Hooks as extension mechanism
    • PageURL as Extension
    • Assets managed only by legacy asset registry
    • Theme = presentation only
    • CMS provides data structure (streams)
    • Themes render blocks
    • DOM markers act as JS integration API
    ...

    Архитектура - Engine Layer
    Начало /  /  / Документация...


  • Semantic sections позволяват на редактора да маркира части от съдържанието според тяхната роля, без да променя структурата на страницата.

    Редакторът продължава да работи в основното HTML съдържание на страницата, но при нужда може да огради важен блок със:

    <section class="section section-hero">
        <h1>Основно обещание на страницата</h1>
        <p>Кратко пояснение за кого е страницата и какъв резултат предлага.</p>
    </section>

    Основно правило

    Всеки section има две CSS class стойности:

    section section-{име}

    Пример:

    <section class="section section-solution">
        <h2>Нашето решение</h2>
        <p>Описание на продукта, услугата или подхода.</p>
    </section>
    • section – казва, че това е семантична секция.
    • section-solution – казва каква е ролята на секцията.

    Най-често използвани секции

    • section-hero – основно обещание / първи екран
    • section-intro – въведение
    • section-problem – проблем или нужда
    • section-solution – решение
    • section-benefits – ползи
    • section-features – характеристики
    • section-proof – доказателства, резултати, доверие
    • section-offer – оферта
    • section-action – действие / CTA
    • section-faq – често задавани въпроси

    Примерна страница

    <section class="section section-hero">
        <h1>Бърза поддръжка на компютри за малък бизнес</h1>
        <p>Помагаме ви да работите спокойно, без забавяния и технически прекъсвания.</p>
    </section>
    
    <section class="section section-problem">
        <h2>Кога имате нужда от сервиз?</h2>
        <ul>
            <li>Компютрите работят бавно.</li>
            <li>Софтуерът често блокира.</li>
            <li>Нямате човек, който да реагира бързо.</li>
        </ul>
    </section>
    
    <section class="section section-solution">
        <h2>Как помагаме?</h2>
        <p>Предлагаме диагностика, ремонт, профилактика и абонаментна поддръжка.</p>
    </section>
    
    <section class="section section-action">
        <h2>Имате нужда от помощ?</h2>
        <p>Свържете се с нас за бърза консултация.</p>
    </section>

    Какво може да използва редакторът вътре в section

    Вътре в секциите могат да се използват стандартни HTML елементи:

    • заглавия: h1, h2, h3
    • параграфи: p
    • списъци: ul, ol, li
    • удебеляване: strong, b
    • курсив: em, i
    • линкове: a
    • снимки: img
    • таблици, ако са нужни за структурирани данни

    Какво да се избягва

    • Да не се използват сложни inline стилове за layout.
    • Да не се влагат прекалено много section-и един в друг.
    • Да не се използват section-и само за визуален ефект.
    • Да не се заменя смисълът на съдържанието с дизайн класове.

    Важно

    Ако темата поддържа semantic sections, тя може да изведе отделни секции на специални места — например section-hero в hero зона, section-action до форма за контакт или section-faq преди финалния CTA.

    Ако темата не ги поддържа, съдържанието пак остава валиден HTML и може да се покаже като обикновен текст на страницата.

    ...

    Семантични секции в страница (page semantic secionts)
    Начало /  /  / Документация...


  •         Нов редактор в Максофт Нет CMS представи компанията на обучение за клиенти

    Максофт е дигитална агенция със собствени продукти за изработка, поддръжка, SEO оптимизация и маркетинг на интернет сайтове от 1999 година. Ние сме SEO фирма със собствени продукти и услуги за управление на съдържание, SEO оптимизация, дигитален маркетинг и реклама на фирми от различни браншове.  

    Максофт има над 25 години опит в печатна и интернет реклама. Компанията е водещ вносител на рекламни материали. 

    ...

    Начало
    Начало...


  • Какво е Максофт Нет система за управление на съдържанието на уеб сайт. Може ли да се инсталира, Как се прехвърля. Колко струва?

     

    ...

    Въпроси и коментари за Максофт Нет CMS
    Начало /  /  / ...


  • Настоящият раздел регламентира задълженията и правата на Максофт като Изпълнител и на клиента като Възложител по направени поръчки, както и правила за поддръжка.

    Условия за ползване 

    Този сайт е предназначен само за юридически лица- фирми регистрирани на територията на страна члена на Европейския съюз или извън него. 

    Разглеждайки този сайт Вие декларирате, че представлявате законно регистрирана компания (фирма). 

    В хода на работа с този сайта, за изготвяне на калкулации и оферти, ще Ви бъде изискан уникален идентификационен номер (булстат) на компанията (фирмата), която представлявате. 

    Този сайт не събира информация по смисъла на чл.2, ал.1 от Закона за защита на личните данни и не работи с частни лица. 

     

    Общи условия за възлагане, изпълнение на поръчки и поддръжка

    Поръчките в този сайт се изпълняват съгласно Закона за задълженията и договорите. 

    ...

    Общи условия
    Начало / ...


Максофт е дигитална агенция със собствени продукти за изработка, поддръжка, SEO оптимизация и маркетинг на интернет сайтове от 1999 година. Ние сме SEO фирма със собствени продукти и услуги за управление на съдържание, SEO оптимизация, дигитален маркетинг и реклама на фирми от различни браншове.  

Максофт има над 25 години опит в печатна и интернет реклама. Компанията е водещ вносител на рекламни материали. 



Следвайте ни

Запитване

Maksoft.Bg Maksoft.Net BrandIT