Skip to content

Instantly share code, notes, and snippets.

@ilyautkin
Created April 29, 2015 12:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ilyautkin/c26550d7c010340db2f3 to your computer and use it in GitHub Desktop.
Save ilyautkin/c26550d7c010340db2f3 to your computer and use it in GitHub Desktop.
Процессор создания "Операции"
<?php
class OperationCreateProcessor extends modObjectCreateProcessor {
/*
* Процессор создает "Операции" для управления финансами
* Операция - это расход, приход или перевод со счета на счет
*/
public $classKey = 'Operation';
public $objectType = 'object';
public function beforeSet() {
$amount = $this->getProperty('amount');
switch ($this->getProperty('type')) {
case 'charge':
$this->setProperty('amount', -1 * $amount);
break;
case 'income':
$this->setProperty('amount', 1 * $amount);
break;
case 'transfer':
/*
* Если перевод, то создаем 2-ую операцию так как
* с одного счета деньги ушли (операция с минусом)
* а на другой счет деньги поступили (с плюсом)
*/
$secondOp = $this->modx->newObject('Operation');
/* Все поля в обеих операциях дублируются */
$secondOp->fromArray($this->getProperties());
/* Кроме знака в сумме операции - плюс или минус */
$secondOp->set('amount', 1 * $amount);
/* И счета, к которому операция относится */
$secondOp->set('account', $this->getProperty('to'));
$secondOp->save();
$this->setProperty('amount', -1 * $amount);
$this->setProperty('account', $this->getProperty('from'));
/*
* Операции хоть и разные сущности, но перевод
* это единый процесс и операции надо связать.
* Сначала в одном объекте указываем id другого
* (мы его уже знаем)
*/
$this->setProperty('related', $secondOp->id);
$this->setProperty('relation_type', $this->getProperty('type'));
break;
default:
$this->modx->error->addField('type', 'Unknown type');
return false;
}
return true;
}
public function afterSave() {
if ($this->getProperty('type') == 'transfer') {
/*
* А потом в другом объекте указываем id первой операции.
* Этот id мы можем узнать только в методе afterSave
*/
if ($secondOp = $this->modx->getObject('Operation',
$this->getProperty('related'))
) {
$secondOp->set('related', $this->object->id);
$secondOp->set('relation_type', $this->getProperty('type'));
/*
* И в момент повторного сохранения этого объекта
* MODX выдает ошибку "Attempt to save lazy object"
*/
$secondOp->save();
}
}
return true;
}
}
return 'OperationCreateProcessor';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment