DLE картинки популярных новостей, RSS фидов и Похожих новостей

Уже долгое время передо мной стояла задача максимизировать заинтересованность пользователя контентом.

upload successful

upload successful

ЧТО МЫ ИМЕЕМ?
— Полная новость, на этой-же странице RSS поток с одной из категорий, топ новостей и похожие новости.

ЛЮДЯМ ЛЕНЬ ЧИТАТЬ
— Мало кто будет бегать глазами по куче текста в поисках чего-то интересного.

ЗАДАЧА:
— Нужна картинка рядом с анонсом новости (ссылкой на неё), ведь так гораздо проще найти что-то интересное на сайте.
— Стандартные возможности последних версий DLE частично реализуют такой функционал, но есть одно НО:
движок отдаёт нам картинку такого-же размера, как и в новости. Возникает резонный вопрос: Нафига?
Минусы: разный размер катинок, огромное количество «пустого» трафика.
Плюсы: это работает из коробки.
— Что нужно реализовать: маленький вес «картинки», обезка нестандартных картинок, нужная длина и ширина привью.

РЕШЕНИЕ:
— при разработке модуля VAuth было решено огромное количество вопросов, в том числе и качественная обработка аватарок пользователей из разных социальных сетей. Частью этого кода я и воспользовался для решения этой задачи.

Актулально для свежих версий DLE

  1. Привью для “топа новостей”

1.1 Создаём папку в uploads -> toppics с правами 0777
1.2 Открываем /engine/modules/topnews.php
1.3 Ищем

