============================================
  BASKET — Корзина товаров (обновление 2.x)
============================================

Версия: 2.x (обновлён)
Зависимости: xfields, feedback

─────────────────────────────────────────────────────────────────────────────
ОПИСАНИЕ
─────────────────────────────────────────────────────────────────────────────
Плагин реализует функционал корзины товаров для NGCMS. Товарами выступают
новости с доп. полями xfields. Оформление заказа — через плагин feedback.
В версии 2.x добавлено: сохранение заказов в БД, страница подтверждения
заказа, интеграция с плагином payments.

─────────────────────────────────────────────────────────────────────────────
УСТАНОВКА / ПЕРЕУСТАНОВКА
─────────────────────────────────────────────────────────────────────────────
1. Убедитесь, что установлены: xfields, feedback.
2. Установите (или переустановите для обновления) плагин basket.
   Создаются/обновляются таблицы:
     {prefix}_basket          — товары в корзине
     {prefix}_basket_orders   — оформленные заказы (НОВОЕ в 2.x)
3. Настройте плагин (Плагины → basket → Настройки).
4. Создайте форму в плагине feedback для оформления заказа.
   Укажите ID этой формы в настройках basket.

─────────────────────────────────────────────────────────────────────────────
СХЕМА ТАБЛИЦЫ basket_orders (новая)
─────────────────────────────────────────────────────────────────────────────
  id              — ID заказа
  user_id         — ID пользователя (0 = гость)
  cookie          — ngTrackID из cookie (для гостей)
  uniqid          — уникальный ключ заказа (MD5, для URL)
  total           — сумма заказа
  status          — статус: new | paid
  payment_method  — метод оплаты (заполняется плагином payments)
  items_json      — JSON-массив товаров на момент оформления
  contact_json    — JSON данных из формы feedback ($_POST)
  created_at      — Unix timestamp создания
  paid_at         — Unix timestamp оплаты

─────────────────────────────────────────────────────────────────────────────
НАСТРОЙКИ (Плагины → basket → Настройки)
─────────────────────────────────────────────────────────────────────────────
  feedback_form   — ID формы feedback для оформления заказа (обязательно)
  ntable_flag     — включить корзину для таблиц xfields внутри новостей
  ntable_xfield   — поле xfields для активации по условию (в таблицах)
  ntable_price    — поле xfields с ценой (в таблицах)
  ntable_itemname — формат названия товара (в таблицах)
                    Переменные: {title}, {xt:NAME}, {x:NAME}
  news_flag       — включить корзину для самих новостей
  news_xfield     — поле xfields для активации по условию (в новостях)
  news_price      — поле xfields с ценой (в новостях)
  news_itemname   — формат названия товара (в новостях)
                    Переменные: {title}, {x:NAME}

─────────────────────────────────────────────────────────────────────────────
URL-СТРАНИЦЫ ПЛАГИНА
─────────────────────────────────────────────────────────────────────────────
  /basket/              — содержимое корзины
  /basket/update/       — обновление количества (POST)
  /basket/order/        — подтверждение заказа (НОВОЕ в 2.x)
  /basket/order/?order_id=N  — заказ по ID (из ссылки в письме)
  /basket/add/?ds=X&id=N     — добавить товар (внутренний URL)

─────────────────────────────────────────────────────────────────────────────
ПЕРЕМЕННЫЕ В ШАБЛОНАХ НОВОСТЕЙ
─────────────────────────────────────────────────────────────────────────────
Плагин добавляет переменные через NewsFilter (когда news_flag = 1):

  {{ basket_link }}         — ссылка для добавления новости в корзину
  [basket]...[/basket]      — тег: содержимое показывается только если
                              корзина для этой новости активна

Пример в шаблоне новости (news.tpl):
  [basket]
    <a href="{{ basket_link }}">В корзину — {{ xfields_price }} ₽</a>
  [/basket]

─────────────────────────────────────────────────────────────────────────────
ШАБЛОНЫ (tpl/)
─────────────────────────────────────────────────────────────────────────────
  tpl/total.tpl
    Виджет «иконка корзины» (выводится на каждой странице через add_act).
    Переменные:
      {{ count }}           — количество позиций в корзине
      {{ price }}           — сумма (число)
      {{ price_formatted }} — сумма (строка, например «1 234.50»)

  tpl/list.tpl
    Страница /basket/ — содержимое корзины.
    Переменные:
      {{ recs }}            — количество позиций
      {{ entries }}         — массив позиций:
                              [{ id, title, price, price_formatted,
                                 count, sum, sum_formatted, xfields }, …]
      {{ total }}           — итоговая сумма (число)
      {{ total_formatted }} — итоговая сумма (строка)
      {{ form_url }}        — URL формы feedback для оформления заказа

  tpl/lfeedback.tpl
    Блок внутри формы feedback (список товаров перед подтверждением).
    Переменные:
      {{ recs }}            — количество позиций
      {{ entries }}         — массив позиций (аналогично list.tpl)
      {{ total }}           — итоговая сумма (число)
      {{ total_formatted }} — итоговая сумма (строка)

  tpl/order.tpl    (НОВОЕ в 2.x)
    Страница /basket/order/ — подтверждение заказа с кнопкой оплаты.
    Переменные:
      {{ order }}           — данные заказа (строка из basket_orders):
                              { id, total, status, uniqid, created_at, … }
      {{ items }}           — JSON-массив товаров (декодированный):
                              [{ id, title, price, count, xfields }, …]
      {{ pay_link }}        — URL страницы оплаты /payments/pay/… (или null)
      {{ pay_active }}      — true если плагин payments установлен

  tpl/basket.tpl
    Вспомогательный шаблон (используйте по необходимости).

─────────────────────────────────────────────────────────────────────────────
ПОТОК ОФОРМЛЕНИЯ ЗАКАЗА
─────────────────────────────────────────────────────────────────────────────
1. Пользователь добавляет товары: /basket/add/?ds=X&id=N
2. Просматривает корзину: /basket/
3. Переходит к форме: /feedback/?id=FORM_ID (ссылка form_url)
4. Заполняет и отправляет форму
5. onProcessNotify сохраняет заказ в basket_orders, очищает корзину
6. Пользователь перенаправляется на /basket/order/
7. Если payments установлен — кнопка «Перейти к оплате» → /payments/pay/
8. После оплаты заказ получает status='paid'

─────────────────────────────────────────────────────────────────────────────
ПРИМЕР: КНОПКА «В КОРЗИНУ» В ТАБЛИЦЕ XFIELDS
─────────────────────────────────────────────────────────────────────────────
В шаблоне таблицы xfields (tdata):
  {% if flags.basket_allow %}
    <a href="{{ basket_link }}" class="btn-cart">В корзину</a>
  {% endif %}

─────────────────────────────────────────────────────────────────────────────
ПРИМЕР: ВИДЖЕТ КОРЗИНЫ В ШАПКЕ
─────────────────────────────────────────────────────────────────────────────
В файле шаблона header.tpl:
  {% if plugin_basket is defined %}
    {{ plugin_basket|raw }}
  {% endif %}

Шаблон tpl/total.tpl:
  <a href="/basket/" class="cart-icon">
    🛒 {{ count }} товар(а) на {{ price_formatted }} ₽
  </a>
