public function sort($id, $sort) { if (!in_array($sort, array('up', 'down'))) { return redirect_message(array('admin', $this->get_class()), array('_flash_message' => '排序失敗!')); } $total = WorkTag::count(array('conditions' => array('work_tag_id = ?', 0))); switch ($sort) { case 'up': $sort = $this->tag->sort; $this->tag->sort = $this->tag->sort - 1 < 0 ? $total - 1 : $this->tag->sort - 1; break; case 'down': $sort = $this->tag->sort; $this->tag->sort = $this->tag->sort + 1 >= $total ? 0 : $this->tag->sort + 1; break; } WorkTag::addConditions($conditions, 'sort = ? AND work_tag_id = ?', $this->tag->sort, 0); $tag = $this->tag; $update = WorkTag::transaction(function () use($conditions, $tag, $sort) { if (($next = WorkTag::find('one', array('conditions' => $conditions))) && (($next->sort = $sort) || true)) { if (!$next->save()) { return false; } } if (!$tag->save()) { return false; } return true; }); if (!$update) { return redirect_message(array('admin', $this->get_class()), array('_flash_message' => '排序失敗!', 'posts' => $posts)); } return redirect_message(array('admin', $this->get_class()), array('_flash_message' => '排序成功!')); }