Помощь Сортировка новостей в админке по количеству просмотров

Тема в разделе "DLE", создана пользователем Lazy_bones, 16 мар 2013.

Информация :
Актуальная версия DataLife Engine 12.0
( Final Release v.12.0 | Скачать DataLife Engine | Скачать 12.0 demo )
Нужно ли обновляться | Как обновиться | Изменения в шаблонах
> Нет русских символов <
[Приватная тема DLE (Все подробности в ЛС к модератору раздела)]

Версии 11.3 и ниже - уязвимы!

Локализации | F.A.Q. | Внешний вид
Правила раздела | Правила форума
Обсуждение хайда карается баном!
В каждом сообщении указывайте версию DLE, которого они касаются!
Модераторы: killoff
  1. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Здравствуйте. Есть куча модулей, которые выводят на сайте новости с сортировкой по количеству просмотров.
    А можно ли как то отсортировать их в админке именно по количеству просмотров?
    К примеру стандартная строка при редактировании новостей выглядит таким образом
    Код:
    http://site/admin.php?mod=editnews&action=list&search_field=&search_author=&search_cat=&fromnewsdate=&tonewsdate=&news_status=0&news_per_page=50&search_order_f=desc&search_order_m=asc&search_order_d=desc&search_order_t=&start_from=0 
    Можно ли подставить в данную строку какой нить параметр, чтобы сортировка выполнилась по количеству просмотров? Или есть какие то способы это сделать?
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.221
    \engine\inc\editnews.php
    PHP:
    $db->query"SELECT p.id, p.date, p.title, p.category, p.autor, p.alt_name, p.comm_num, p.approve, p.fixed, e.news_read, e.votes FROM " PREFIX "_post p LEFT JOIN " PREFIX "_post_extras e ON (p.id=e.news_id) " $where " ORDER BY " $order_by " LIMIT $start_from,$news_per_page);
    Заменить на:
    PHP:
    $db->query"SELECT p.id, p.date, p.title, p.category, p.autor, p.alt_name, p.comm_num, p.approve, p.fixed, e.news_read, e.votes FROM " PREFIX "_post p LEFT JOIN " PREFIX "_post_extras e ON (p.id=e.news_id) " $where " ORDER BY e.news_read asc, " $order_by " LIMIT $start_from,$news_per_page);
     
    Lazy_bones нравится это.
  3. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Странно, поставил то, что Вы сразу дали и он работает также, как и новый.
    Вот только почему то всегда сортирует от меньших просмотров к большим и какой бы параметр не менял, обратная сортировка не происходит. Не знаю так и должно быть или все таки где то и обратная есть?
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.221
    И так, чисто теория, т.к. установленной ДЛЕ под рукой нет. Будут баги - исправлю.
    \engine\inc\editnews.php
    Найти:
    PHP:
            <td style="padding-left:2px;" colspan="2"><select name="search_order_t" id="search_order_t">
               <
    option {$search_order_title['----']} value="">{$lang['user_order_no']}</option>
               <
    option {$search_order_title['asc']} value="asc">{$lang['user_order_plus']}</option>
               <
    option {$search_order_title['desc']} value="desc">{$lang['user_order_minus']}</option>
                </
    select>
            </
    td>
    Добавить ниже:
    PHP:
            <td style="padding-left:2px;"><select name="search_order_v" id="search_order_v">
               <
    option {$search_order_mod['----']} value="">{$lang['user_order_no']}</option>
               <
    option {$search_order_mod['asc']} value="asc">{$lang['user_order_plus']}</option>
               <
    option {$search_order_mod['desc']} value="desc">{$lang['user_order_minus']}</option>
                </
    select>
            </
    td>
    Найти:
    PHP:
        if( $_REQUEST['search_order_t'] == "asc" or $_REQUEST['search_order_t'] == "desc" $search_order_t $_REQUEST['search_order_t'];
        else 
    $search_order_t "";
    Добавить ниже:
    PHP:
        if( $_REQUEST['search_order_v'] == "asc" or $_REQUEST['search_order_v'] == "desc" $search_order_v $_REQUEST['search_order_v'];
        else 
    $search_order_v "";
    Найти:
    PHP:
        if( ! empty( $search_order_t ) ) {
            
    $order_by[] = "title $search_order_t";
        }
    Добавить ниже:
    PHP:
        if( ! empty( $search_order_v ) ) {
            
    $order_by[] = "e.news_read $search_order_v";
        }
    Найти:
    PHP:
        $search_order_title = array ('----' => '''asc' => '''desc' => '' );
        if( ! empty( 
    $search_order_t ) ) {
            
    $search_order_title[$search_order_t] = 'selected';
        } else {
            
    $search_order_title['----'] = 'selected';
        }
    Добавить ниже:
    PHP:
        $search_order_view = array ('----' => '''asc' => '''desc' => '' );
        if( ! empty( 
    $search_order_v ) ) {
            
    $search_order_view[$search_order_v] = 'selected';
        } else {
            
    $search_order_view['----'] = 'selected';
        }
    Найти:
    PHP:
            <td style="padding:5px;">{$lang['edit_et']}</td>
    Добавить ниже:
    PHP:
            <td style="padding:5px;">По просмотрам:</td>
    Пробуем... Единственное - немного поедит дизайн... Там надо количество колонок восстанавливать:
    colspan="4" заменять на colspan="5" и т.д., но это уже мелочи.
     
    Lazy_bones нравится это.
  5. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Все поставил. Но почему то какую бы сортировку не выбрал, всегда сортирует от меньшего к большему
     
  6. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.221
    Так предыдущее измениен надо убрать =)

    И ещё заметил багу у себя:
    PHP:
        if( ! empty( $search_order_v ) ) {
            
    $order_by[] = "title $search_order_v";
        }
    А должно быть:
    PHP:
        if( ! empty( $search_order_v ) ) {
            
    $order_by[] = "e.news_read $search_order_v";
        }
     
    Lazy_bones нравится это.
  7. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Все получилось. Только нужно сначала сбросить сортировки(Статус, Дата публикации, Заголовок), которые ставятся по умолчанию. Сначала нужно поставить в положение -----(Статус, Дата публикации, Заголовок) и только после этого начинает работать правильно в оба направления, если же их оставить то работает только от меньшего к большему
     
  8. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.199
    Симпатии:
    2.221
    Да, это действительно так. Смысл вот в чём: сортировка идёт последовательно. Сначала скрипт сортирует всё по параметру "зафиксированных" статей - получаем 2 группы: зафиксированные и обычные. Они соответсвенно сортируются по статусу, уже получаем 4 группы. Следующая - сортировка по дате и заголовку соответственно. И дальше уже происходит сортировка по просмотрам. Итог:
    Если мы будем иметь 2 новости от одинаковой даты, с одинаковыми заголовками и другими параметрами - они будут отсортированы по просмотрам, в противном случае сортировка не будет произведена, т.к. в каждой группе останется 1 статья...

    Тут либо очищать параметры, либо передвинуть код:
    PHP:
        if( ! empty( $search_order_v ) ) {
            
    $order_by[] = "e.news_read $search_order_v";
        }
    выше, чтобы сортировка по этому параметру происходила раньше, чем по другим. Либо изменить параметры сортировки по умолчанию:
    PHP:
    if( ! $order_by $order_by "fixed desc, approve asc, date desc";
    К примеру, оставить сортировку только по фиксированным новостям, либо по статусу.
     
  9. Lazy_bones

    Lazy_bones

    Регистр.:
    11 дек 2008
    Сообщения:
    436
    Симпатии:
    106
    Еще обнаружил такую проблему. Выбираю сортировку по просмотрам и хоть по возрастанию, хоть по убыванию. Все отсортировал, но если я перейду на любую страницу пагинации, то дальше сортировка не работает, все сбрасывается. Получается, что сортировка работает только для первой страницы и чтобы получить больше результатов, то нужно просто вписывать большее количество новостей для отображения.

    В хаке, который Вы предложили в самом начале работала только сортировка по возрастанию, но страницы пагинации работали.
     
  10. DzSoft

    DzSoft 3T

    Moderator
    Регистр.:
    13 сен 2007
    Сообщения:
    274
    Симпатии:
    105
    У меня не вышло.
    Версия DLE 10.2
    Все сделал как описано. Но сортировка не работает.
    Частично код выглядит по другому.

    Прошу помощи в разъяснении
     
    Последнее редактирование: 1 дек 2015