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

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

15.05
71
22 627
Блок случайных новостей (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).

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

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

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

Комментарии

ravchik
ravchik 17 мая 2010 12:06
Прекрасный модуль! Очень давно искал такой... Было-бы здорово, если бы настройки в админку вывести.
Так же очень понравилась Ваша статься про панель авторизации - http://pafnuty.name/statyi/44-oformlyaem-panel-avtorizacii-v-dle.html

Продолжайте в том-же духе!
ПафНутиЙ
ПафНутиЙ 17 мая 2010 12:23
Выносить настройки в админку смысла не вижу, во первых - нужно будет вносить изменения в двиг, а я не сторонник этого, во вторых (и это главное) придётся довольно много писать кода, на мой взгляд совершенно лишнего, да и глючности наверняка прибавит (т.к. я всё таки не программист).
Тем более я подробно описал все настройки в модуле. Сами посудите - что проще: прописать 1 строку для подключения модуля или кучу строк для его установки, и ковырять настройки отдельно для каждого блока в админке?
Malchishka
Malchishka 19 мая 2010 01:15
aka Kolbaser
1. в styles.css вставляю только:
.r_news li {
display: block;
float: left;
width: 120px;
height: 120px;}

2. в r_news.php следующее:
...
//----------------------------------------//
if(!is_numeric($title_length)) $title_length = 30; //Длина заголовка
if(!is_numeric($short_story_length)) $short_story_length = 0; // Кол-во символов из короткой новости
if(!is_numeric($img_maxsize)) $img_maxsize = 90; // Размер картинки
if(!is_numeric($news_num)) $news_num = 3; //Лимит новостей выводимых в блоке
if(!is_numeric($sort_news_var)) $sort_news_var = 4; //порядок сортировки новостей 1 - Случайно, 2 - по дате, 3 - самые комментируемые, 4 - Самые частопросматриваемые.
if(!is_numeric($titleonly)) $titleonly = 3; //0 - показывать краткое описание без картинки, 1 - только заголовки новостей, 2 - краткое описание и картинка, 3 - только заголовок и картинка
if(!is_numeric($showcomments)) $showcomments = 0; //1 - показывать количество комментариев, 0 - не показывать количество комментариев.
if(!is_string($bad_cat)) $bad_cat = '14-29'; // Исключаемые категории , через чёрточку (тире) пример: '10-11'. 1500 указано чтобы не заморачиваться с переменными, всёравно маловероятно наличие категории с id=1500 на сайте :)
if(!is_string($good_cat)) $good_cat = '0'; // Вывод только определённых категорий, через чёрточку (тире) пример: '10-11'. 0 - Вывод всех категорий (кроме указанных в исключаемых категориях см. выше)

//////Дополнительные настройки /////////

if(!is_string($boxwrap)) $boxwrap = span; // Тег, в который будет заключаться блок с новостями.
if(!is_string($newswrap)) $newswrap = div; // Тег, в который будет заключаться новость.
if(!is_string($newsprefix)) $newsprefix = rarr; // Префикс перед новостью, 0 - убрать префикс, ставим сюда обозначение символа в формате &rarr; но без '&' в начале и ';' в конце, т.е. только буквы. список символов можно посмотреть например тут: http://wdh.suncloud.ru/entities.htm
if(!is_string($boxclass)) $boxclass = r_news; // Класс, который будет присваиваться блоку с новостями. не забываем прописывать его в css :)
....

