TSVShop, учет остатков

Доброго дня может кто то подскажет работал с магазином TSVShop нужно реализовать учет остатков товаров может кто то встречался с этим.

20 комментариев

avatar
А что именно нужно сделать? Есть плагин, правда старый, которые просто считает товары и остаток записывает в TV
avatar
ну вот мне такое и нужно реализовать буду благодарен.
avatar
1drv.ms/t/s!AjtzQrbcbr0_43LpcyempRMTzFfy
Только это старая версия, совсем сырая, нужно проверить. И при желании доработать. Сейчас плагин не умеет возвращать товары на склад, если пользователь не завершил заказ. Теоретически, можно сделать списание товара только при завершении заказа.
avatar
получается сменил значения на свои но не чего не списывает.

событие на плагин повесил TSVshopOnAddItem


// Определяем переменные
$tvinventory = (!empty($tvinventory)) ? $tvinventory : 'inventory';  // название TV для учета количества товара на складе
$templateid = (!empty($templateid)) ? $templateid : '6';  // ИД шаблона карточки товара
$errorchunk = (!empty($errorchunk)) ? $errorchunk : 'soob';  // Чанк с сообщением, если товара нету в наличии
$lesschunk = (!empty($lesschunk)) ? $lesschunk : 'soob';  // Чанк с сообщением, если товара в наличии меньше, чем заказали
avatar
Немного поправил код по ссылке. Не проверял. Если что, пишите.
avatar
что то все равно не списывает
avatar
А в отчете системе есть какие-то ошибки?
avatar
нет не чего
avatar
Поправил код, там была ошибка
avatar
ошибку я тоже исправлял там ненужная ] была.


$count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);


тут я так понимаю получаем значение tv да?
avatar
да
avatar
ну вот проверил значение tv получаем а почему не списывается остаток не понятно.
avatar
Понял причину. Обновил
avatar
Да почему то вообще не работает предыдущий вариант выдавал сообщение если нету

