Хак Вывод архива 1 категории

Тема в разделе "DLE", создана пользователем Горбушка, 12 янв 2013.

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

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

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

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.039
    Не так давно ко мне обратился челвоек и заказал модуль. Т.к. я просрочил срок выполнения, денег не взял, но и код выкладываю в публичный доступ. Хотя за такое и денег брать стыдно.

    Суть:
    Человеку потребовалось выводить архив (блок на сайте в формате Месяц-Год) только из 1 категории. Соответсвенно при клике на месяц выдавать список новостей тоже из 1 категории.

    Реализуем для ДЛЕ 9.7:
    Файл \engine\modules\calendar.php ищем (213 строка) :
    Код:
    $db->query( "SELECT DATE_FORMAT(date,'%b %Y') AS m_date, COUNT(id) AS cnt FROM " . PREFIX . "_post WHERE approve=1" . $where_date . " ЦРУGROUP BY m_date ORDER BY date desc" );
    
    Заменяем на:
    Код:
    $db->query( "SELECT DATE_FORMAT(date,'%b %Y') AS m_date, COUNT(id) AS cnt FROM " . PREFIX . "_post WHERE approve=1" . $where_date . " AND `category` = 2 GROUP BY m_date ORDER BY date desc" );
    Файл \engine\engine.php ищем (514 строка) :
    Код:
    				$sql_select = "SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE {$stop_list}date >= '{$year}-{$month}-01'AND date < '{$year}-{$month}-01' + INTERVAL 1 MONTH AND approve=1" . $where_date . " ORDER BY " . $news_sort_by . " " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];
    				$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post where {$stop_list}date >= '{$year}-{$month}-01'AND date < '{$year}-{$month}-01' + INTERVAL 1 MONTH AND approve=1" . $where_date;
    Заменяем на:
    Код:
    				$sql_select = "SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM " . PREFIX . "_post p LEFT JOIN " . PREFIX . "_post_extras e ON (p.id=e.news_id) WHERE {$stop_list}date >= '{$year}-{$month}-01' AND `category` = 2 AND date < '{$year}-{$month}-01' + INTERVAL 1 MONTH AND approve=1" . $where_date . " ORDER BY " . $news_sort_by . " " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];
    				$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post where {$stop_list}date >= '{$year}-{$month}-01' AND `category` = 2 AND date < '{$year}-{$month}-01' + INTERVAL 1 MONTH AND approve=1" . $where_date;
    Т.е. в запросы добавляем AND `category` = 2, де 2 - нужная нам категория.

    Обновляем кэш, готово.

    Решение сделано за 10 минут, буду доделовать. Выложил по 2 причинам:
    1) Не удобно задерживать заказ и дальше
    2) Интересны Ваши идеи по доработке

    Известные ошибки и недоработки:
    1) Категория задаётся жёстко, а не в конфиге
    2) Работает только если выключены мультикатегории
    3) Не выводит статьи из подкатегорий

    Дорабатывать буду как появится больше свободного времени. Ориентир - следующая неделя. Хотя слово "дорабатывать" тут не подходит, скорее делать по человечески, а не экстренный вариант.
     
    latteo нравится это.
  2. rahman

    rahman Постоялец

    Регистр.:
    11 апр 2007
    Сообщения:
    88
    Симпатии:
    97
    Раз уж речь про архив, скажу свою хотелку:
    Мне нужно, чтобы в блоке "Архив новостей" не показывались месяцы, то есть чтобы не было ничего ДО ТОГО, как юзер не нажмет на ссылку "Показать/скрыть весь архив"
    Я понял, что за это отвечает файл calendar.php и методом тыка добился нужного, я изменил сначение "6" на "0" на 236 строке:
    $db->free();

    $i = count( $news_archive );

    if( $i > 6 ) {
    $news_archive[6] = "<div id=\"dle_news_archive\" style=\"display:none;\">" . $news_archive[6];
    $news_archive[] = "</div><div id=\"dle_news_archive_link\" ><br /><a class=\"archives\" onclick=\"$('#dle_news_archive').toggle('blind',{},700); return false;\" href=\"#\">" . $lang['show_archive'] . "</a></div>";
    }

    if( $i ) $tpl->result['archive'] = implode( "<br />", $news_archive );
    else $tpl->result['archive'] = "";

    create_cache( "archives", $tpl->result['archive'], $config['skin'] );
    }

    }
    ?>

    Выделил жирным 6-ки, которые я изменил на 0. И все получилось.
    Но вот проблема - хостер отрубил сайт чз сутки за перегруз, и думаю что после этой манипуляции. Подскажите, как реализовать по-человечески?
     
    Alex.Volk нравится это.
  3. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.039
    Нет, хостер за такое не мог отрубить... Вы всего лишь добавили display:none; к выводимому контенту и всё.
     
  4. rahman

    rahman Постоялец

    Регистр.:
    11 апр 2007
    Сообщения:
    88
    Симпатии:
    97
    Вы уверены? А может там получился какой-то незавершаемый цикл? Может 0 вместо 6 нельзя ставить?
    А вы не подскажите более элегантное решение? версия дле 9.5
    Я просто хотел, чтобы была незаметная кнопка "архив" по нажатию на которую уже бы список выдвигался. Могу 5$ подкинуть на чай.
     
    Alex.Volk нравится это.
  5. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.039
    Более элегантная - спрятать через CSS то, что уже генерируется в ДЛЕ...
    Открываем /engine/modules/calendar.php и удаляем к чертям:
    PHP:
            if( $i ) {
                
    $news_archive[6] = "<div id=\"dle_news_archive\" style=\"display:none;\">" $news_archive[6];
                
    $news_archive[] = "</div><div id=\"dle_news_archive_link\" ><br /><a class=\"archives\" onclick=\"$('#dle_news_archive').toggle('blind',{},700); return false;\" href=\"#\">" $lang['show_archive'] . "</a></div>";
            }
    В main.tpl вставляем обычный спойлер...
     
    rahman нравится это.
  6. rahman

    rahman Постоялец

    Регистр.:
    11 апр 2007
    Сообщения:
    88
    Симпатии:
    97
    Такс, убрал код как ты сказал. При этом весь календарь отобразился(все месяцы столбцом).
    А вот спойлер в main.tpl это я недопонял.
    Еще что то нет ссылки "начать переписку" при нажатии на твой профиль:confused:
     
    Alex.Volk нравится это.
  7. Горбушка

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

    Регистр.:
    2 май 2008
    Сообщения:
    3.036
    Симпатии:
    2.039
    Всё верно. Покажется весь календарь... Дальше берём в main.tpl и добавляем спойлер вот таким методом:
    HTML:
    <div class="title_spoiler">
    <img id="image-spdle_news_archive" style="vertical-align: middle;border: none;" alt="" src="/dle/templates/Default/dleimages/spoiler-plus.gif" />&nbsp;<a href="javascript:ShowOrHide('spdle_news_archive')">Показать / Скрыть архив</a>
    </div>
    <div id="spdle_news_archive" class="text_spoiler" style="display:none;">{archives}</div>
    Очень много флуда было в ЛС, посему эту функцию для себя отключил. Если хотите что-то заказать - в подписи есть ICQ. По остальным вопросам - только форум.