в main.tpl:
{include file="engine/modules/r_news.php?&block_num=1&title_length=30&img
_maxsize=90&news_num=3&sort_news_var=4&titleonly=3&showcomments=
0"}

и всё равно вертикально, изменения от 18.08 я внёс.

П.С.Я не понял почему из строчки для .tpl убрано "Класс, который будет присваиваться блоку с новостями"?
ПафНутиЙ
ПафНутиЙ 19 мая 2010 07:01
Зачем менять в настройках модуля настройки по умолчанию, если в строке подключения они уже указаны? Если вы изменили настройки в php, тогда просто достаточно прописать
{include file="engine/modules/r_news.php"}
и всё.

Цитата: Malchishka
и всё равно вертикально, изменения от 18.08 я внёс.

1 - положите на сайт оригинальный r_news.php от 18.05
2 - пропишите в .tpl
{include file="engine/modules/r_news.php?&block_num=1&title_length=30&img
_maxsize=90&ne
ws_num=3&sort_news_var=4&titleonly=3&showcomments=0"}

3 - в css оставить как сейчас.

Цитата: Malchishka
П.С.Я не понял почему из строчки для .tpl убрано "Класс, который будет присваиваться блоку с новостями"?


потому что используемый по умолчанию класс r_news был указан.
everty
everty 19 мая 2010 20:22
добрый день, подскажите

я внес изменения,

я хочу чтобы было новостей 5 одна под одной:
опр. размера картинка(ссылка) ниже тайтл ссылка (полный тайтл)
новости соритировать по дате добавления

какой мне нужно код прописать? dontknow
ПафНутиЙ
ПафНутиЙ 20 мая 2010 00:55
Для начала заменить (строки 139-140)
<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></'.$newswrap.'>';

на
<div style="width:'.$img_maxsize.'; height:'.$img_maxsize.';" style="margin-bottom: 5px;">'.$img_code.'</div>
<div><b>'.$newspref.' <a href="'.$full_link.'" title="'.$ttl.'">'.$title_short.'</a></b> '.$comm_n.'</div></'.$newswrap.'>';


Далее, в tpl пишем:
{include file="engine/modules/r_news.php?&block_num=1&img_maxsize=80&news_num=5&sort_news_var=2"}

всё, только css под свой дизайн подправить :)
everty
everty 20 мая 2010 19:01
спасибо, с картинками не вышло, сделал текстом :)
CKBAD
CKBAD 21 мая 2010 05:27
Как сделать также красиво, как у тебя в блоге ?
Bag9898
Bag9898 8 июня 2010 15:07
Спасибо ,блоки хорошие получаються.
обнаружил только одну проблемку:в блоке выставлено заглавие + картинка - при нажатии на заглавие -перенаправляет правильно в полную новость,однако при клике на саму картинку перенаправляет либо на текущую открытую страницу либо на полную новсть которая в блоке стоит на 1 выше.

Вопрос можно ли это исправить,или ,в крайнем случае, отключить кликабельность самих картинок?
ПафНутиЙ
ПафНутиЙ 8 июня 2010 16:20
Спасибо за найденный баг.
Дело в том что тег, формирующий ссылку на полную новость прописан ПОСЛЕ формирования картинки, из-за этого и ошибка.
Для исправления нужно перенести строку:
$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);


Модуль будет обновлён.
Bag9898
Bag9898 8 июня 2010 16:33
сделал как написано выше - помогло , щас все норм .
Спсибо большое :)
ПафНутиЙ
ПафНутиЙ 8 июня 2010 16:41
Всегда пожалуйста.
Не силён я ещё в php smile

P.S.
Кстати, совсем из головы вылетело - если в папку images закинуть картинку с именем nothumb.gif? тогда при отсутствии картинок в новостях будет показываться она.
ПафНутиЙ
ПафНутиЙ 6 июля 2010 00:44
Очередное обновление модуля, изменён способ выбора картинки из короткой новости.
AvanT
AvanT 9 июля 2010 14:35
Помогите пожалуйста вывести дату новость, что-то не выходит, только для первой вышло, для остальных не показывает.
ПафНутиЙ
ПафНутиЙ 9 июля 2010 14:43
Код подключения модуля и стили в студию.
AvanT
AvanT 9 июля 2010 15:49
да я пытался из:
if ($showcomments == '1') {
$comm_n = '('.$row['comm_num'].')';
} else {
$comm_n = '';

так же вывести дату, типо:
if ($date == '1') {
$date = '('.$row['date'].')';
} else {
$date = '';

Я конечно понимаю, что это наверное я херню склепал, т.к. в php не силен, но дата выводится!! вот только для первой новости, остальные идут без даты))
ПафНутиЙ
ПафНутиЙ 10 июля 2010 10:18
В начало, там где дополнительные настройки пишем:
if(!is_numeric($s_date)) $s_date = 1;

после
//--ссылка на новость --

пишем:
if ($s_date == '1') {
$r_date = ('('.$row['date'].')');
} else {
$r_date = '';}

Ну и
'.$comm_n.'

Заменяем в 4х местах на:
'.$comm_n.''.$r_date.'

