» » Блок случайных новостей (by ПафНутиЙ)

Блок случайных новостей (by ПафНутиЙ)

15.05
71
28 082
Блок случайных новостей (by ПафНутиЙ)


С разрешения автора представляю вашему вниманию свою модификацию бесплатной версии модуля Блок случайных новостей написанного Андреем (aka kand).
Это моя первая работа в области php и сразу хочу предупредить народ - я не программист, с php практически не дружу, а с синтаксисом вообще проблемы, дорабатывал модуль для себя и поэтому код модуля может быть не совсем корректен в плане оптимизации, или может содержать ошибки о которых я впринципе знать не могу. Отсюда просьба не закидывать камнями, а лучше помочь словом, и адекватно оценить проделанную работу, и возможно помочь словом и делом, хотя бы по той причине, что я не присваиваю себе авторство модуля, а честно спросил разрешения у автора, за что ему отдельное спасибо.

Назначение: Вывод в любом месте сайта неограниченного количества блоков с заданным количеством новостей, с возможностью гибкой настройки вида для каждого блока в отдельности.
Версия DLE: 8.2 и выше (тестировалось на 8.5)

А теперь о бо всём более подробно.

1. Возможности:

- Простота установки и настройки модуля. Модуль не требует установки, нужно просто залить php-файл в папку engine/modules и прописать в любом tpl, в нужном месте одну строчку для подключения модуля.
- Неограниченное количество выводимых блоков с новостями.
- Возможность настройки вывода новостей для каждого блока отдельно (производятся в строке подключения модуля непосредственно в шаблоне).
- Настройка вида блока полностью в CSS, причём для каждого блока можно задать свой класс и html-тег в который будет заключаться как блок целиком, так и каждая новость в отдельности.
- Кеширование каждого подключаемого блока отдельно.

2. Настройки (каждый блок можно настроить отдельно).

- Настройка количества выводимых новостей.
- Настройка максимальной длинны заголовка новости.
- Настройка максимальной длинны краткого содержания.
- Включение и отключение вывода краткого содержания.
- Настройка размера картинки
(берётся из короткой новости)
- Включение и отключение вывода картинки из короткой новости. (если картинка в новости отсутствует - выводится заглушка)
- 4 варианта порядка сортировки новостей (случайно, по дате, самые комментируемые, самые часто просматриваемые)
- Возможность задать исключаемые из показа категории.
- Возможность задать показ только определённых категорий. (по умолчанию выводятся все категории)
- Возможность задать html-тег, в который будет заключаться блок с новостями и html-тег, в который будет заключаться сама новость.
- Возможность задать или отключить префикс перед заголовком.
- Возможность задать класс для блока с новостями.


Обновление от 18.05.2010

Немного обновим модуль, добавим вывод только заголовка и картинки, без краткого содержания, для этого найдём (строки 123-149):

///---Варианты вывода блока ------
$noimage_block .= '
                 <'.$newswrap.'>
                 <b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'<br />
                  '.$s_story.'</'.$newswrap.'>';
$titleonly_block .= '
                 <'.$newswrap.'>
                 <b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.' </'.$newswrap.'>';
$image_block .= '
                 <'.$newswrap.'>
                 <div style="margin-bottom: 5px;"><b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'</div>
                 <div style="padding-right: 3px; padding-bottom: 3px; float: left; width:'.$img_maxsize.'; height:'.$img_maxsize.';">'.$img_code.'</div>
                <div style="margin-top: -3px;">'.$s_story.'</div><div style="clear: both; height:0;"></div></'.$newswrap.'>';
                  
if ($titleonly == '0') {
    $r_news = $noimage_block; }
        if ($titleonly == '1') {
            $r_news = $titleonly_block; }
                if ($titleonly == '2') {
                    $r_news = $image_block; }
};
$r_news_block = '<'.$boxwrap.' class="'.$boxclass.'">'.$r_news.'</'.$boxwrap.'>';

