Pages, Articles & News
Tools & Plugins
Example / Placeholder Title


Description as an example placeholder. Sample text content for further customization of the "Index36" template.

You are free to edit and customize the template however you like. If you don’t have time or enough knowledge — you can always order template adaptation by contacting me via GitHub or private messages on the digital goods marketplace.

2025-08-18 18:41

Процедура добавления и редактирования товаров в 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=[категория]).

Процесс добавления

  1. Проверка прав:
    • Импортируется категория через cot_import('c', 'G', 'TXT').
    • Проверяется право на запись: cot_auth('mstore', $c, 'W'). Без прав — ошибка 403.
    • Категория не должна быть заблокированной (locked в Cot::$structure['mstore']) — иначе ошибка 602.
  2. Формирование формы:
    • Хлебные крошки: Формируются через 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.
  3. Импорт данных:
    • При отправке формы (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).
  4. Валидация:
    • Функция 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).
  5. Сохранение:
    • Функция 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]).

Процесс редактирования

  1. Проверка прав:
    • Импорт 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.
  2. Формирование формы:
    • Хлебные крошки: Путь до категории + заголовок товара + "Редактирование".
    • Шаблон: 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: Включен.
  3. Импорт данных:
    • При a=update: cot_mstore_import('POST', $row_item, Cot::$usr), где $row_item — текущие данные.
    • Поля: Те же, что при добавлении, с текущими значениями.
  4. Валидация:
    • cot_mstore_validate($ritem): Проверки как при добавлении, но алиас исключает текущий ID.
  5. Обновление/Удаление:
    • Обновление (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. Редирект (на товар,   |
    |    список или редактир.) |
    |__________________________|
    
Account