На время проведения реконструкции сайт переведён в режим "ТОЛЬКО ЧТЕНИЕ" (Read only). Приносим свои извинения!
MaxHub
Полезности по Maxsite CMS

Сортировка записей в рубриках (и не только)

Вопросы-ответы / 12 мая 2015

По-умолчанию сортировка записей в рубриках выполняется исходя из даты публикации:

$par = array( 
  'order' => 'page_date_publish',
  'order_asc' => 'desc'
 );

Можно ли сделать комбинированный тип сортировки: сначала сортируются записи, у которых задан параметр page_menu_order (порядок). Далее сортируются записи без него, они сортируются по page_date_publish.

Если задать:

$par['order'] = 'page_menu_order';
$par['order_asc'] = 'desc';

То сортировка будет производится с учетом page_menu_order. Но в этом случае не будет учитываться page_date_publish.

Как сделать, чтобы если page_menu_order = 0, то сортировка производилась с учетом page_date_publish?

UPD. Благодаря нашим специалистам было найдено решение:

$par['order'] = 'page_menu_order desc, page_date_publish desc';
$par['order_asc'] = '';

Работает замечательно. Так, как и должно быть. Возник вопрос. Если мы изменим способ сортировки по page_menu_order на asc:

$par['order'] = 'page_menu_order asc, page_date_publish desc';
$par['order_asc'] = '';

То получим, что все записи с page_menu_order = 0 становятся выше всех. Можно ли сделать так, как показано на картинке (вариант с page_menu_order asc)?

Комментариев: 9
  1. Катя, если я правильно понимаю, то можно попытаться получить желаемое при задании двойной сортировки таким образом (это возможно судя по описанию функции order_by фреймворка CodeIgniter, например, здесь - http://code-igniter.ru/user_guide/database/active_record.html):

    $par['order'] = 'page_menu_order desc';
    $par['order_asc'] = 'page_date_publish desc';

    Я думаю, так. Сперва записи будут отсортированы по убыванию по полю page_menu_order и в конце выборки окажутся записи со значением = 0. У этих записей (с page_menu_order = 0) будет обратная сортировка по page_date_publish. Другой вопрос, что при наличии записей, например, с page_menu_order = 1 они между собой тоже будут обратно отсортированы по page_date_publish и я не знаю, подходит ли вам такой вариант.

    Если этот вариант не сработает как вам нужно, то других идей кроме как написать полностью свою функцию выборки записей у меня нет.

  2. Илья, предложенный Вами вариант приведет к ошибке синтаксиса SQL.

    Для сортировки по нескольким полям с использованием функции получения записей mso_get_pages() должно быть так.

    $par['order'] = 'page_menu_order desc, page_date_publish desc';
    $par['order_asc'] = '';

  3. searchingman, каюсь, не проверял. Спасибо, что подправили!

  4. Илья, searchingman, СПАСИБО!!! Добавила один вопрос в тему.

  5. Добавила один вопрос в тему.

    Катя, может проще у всех записей с 'page_menu_order' = 0 установить какое-нибудь большое значение, н-р, 9999.

    Для этого нужен 1 запрос в БД.

  6. searchingman, скажу больше, меня и вот этот вариант полностью устраивает:

    $par['order'] = 'page_menu_order desc, page_date_publish desc';
    $par['order_asc'] = '';

    Кстати, вариант с установкой 9999 очень интересный. Подскажите, пожалуйста, как сделать такой запрос, используя phpMyAdmin.

    Вариант с page_menu_order desc тоже рабочий. Просто нумерацию лучших записей нужно начинать с большого числа, например - 9999, 9998, 9997 и тд.

  7. Запрос

    UPDATE `mso_page` SET `page_menu_order`= 9999 WHERE `page_menu_order`= 0

    Важно! Перед любыми манипуляциями с БД нужно иметь архив БД.

  8. searchingman, СПАСИБО!!!

    ИМХО, получился очень полезный топик. Тк теперь мы имеем возможность показать нужные записи выше других!

  9. На мой взгляд, это один из лучших топиков на МаксХаб. Тк дается уже готовое решение. Иди и внедряй =)))