$db->free();
create_cache( "r_news_block". $block_num, $r_news_block);
}
///---вывод блока ------


и заменим на:

///---Варианты вывода блока ------
$noimage_block .= '
                 <'.$newswrap.'>
                 <b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'<br />
                  '.$s_story.'</'.$newswrap.'>';
$titleonly_block .= '
                 <'.$newswrap.'>
                 <b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.' </'.$newswrap.'>';
$image_block .= '
                 <'.$newswrap.'>
                 <div style="margin-bottom: 5px;"><b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'</div>
                 <div style="padding-right: 3px; padding-bottom: 3px; float: left; width:'.$img_maxsize.'; height:'.$img_maxsize.';">'.$img_code.'</div>
                <div style="margin-top: -3px;">'.$s_story.'</div><div style="clear: both; height:0;"></div></'.$newswrap.'>';
                
$image_block_s .= '
                 <'.$newswrap.'>
                 <div style="margin-bottom: 5px;"><b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'</div>
                 <div style="width:'.$img_maxsize.'; height:'.$img_maxsize.';">'.$img_code.'</div>';
                  
if ($titleonly == '0') {
    $r_news = $noimage_block; }
        if ($titleonly == '1') {
            $r_news = $titleonly_block; }
                if ($titleonly == '2') {
                    $r_news = $image_block; }
                        if ($titleonly == '3') {
                            $r_news = $image_block_s; }
};
$r_news_block = '<'.$boxwrap.' class="'.$boxclass.'">'.$r_news.'</'.$boxwrap.'>';

$db->free();
create_cache( "r_news_block". $block_num, $r_news_block);
}
///---вывод блока ------


И по желанию в конец строки 33 допишем
3 - только заголовок и картинка


Всё. Теперь если в строке подключения модуля дописать titleonly=3, будет выводиться только заголовок и картинка.

Обновление от 20.05.2010

Найден небольшой, но не очень приятный баг:
когда вносил последние изменения, в строку 140, в конец не дописал закрывающий тег для новости.
Исправляем:
<div style="width:'.$img_maxsize.'; height:'.$img_maxsize.';">'.$img_code.'</div>';

на
<div style="width:'.$img_maxsize.'; height:'.$img_maxsize.';">'.$img_code.'</div></'.$newswrap.'>';


Обновление от 08.06.2010

Устранена ошибка при переходе в полную новость по нажатию на картинку, если в строке подключения задан её вывод.

Для исправления нужно перенести строку:
$full_link = $config['http_home_url'].get_url($row['category'])."/".$row['id']."-".$row['alt_name'].".html"; //--ссылка на новость --

ПЕРЕД
//-----Обработка картинок --->
preg_match('|<img(.*) src="([^"]*)"[^>]*>|is', $row['short_story'], $ps);



Обновление от 06.07.2010

Сегодня был обнаружен интересный баг - если в короткой новости присутствовало видео, то вместо картинки в блок выводилась ссылка на видео из новости.
Так же поправлен вывод картинки , теперь берётся самая первая картинка из короткого содержания.

