Обновление остатков товара

Хотелось бы поднять вопрос обновления остатков товара после оформления заказа.
Точнее, в момент совершения заказа на n-ое количество товара остаток должен уменьшиться на n заказанных штук.
Возможно, плохо гуглил, но информация какая-то разрозненная и нужно собрать по крупицам в кучу.
В общем, благодаря этому комменту написал такой плагин:

<?php
switch ($modx->event->name) {
case 'msOnCreateOrder':
		$prs = $msOrder->getMany('Products');
		// так получаем объекты товаров в заказе
		foreach ($prs as $pr) { //повторяем для каждого товара в заказе
			$data['id'] = $pr->get('product_id'); //определяем id ресурса в заказе
			
			$q = $modx->newQuery('msProduct');
	    	$q->select('Data.available'); //выборка по available, где available - остаток на складе, из которого нужно вычитать количество товара в заказе
	    	$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
	    	$q->where(array('id' => $data['id'])); //при условии,что id ресурса равен id товара в заказе
	        $q->prepare();
	    
	        if($q->stmt && $q->stmt->execute()){
		        $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

		        $data['available'] = ($result[0]['available'] - $pr->get('count')); //определяем остаток товара путём вычитания из текущего остатка товара кол-во товара в заказе $pr->get('count')
			
				$resource = $modx->getObject('msProduct',array('id'=>$data['id'])); //получаем ресурс по его id

				$resource->set('available',$data['available']); //устанавливаем новое значение для поля available
				if ($resource->save()) {
					$modx->cacheManager->clearCache(); //если сохранение успешно, то чистим кэш
			    }
			}
		}
break;
}
Такая конструкция работает, но есть пара вопросов.
Вопрос 1: Как чистить кэш только для этого ресурса, а не для всего сайта?
Пробовал так:
.............up по коду
	$resource = $modx->getObject('msProduct',array('id'=>$data['id'])); //получаем ресурс по его id
	$resource->set('available',$data['available']); //устанавливаем новое значение для поля available
	if ($resource->save()) {
		$cache = $modx->cacheManager->getCacheProvider($modx->getOption('cache_resource_key', null, 'resource'));
		$key = 'web/resources/' . $data['id']; //пробовал и mgr/
		$cache->delete($key, array('deleteTop' => true));
		$cache->delete($key);
	}
.............down по коду
но не работает.
===========
Изначально я пробовал обновлять значения available через процессоры. Однако так и не удалось победить «permission denied» при обновлении ресурса с фронтенда. Делал по аналогии:
<?php
switch ($modx->event->name) {
case 'msOnCreateOrder':
		$prs = $msOrder->getMany('Products');
		// так получаем объекты товаров в заказе
		foreach ($prs as $pr) { //повторяем для каждого товара в заказе
    		$data['id'] = $pr->get('product_id'); //определяем id ресурса в заказе
    		
    		$q = $modx->newQuery('msProduct');
        	$q->select(array('alias','Data.available')); //выборка по alias и available, где available - остаток на складе, из которого нужно вычитать количество товара в заказе; без alias или pagetitle runProcessor не работает
        	$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
        	$q->where(array('id' => $data['id'])); //при условии,что id ресурса равен id товара в заказе
            $q->prepare();
        
            if($q->stmt && $q->stmt->execute()){
                $result = $q->stmt->fetchAll(PDO::FETCH_ASSOC);

                $data['available'] = ($result[0]['available'] - $pr->get('count')); //определяем остаток товара путём вычитания из текущего остатка товара кол-во товара в заказе $pr->get('count')
                $data['context_key'] = 'web';
                $data['alias'] = $result[0]['alias']; //определяем псевдоним ресурса

                $response = $modx->runProcessor('resource/update', $data); //передаём весь массив параметров $data на обработку процессору resource/update
                if ($response->isError()) { //на случай ошибок печатаем их в лог
        		  $modx->log(modX::LOG_LEVEL_ERROR, "Error on update: \n". print_r($response->getAllErrors(), 1));
                }
            }
        }
break;
}
Данный плагин отрабатывает, если мы авторизованы. Если покупку делает аноним, то, как водится, «permission denied».
Вопрос 2: как победить этот permission denied, поскольку хочется сделать через процессоры?
С правами пользователей помудрил — ничего не вышло.
Андрей
12 октября 2014, 13:36
modx.pro
6
2 904
0

Комментарии: 3

Андрей
Андрей
14 октября 2014, 17:17
0
Up!
    Алексей Ерохин
    14 октября 2014, 17:20
    0
    Попробуйте дать анонимусам права context для web.
    Если Вы используете процессоры для апдейта, то у кэш будет автоматически обновляться.
      Евгений
      29 марта 2017, 23:51
      0
      Победили ли вы как нибудь permission denied?
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3