Esempio n. 1
0
 public function insertChild(Library\DatabaseRowInterface $node)
 {
     //Track the parent
     $node->setParent($this);
     //Insert the row in the rowset
     $this->getChildren()->insert($node);
     return $this;
 }
Esempio n. 2
0
 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;
     }
 }