Итак, что же представляет собой ребрендер? Зачем он нужен, и какие шаблоны поддерживает мы уже разобрали, теперь разберемся с технической стороной. Как ты уже видел на схеме, за ребрендер отвечают 3 сервиса: https://github.com/WOWMIDEV/WOWMI-ecosystem-builder, https://github.com/WOWMIDEV/WOWMI-ecosystem-api и https://github.com/WOWMIDEV/WOWMI-Ecosystem-Dashboard. Для удобства будем назвать их builder, api и dashboard.

Api — это бекенд часть ребрендера, написанная на Symphony 6 (но аннотации нужно будет поменять на атрибуты, т к это уже не модно, но это я уже забегаю вперед). В этой апи содержится основная логика работы самого сервиса. Более подробно структуру этого апи мы рассмотрим ниже, а пока этого достаточно.

Dashboard — это frontend часть ребрендера. Находится она тут /dashboard/templates/themes (по какому именно доменному имени ты должен уже и сам догадаться, если внимательно читал). Именно dashboard общается с Api, отправляет и получает информацию.

Возникает вполне логичный вопрос, для чего в этой цепочке нужен builder? Так вот этот сервис содержит файлы самих тем, новые, сгенерированные ребрендером стили. Ну и собственно builder подгружает саму тему при открытии сайта. На текущий момент существует одна тема, от которой копируются остальные и видоизменяются. Эта тема называется Arbor. Также важно понимать, что все темы ребрендера пробрасываются в докер-контейнер. На текущий момент эта папка находится тут /home/digitalbutler/data/wowmi-platform-prod/duplicated-themes

Давайте рассмотрим схему базы данных в сервисе API:

https://viewer.diagrams.net/?tags={}&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Ребрендер.drawio#R7V1bc9o6EP41zPQ8wPiK4THQJm1PeqZtenp5yihYATfGorYokF9fGcsGW%2FKNi0UdzWQm1lq%2B6Vtpv12tREcfz9c3PljMPiAbuh1Nsdcd%2FXVH09ShZZJ%2FoWQTS%2Fp6JJn6jk1lO8Gd8wypUKHSpWPDIFURI%2BRiZ5EWTpDnwQlOyYDvo1W62iNy009dgClkBHcT4LLSb46NZ5F0oFk7%2BVvoTGfxk9X%2BMDozB3Fl%2BiXBDNhotSfS33T0sY8Qjo7m6zF0w9aL2%2BXbu8039%2Fapf%2FP%2BU%2FAL%2FD%2F698t%2FX7vRza7rXJJ8gg89fPCtn58er99%2BNX5%2BX3y8%2FrRSbq4e3nfpJcpv4C5pe2E4X7gAw3s8g3NIvxxv4uYMVs7cBR4pjR6Rh%2B%2FoGdIYI%2BA6U48cT8hbQp8IfkMfOwSJK3oCowWRTmaOa9%2BCDVqG3xJgMHmKS6MZ8p1nclvgklMqEZDTPqZKpfVTNe7CK4lYIVIfBqTOx7iB1ER0CwJM60yQ64JF4DxsXzisMgf%2B1PFGCGM0j2%2BElp4NbVpKEN8WsI%2BeEh0Kr68IC4UvbA243lNKCtMNRHOI%2FQ2pQs%2F2%2B1Q5aZ%2Frmn2K02qnwWosm%2B1pr05lgHaaaXLv5HGfSScD3pQ0QvK85LK4jxsVH0cQST0OuAR4jyjPKGzGYF8dycHep%2B5EWyWtobCqzmjsHNlLt7KmKlJTT6epqjZIq07XGFbUHVU9SFd1I%2F1AfcB5nnUhumowukrqZ%2FWUNDXe00kXPuJcjQwWYOJ409ttndfGTvKZfmgoQuTaR3erDTPHtqG31RYMMHhIesACOR7etoQ5In%2BkvcZKz%2ByY5IXGpKzuyuQvrO7jMfKIYgFnq0GQaOsKhhrL0a3ijluuXJs0YnVHoX1FSkFagJ%2FW1Z%2Fer9GHobW46U6153cPX8Yc4%2BgBjklsB4AMLpUxzQXQ1AQDqDIARrbi3nW8J4ljVRytgWAc%2BxoDFrQJy6dF0iYzNEUecN%2FspBkDuatzi0IEt2bxJ8R4Q202WGIUWm08jy06XDv4e3g5af%2Bo9IPeLDx%2Bvd4vbOKCR773e3yDsPBjd4ewuLtsW4qvi74v%2FKhc5IosdoCW%2FgQWIUwZJSEpU1ikCgpfE3xIfALnd%2FrtCiz3x1Ctd1Z7kKUJZtb6Ry9GLzuDKbaYoSBxdCR%2FFMYfB%2F08vSilj4e5Oqb5F7k6A0kf2Q58kfSR%2F8rDPPrRQhgLhhNqUpVzgt0k1eS%2BssY6C%2BlImgT95KA3yUv5oOc6GM4cTOH9oyM7%2BxlwVxVDsENiMriv4EPgJGTyfkqaaCEpZSmlLPFW81lmfkhSzVC8rl6V4yXCVoQk%2BZ70y6GUJaqV368vglFyX6%2FUiW2jsTkXmsKjk6x7hzeLcFx5BUJswiFmvIVyaTsorOjYMPzf6%2F0jQa4IsvDQJesDTogBJp8UUQTZYatjKZ72qayTF%2FM%2BiWN1HPUDY26nw1Er4%2B%2B0k0oGL4DBD60MgbdYfUmSsk4QE%2F6b%2BDsn%2FUWOPEzPrsPguZp0vpGHTQnhRQ6kOakBKofINwwqGw5imDx5E2ATs0Cabax1rpQoA4EWfHKOVJk73hLDQLL7ytBz6H3D0LMBlehQQlgRQh6rbxbD%2FoBBq4HskuiZJ8n44Dc79TxLMz6iikekfBzXgVgHORvTkrF0UUzcHGaYePVQ%2BkBrOxXnzPhK1sb07MsNpnMmb2U0%2FXA8hYfTNTaos8%2FC3QlM%2BHYmpL6V9Xoyrl4DbuGBdY2NhMjI%2BqFoig%2Bta6wjtc2ekXHZi2GDqp6lgzx2dsJk3b%2BKDbJz83IAYvr3BbNBdja%2Brdl7ZwNRPAVkgwkyun4kqMKJns762RGvlwhWQ1A8udNLuLqkcwLo3EDLsDmtz47fydYQKToXK1R76Zz%2BgpbuHzLk6MUrhnnz7DxNOt%2BIw07JRmv3lVdR8OeeZlPSiBDwnDlRKDsSyzhQZaR5k%2B%2FNIs1JaSeD6zrHskgga0ylNwqkweF5cTzehcCeQu%2F%2B19J5lmRBROxHye7zw0nKe6mxH4OdSZJkgenZlxv7MTgzR61fu3s2OIVHgQzW2wzthgSxBojCoz4WS%2Bt6vZ4EsCqA4oM%2BJutCbyPq2SQLOaUnjtYxCV48VjewXiSrM9kQgrQgTP%2Buxep4mnS%2B8Scno0CCWB1EHpdrFsTyJe9ySq8uqjxy1yyqeUvfJYLVEOSyu0YhjH8FQMyWnPHx3uaa5VtyJoUL2ZKz8gKNHF2otyfnle%2BDzV4Fqua7O2e27FSV7PygQcnbdd4VGhMkrH%2BFqWZUM3rvkzK7viFSd5VDdFfcdrJFG9GUq%2B7gSNU9LhBUTh6k8ynO%2BdSMcueTn3%2FQfufTeEF7vx4U%2FbIK%2BZHw%2FAOj4rJG6bfUQFV4rkG8s%2BCJFvrLFUd10BeeoGCy07xyrX8tCLlr%2FRvF0NIYDMO5wWcYSAoogAJmfnisq5kcStb%2BX4%2Fiq6rc6qlwrIm68uVmlVjs%2FOfPAHkSwaoICk8ksdgZQJmDUANA8UkkbABoP5NUWn1BgZ%2FsBo%2B6UtXstz%2FyY8nIT%2FGYUzvy0%2FCYk78GVeJYHUfhxn%2FAevsyi7QmiMIJwIAN2EkGVwNA8Vmk8T5yMs%2Fg0LnaeHXK2X%2F68zicZT7JsXPyOotzwfoIYUALTb5oA9AmJ%2FuiYIdKYUCbEugjR25Ohth5gD4oQ8zIuvGaua80TH2T2XCiZn1daSA5LM6ilGp7qNpqVQ2Rfmxi43Hjk5Btv9sEdPxjFqVA5%2BxP1BDOQ5E4tyHbU6tqh4TiPBTqKbYB56own2vcJkUfIbxvz32wmH1ANgxr%2FAE%3D

Если эта схема кажется тебе слишком сложной, то так и есть. А теперь давай рассмотрим основное, что нужно понимать:

template_theme — хранит название темы, к какой компании она относится, к какому типу пользователя. Также имеет системные статусы, по которым builder понимает, что нужно сгенерировать и обновить стили для шаблона.

module — хранит список существующих модулей для данного шаблона с их URI (если упростить, то это страницы с контентом).

template_module — хранит информацию о том, какие модули принадлежат какой-то конкретной теме

template_module_group — хранит группы контента, которые принадлежат определенной странице

template_module_content — хранит сам контент группы

file_template_module_content — хранит картинки группы

Чтобы лучше всего понять эту связку перейди на любой сайт, и посмотри на сам контент страниц, все сразу станет на свои места

template_leadgen_quiz и все ответвленные таблички отвечают за квизы (опросники)

Как работать с ребрендером?

Большинство будущих задач будет связано с исправлением ошибок на текущих темах, добавлением новых элементов в редактор, или созданием новых тем для редактора.

Для того, чтобы выполнять подобные задачи нужно понимать как все это работает.

Допустим, у нас есть, какая-то тема. Как мы помним, лежит она тут frontend/views/templates либо тут frontend/views/templates/duplicated-themes (если она является копией уже существующей темы, которую ранее подключили в ребрендер). Все элементы, которые должны редактироваться, нужно рендерить через специальную функцию. Рассмотрим на конкретном примере (Функция, которая рендерит главный заголовок страницы):