Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для категорий. Перейдем к делу
У меня в базе данных введен в таблице специальный столбик, называемый order_num. Он как раз и определяет порядковый номер записи в таблице. По нажатию на кнопке вверх (я называю эту процедуру promote), порядковый номер текущей записи меняется местами с порядковым ближайшим большим порядковым номером. Обратная процедура (demote) меняет с ближайшим меньшим.
Обращу ваше внимание на то, что этот пример сделан не для категорий а для контентных страниц (что сути не меняет), к тому же учитывается parent_id, то есть можно менять порядок внутри категории не затрагивая другие.
Promote:
public function executePromote() { $page_id = $this->getRequestParameter('page_id'); $connection = Propel::getConnection(); $promoting_RS = $connection->query("SELECT order_num, parent_id FROM static_pages WHERE page_id='{$page_id}'"); $promoting = $promoting_RS->fetch(PDO::FETCH_ASSOC); $promoting_num = $promoting['order_num']; $promoting_parent = $promoting['parent_id']; if ($promoting_num < 2) { $this->redirect('static_pages/index'); } $demoting_num_RS = $connection->query("SELECT MAX(order_num) AS order_num, page_id FROM static_pages WHERE parent_id='{$promoting_parent}' AND order_num < '{$promoting_num}' GROUP BY NULL"); $demoting = $demoting_num_RS->fetch(PDO::FETCH_ASSOC); $demoting_num = $demoting['order_num']; $query = "UPDATE static_pages SET order_num = CASE WHEN page_id = '".$page_id."' THEN '".$demoting_num."' WHEN parent_id='{$promoting_parent}' AND order_num='{$demoting_num}' THEN '".$promoting_num."' END WHERE page_id = ".$page_id." OR (parent_id={$promoting_parent} AND order_num={$demoting_num})"; $connection->query($query); $this->redirect('static_pages/index'); return sfView::NONE; }
Мы берем id из запроса, потом запросом ищем максимальный order_num, который меньше текущего, и потом запросом меняем их местами. Не забудьте ставить WHERE в UPDATE. На основе этого, думаю demote легко дописать самому.
P.S> Поле не должно быть UNIQUE, я так и не придумал как одним запросом менять значения между собой в UNIQUE поле.
А еще я писал про:










Май 8th, 2009 at 14:02
WHERE page_id = «.$page_id.»
Пахнет SQL-injection…
WHERE page_id = » . (int)$page_id . »
Май 8th, 2009 at 15:49
Пропел автоматически фильтрует