public function insertChild(Library\DatabaseRowInterface $node) { //Track the parent $node->setParent($this); //Insert the row in the rowset $this->getChildren()->insert($node); return $this; }
protected function _reorderCustom(Library\DatabaseRowInterface $row, $column, $operation) { $table = $row->getTable(); switch ($operation) { case Library\Database::OPERATION_INSERT: $query = $this->_buildQuery($row)->columns('orderings.custom')->join(array('orderings' => $table->getOrderingTable()->getName()), 'tbl.' . $table->getIdentityColumn() . ' = orderings.' . $table->getIdentityColumn(), 'INNER')->order('orderings.custom', 'DESC')->limit(1); $max = (int) $table->getAdapter()->select($query, Library\Database::FETCH_FIELD); $table->getOrderingTable()->select($row->id, Library\Database::FETCH_ROW)->setData(array('custom' => $max + 1))->save(); break; case Library\Database::OPERATION_UPDATE: if ($row->order) { $old = (int) $row->ordering; $new = $row->ordering + $row->order; $new = $new <= 0 ? 1 : $new; $select = $this->_buildQuery($row)->columns('orderings.custom')->columns('tbl.' . $table->getIdentityColumn())->join(array('orderings' => $table->getOrderingTable()->getBase()), 'tbl.' . $table->getIdentityColumn() . ' = orderings.' . $table->getIdentityColumn(), 'INNER')->order('index', 'ASC'); if ($row->order < 0) { $select->columns(array('index' => 'IF(orderings.custom >= :new AND orderings.custom < :old, orderings.custom + 1, ' . 'IF(orderings.' . $table->getIdentityColumn() . ' = :id, :new, orderings.custom))')); } else { $select->columns(array('index' => 'IF(orderings.custom > :old AND orderings.custom <= :new, orderings.custom - 1, ' . 'IF(orderings.' . $table->getIdentityColumn() . ' = :id, :new, orderings.custom))')); } $select->bind(array('new' => $new, 'old' => $old, 'id' => $row->id)); $update = $this->getObject('lib:database.query.update')->table(array('tbl' => $table->getOrderingTable()->getBase()))->join(array('ordering' => $select), 'tbl.' . $table->getIdentityColumn() . ' = ordering.' . $table->getIdentityColumn())->values('tbl.' . $column . ' = ordering.index')->where('tbl.' . $table->getIdentityColumn() . ' = ordering.' . $table->getIdentityColumn()); $table->getAdapter()->update($update); } break; case Library\Database::OPERATION_DELETE: $table->getAdapter()->execute('SET @index := 0'); $select = $this->_buildQuery($row)->columns(array('index' => '@index := @index + 1'))->columns('orderings.custom')->columns('tbl.' . $table->getIdentityColumn())->join(array('orderings' => $table->getOrderingTable()->getBase()), 'tbl.' . $table->getIdentityColumn() . ' = orderings.' . $table->getIdentityColumn(), 'INNER')->order('index', 'ASC'); $update = $this->getObject('lib:database.query.update')->table(array('tbl' => $table->getOrderingTable()->getBase()))->join(array('ordering' => $select), 'tbl.' . $table->getIdentityColumn() . ' = ordering.' . $table->getIdentityColumn())->values('tbl.' . $column . ' = ordering.index')->where('tbl.' . $table->getIdentityColumn() . ' = ordering.' . $table->getIdentityColumn()); $table->getAdapter()->update($update); break; } }