Все инструкции от А до Я по работе с системой и ее архитектурой
Добро пожаловать в meloddyCMS! Платформа предназначена для легкого и интуитивного управления контентом ваших сайтов без необходимости знать программирование.
Вы можете самостоятельно зарегистрироваться на платформе. Для этого нажмите кнопку «Начать работу» на главной странице сайта или перейдите по ссылке https://meloddy-crm.ru/login.html?mode=register. Создайте свой аккаунт администратора, указав имя, действующий email и надежный пароль.
В любой момент вы можете изменить свое отображаемое имя или адрес электронной почты. Для этого перейдите в раздел «Настройки» (вкладка «Профиль») в левом боковом меню панели управления.
После входа вы попадаете на Дашборд. Это ваш главный пульт управления.
В карточке каждого проекта есть кнопка с тремя точками (...). При нажатии на неё откроется меню управления конкретным сайтом (настройки, SEO, аналитика и действия).
Это главная фишка meloddyCMS. Вы редактируете сайт прямо поверх его реального дизайна.
Наведите мышку на любой текст. Если он обвелся пунктирной линией, значит его можно изменить. Просто кликните по нему, сотрите старый текст и напишите новый. Форматирование (жирность, размер) сохранится автоматически.
Аналогично наведите на фотографию, логотип или иконку. По клику откроется стандартное окно вашего компьютера для выбора файла. Выберите новое изображение, и оно моментально загрузится на сайт.
Когда вы вносите изменения, они сохраняются только для вас в виде черновика. Посетители сайта их не видят! Чтобы выкатить изменения на боевой сайт, обязательно нажмите фиолетовую кнопку «Опубликовать» на верхней панели редактора.
В дашборде, нажав (...) на карточке проекта, вы попадете в детальную панель управления сайтом, разделенную на несколько вкладок:
robots.txt, генерируется ссылка на авто-обновляемую карту сайта sitemap.xml, подключается ID счетчика Яндекс Метрики (с поддержкой Вебвизора) и привязываются уведомления в Telegram.Система может перехватывать данные с форм обратной связи на вашем сайте и моментально отправлять их вам в мессенджер.
Чтобы бот присылал вам уведомления:
@meloddyCMS_bot (нажмите «Запустить» / Start).Если ваш разработчик подготовил для вас шаблоны, вы найдете их в Дашборде на вкладке «Шаблоны».
Чтобы развернуть новый сайт, достаточно нажать кнопку на карточке шаблона, ввести название нового проекта (ID) и подтвердить. CMS сама создаст точную копию этого шаблона в виде отдельного проекта, в котором вы сразу же сможете менять контент через визуальный редактор!
В meloddyCMS встроен продвинутый, но простой в использовании Файловый менеджер. Доступ к нему осуществляется через главное меню в левой панели или по клику на кнопку «Файлы» в карточке нужного проекта.
Вы можете перетаскивать файлы картинок, документов (PDF, DOCX) прямо в окно файлового менеджера. Все они будут бережно сохранены в структуре папок вашего сайта.
Для поддержания порядка создавайте отдельные папки, например /docs для PDF-инструкций и /images/blog для картинок новостей. Это предотвратит кашу в корневой папке.
Все контакты клиентов, которые заполняют формы на ваших сайтах, сохраняются во встроенную микро-CRM систему.
В главном меню перейдите в раздел «Заявки». Вы увидите доску со столбцами, представляющими этапы воронки продаж:
Вы можете кликнуть на любую карточку лида, чтобы увидеть полные детали: дату отправки, страницу, с которой пришла заявка, и все заполненные поля формы. Также внутри карточки можно оставлять текстовые заметки для менеджеров.
При необходимости выгрузить базу лидов для рассылки или анализа, воспользуйтесь кнопкой «Экспорт в Excel (CSV)». Файл скачается моментально.
По умолчанию ваши проекты доступны на служебных поддоменах вида site-123.meloddy.ru. Для боевого запуска необходимо привязать собственный домен.
A, Имя (Хост): @ (или пустое), Значение (IP): 195.209.214.15CNAME, Имя (Хост): www, Значение: ваш-домен.ru.Система сама отслеживает обновление DNS-записей и в течение 15 минут после привязки бесплатно выпустит SSL-сертификат Let's Encrypt для безопасного соединения HTTPS.
meloddyCMS поддерживает разграничение прав доступа. Это позволяет безопасно давать доступ разным специалистам.
Если вы используете сторонние CRM-системы (например, amoCRM или Bitrix24), вы можете настроить интеграцию для автоматической пересылки лидов.
На данный момент автоматическая отправка вебхуков находится в стадии активной разработки. Однако вы можете легко подключить внешнюю CRM-систему, используя наш REST API для получения лидов или внедрив кастомный JavaScript-код формы, который будет отправлять данные параллельно в вашу CRM.
Это позволяет связывать формы сайта с любыми конструкторами автоматизации, такими как Albato, Make или Integromat.
Мы заботимся о сохранности ваших данных и автоматически делаем ежедневные бэкапы всей платформы.
Вы можете в любой момент выгрузить полную актуальную копию вашего сайта. Для этого зайдите в детальные настройки сайта (...), выберите вкладку «Доступ & Бэкапы» и нажмите «Скачать» (предварительно можно нажать «Создать бэкап» для создания свежей версии). Вы получите архив с HTML-кодом, скриптами и всеми вашими картинками.
Если вы случайно удалили важный блок или испортили страницу в визуальном редакторе, вы можете выбрать один из сохраненных бэкапов в выпадающем списке во вкладке «Доступ & Бэкапы» и восстановить сайт до этой точки сохранения.
meloddyCMS не требует изучения сложных языков шаблонизаторов. Посадка происходит прямо на вашу готовую HTML-верстку.
index.html, папками css, js, img).<img src="/img/logo.png">).Если у вас несколько страниц (например, index.html и about.html), загружайте их все в одном архиве. CMS автоматически найдет все HTML-файлы и сделает их редактируемыми.
Чтобы клиент мог менять текст или картинки в Визуальном редакторе, вам нужно разметить нужные теги специальными data-атрибутами.
Добавьте атрибут data-editable="уникальный_ключ" к любому текстовому тегу (h1-h6, p, span, div). Ключ должен быть уникальным в рамках страницы.
<h1 data-editable="hero_title">Мы создаем сайты</h1> <p data-editable="hero_subtitle">Быстро и качественно</p>
Для тегов <img> используйте атрибут data-img-editable="ключ". При клике в редакторе откроется загрузчик файлов.
<img data-img-editable="about_photo" src="/img/about.jpg" alt="О нас">
Если картинка задана через CSS свойство background-image (inline style), используйте data-bg-editable="ключ".
<section data-bg-editable="main_banner" style="background-image: url('/img/banner.jpg');">
...
</section>
Для отправки заявок с сайта в Telegram-бот CMS, вам не нужно писать PHP-скрипты или настраивать SMTP. Достаточно слегка модифицировать вашу HTML-форму.
action="/api/submit-form".name (например: name="Телефон", name="Имя"). CMS использует эти имена для формирования красивого сообщения в Telegram.<form action="/api/submit-form" method="POST">
<input type="text" name="Имя" placeholder="Ваше имя" required>
<input type="tel" name="Телефон" placeholder="Ваш телефон" required>
<button type="submit">Оставить заявку</button>
</form>
Шаблоны позволяют вам один раз собрать типовой сайт (например, квиз или лендинг для стройки), а затем создавать из него новые проекты для клиентов в один клик.
data-editable атрибутами.template.json со следующим содержимым:{
"name": "Лендинг: Строительство домов",
"description": "Светлый шаблон со слайдером и формой",
"version": "1.0.0"
}
template.json) в ZIP-архив.Теперь вы сможете разворачивать этот сайт под новых клиентов моментально, просто указывая новый домен или ID проекта!
В отличие от классических CMS, которые перестраивают DOM дерева и ломают ваши JavaScript плагины (слайдеры, табы, анимации), визуальный редактор meloddyCMS работает в режиме прямого редактирования.
Когда пользователь редактирует текст или меняет картинку, CMS обновляет только текстовые узлы или атрибут src, не перезагружая страницу и не ломая привязанные JS-слушатели событий.
data-editable, но чтобы клиент мог их увидеть в редакторе, CMS предоставляет специальную панель просмотра скрытых элементов.Вы можете позволить клиенту самостоятельно редактировать SEO-параметры страницы, используя системные data-атрибуты.
Помимо вкладки «SEO & Файлы» в настройках дашборда, вы можете внедрить прямое редактирование метатегов в HTML коде шаблона:
<title data-editable="meta_title">...</title> — позволяет клиенту менять заголовок вкладки.<meta name="description" content="Отредактируйте меня" data-editable="meta_description"> — описание для поисковиков.<meta property="og:image" content="/img/share.jpg" data-img-editable="og_image">.meloddyCMS предоставляет набор REST API эндпоинтов, которые вы можете использовать для интеграции с внешними системами или разработки собственных расширений.
GET /api/sites — получить список всех сайтов текущего пользователя (доступно для ролей admin и developer).POST /api/sites — создать новый сайт на основе ZIP-архива.GET /api/sites/:id/files — получить структуру файлов проекта в формате JSON.POST /api/submit-form — эндпоинт для отправки лидов. Принимает JSON или url-encoded данные и пересылает их в привязанный Telegram-чат.POST /api/settings/developer — привязка разработчика к сайту по уникальному коду.Для удобства разработки шаблонов и верстки вы можете использовать Git и разрабатывать сайты на своем локальном компьютере.
Вы можете настроить автоматический деплой из вашей IDE (VS Code, WebStorm) прямо в директорию сайтов на сервере:
/home/ubuntuuser/meloddy-cms/data/sites/[siteId].Если клиент уже отредактировал тексты на сайте через CMS, а вы зальете поверх новый ZIP-архив с версткой без сохранения файлов данных, то правки клиента могут быть заменены исходными текстами из верстки. Всегда делайте бэкап данных перед обновлением структуры!
Вся конфигурация пользователей, проекты, связи с Telegram и лиды хранятся в легковесной и быстрой базе данных SQLite.
data/database.sqlite (или конфигурационный файл users.json / sites.json в зависимости от сборки).leads содержит поля: id (уникальный номер), site_id (ID сайта), data (JSON строка со всеми полями формы), status (статус в CRM: new, in_progress, completed, rejected), created_at (дата создания).data/sites/[siteId]/.meloddy/config.json.meloddyCMS не делает лишних запросов к базе данных при открытии ваших сайтов посетителями. Все страницы отдаются напрямую веб-сервером Nginx как статический HTML, что обеспечивает невероятную скорость работы (100 баллов в Google PageSpeed Insights).
</body> с атрибутом defer.Чтобы максимально ускорить посадку сайта на meloddyCMS (особенно если верстка сгенерирована ИИ-конструкторами или визуальными средами вроде VibeCode), вы можете использовать любой ИИ-ассистент (Claude, ChatGPT, Gemini).
Используйте следующий подготовленный промпт. Скопируйте его и отправьте в чат с ИИ вместе с архивом вашего проекта или кодом страниц:
Ты — специализированный транскомпилятор и системный нормализатор статической верстки для платформы meloddyCMS.
Твоя задача — преобразовать предоставленные исходные файлы верстки (HTML, CSS, JS, медиа-ресурсы), включая экспортированные из визуальных сред и генераторов кода (таких как VibeCode), и полностью подготовить их к интеграции с платформой meloddyCMS.
Выполняй обработку строго по шагам (Chain of Thought), следуя техническому регламенту ниже.
---
### ТЕХНИЧЕСКИЙ РЕГЛАМЕНТ ОБРАБОТКИ ВЕРСТКИ
#### ШАГ 1: Реорганизация структуры каталогов
Приведи файловую структуру проекта к следующему стандарту:
1. Все файлы страниц (*.html) должны быть перенесены исключительно в корень проекта.
2. Все файлы стилей (*.css) должны быть перенесены в директорию /css/.
3. Все файлы скриптов (*.js) должны быть перенесены в директорию /js/.
4. Все медиаресурсы (изображения png/jpg/webp/avif, векторная графика svg, шрифты, иконки, favicon) должны быть перенесены в директорию /img/.
#### ШАГ 2: Нормализация путей в коде (Рефакторинг ссылок)
Замени все относительные (../, ./, images/, assets/) и абсолютные сторонние пути во всех HTML и CSS файлах на относительные от корня сайта. Каждый путь должен начинаться со знака слэша /:
- Подключение стилей: <link rel="stylesheet" href="/css/style.css">
- Подключение скриптов: <script src="/js/main.js"></script>
- Подключение картинок: <img src="/img/logo.svg">
- Фоновые изображения в CSS: background-image: url('/img/hero-bg.webp');
- Фавикон: <link rel="icon" type="image/svg+xml" href="/favicon.svg"> (favicon.svg находится в корне).
#### ШАГ 3: Интеграция data-атрибутов редактирования (Визуальный редактор)
Разметь все контентные элементы специальными атрибутами.
##### Валидация идентификаторов (ID):
Каждое значение атрибута (ключ) должно:
1. Быть уникальным в пределах одной страницы.
2. Соответствовать регулярному выражению: ^[a-z0-9_]+$ (только строчные латинские буквы, цифры и символ подчеркивания).
3. Иметь длину от 3 до 50 символов.
4. Отражать семантическое назначение элемента (например: hero_title, benefit_card_1_text).
##### Правила разметки элементов:
1. Редактируемый текст (data-editable):
Добавь атрибут data-editable="[уникальный_ключ]" к тегам: <h1>-<h6>, <p>, <span>, <div class="...-text">, <a> (если внутри ссылки только простой текст).
* ДО: <h2 class="title">Наши услуги</h2>
* ПОСЛЕ: <h2 class="title" data-editable="services_title">Наши услуги</h2>
2. Заменяемые изображения (data-img-editable):
Добавь атрибут data-img-editable="[уникальный_ключ]" к тегам <img>.
* ДО: <img class="logo" src="img/logo-old.png" alt="Лого">
* ПОСЛЕ: <img class="logo" src="/img/logo-old.png" data-img-editable="header_logo" alt="Лого">
3. Фоновые изображения (data-bg-editable):
Если фон задан инлайн-стилем style="background-image: url(...)", добавь атрибут data-bg-editable="[уникальный_ключ]".
* ДО: <div class="hero" style="background-image: url('assets/hero.jpg');">
* ПОСЛЕ: <div class="hero" data-bg-editable="hero_banner" style="background-image: url('/img/hero.jpg');">
#### ШАГ 4: Интеграция лид-форм (CRM и уведомления)
Все HTML-формы на страницах сайта должны быть адаптированы для отправки лидов во встроенную CRM-систему meloddyCMS и привязанный Telegram-канал.
##### Правила для форм:
1. Тег <form> должен иметь атрибуты: action="/api/submit-form" и method="POST".
2. Каждый элемент ввода данных (<input>, <textarea>, <select>) обязан иметь атрибут name. Значение этого атрибута должно быть человекочитаемым русским словом или фразой, так как оно напрямую транслируется в Telegram-оповещения администратора.
3. Кнопка отправки формы должна иметь тип type="submit".
##### Таблица сопоставления полей (Few-shot mapping):
- name="name" или name="first-name" → name="Имя"
- name="phone" или name="tel" → name="Телефон"
- name="email" → name="Email"
- name="message" или name="comment" → name="Сообщение"
- name="company" → name="Компания"
##### Пример нормализации формы:
* ДО:
<form id="contact-form">
<input type="text" name="user_name" placeholder="Введите имя">
<input type="tel" name="phone_number" placeholder="Ваш телефон">
<textarea name="user_message"></textarea>
<button class="submit-btn">Отправить</button>
</form>
* ПОСЛЕ:
<form action="/api/submit-form" method="POST">
<input type="text" name="Имя" placeholder="Введите имя" required>
<input type="tel" name="Телефон" placeholder="Ваш телефон" required>
<textarea name="Сообщение"></textarea>
<button type="submit" class="submit-btn">Отправить</button>
</form>
#### ШАГ 5: Интеграция модулей (Интернет-магазин и Новости)
Если на исходном сайте присутствуют элементы интернет-магазина (каталог, корзина, кнопки покупки) или разделы блога/новостей, интегрируй их по следующим правилам meloddyCMS:
##### 1. Интернет-магазин (Модуль Магазин):
- Подключи скрипт корзины перед закрывающим тегом </body>:
<script src="/js/client-cart.js"></script>
- Для кнопок покупки назначь обработчик клика, вызывающий добавление товара:
MeloddyCart.addItem({ id: "ID", name: "Имя", price: Число, image: "/путь/к/картинке", selectedVariants: {} })
- Для отрисовки корзины подпишись на событие обновления:
window.addEventListener('meloddy-cart-updated', renderCart)
- Форму оформления заказа отправляй через метод API:
MeloddyCart.submitOrder({ name: "Имя", phone: "Телефон", comment: "Комментарий" })
##### 2. Новости / Статьи (Модуль Блог):
- Подключи SDK блога перед закрывающим тегом </body>:
<script src="/js/client-blog.js"></script>
- Создай пустые контейнеры для авто-рендеринга ленты и полной статьи:
<div id="blog-feed-container"></div>
<div id="blog-post-container"></div>
- Настрой вызов рендеринга в зависимости от URL-параметров:
const postSlug = new URLSearchParams(window.location.search).get('post');
if (postSlug) {
MeloddyBlog.renderPost('blog-post-container', postSlug);
} else {
MeloddyBlog.renderFeed('blog-feed-container');
}
- Если в верстке детальной страницы статьи используются дополнительные независимые блоки (цитата автора, промо-баннер), добавь к ним атрибуты связывания:
- data-blog-field="ключ" — для текстовых полей
- data-blog-img="ключ" — для картинок
#### ШАГ 6: Валидация сборки (Sanity Check)
Перед генерацией ответа перепроверь полученный результат по чек-листу:
1. Нет ли сломанных путей и ссылок (каждый href/src стилей, скриптов и картинок начинается со слэша /).
2. Все ли data-атрибуты имеют валидные уникальные ключи (^[a-z0-9_]+$).
3. Все ли формы имеют action="/api/submit-form" и method="POST", а их поля — русские атрибуты name.
4. Убедись, что скрипты модулей (/js/client-cart.js, /js/client-blog.js) подключены только при необходимости.
5. Весь HTML-код валиден, теги закрыты, стили/скрипты не удалены.
---
### ФОРМАТ ОТВЕТА
Выведи результат строго в следующем формате:
1. Файловая структура: Схема перемещения файлов (какие файлы куда перенесены).
2. Сборка проекта: Полные версии измененных файлов (HTML-код страниц) без сокращений и пропусков. Не используй плейсхолдеры вида <!-- тут остальной код -->, выводи код целиком, чтобы его можно было скопировать.
После обработки ИИ вы получите готовую структуру файлов. Вам останется лишь запаковать их в ZIP-архив и загрузить в CMS в один клик!
Для создания полноценного каталога товаров перейдите в раздел «Магазин» на боковой панели и выберите вкладку «Категории». Категории позволяют структурировать товары и упрощают навигацию для покупателей.
smartfony для «Смартфоны»). При желании слаг можно изменить вручную.Вкладка «Свойства товаров» позволяет создавать шаблоны характеристик, которые затем заполняются в карточках товаров. Это незаменимо для фильтрации и сравнения.
Текст: Любое текстовое значение (например, «Бренд: Xiaomi»).Число: Только числовые параметры (например, «Объем памяти: 256» или «Вес: 180»). Подходит для фильтрации по диапазону.Список: Фиксированный набор значений (например, «Тип матрицы: AMOLED, IPS, OLED»).Флажок (Логическое): Да/Нет переключатели (например, «Влагозащита: Да», «Поддержка eSIM: Нет»).Вкладка «Товары» — основное рабочее пространство контент-менеджера. Для добавления товара нажмите «Добавить товар».
Если при заполнении товара вы укажете ссылки на изображения с внешних ресурсов (например, из каталога поставщика), meloddyCMS автоматически скачает их в фоновом режиме, сохранит на вашем сервере и привяжет к товару. Это предотвратит сбои из-за недоступности внешних хостов!
Все оформленные на сайте заказы моментально попадают во встроенную CRM-систему (раздел «Магазин» → вкладка «Заказы»).
Новые: Только что поступившие заказы. Подсвечиваются ярким индикатором и требуют подтверждения менеджера.В обработке: Сборка, упаковка или доставка товара клиенту.Выполненные: Успешно закрытые сделки. Данные из этой колонки попадают в графики аналитики.Отмененные: Возвраты или спам-заказы.Для оперативного контроля заказов без необходимости постоянно держать открытой панель управления, meloddyCMS поддерживает отправку уведомлений в Telegram.
@meloddyCMS_bot и нажмите «Запустить» (/start).Вы можете полностью кастомизировать вывод товаров, категорий и фильтров на вашем сайте, обращаясь к нашему публичному API. Авторизация (токены) для этих запросов не требуется.
GET /api/commerce/:siteId/public/categories
Возвращает плоский массив категорий с иерархическими связями (родительский ID в поле parentId).
GET /api/commerce/:siteId/public/products?category=smartfony&limit=12&page=1
Поддерживаемые query-параметры:
category (строка): Слаг, имя или ID категории для фильтрации.search (строка): Полнотекстовый поиск по названию или SKU.minPrice / maxPrice (числа): Фильтрация по диапазону цен.page (число): Номер страницы (по умолчанию 1).limit (число): Количество товаров на страницу (по умолчанию 20).GET /api/commerce/:siteId/public/products/:idOrSlug
Возвращает объект товара, включая его характеристики (массив properties), остатки, галерею картинок, а также массив relatedProductsData (до 8 связанных товаров, настроенных в панели).
Чтобы не писать логику хранения товаров в LocalStorage, мелочевки подсчетов и отправки заказов вручную, подключите нашу официальную JS-библиотеку:
<script src="/js/client-cart.js"></script>
После подключения на объекте window становится доступен глобальный класс MeloddyCart, инкапсулирующий все необходимые методы:
MeloddyCart.getItems(): Возвращает массив элементов корзины. Каждый элемент содержит:
{
productId: "ID_товара",
name: "Название товара",
price: 1500,
quantity: 2,
image: "/img/photo.png",
selectedVariants: { "Цвет": "Черный", "Размер": "L" }
}MeloddyCart.addItem(item): Добавляет товар в корзину. Аргумент должен содержать поля: id, name, price, quantity, image, и опционально selectedVariants. Если товар с таким ID и опциями уже есть в корзине, его количество увеличивается.MeloddyCart.removeItem(productId, selectedVariants): Удаляет товар из корзины. Если товар имеет выбранные варианты, необходимо передать их вторым аргументом для точного сопоставления.MeloddyCart.updateQuantity(productId, quantity, selectedVariants): Обновляет количество товара до указанного значения.MeloddyCart.clear(): Полностью очищает корзину.MeloddyCart.getTotalCount(): Возвращает общее число товаров в корзине (сумма всех quantity).MeloddyCart.getTotalPrice(): Возвращает суммарную стоимость товаров.MeloddyCart.submitOrder(orderData): Отправляет заказ на сервер в CRM. Метод возвращает Promise.
Формат объекта orderData:
{
name: "Иван Иванов",
phone: "+7 (999) 123-45-67",
email: "ivan@example.com",
comment: "Доставка до двери"
}Часто один и тот же товар продается в разных вариациях (например, футболка размера S, M, L или телефон с 128ГБ и 256ГБ памяти). meloddyCMS и библиотека корзины полностью поддерживают кастомные свойства при оформлении заказа.
При клике на кнопку «В корзину» соберите выбранные пользователем значения из выпадающих списков или радио-кнопок и передайте их в свойстве selectedVariants:
const productToBuy = {
id: "tshirt_01",
name: "Фирменная футболка",
price: 1990,
image: "/site/shop/tshirt.jpg",
quantity: 1,
selectedVariants: {
"Размер": "L",
"Цвет": "Синий"
}
};
// Добавляем в корзину
MeloddyCart.addItem(productToBuy);
В CRM в карточке заказа эти данные отобразятся в структурированном виде: Фирменная футболка (Размер: L, Цвет: Синий), что позволит менеджеру не ошибиться при комплектации.
Ниже приведен готовый пример фронтенд-кода каталога товаров, корзины и формы оформления заказа, который вы можете скопировать и внедрить на свой сайт:
<!-- Подключаем библиотеку корзины -->
<script src="/js/client-cart.js"></script>
<!-- Контейнер каталога товаров -->
<div id="catalog-container" class="products-grid"></div>
<!-- Контейнер корзины -->
<div class="cart-section">
<h3>Корзина (<span id="cart-count">0</span> шт.)</h3>
<div id="cart-items"></div>
<div class="cart-total">Итого: <strong id="cart-total-price">0</strong> ₽</div>
<!-- Форма оформления -->
<form id="checkout-form" onsubmit="submitOrder(event)" style="margin-top: 15px;">
<input type="text" id="order-name" placeholder="Ваше Имя" required style="display:block; margin-bottom:8px;">
<input type="tel" id="order-phone" placeholder="Телефон" required style="display:block; margin-bottom:8px;">
<button type="submit">Оформить заказ</button>
</form>
</div>
<script>
window.meloddySiteId = window.location.pathname.split('/')[2] || 'my-shop-id';
async function initCatalog() {
const response = await fetch(`/api/commerce/\${window.meloddySiteId}/public/products?limit=6`);
if (response.ok) {
const data = await response.json();
const container = document.getElementById('catalog-container');
container.innerHTML = data.products.map(p => `
<div class="product-card">
<img src="\${p.images[0] || '/img/no-photo.png'}" alt="\${p.name}" width="150">
<h4>\${p.name}</h4>
<p>Цена: \${p.price} ₽</p>
<button onclick="buyProduct('\${p.id}', '\${p.name}', \${p.price}, '\${p.images[0] || ''}')">Купить</button>
</div>
`).join('');
}
}
function buyProduct(id, name, price, image) {
MeloddyCart.addItem({ id, name, price, image, quantity: 1 });
}
function renderCart() {
const items = MeloddyCart.getItems();
const itemsContainer = document.getElementById('cart-items');
const countContainer = document.getElementById('cart-count');
const totalContainer = document.getElementById('cart-total-price');
countContainer.textContent = MeloddyCart.getTotalCount();
totalContainer.textContent = MeloddyCart.getTotalPrice();
if (items.length === 0) {
itemsContainer.innerHTML = '<p>Корзина пуста</p>';
return;
}
itemsContainer.innerHTML = items.map(item => `
<div class="cart-item" style="display:flex; justify-content:space-between; margin-bottom:8px;">
<div>\${item.name} (\${item.quantity} x \${item.price} ₽)</div>
<button onclick="MeloddyCart.removeItem('\${item.productId}', \${JSON.stringify(item.selectedVariants)})">Удалить</button>
</div>
`).join('');
}
window.addEventListener('meloddy-cart-updated', renderCart);
async function submitOrder(e) {
e.preventDefault();
const orderData = {
name: document.getElementById('order-name').value,
phone: document.getElementById('order-phone').value,
comment: 'Заказ оформлен через кастомную корзину'
};
try {
const res = await MeloddyCart.submitOrder(orderData);
alert(\`Заказ оформлен! Номер заказа: \${res.orderId}\`);
MeloddyCart.clear();
document.getElementById('checkout-form').reset();
} catch(err) {
alert(\`Ошибка оформления: \${err.message}\`);
}
}
document.addEventListener('DOMContentLoaded', () => {
initCatalog();
renderCart();
});
</script>