вот когда убрал оператор swith тогда срабатывают сообщения и проверки что поставил принтом


   $countt = 12;
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);

      if ($count['value']< $_SESSION[$session]['orders'][$item]['qty']) {
        $modx->db->update(array('value'=>0),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
        $_SESSION[$session]['orders'][$item]['qty'] = $count['value'];
        $modx->webAlert(getTpl($lesschunk));
        print_r ($countt);
      } else {
        $modx->db->update(array('value'=>floatval($count['value']-$_SESSION[$session]['orders'][$item]['qty'])),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
		     print_r ($count['value']);
      }

}
Комментарий отредактирован 2017-06-08 20:34:02 пользователем eflit
avatar
Все остатки списываются при добавлении в корзину но не возвращаются

/*
Плагин для учета товаров
 
Конфигурация:
&customtv=Список добавляемых TV через запятую;string; &tvinventory=Название TV учета кол-ва товара;string;tvinventory &templateid=ID шаблона карточки товара;string; &errorchunk=Чанк с сообщением, если товара нет в наличии;string;Shop_ItemNull &lesschunk=Чанк с сообщением, если товара меньше, чем надо;string;Shop_ItemLess

События:
TSVshopOnAddItem, TSVshopOnDeleteItem
*/

global $session, $cache;
$e = &$modx->Event;

//Подключаем конфиг и ядро корзины
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/config.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/include/cart.inc.php");
include(MODX_BASE_PATH."assets/snippets/tsvshop/admin/includes/core.inc.php");

// Определяем переменные
$tvinventory = (!empty($tvinventory)) ? $tvinventory : 'inventory';  // название TV для учета количества товара на складе
$templateid = (!empty($templateid)) ? $templateid : '6';  // ИД шаблона карточки товара
$errorchunk = (!empty($errorchunk)) ? $errorchunk : 'soob';  // Чанк с сообщением, если товара нету в наличии
$lesschunk = (!empty($lesschunk)) ? $lesschunk : 'soob';  // Чанк с сообщением, если товара в наличии меньше, чем заказали


if (!function_exists('setTemplateVar')) {
  function setTemplateVar($value, $docID, $tplVarName) {
    global $modx;

    //-- get tmplvar id
    $tplName = $modx->getFullTableName('site_tmplvars');
    $tplRS = $modx->db->select('id', $tplName, 'name="' . $tplVarName . '"');
    $tplRow = $modx->db->getRow($tplRS);

    $tblName = $modx->getFullTableName('site_tmplvar_contentvalues');

    $selectQuery = $modx->db->select('*', $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);

    $updFields = array (
      'value' => $value
    );
    $insFields = array (
      'tmplvarid' => $tplRow['id'],
      'contentid' => $docID,
      'value' => $value
    );

    if ($modx->db->getRecordCount($selectQuery) < 1) {
      $modx->db->insert($insFields, $tblName);
    } else {
      $modx->db->update($updFields, $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);
    }
  }
}


if (empty($templateid)) return;

$dborders=$modx->getFullTableName('shop_order');
$tvtable = $modx->getFullTableName('site_tmplvar_contentvalues');
$dborders_details=$modx->getFullTableName('shop_order_detail');

if ($e->name == 'TSVshopOnAddItem') {
   // Срабатывает при добавлении товара в корзину
   // Здесь мы будем проверять, есть ли товар в наличии при добавлении в корзину, сколько единиц доступно.
   // Если его кол-во равно 0 или пусто - не даем добавить в корзину и выводим предупреждение
   // Если его кол-во меньше, чем положено в корзину, то уменьшаем на доступное кол-во + алерт
   // Если все ок, то уменьшаем на заказанное кол-во
   // Данные о добавляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);

      if ($count['value']< $_SESSION[$session]['orders'][$item]['qty']) {
        //$modx->db->update(array('value'=>0),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
        setTemplateVar(0, $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
        $_SESSION[$session]['orders'][$item]['qty'] = $count['value'];
        $modx->webAlert(getTpl($lesschunk));
        // или $e->output(getTpl($lesschunk));
      } else {
        //$modx->db->update(array('value'=>floatval($count['value']-$_SESSION[$session]['orders'][$item]['qty'])),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
        setTemplateVar(floatval($count['value']-$_SESSION[$session]['orders'][$item]['qty']), $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
      }

   }


if ($e->name == 'TSVshopOnDeleteItem') { 
   // При удалении товара из корзины
   // Приплюсовываем кол-во товара к общему кол-ву товара на складе
   // Данные об удаляемом товаре доступны в массиве $item
   
   $count = $modx->getTemplateVar($tvinventory,'*',$_SESSION[$session]['orders'][$item]['url']);
   //$modx->db->update(array('value'=>floatval($count['value']+$_SESSION[$session]['orders'][$item]['qty'])),$tvtable,'contentid = '.$_SESSION[$session]['orders'][$item]['url'].' AND tmplvarid='.$templateid);
	setTemplateVar(floatval($count['value']+$_SESSION[$session]['orders'][$item]['qty']), $_SESSION[$session]['orders'][$item]['url'], $tvinventory);
}


вот при таком коде все работает и списание и возрат количества огромное спасибо за плагин и помощь
Комментарий отредактирован 2017-06-08 20:48:38 пользователем eflit
avatar
Пожалуйста
avatar
Немного не по теме, но про TSVShop. А где нужно внести изменения, чтобы свой кастомный плейсхолдер прописывался в админке при выводе заказа? Например, вместо «индекса». Он у меня «Время доставки» [+shop.basket.time+]. Оно в отличии от «индеска» [+shop.basket.zip+] мне принципиально важно. [+shop.basket.time+] у меня в базу падает, но как его в админку то вытащить?
avatar
Здравствуйте. Для админки у каждого аддона есть свои шаблоны. В вашем случае посмотрите в assets/snippets/tsvshop/addons/sales/tpl/. Там 3 шаблона. В них плейсхолдеры в виде названия полей в БД. В вашем случае, как понимаю, нужно вывести поле в просмотр конкретного заказа? Тогда шаблон orderview.tpl

Посмотрите, как там другие плейсхолдеры выводятся. Для времени доставки у вас будет [+time+]
avatar
Спасибо! Ура, Получилось внести изменения в админку.
avatar
Ну и здорово, пользуйтесь :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.