Собственно, всё. Проверил - дата показывается, осталось только разобраться как настраивать сам показ даты, т.к. она показывается полностью до секунд.
SiriusZ
SiriusZ 13 октября 2010 10:24
Помогите с выводом блока в шаблон , не могу найти где прописать номер блоку , и если два разных блока то как присвоить им разные параметры ? файл r_news всего один
SiriusZ
SiriusZ 13 октября 2010 10:30
и будет работать мод на DLE 9?
SiriusZ
SiriusZ 13 октября 2010 16:27
где строка подключение модуля?
ПафНутиЙ
ПафНутиЙ 13 октября 2010 17:45
Все настройки, строка подключения, а так же используемый по умолчанию стиль для отображения блока находятся в файле модуля, и достаточно хорошо прокомментированы, что значительно облегчит работу с модулем


Под DLE 9 работает.

SiriusZ
SiriusZ 13 октября 2010 18:28
в файле мода , строки настроек
if(!is_numeric($title_length)) $title_length = 30; //Длина заголовка

показаны для примера? (они не работают) зачем они нужны ?.
а здесь работает
{include file="engine/modules/r_news.php?&block_num=1&title_length=50 ......

только не видно мои картинок ( вместо их nothumb.gif) я добавляю url картинок полем
biggy
biggy 13 октября 2010 19:09
Пафнутий, отличный мод! Поставил на сайт с ДЛЕ 9.0 без проблем, но у меня есть небольшая просьба - нужно переделать мод чтобы он таскал картинки не из краткой новости, а из дополнительного поля (я там картинки размещаю) + сделать возможность вывода только картинки, без заголовка или краткой новости. Теоретически я знаю как это сделать: подключить к выборке поле с доп. полями, отключить выборку из краткой новости, но как это реализовать практически?
biggy
biggy 13 октября 2010 19:11
Это параметры по умолчанию и будут применяться именно они, если ты в
{include file="engine/modules/r_news.php?&block_num=1&title_length=50...
не укажешь иного...
biggy
biggy 13 октября 2010 19:14
И ещё хотелось бы попросить тебя сделать "скелет" стиля, который будет выводить контент не в стоблик, а в строчку. Допустим 10 картинок в одну строку, при клике на которую будет открываться полная новость.

Спасибо!
biggy
biggy 13 октября 2010 19:57
c картинками разобрался, заменил просто short_story на xfields в обработке картинок и в
SELECT id, date, title, short_story, comm_num,
добавил выборку по доп. полю:
SELECT id, date, title, short_story, xfields, comm_num,


Осталось заголовки убрать и будет идеально ;)
ПафНутиЙ
ПафНутиЙ 13 октября 2010 20:53
Для вывода ТОЛЬКО картинки-ссылки на новость:
Перед
if ($titleonly == '0') {

вставить
$image_block_i .= '
                 <'.$newswrap.'><a href="'.$full_link.'" title="'.$ttl.'">'.$img_code.'</a></'.$newswrap.'>';


после
$r_news = $image_block_s; }

вставить
if ($titleonly == '4') {
$r_news = $image_block_i; }


при подключении блока добавлять параметр
&titleonly=4


И ещё хотелось бы попросить тебя сделать "скелет" стиля,


в строке подключения добавляешь параметры:
boxwrap=div&newswrap=span&boxclass=custom

в css пишешь:
.custom {margin: 10px 0;}
.custom span {padding: 5px;}

этого хватит вполне.
biggy
biggy 13 октября 2010 21:24
Вот что значит разбираться в верстке, а я уже сделал "топором", в пхп для 4 стиля жестко задал <td ...> </td>, а инклюд окружил в полной новости таблицей и <tr> </tr>.

Сейчас буду менять обратно, огромное спасибо за помощь!
biggy
biggy 13 октября 2010 21:43
Попутно вопрос: вот если поставить случайную выборку, то при каждой загрузке страницы, выборка будет происходить заново, так? Как тогда работает кэширование и работает ли оно вообще в этом случае?
biggy
biggy 13 октября 2010 22:10
Цитата: ПафНутиЙ
в строке подключения добавляешь параметры:
boxwrap=div&newswrap=span&boxclass=custom

в css пишешь:
.custom {margin: 10px 0;}
.custom span {padding: 5px;}

этого хватит вполне.


Добавил, исправил и по прежнему всё идет в столбик :(

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

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

Информация

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