1
if ( count($images) ) {

1.4 Удяляем всё это условие

1.5 Пишем новое вместо старого:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
if ( count($images) ) {
$i=0;
foreach($images as &$url) {
$i++;
$img_hash = md5($url);
$hash_name = $img_hash . '_topnews_.' .$info['extension'];
$pos = strpos($url, 'http');
if ( !file_exists(ROOT_DIR . '/uploads/toppics/' . $hash_name) ) {
$avatar_size = 160;
$image_name = $hash_name;
$fullpath = ROOT_DIR . '/uploads/toppics/'.$image_name;
@unlink($fullpath);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$rawdata = curl_exec($ch);
curl_close($ch);
$im = imagecreatefromstring($rawdata);
$height = imagesy($im); // Высота
$width = imagesx($im); // Ширина
$width2 = $width;
$x = 0;
$y = 0;
if ($height > $width) {
$ratio2 = $height/$width;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$y = $shift;
$height = $width;
}
if ($width>$height) {
$ratio2 = $width/$height;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$x = $shift;
$width = $height;
}
$im2 = imagecreatetruecolor($avatar_size,$avatar_size);
imagecopyresized($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
imagecopyresampled($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
// delete the original image to save resources
imagedestroy($im);
imagejpeg($im2, $fullpath);
@chmod( $fullpath, 0666 );
// remember to free resources
imagedestroy($im2);
}
$url = '/uploads/toppics/'. $hash_name;
$tpl->copy_template = str_replace( '{image-'.$i.'}', $url, $tpl->copy_template );
$tpl->copy_template = str_replace( '[image-'.$i.']', "", $tpl->copy_template );
$tpl->copy_template = str_replace( '[/image-'.$i.']', "", $tpl->copy_template );
}
}

1.6 Сохраняемся и готово! Вставляем в шаблон топа новостей код {image-1} (1 - значит 1 картинка из новости) и радуемся жизни!) $avatar_size - отвечает за ширину и длину картинки (по умолчанию 160x160px) можно поменять на свой вкус)

В следующих обновлениях этого поста я расскажу как реализовать такую-же штуку в RSS фидах и “похожих новостях” как на jeeraf.ru

  1. Привью для “похожих” новостей

2.1 Создаём папку uploads/relatednews/ с правами 0777
2.2 Открываем /engine/modules/show.full.php
2.3 Ищем:

1
if (stripos ( $tpl2->copy_template, "{image-" ) !== false) {

2.4 Заменяем всё это условие на:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
if (stripos ( $tpl2->copy_template, "{image-" ) !== false) {
$images = array();
preg_match_all('/(img|src)=("|\')[^"\'>]+/i', $related['short_story'], $media);
$data=preg_replace('/(img|src)("|\'|="|=\')(.*)/i',"$3",$media[0]);
foreach($data as $url) {
$info = pathinfo($url);
if (isset($info['extension'])) {
$info['extension'] = strtolower($info['extension']);
if (($info['extension'] == 'jpg') || ($info['extension'] == 'jpeg') || ($info['extension'] == 'gif') || ($info['extension'] == 'png')) array_push($images, $url);
}
}
if ( count($images) ) {
$i=0;
foreach($images as $url) {
$i++;
$img_hash = md5($url);
$hash_name = $img_hash . '_same_.' .$info['extension'];
$file_string = ROOT_DIR . '/uploads/relatednews/' . $hash_name;
if ( !file_exists($file_string) ) {
$avatar_size = 100;
$image_name = $hash_name;
@unlink($file_string);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$rawdata = curl_exec($ch);
curl_close($ch);
$im = imagecreatefromstring($rawdata);
$height = imagesy($im); // Высота
$width = imagesx($im); // Ширина
$width2 = $width;
$x = 0;
$y = 0;
if ($height > $width) {
$ratio2 = $height/$width;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$y = $shift;
$height = $width;
}
if ($width>$height) {
$ratio2 = $width/$height;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$x = $shift;
$width = $height;
}
$im2 = imagecreatetruecolor($avatar_size,$avatar_size);
imagecopyresized($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
imagecopyresampled($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
// delete the original image to save resources
imagedestroy($im);
imagejpeg($im2, $fullpath);
@chmod( $fullpath, 0666 );
// remember to free resources
imagedestroy($im2);
}
$url = '/uploads/relatednews/'. $hash_name;
$tpl2->copy_template = str_replace( '{image-'.$i.'}', $url, $tpl2->copy_template );
$tpl2->copy_template = str_replace( '[image-'.$i.']', "", $tpl2->copy_template );
$tpl2->copy_template = str_replace( '[/image-'.$i.']', "", $tpl2->copy_template );
}
}
$tpl2->copy_template = preg_replace( "#\[image-(.+?)\](.+?)\[/image-(.+?)\]#is", "", $tpl2->copy_template );
$tpl2->copy_template = preg_replace( "#\\{image-(.+?)\\}#i", "{THEME}/dleimages/no_image.jpg", $tpl2->copy_template );
}

2.5 Сохраняемся и готово! Вставляем в шаблон топа новостей код {image-1} (1 - значит 1 картинка из новости) и радуемся жизни!) $avatar_size - отвечает за ширину и длину картинки (по умолчанию 100px) можно поменять на свой вкус)

  1. Привью для отображаемых RSS лент (информеров):

3.1 Создаём папку /uploads/informer с правами 0777
3.2 Открываем /engine/modules/rssinform.php
3.3 Ищем:

1
foreach ( $xml->content as $content ) {

3.4 Ниже вставляем: ($avatar_size - отвечает за размер аватарки)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
$images = array();
preg_match_all('/(img|src)=("|\')[^"\'>]+/i', $content['description'], $media);
$data=preg_replace('/(img|src)("|\'|="|=\')(.*)/i',"$3",$media[0]);
foreach($data as $url) {
$info = pathinfo($url);
if (isset($info['extension'])) {
$info['extension'] = strtolower($info['extension']);
if (($info['extension'] == 'jpg') || ($info['extension'] == 'jpeg') || ($info['extension'] == 'gif') || ($info['extension'] == 'png')) array_push($images, $url);
}
}
if ( count($images) ) {
$i=0;
foreach($images as $url) {
$i++;
$img_hash = md5($url);
$hash_name = $img_hash . '_informer_.' .$info['extension'];
if ( !file_exists(ROOT_DIR . '/uploads/informer/' . $hash_name) ) {
$avatar_size = 160;
$image_name = $hash_name;
$fullpath = ROOT_DIR . '/uploads/informer/'.$image_name;
@unlink($fullpath);
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$rawdata = curl_exec($ch);
curl_close($ch);
$im = imagecreatefromstring($rawdata);
$height = imagesy($im); // Высота
$width = imagesx($im); // Ширина
$width2 = $width;
$x = 0;
$y = 0;
if ($height > $width) {
$ratio2 = $height/$width;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$y = $shift;
$height = $width;
}
if ($width>$height) {
$ratio2 = $width/$height;
$shift = $width2*$ratio2;
$shift = $shift-$width2;
$shift = round($shift/2);
$x = $shift;
$width = $height;
}
$im2 = imagecreatetruecolor($avatar_size,$avatar_size);
imagecopyresized($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
imagecopyresampled($im2,$im,0,0,$x,$y,$avatar_size,$avatar_size,$width,$height);
// delete the original image to save resources
imagedestroy($im);
imagejpeg($im2, $fullpath);
@chmod( $fullpath, 0666 );
// remember to free resources
imagedestroy($im2);
}
$url = '/uploads/informer/'. $hash_name;
$tpl->set( '{image}', $url );
}
} else $tpl->set( '{image}', "{THEME}/dleimages/no_image.jpg" );

3.5 Ищем:

1
$xml->content[$i]['description'] = strip_tags( $xml->content[$i]['description'], "<br>" );

3.6 Заменяем на:

1
$xml->content[$i]['description'] = strip_tags( $xml->content[$i]['description'], "<br><img>" );

3.5 Тег для вывод ссылки на картинку в шаблоне: {image}

3.6 Готово!