Главная > DLE > DLE хаки: Добавим краткое описание и картинку в topnews

DLE хаки: Добавим краткое описание и картинку в topnews


13 ноября 2009. Разместил: dimon
Потребовалось немного изменить модуль topnews - нужно чтобы помимо названия новости еще отображалась маленькая картинка и краткое описание новости.

DLE хаки: Добавим краткое описание и картинку в topnews


Порывшись в интернете, нашел два варианта решения данной задачи:
1. Купить платный модуль с кучей настроек
2. ХАК "thumbs в topnews" от prime. В этом хаке изображения кладутся в папку /uploads/topnews/

Поэтому подумав, решил написать свой хак.
Для хранения урла изображения с превьювом будем использовать дополнительное поле новости (xfields). Такой способ удобен тем, что создавая новость, можно загрузить изображение, уменьшив его до определенного размера, средствами движка, а потом адрес этой картинки просто скопировать в дополнительное поле внизу формы добавления новости.

Поэтому создаем дополнительное поле:
Название поля = k_foto_pre
Описание поля = Изображение краткой новости
Категории = по выбору (я выбирал все)
Тип поля = одна строка
Значение по умолчанию = пусто (но можно указать url изображения которое будет отображаться по-умолчанию)
Использовать при желании = да (чтобы можно было не заполнять поле)

Теперь заменяем файл /engine/modules/topnews.php на вот такой:

<?php
/*
=====================================================
 DataLife Engine - by SoftNews Media Group 
-----------------------------------------------------
 http://dle-news.ru/
-----------------------------------------------------
 Copyright (c) 2004,2009 SoftNews Media Group
=====================================================
 Данный код защищен авторскими правами
=====================================================
 Файл: topnews.php
-----------------------------------------------------
 Назначение: вывод рейтинговых статей с картирнкой,
 хранящейся в дополнительных полях новости
 ----------------------------------------------------
 ХАК  by dimon
 http://tudimon.com/
=====================================================
*/

if( ! defined( 'DATALIFEENGINE' ) ) {
    die( "Hacking attempt!" );
}



// ====================================================
// дополнительные параметны вывода top-новостей
$w = "100";                            // ширина картинок
$wt = "99%";                        // ширина таблицы topnews
$lim = "10";                        // кол-во выводимых новостей
$xf = "k_foto_pre";                    // название дополнительного поля в котором хранится адрес картинки
$ls = "150";                        // кол-во символов в описании ( до стольких обрезаем)
$noimg = "/uploads/noprev.jpg";        // этот файл отображаем если не заполнено поле в новости с url-ом картинки
// ====================================================

$topnews = dle_cache( "topnews", $config['skin'] );


if( ! $topnews ) {
    
    $topnews .= '<table width="'.$wt.'" border="0">';
    
    $this_month = date( 'Y-m-d H:i:s', $_TIME );
    
    $db->query( "SELECT id, title, date, alt_name, category,_
    short_story, xfields, flag FROM " . PREFIX . "_post WHERE_
    approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND_
    date < '$this_month' ORDER BY rating DESC, comm_num DESC,_
    news_read DESC, date DESC LIMIT 0, $lim" );
    
    while ( $row = $db->get_row() ) {
        
        $row['date'] = strtotime( $row['date'] );
        $row['category'] = intval( $row['category'] );
        
        if( $config['allow_alt_url'] == "yes" ) {
            
            if( $row['flag'] and $config['seo_type'] ) {
                
                if( $row['category'] and $config['seo_type'] == 2 ) {
                    
                    $full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
                
                } else {
                    
                    $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
                
                }
            
            } else {
                
                $full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
            }
        
        } else {
            
            $full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
        
        }
        
        if( strlen( $row['title'] ) > 55 ) $title = substr( $row['title'], 0, 55 ) . " ...";
        else $title = $row['title'];
        
        $go_page = ($config['ajax']) ? "onclick=\"DlePage('newsid=" . $row['id'] . "'); return false;\" " : "";
        if( $config['allow_comments_wysiwyg'] == "yes" ) $go_page = '';
        
        $link = "<a {$go_page}href=\"" . $full_link . "\">далее</a>";
        
        
// очистим короткую новость от каментов, картинок, .. 
$row['short_story'] = preg_replace("/\[attachment=[[:digit:]]*\]/si","",stripslashes($row['short_story']));
$row['short_story'] = preg_replace("/<!--*-->/si","",$row['short_story']);
$row['short_story'] = strip_tags($row['short_story']);

// сделаем массив с xfields-ами
$xfieldsdata = xfieldsdataload( $row['xfields'] );
// проверим, что поле с адресом картиник заполнено. если не заполнено, то отобразим $noimg
if($xfieldsdata[$xf]<>"") $preview = $xfieldsdata[$xf];
else $preview = $noimg;

// укоротим короткую новость до $ls символов
if( strlen( $row['short_story'] ) > $ls ) $row['short_story'] =_
substr( $row['short_story'], 0,$ls ) . " ... <br/><br/><div align=\"right\">$link</div>";

//сформируем тег {topnews}
$topnews .= '
<tr>
    <td widht="'.$w.'" valign="top"><img style="border: medium none;"_
    src="'.$preview.'" width="'.$w.'"></td>
    <td style="padding-left: 4px;"><strong><a href="'.$full_link.'"_
    title="'.stripslashes( $row['title']).'">'.stripslashes( $row['title']).'</a></strong><br>
    '.stripslashes($row['short_story']).'</td>
</tr>
<tr>
    <td class="news" valign="top" colspan="2"><div class="hr_line"></div></td>
</tr>
';


    }
    
    $topnews .= '</table>'; 
    
    $db->free();

    create_cache( "topnews", $topnews, $config['skin'] );
}
?>



Дополнительные параметры настройки этого модуля записаны прямо в файле topnews.php, если необходимо – отредактируйте их в соответствии со своим вкусом.

В приложенном файле – архив со всеми файлами.
Тестировал на DLE 8.2, но думаю что с другими версиями проблем не будет.

Я тут подумал - можно в дополнительном поле хранить адрес уменьшиной картинки из новости, и выводить картинку с тегом thumb. Как изменить код файлы Вы догадаетесь сами?

topnews_by_dimon.rar [26,94 Kb] (cкачиваний: 288)




Кстати если требуется выводить новости только из одной категории, то нужно просто подправить запрос, добавив в него фильтр категории.
Например будем выводить новости только из 666 категории:

$db->query( "SELECT id, title, date, alt_name, category,_
short_story, xfields, flag FROM " . PREFIX . "_post WHERE category='666'_
AND approve='1' AND date >= '$this_month' - INTERVAL 1 MONTH AND_
date < '$this_month' ORDER BY rating DESC, comm_num DESC,_
news_read DESC, date DESC LIMIT 0, $lim" );



В версии DLE 9.4 модуль популярных новостей полностью переведен на использование шаблонной системы, картинки можно вставлять с помощью тэга {image-1} - см. документацию

Вернуться назад