:-)
  • PHP 02.05.2009

    Этим постом я отвечаю на вопрос в комментариях о том, как я реализовал стрелки вверх и вниз для категорий. Перейдем к делу

    У меня в базе данных введен в таблице специальный столбик, называемый 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 поле.

    А еще я писал про:

    1. Symfony: переключатели
    2. Документация Symfony
    3. Symfony: динамический роутинг

    Tags: , ,

  • 2 комментариев

    WP_Modern_Notepad

    Trackbacks