-
-
Save ilyautkin/c26550d7c010340db2f3 to your computer and use it in GitHub Desktop.
Процессор создания "Операции"
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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