Files
dominik/AGENTS.md
T
2026-05-30 11:47:38 +03:00

142 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — инструкция для агентов
## О проекте
**ocStore (OpenCart) 3.0.3.7** — интернет-магазин на PHP с Twig-шаблонами.
- **Платформа:** ocStore 3.0.3.7 (форк OpenCart)
- **PHP:** >= 8.5
- **Шаблонизатор:** Twig 3.0
- **Язык:** русский (ru-ru)
- **База данных:** MySQL (драйвер mysqli)
- **Веб-сервер:** Apache с mod_rewrite
## Структура проекта
```
public/
├── admin/ # Админ-панель (MVC)
│ ├── controller/ # Контроллеры
│ ├── language/ # Языковые файлы ru-ru
│ ├── model/ # Модели
│ ├── view/ # Twig-шаблоны (.twig)
│ └── index.php
├── store/ # Витрина / каталог (MVC)
│ ├── controller/
│ ├── language/
│ ├── model/
│ └── view/theme/ # Тема оформления
├── system/ # Ядро (фреймворк, библиотеки, хелперы)
│ ├── engine/ # Роутинг, экшены, загрузчик
│ ├── library/ # Библиотеки (language, config, template, …)
│ ├── helper/ # Хелперы
│ └── config/ # Конфигурация ядра
├── image/ # Изображения товаров
├── config.php # Конфигурация (в .gitignore!)
└── index.php # Точка входа
storage/
├── cache/ # Кэш (в .gitignore)
├── logs/ # Логи (в .gitignore)
├── modification/ # Модификации OCMOD (в .gitignore)
├── session/ # Сессии PHP (в .gitignore)
├── upload/ # Загрузки (в .gitignore)
├── download/ # Файлы для скачивания (в .gitignore)
└── vendor/ # Composer-зависимости (в .gitignore, Twig)
```
## Важные правила
### Никогда не коммитить
- `public/config.php` и `public/admin/config.php` — содержат пароли БД
- `storage/` целиком (кроме `index.html`)
- `vendor/` — устанавливается через Composer
- Файлы кэша, логов, сессий
- `public/image/` — изображения хранятся отдельно
### Коммиты
- Сообщения коммитов — **на русском языке**
- Стиль: кратко, что сделано (пример: `"Блог в меню"`, `"Удалил googleshopping"`)
### Код-стайл
- PHP: без строгой типизации, используется `$_` суперглобальный массив для языковых переменных
- Языковые файлы — ассоциативный массив `$_['key'] = 'значение';`
- Контроллеры — классы в `Controller*` namespace
- Модели — классы в `Model*` namespace
- Шаблоны — `.twig` файлы
- Формат языковых переменных в шаблонах: `{{ text_yes }}`, `{{ button_save }}`
- Формат языковых констант: `$_['text_yes']`, `$_['button_save']` и т.д.
### OpenCart MVC (паттерн)
- URL-роутинг: `index.php?route=common/home` загружает `controller/common/home.php`
- Контроллер вызывает `$this->load->model('catalog/product')` для загрузки модели
- Контроллер вызывает `$this->load->language('product/product')` для языкового файла
- Шаблоны рендерятся через `$this->response->setOutput($this->load->view(...))`
### Модификации (OCMOD)
- OCMOD-модификации лежат в `public/system/modification.xml`
- Изменённые файлы попадают в `storage/modification/` — не трогать вручную
### Composer
- Зависимости: Twig 3.0
- Установка: `composer install` в `storage/`
## Работа с расширениями
Расширения (модули, темы, платёжные шлюзы и т.д.) устанавливаются через админ-панель или вручную:
- Модули: `public/admin/controller/extension/module/`, `public/store/controller/extension/module/`
- Темы: `public/store/view/theme/`
- Языковые файлы расширений: `public/admin/language/ru-ru/extension/`
## Модальные окна и UI
### Модалки (modal.create)
Система модальных окон реализована в `public/store/view/theme/dominik/assets/js/script.js` (объект `modal`, строка 64).
**Вызов модалки с HTML-контентом:**
```js
modal.create({
modal: '<p>Содержимое окна</p>', // HTML-контент (обязателен)
title: 'Заголовок окна', // опционально
width: 400, // опционально, ширина в px
align: 'top', // опционально, прижать к верху
class: { // опционально, CSS-классы
'modal-body': 'p-0',
'modal-title': 'text-primary'
},
callback: { // опционально
show: function() { ... } // колбек при показе
}
});
```
**Загрузка контента через AJAX (modal.load):**
```js
modal.load(url, data); // ожидает JSON-ответ с ключом 'modal'
```
### Выбор города в шапке
Выбор города реализован через:
- **Контроллер:** `public/store/controller/common/city.php`
- `index()` — отдаёт HTML-список зон (городов) для страны магазина
- `save()` — сохраняет `city_id` в сессию (`session->data['city_id']`), возвращает JSON с именем города
- **Шаблон списка:** `public/store/view/theme/dominik/template/common/city_list.twig`
- **Логика в хедере:** `public/store/controller/common/header.php` (строки с `model_localisation_zone`)
- Берёт `config_country_id` и `config_zone_id` из настроек магазина
- Если в сессии есть `city_id` — используется он, иначе `config_zone_id`
- Передаёт `current_city_name` и `city_list_url` в шаблон
- **Кнопка в шапке:** `public/store/view/theme/dominik/template/common/header.twig` — после `{{ service_menu }}`
- **JS-функция:** `citySelect(el)` в `script.js` — загружает список городов через AJAX, создаёт модалку, при клике сохраняет выбор в сессию и обновляет название на кнопке
## Полезные команды
```bash
# Очистка кэша
rm -rf storage/cache/*
# Установка зависимостей
cd storage && composer install
# Просмотр логов
tail -f storage/logs/error.log
```