public function meta() { return DatabaseObjectLinkMeta::forClass(get_class($this), $this->_db); }
public static function reorder($links) { if (!is_array($links)) { throw new InvalidArgumentException('invalid link list'); } $page = null; $area = null; foreach ($links as $link) { if (!is_object($link) || !$link instanceof self) { throw new InvalidArgumentException('list item not a CMSPageNodeLink'); } if (isset($page)) { if ($link->from != $page || $link->area != $area) { throw new InvalidArgumentException('heterogenous list'); } } else { $page = $link->from; $area = $link->area; } } $meta = DatabaseObjectLinkMeta::forClass(__CLASS__); $database = $meta->getDatabase(); $sql = $meta->getSQL('pagecount'); $sth = $database->execute($sql, $page->id, $area); $c = $sth->fetch(PDO::FETCH_NUM); $c = $c[0]; if ($c != count($links)) { throw new InvalidArgumentException('will not partially reorder'); } $upd = $database->prepare($meta->getSQL('fixupd')); $this->lockTables(); $database->transaction(); try { $w = 0; $nodeid = null; $upd->bindParam($meta->getFromKey(), $page->id); $upd->bindParam($meta->getToKey(), $nodeid); $upd->bindParam('area', $area); $upd->bindParam('weight', $w); foreach ($links as $link) { $nodeid = $link->to->id; $link->weight = $w; $upd->execute(); $w++; } } catch (Exception $e) { $database->rollback(); $database->unlock(); throw $e; } $database->commit(); $database->unlock(); }