Тема: Уменьшение количества товара и списание средств

Здравствуйте, разработал собственный модуль, но не могу понять как реализовать уменьшение количества товара и списание средств.
У меня есть форма, которая отправляет данные в контроллер модуля, естественно post запросом. В контроллере в функции action_index написана функция записи полученных переменных в БД. Но я никак не могу понять как реализовать уменьшение количества товара (id товара и количество передается в форме).
Насколько я понимаю, в orm модели моего модуля необходимо прописать строчку use \Product\Model\Orm\Product; чтобы использовать таблицу с товарами. И дописать в этой же функции action_index код для извлечения переменной из post запроса и уменьшения количества. Или же в orm модели написать такую функцию и как-то вызвать ее в функции action_index (как?).

И собственно вопрос, касаемый списания денежных средств с лицевого счета пользователя. Функции создания транзакции и списания ведь есть, надо лишь к ним обратиться, но опять же не могу разобраться как и где, обратится, передав значения id пользователя, id товара и количество.

Буду невероятно признателен за помощь, а то срок сдачи близится а я застрял на этом месте smile

Повысить оценку Понизить оценку

Re: Уменьшение количества товара и списание средств

Здравствуйте.
Итак нам нужно изменить количество товара. Сведения о количестве товаров хранятся в разрезе складов и комплектаций. По умолчанию к товару создаётся 1 комплектация где хранятся сведения о количестве данного товара. Если комплектаций больше, то соотвественно для каждой комплектации хранится своё количество товара на складе.
Поэтому нужно:
1. Подгрузить товар.
2. Вызвать у него заполнение количества комплектаций и остатков их.
3. Составить новый массив комплектаций с изменениями по количству на складе, привоив их товару.
4. Обновить товар.

Вот как это выглядит:

$product_id = 27452; //id товара
  
  $plus_value = 2; //Количество на которое увеличися товар
  
  //Подгрузим сам товар
  $product = new \Catalog\Model\Orm\Product($product_id);
  
  //Заполняем сведения об остатках на складах товара и имеющихся комплектациях, значения появятся в ключе offers
  $product->fillOffersStock();
  
  //Получим склад по умолчанию через запрос к БД использую ORM Request
  $warehouse = \RS\Orm\Request::make()
        ->from(new \Catalog\Model\Orm\WareHouse())
        ->where(array(
            'site_id' => \RS\Site\Manager::getSiteId(), //На текущем сайте
            'default_house' => 1 //Флаг по умолчанию включён
        ))
        ->object();
        
  //Получаем все комплектации
  $offers = $product['offers']; 
  
  //Эти строки показывают общую картину что подгрузили и как это выглядит. Комлектации находятся в ключе offers      
  echo "<pre>";
  var_dump('warehouse', $warehouse);
  var_dump('product', $offers);
  echo "</pre>"; 
  
  //Пробежимся по комплектациям и изменим количество, задав новые значения комплектациями
  $new_offers = array();
  foreach ($offers['items'] as $k=>$item){
     //Т.к. товар это объект \Catalog\Model\Orm\Product, то обращение к нему как к массиву происходит так, иначе Notice 
     $stock_num                   = $item['stock_num'];
     $stock_num[$warehouse['id']] = $stock_num[$warehouse['id']]+$plus_value;
    
     $item['stock_num'] = $stock_num;
     
     $new_offers[$k] = $item;
  }
  
  $product['offers'] = $new_offers;
  
  //Вызываем обновление у товара. В функции afterWrite класса \Catalog\Model\Orm\Product произойдёт обновление
  $product->update();

Получить значение из POST можно так к контроллере:

$this->request('product_id',TYPE_INTEGER,0); //Получение переменной из $_REQUEST, product_id где ожидается что это число.

Строка:

use \Product\Model\Orm\Product

Все го лишь отвечает за, то что вы можете вместо

\Product\Model\Orm\Product::loadByWhere();

Сделать так

Product::loadByWhere()

Т.е. использовать сокращённый alias

Re: Уменьшение количества товара и списание средств

Для работы с БД я на этой странице постарался описать.

Re: Уменьшение количества товара и списание средств

Спасибо огромное, все быстро реализовал благодаря вашим пояснениям. Но не могли бы вы ответить, пожалуйста, на вторую часть вопроса:

И собственно вопрос, касаемый списания денежных средств с лицевого счета пользователя. Функции создания транзакции и списания ведь есть, надо лишь к ним обратиться, но опять же не могу разобраться как и где, обратится, передав значения id пользователя, id товара и количество.

Повысить оценку Понизить оценку

5

Re: Уменьшение количества товара и списание средств

Чтобы изменить баланс пользователя, необходимо вызвать метод:

$transactionApi = new \Shop\Model\TransactionApi();
$transactionApi->addFunds($user_id, $amount, $writeoff, $reason);

//$user_id - ID юзера
//$amount - сумма
//$writeoff - флаг списания. Если true, то сумма $amount списывается, false - добавляется
//$reason - комментарий к операции
$transactionApi = new \Shop\Model\TransactionApi();
$transactionApi->addFunds(123, 25.50, false, 'Пополнение баланса пользователя на 25 руб 50 коп. пользователя ID 123');

$transactionApi = new \Shop\Model\TransactionApi();
$transactionApi->addFunds(123, 25.50, true, 'Списание 25 руб. 50 коп. с баланса у пользователя ID 123');

Повысить оценку +1 Понизить оценку

Re: Уменьшение количества товара и списание средств

Получить авторизованного пользователя можно так:

$user = \RS\Application\Auth::getCurrentUser()

Re: Уменьшение количества товара и списание средств

Спасибо огромное за помощь, все реализовано) Третий проект на ReadyScript ставлю и в этот раз понадобился дополнительный функционал заказчику. Великолепная техническая поддержка, по сравнению с другими CMS. Еще раз спасибо за помощь smile

Повысить оценку Понизить оценку