Attempt to save lazy object при повторном сохранении объекта в процессоре

Apr 29, 2015

Добрый день. Хотелось бы разобраться. Столкнулся с проблемкой — вот код процессора: https://gist.github.com/ilyautkin/c26550d7c010340db2f3

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';

Такой метод одновременного создания двух объектов в корне неверен или я просто упустил что-то?