Процедура добавления и редактирования товаров в MultiStore
Модуль MultiStore (Cotonti Siena 0.9.26, PHP 8.4) позволяет пользователям с правами на запись (auth_write) добавлять и редактировать товары через фронтенд-формы. Процессы реализованы в файлах mstore.add.php (добавление) и mstore.edit.php (редактирование), с использованием функций из mstore.functions.php и классов, таких как MstoreControlService. Описание охватывает структуру базы данных, обязательные поля, импорт данных, валидацию и сохранение.
Структура базы данных
Товары хранятся в таблице cot_mstore (определена в mstore.install.sql). Поля:
msitem_id: Уникальный ID (int unsigned, автоинкремент, первичный ключ).msitem_alias: Алиас для URL (varchar(255), по умолчанию '').msitem_state: Состояние (tinyint unsigned, 0=опубликован, 1=на рассмотрении, 2=черновик).msitem_cat: Код категории (varchar(255)).msitem_title: Заголовок (varchar(255)).msitem_desc: Краткое описание (varchar(255), по умолчанию '').msitem_metatitle: Мета-заголовок для SEO (varchar(255), по умолчанию '').msitem_metadesc: Мета-описание (varchar(255), по умолчанию '').msitem_text: Полный текст (mediumtext, null).msitem_costdflt: Стоимость (decimal(10,2), по умолчанию 0.00).msitem_parser: Парсер текста (varchar(64), по умолчанию '').msitem_ownerid: ID владельца (int unsigned, по умолчанию 0).msitem_date: Дата создания (int unsigned, timestamp, по умолчанию 0).msitem_updated: Дата обновления (int unsigned, timestamp, по умолчанию 0).msitem_count: Счетчик просмотров (mediumint unsigned, по умолчанию 0).- Экстрафилды: Поля с префиксом
msitem_[имя], например,msitem_photo(зависят от настроек).
Индексы: На msitem_cat, msitem_alias, msitem_date, msitem_ownerid, msitem_title.
Обязательные поля (по валидации):
msitem_cat: Обязательна, категория не должна быть заблокированной (locked в структуре).msitem_title: Обязателен, минимум 2 символа.msitem_text: Обязателен, еслиmstoreallowemptytextне включено в конфигурации категории.msitem_alias: Необязателен, но если указан, проверяется формат (без +/?%#&).
Для администраторов доступны поля msitem_ownerid (смена владельца) и msitem_count (изменение просмотров).
Добавление товара
Добавление происходит через форму в mstore.add.php (URL: mstore?m=add или mstore?m=add&c=[категория]).
Процесс добавления
- Проверка прав:
- Импортируется категория через
cot_import('c', 'G', 'TXT'). - Проверяется право на запись:
cot_auth('mstore', $c, 'W'). Без прав — ошибка 403. - Категория не должна быть заблокированной (locked в
Cot::$structure['mstore']) — иначе ошибка 602.
- Импортируется категория через
- Формирование формы:
- Хлебные крошки: Формируются через
cot_structure_buildpath('mstore', $c)с добавлением "Добавление". - Шаблон:
mstore.add.tplилиmstore.add.[tpl_категории]. - Теги формы:
MSTOREADD_FORM_CAT_S2: Селект категорий (cot_mstore_selectbox_structure_select2($c, 'rcat', '')).MSTOREADD_FORM_METATITLE: Поле ввода (cot_inputbox('text', 'rmetatitle'), до 255 символов).MSTOREADD_FORM_METADESC: Текстовое поле (cot_textarea('rmetadesc', '', 2, 64), до 255 символов).MSTOREADD_FORM_ALIAS: Поле ввода (cot_inputbox('text', 'ralias'), до 255 символов).MSTOREADD_FORM_TITLE: Поле ввода (cot_inputbox('text', 'rtitle'), до 255 символов).MSTOREADD_FORM_DESCRIPTION: Текстовое поле (cot_textarea('rdesc', '', 2, 64), до 255 символов).MSTOREADD_FORM_OWNER: Имя пользователя (cot_build_user(Cot::$usr)).MSTOREADD_FORM_DATE: Селект даты (cot_selectbox_date($item['msitem_date'], 'long', 'rmsitemdate')+ чекбокс "Сейчас").MSTOREADD_FORM_TEXT: Текстовое поле (cot_textarea('rtext', '', 24, 120), с редактором).MSTOREADD_FORM_PARSER: Селект парсеров (cot_selectbox($item['msitem_parser'], 'rmsitemparser', cot_get_parsers())).MSTOREADD_FORM_COSTDFLT: Поле ввода (cot_inputbox('text', 'rcostdflt'), до 10 символов).- Экстрафилды: Генерируются через
cot_build_extrafields('msitem', Cot::$extrafields[Cot::$db->mstore]).
- Клонирование: Если
clone=[ID], данные загружаются изcot_mstoreи заполняют форму. - Noindex: Добавляется в head через
Cot::$out['meta_noindex'] = true.
- Хлебные крошки: Формируются через
- Импорт данных:
- При отправке формы (
a=add) данные импортируются черезcot_mstore_import('POST', [], Cot::$usr). - Поля импорта:
msitem_cat: TXT, 255 символов.msitem_alias: TXT, 255 символов.msitem_title: TXT, 255 символов.msitem_desc: TXT, 255 символов.msitem_metatitle: TXT, 255 символов.msitem_metadesc: TXT, 255 символов.msitem_text: HTM (безопасная обработка HTML).msitem_parser: ALP, 64 символа, проверяется наличие вcot_get_parsers().msitem_costdflt: NUM, форматируется как float.msitem_date: Дата черезcot_import_date('rmsitemdate'), с опцией "сейчас" (rmsitemdatenow).msitem_updated: Текущее время (time()).msitem_ownerid: ФиксированоCot::$usr['id'](для админов — импорт INT).msitem_count: INT (для админов).- Экстрафилды: Через
cot_import_extrafields('rmsitem', Cot::$extrafields[Cot::$db->mstore]).
- Парсер: Если не выбран или недоступен, берётся из конфигурации (
mstoreparser).
- При отправке формы (
- Валидация:
- Функция
cot_mstore_validate($ritem):msitem_cat: Проверяется наличие и отсутствие locked (cot_check(empty($ritem['msitem_cat']) || !isset(Cot::$structure['mstore'][$ritem['msitem_cat']]))).msitem_title: Минимум 2 символа (mb_strlen($ritem['msitem_title']) < 2).msitem_text: Проверяется, еслиmstoreallowemptytextне включено.msitem_alias: Проверка формата (preg_match('`[+/?%#&]`', $ritem['msitem_alias'])).
- Ошибки: Добавляются через
cot_error, отображаются в шаблоне черезcot_display_messages($t).
- Функция
- Сохранение:
- Функция
cot_mstore_add($ritem, Cot::$usr):- Проверка уникальности
msitem_alias: Если занят, добавляется суффикс (rand 1000-9999). - Состояние: STATE_PUBLISHED (0) для админов с автовалидацией (
mstoreautovalidate), иначе STATE_PENDING (1). - Вставка в
cot_mstoreчерезCot::$db->insert. - Обработка файлов экстрафилдов:
cot_extrafield_movefiles. - Обновление счетчиков:
cot_mstore_updateStructureCounters($ritem['msitem_cat']). - Лог:
cot_log('Add store item #' . $id, 'mstore', 'add', 'done'). - Очистка кэша: Если включено
cache_mstore, очищаются URI товара и категории.
- Проверка уникальности
- Редирект:
- Опубликован: На страницу товара (
cot_mstore_url($ritem, ['id' => $id])). - На рассмотрении: Сообщение и редирект на
mstore?c=[категория]. - Черновик: На редактирование (
mstore?m=edit&id=[ID]).
- Опубликован: На страницу товара (
- Функция
Редактирование товара
Редактирование происходит через mstore.edit.php (URL: mstore?m=edit&id=[ID]).
Процесс редактирования
- Проверка прав:
- Импорт ID и категории.
- Загрузка товара:
SELECT p.*, u.* FROM $db_mstore AS p LEFT JOIN $db_users AS u ON u.user_id=p.msitem_ownerid WHERE p.msitem_id=? LIMIT 1. - Проверка прав:
cot_auth('mstore', $item['msitem_cat'], 'RW'). Без прав — ошибка 403. - Если товар не найден — ошибка 404.
- Формирование формы:
- Хлебные крошки: Путь до категории + заголовок товара + "Редактирование".
- Шаблон:
mstore.edit.tplилиmstore.edit.[tpl_категории]. - Теги формы: Аналогично добавлению, плюс:
MSTOREEDIT_FORM_STATE: Числовое состояние.MSTOREEDIT_FORM_STATUS: Текст статуса (cot_mstore_status($item)).MSTOREEDIT_FORM_UPDATED: Дата обновления (cot_date('datetime_medium', $item['msitem_updated'])).MSTOREEDIT_FORM_DELETE: Радиокнопка удаления (cot_radiobox).- Для админов:
MSTOREEDIT_FORM_OWNER_ID,MSTOREEDIT_FORM_HITS.
- Мульти-табы: Текст поддерживает разделение на вкладки через [newpage].
- Noindex: Включен.
- Импорт данных:
- При
a=update:cot_mstore_import('POST', $row_item, Cot::$usr), где$row_item— текущие данные. - Поля: Те же, что при добавлении, с текущими значениями.
- При
- Валидация:
cot_mstore_validate($ritem): Проверки как при добавлении, но алиас исключает текущий ID.
- Обновление/Удаление:
- Обновление (
cot_mstore_update($id, $ritem)):- Проверка уникальности
msitem_alias. - Обновление:
Cot::$db->update(Cot::$db->mstore, $ritem, 'msitem_id=?', $id). - Файлы экстрафилдов:
cot_extrafield_movefiles. - Счетчики:
cot_mstore_updateStructureCounters(для старой и новой категории, если изменилась). - Лог:
cot_log("Edited store item #$id", 'mstore', 'edit', 'done'). - Очистка кэша.
- Проверка уникальности
- Удаление: Если
rdelete=1и подтверждено (cot_check_xp()), вызываетсяMstoreControlService::delete($id, $row_item):- Транзакция: Удаление файлов, записи, обновление счетчиков.
- Лог и очистка кэша.
- Редирект: Аналогично добавлению, или на список товаров при удалении.
- Обновление (
Используемые функции из mstore.functions.php
cot_mstore_selectbox_structure_select2: Генерирует селект категорий с Select2.cot_mstore_import: Импортирует данные из POST/GET в массив (поля, даты, парсер, экстрафилды).cot_mstore_validate: Проверяет обязательные поля и формат.cot_mstore_add: Сохраняет новый товар в БД.cot_mstore_update: Обновляет товар в БД.cot_mstore_url: Генерирует URL товара для редиректа.cot_mstore_status: Возвращает текстовый статус (published/pending/draft).cot_mstore_updateStructureCounters: Обновляет счетчики категории.cot_generate_mstoretags: Генерирует теги для шаблона (включая админ-ссылки).cot_build_extrafields_data: Форматирует экстрафилды для форм.cot_auth: Проверяет права доступа.cot_log: Логирует действия.
Визуализация процесса
Схема этапов добавления и редактирования:
____________________________
| 1. Открытие формы |
| (m=add или m=edit&id) |
|__________________________|
|
|
V
____________________________
| 2. Проверка прав доступа |
| (cot_auth, locked cat) |
|__________________________|
|
|
V
____________________________
| 3. Импорт данных в форму |
| (cot_mstore_import) |
|__________________________|
|
|
V
____________________________
| 4. Валидация данных |
| (cot_mstore_validate) |
|__________________________|
|
|
V
____________________________
| 5. Сохранение/Обновление |
| (cot_mstore_add/update)|
|__________________________|
|
|
V
____________________________
| 6. Редирект (на товар, |
| список или редактир.) |
|__________________________|