Для обновления нужно найти строки:
//-----Обработка картинок --->
preg_match('|<img(.*) src="([^"]*)"[^>]*>|is', $row['short_story'], $ps);
if($ps[2])
{
   $img_parts = pathinfo($ps[2]);
   $img_link = $img_parts['dirname'].'/'.$img_parts['basename'];


и заменить на:
//-----Обработка картинок --->
$count_img = preg_match_all('%(((http://www)|(http://)|(www))[-a-zA-Z0-9@:%_+.~#?&//=]+).(jpg|jpeg|gif|png|bmp|tiff|tga|svg)%i', $row['short_story'], $img_match);
     if ($count_img > 0){
    
          $img_parts = pathinfo($img_match[0][0]);
          $img_link = $img_parts['dirname'].'/'.$img_parts['basename'];



Рекомендую скачать обновлённый архив.

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



P.S.
Если вы не знаете какие изменения вносили в скрипт, а какие нет, поможет утилита для сравнения текстовых фрагментов (diff).

Работу модуля можно видеть чуть ниже, я заменил модулем вывод случайных материалов (в портфолио - случайных работ) и в правой колонке сайта Новые материалы так же выводятся этим модулем.

Жду предложений и замечаний.

Похожие материалы

Комментарии

ПафНутиЙ
ПафНутиЙ 13 октября 2010 23:22
При случайной выборке, хз как работает кеш если честно, это вопрос к более продвинутым программистам.
По поводу столбика:
очистить кеш. либо смотреть дочерние блоки. может где то стоит для картинок, либо для ссылок display: block; либо уже есть класс custom
при том решении, которое я предложил блок с новостями будет выглядеть примерно так:
<div class="custom">
<span><a href="LINK"><IMAGE></a></span>
<span><a href="LINK"><IMAGE></a></span>
<span><a href="LINK"><IMAGE></a></span>
</div>

тут впринципе без классов и стилей будет в строчку.
SiriusZ
SiriusZ 14 октября 2010 07:51
Заработало , только теперь сайт грузится в 5 раз медленней так и должно быть ?
У меня выводится один блок 10 новостей
biggy
biggy 14 октября 2010 08:27
Кстати, у меня такая-же ситуация, сайт, временами, задумывается секунд на 5, хром пишет то "ожидание кеша", то "ожидание ответа с сайта ...". Может дать код спецам посмотреть?
SiriusZ
SiriusZ 14 октября 2010 16:45
Возможно проблема в первой строке обработки картинок?
ПафНутиЙ
ПафНутиЙ 14 октября 2010 22:33
Если есть спецы - покажите им код, я же говорю, код можно оптимизировать.
Marille
Marille 27 октября 2010 04:09
Спасибо за модуль =)

Интересно, а можно как-то реализовать на этой базе вывод похожих новостей? Хочется, чтобы выводились только картинки с названиями, но именно по критерию похожести. А приличного модуля, который был выводил желаемое - не нашла.
ПафНутиЙ
ПафНутиЙ 27 октября 2010 06:50
Как раз сегодня я опубликую хак, который должен вам помочь. Хотел вчера, но желание поспать было сильнее smile
kostik
kostik 1 марта 2011 03:50
Можно нужно сделать выборку по дате?
Чтобы можно было делать блоки популярного:
- за неделю
- за месяц
- за все время
Спасибо, модуль - то что надо!
ПафНутиЙ
ПафНутиЙ 2 марта 2011 06:50
возможно и будет......
BOGrus
BOGrus 23 марта 2011 09:03
Подскажите пожалуйста как выводиться текст в блоке?
Хотелось бы сделать так, что бы краткая новость выводилась в форматировании, т.е. так как она выводиться в краткой новости.
Как это можно сделать?
ПафНутиЙ
ПафНутиЙ 23 марта 2011 09:19
$s_story = strip_tags(str_replace(array('<br>','<br />')," ",$row['short_story'])); //-- замена переносов на пробелы --
if( strlen( $s_story ) > $short_story_length ) $s_story = substr( $s_story, 0, $short_story_length ) . " ..."; //--обрезка содержания --

заменить на
$s_story = $row['short_story'];
BOGrus
BOGrus 20 апреля 2011 15:53
Спасибо. Это помогло, но не совсем.
Теперь текст безусловно отобрадается в форматировании, но к нему и выводиться домолнительно еще раз та же самая картинка.
А учитывая что в настройках стоит $titleonly = 2; и в выводящаяся картинка выводиться в своём div'e, то хотелось что бы выводилась только краткая новость в форматировании, как это и сделано, но без обрезки форматирования.
BOGrus
BOGrus 20 апреля 2011 17:00
Разобрался. Хотя наверно и криво.

$s_story = strip_tags($row['short_story'], '<br><br /><b><strong>');
ПафНутиЙ
ПафНутиЙ 21 апреля 2011 09:26
Если нужно спрятать картинки - в CSS добавьте

.someclass img {display: none;}

где someclass имя класса блока, оборачивающего новость.
BOGrus
BOGrus 21 апреля 2011 17:59
Да это безусловно лучший вариант, но к сожалению Яндекс не любит "display: none" так, что придёться обойтись php. :(
ПафНутиЙ
ПафНутиЙ 21 апреля 2011 22:32
почему не любит?
BOGrus
BOGrus 22 апреля 2011 02:32
http://forum.searchengines.ru/showthread.php?t=619707
Все по разному считают, но я параноик. Если можно без него то для меня лучше без него.
ПафНутиЙ
ПафНутиЙ 22 апреля 2011 06:50
а с каких пор яндекс читает javaskript?
тупо добавляем 1 строку jQuery-кода с функцией addclass и радуемся жизни smile
xuxa
xuxa 26 апреля 2011 08:36
прекрасный модуль, спасибо вам.

небольшое замечание - в качестве превьюшки выводится оригинальная картинка, спрессованная до нужного размера вёрсткой,
не thumb (как у вас же в хаке для "красивых" коротких новостей)

- большие картинки очень большие и с "водяными знаками" - и не очень красиво и напрасно грузят читателя.

как бы так выводить тумбы, а?

ПафНутиЙ
ПафНутиЙ 26 апреля 2011 08:40
я уже переработал почти этот модуль, с нормальным кешированием и нормальной обработкой картинок. Никак времени не хватает с домашними хлопотами smile ждите пока, скоро будет обновление всех модулей...
Toonik
Toonik 29 июля 2011 21:18
Не подскажите почему при наведении на картинку(выводится только она) не появляется тултип, даже стандартный?
в коде модуля использую такой шаб
$image_block_i .= '
                 <'.$newswrap.' >    
                
                  <a href="'.$full_link.'" title="'.$ttl.'">
                  <div style=" float: left; overflow:hidden; height:100px; ">
                  '.$img_code.'
                  </div>
                  </a>
                
                  </'.$newswrap.'>';

картинки берутся с доп полей.

ПафНутиЙ
ПафНутиЙ 31 июля 2011 22:48
хз, это надо на сайте смотреть, так то должно выводиться.
Toonik
Toonik 1 августа 2011 02:25
сайт refrns.ru
ПафНутиЙ
ПафНутиЙ 1 августа 2011 02:43
у меня лично отображается стандартный тултип.
Toonik
Toonik 1 августа 2011 03:23
При наведении на случайные или последние?

весьма странно. какой-то зверский кэш что ли. :D
KillerHT
KillerHT 3 августа 2011 17:03
Настроил чтобы выводилась 1 новость и поставил режим рандомной сортировки - а новость выводится одна и та же, в чем проблема?
ПафНутиЙ
ПафНутиЙ 3 августа 2011 17:25
Блок с новостями кешируется, поэтому вам нужно отключить кеш в модуле.
Для этого удалите или закомментруйте строки:
$r_news_block = dle_cache( "r_news_block", $block_num);

if( !$r_news_block ) {

и
create_cache( "r_news_block". $block_num, $r_news_block);
}
Toonik
Toonik 9 августа 2011 02:19
Баг нашелся к сожалению

крон не работает при выводе последних новостей через модуль.

Это как то поправимо?
ПафНутиЙ
ПафНутиЙ 9 августа 2011 08:31
Да, убрать нафиг модуль smile
Ну а если серьёзно - будет время, я оформлю новый модуль, сейчас он работает на dle-faq.pro, один файл выводит и топ и случайные и последние новости, попытаюсь ещё похожие прикрутить, если получится, и тогда уже опубликую. соответственно этот модуль будет неактуален.
Toonik
Toonik 9 августа 2011 16:16
с нетерпением ждем (:

Добавить комментарий

Комментировать могут только зарегистрированные пользователи

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.