» » Хак - расширенный вывод related и custom новостей + картинка

Хак - расширенный вывод related и custom новостей + картинка

27.10
106
37 127
Хак - расширенный вывод related и custom новостей + картинка

Мне много раз встречались разнообразные хаки для расширенного вывода новостей, выводимых тегами {custоm} и {rеlated-news}, но ни один из них не подходил для моих целей на 100%. Поэтому и было решено написать человеческий хак вывода похожих новостей и пользовательского вывода новостей. Основной загвоздкой была обработка картинок, по задумке должны были создаваться уменьшенные копии и складываться в папку на сервере, но моих знаний php никак не хватало на это. В итоге, после активного нагугливания, было найдено несколько вариантов и хаки были готовы. А что получилось - судить вам.

Итак первый представленный хак:

Advanced-Custom



Хак - расширенный вывод related и custom новостей + картинка


Назначение: Вывод новостей с превьюшками и определенным количеством символов в названии и в кратком содержимом через custom

Возможности:
- Вывод обрезанного, до заданного количества символов, заголовка (при установке значения 0 заголовок не обрезается);
- Вывод обрезанного, до заданного количества символов, краткого содержания (при установке значения 0 краткое содержание не обрезается, сохраняется всё форматирование и т.д. в общем как обычно и выводится {sort-story}, при других значениях удаляется всё форматирование, картинки, переносы строки заменяются на пробелы.);
- Вывод уменьшенной, до заданного размера, копии изображения из краткого содержания. Изображение уменьшается и обрезается через crop до квадрата, и сохраняется в папке кеша сайта с префиксом, соответствующим размеру. Таким образом можно вывести одни и те же новости в разных местах с картинками разного размера, а при редактировании или удалении новостей, либо очистке кеша сервер не будет захламляться лишними файлами.
- Вывод, при необходимости, кликабельной превьюшки, увеличивающейся через HightSlide до оригинала.

Установка:

1. Открываем index.php

Находим:

$tpl->copy_template = preg_replace ( "#{custom category=['"](.+?)['"] template=['"](.+?)['"] aviable=['"](.+?)['"] from=['"](.+?)['"] limit=['"](.+?)['"] cache=['"](.+?)['"]}#ies", "custom_print('1', '2', '3', '4', '5', '6', '{$dle_module}')", $tpl->copy_template );

Заменяем на:

$tpl->copy_template = preg_replace ( "#{custom category=['"](.+?)['"] template=['"](.+?)['"] aviable=['"](.+?)['"] from=['"](.+?)['"] limit=['"](.+?)['"] cache=['"](.+?)['"] title=['"](.+?)['"] short=['"](.+?)['"] img_size=['"](.+?)['"]}#ies", "custom_print('1', '2', '3', '4', '5', '6', '7', '8', '9',  '{$dle_module}')", $tpl->copy_template );



2. Открываем engine/modules/functions.php

Находим:

function custom_print($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $do) {


меняем на:

function custom_print($custom_category, $custom_template, $aviable, $custom_from, $custom_limit, $custom_cache, $custom_title, $custom_short, $custom_img_size, $do) {



Находим:

$custom_limit = intval( $custom_limit );


Ниже добавляем:

        $custom_title = intval( $custom_title );
        $custom_short = intval( $custom_short );
        $custom_img_size = intval( $custom_img_size );




Находим:

$custom_cache_id = "cat_" . $custom_category . "template_" . $custom_template . "from_" . $custom_from . "limit_" . $custom_limit;


меняем на:

$custom_cache_id = "cat_" . $custom_category . "template_" . $custom_template . "from_" . $custom_from . "limit_" . $custom_limit . "title_" . $custom_title . "custom_short_" . $custom_short; 



3. Открываем engine/modules/show.custom.php:


Находим:


 // Обработка дополнительных полей
        

        $tpl->set( 'Хак - расширенный вывод related и custom новостей + картинка', stripslashes( $row['title'] ) );



Заменяем на:

     // Обработка дополнительных полей

    if ($custom_title != 0) {
    if (strlen($row['title'])>$custom_title) $row['title'] = substr($row['title'],0,$custom_title)."...";
    } else {$row['title'] = $row['title']; }    
    $tpl->set('Хак - расширенный вывод related и custom новостей + картинка', stripslashes($row['title']));

        //-----Обработка картинок ---
$c_def_img = "{THEME}/images/nothumb.gif"; // - ПУТЬ до картинки по умолчанию, на тот случай если в новости нет картинки.

$custom_count_img = preg_match_all('%(((http://www)|(http://)|(www))[-a-zA-Z0-9@:%_+.~#?&//=]+).(jpg|jpeg|gif|png)%i', $row['short_story'], $custom_img_match);
if ($custom_count_img != ""){

    $custom_img_parts = pathinfo($custom_img_match[0][0]);
    $images = $custom_img_parts['dirname'].'/'.$custom_img_parts['basename'];
    $not_resized_img = $custom_img_parts['dirname'].'/'.$custom_img_parts['basename'];
    
    $c_upload_path = ROOT_DIR."/engine/cache/";
    $image_name = explode ("/",$images);
    $image_name = end ($image_name);
    $image_name = $custom_img_size."_".$image_name;
    
        if (!file_exists($c_upload_path.$image_name)) {
        include_once ENGINE_DIR . '/classes/thumb.class.php';
        $thumb=new thumbnail($images);
        $thumb->crop($custom_img_size,$custom_img_size);
        $thumb->jpeg_quality(85);
        $thumb->save($c_upload_path.$image_name);
        @chmod( $c_upload_path.$image_name, 0666 );
        }
        
    $images = $config['http_home_url']."engine/cache/".$image_name;
    $images = '<img src="'.$images.'" width="'.$custom_img_size.'" height="'.$custom_img_size.'"  border="0" alt="'.$row['title'].'">';
} else {
    $not_resized_img = "{THEME}/images/nothumb.gif";
    $images = '<img src="'.$c_def_img.'" width="'.$custom_img_size.'" height="'.$custom_img_size.'"  border="0" alt="'.$row['title'].'">';
}
$tpl->set( '{image}',$images);
$tpl->set( '[full-img]', "<a href="" . $not_resized_img . ""  onclick="return hs.expand(this)" >" );
$tpl->set( '[/full-img]', "</a>" );
$tpl->set( '{full-img}','<img src="'.$not_resized_img.'" border="0" alt="'.$row['title'].'">' );
    //<-----Обработка картинок ---





Находим:

    $tpl->set( '{short-story}', stripslashes( $row['short_story'] ) );


Заменяем на:

    $row['short_story'] = stripslashes( $row['short_story'] );
    if ($custom_short != 0) {
    $custom_short_story = strip_tags(str_replace(array('<br>','<br />')," ",$row['short_story']));
    if (strlen($custom_short_story)>$custom_short) $custom_short_story = substr($custom_short_story,0,$custom_short)."...";
       }else {$custom_short_story = $row['short_story'];}
    $tpl->set('{short-story}', $custom_short_story);




4. Открываем /engine/cache/.htaccess

Удаляем всё, что там написано и вставляем:

Order Deny,Allow
#Deny from all
<Files *.tmp>
Deny from all
</Files>
<Files ".(jpg|gif|png)$">
Allow from all
</Files>


Это для того, чтобы дать доступ чтения для картинок.


5. Кладём в папку images текущего шаблона картинку nothumb.gif


Для вывода новостей используем:

{custom category="1" template="shortstory" aviable="main" from="0" limit="5" cache="yes" title="30" short="100" img_size="50"}


Указание всех тегов обязательно, иначе будет глюк...

Где:

category, template, aviable, from, limit, cache - это стандартные теги для настройки вывода.
title - обрезка заголовка
short - обрезка краткой новости
img_size - ширина и высота картинки.

title="0" - отключить обрезание заголовка.
short="0" - отключить образание краткого содержимого новости

- Для вывода миниатюры изображения используем тег {image}
- Для вывода оригинала - {full-img}
- Если поставить: [full-img] {image}[/full-img] - будет выводиться кликабельная уменьшенная копия, при клике на HightSlide будет показано оригинальное изображение.

CSS я не буду описывать, так как это сугубо индивидульно для каждого сайта.

ВСЁ! теперь имеем красивый и единообразный пользовательский вывод новостей.





Далее второй хак:

Advanced-Related



Хак - расширенный вывод related и custom новостей + картинка


Назначение: Вывод похожих новостей с превьюшками и определенным количеством символов в названии и в кратком содержимом с настройками в админке.
За основу взят аналогичных хак от DleTweak.ru

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

- Вывод обрезанного, до заданного количества символов, краткого содержания (настраивается в админке);
- Вывод уменьшенной, до заданного размера, копии изображения из краткого содержания. Изображение уменьшается и обрезается через crop до квадрата, и сохраняется в папке кеша сайта с префиксом, соответствующим размеру. Таким образом можно вывести одни и те же новости в разных местах с картинками разного размера, а при редактировании или удалении новостей, либо очистке кеша сервер не будет захламляться лишними файлами. (размер настраивается в админке)


Установка:

Установка:

1. Открыть /engine/inc/options.php

Ищем:

 showRow( $lang['opt_sys_related'], $lang['opt_sys_relatedd'], makeDropDown( array ("1" => $lang['opt_sys_yes'], "0" => $lang['opt_sys_no'] ), "save_con[related_news]", "{$config['related_news']}" ) );


Ниже вставляем:

showRow( $lang['opt_sys_related_n'], $lang['opt_sys_relatedd_n'], "<input class=edit type=text style="text-align: center;" name='save_con[related_news_n]' value="{$config['related_news_n']}" size=5>" );
showRow( $lang['opt_sys_related_img'], $lang['opt_sys_relatedd_img'], "<input class=edit type=text style="text-align: center;" name='save_con[related_img]' value="{$config['related_img']}" size=5>" );



2. Открыть /engine/modules/show.full.php

Ищем:

SELECT id, title, date, category, alt_name, flag FROM


Меняем на:

SELECT id, title, date, category, alt_name, short_story, flag FROM



Ищем:

 $buffer .= "<li><a href="" . $full_link . "">" . stripslashes( $related['title'] ) . "</a></li>";



Меняем на:

    // *************************
    // START MODERN RELATED NEWS
    // *************************
    //-----Обработка картинок --->
    $pictitle = stripslashes( $related['title'] );
    $related_count_img = preg_match_all('%(((http://www)|(http://)|(www))[-a-zA-Z0-9@:%_+.~#?&//=]+).(jpg|jpeg|gif|png)%i', $related['short_story'], $related_img_match);
if ($related_count_img != ""){

    $related_img_parts = pathinfo($related_img_match[0][0]);
    $related_images = $related_img_parts['dirname'].'/'.$related_img_parts['basename'];
    $not_resized_img = $related_img_parts['dirname'].'/'.$related_img_parts['basename'];
    
    $related_upload_path = ROOT_DIR."/engine/cache/";
    $rel_image_name = explode ("/",$related_images);
    $rel_image_name = end ($rel_image_name);
    $rel_image_name = $config['related_img']."_".$rel_image_name;
    
        if (!file_exists($related_upload_path.$rel_image_name)) {
        include_once ENGINE_DIR . '/classes/thumb.class.php';
        $thumb=new thumbnail($related_images);
        $thumb->crop($config['related_img'],$config['related_img']);
        $thumb->jpeg_quality(85);
        $thumb->save($related_upload_path.$rel_image_name);
        @chmod( $related_upload_path.$rel_image_name, 0666 );
        }
        
    $related_images = $config['http_home_url']."engine/cache/".$rel_image_name;
    $related_images = '<img src="'.$related_images.'" width="'.$config['related_img'].'" height="'.$config['related_img'].'"  border="0" alt="'.$row['title'].'">';
} else {
    $not_resized_img = "{THEME}/images/nothumb.gif";
    $related_images = '<img src="{THEME}/images/nothumb.gif" width="'.$config['related_img'].'" height="'.$config['related_img'].'"  border="0" alt="'.$row['title'].'">';
}
    //<-----Обработка картинок ---
            
    $related['short_story'] = preg_replace("/[attachment=[[:digit:]]*]/si","",stripslashes($related['short_story']));
    $related['short_story'] = preg_replace("/<!--*-->/si","",$related['short_story']);
    $related['short_story'] = strip_tags(str_replace(array('<br>','<br />')," ",$related['short_story'])); //-- замена переносов на пробелы --
    if( strlen( $related['short_story'] ) > $config['related_news_n'] ) $related['short_story'] = substr( $related['short_story'], 0, $config['related_news_n'] ) . " ..."; //--обрезка содержания --
    
    // -- вывод блока -->
    $buffer .='
        <div class="related_block">
        <a href="'.$full_link.'" title="'.$pictitle.'">'.$pictitle.'</a>
        <div class="related_image" style="width:'.$config['related_img'].'; height:'.$config['related_img'].';">'.$related_images.'</div>
        <div class="related_descript">'.stripslashes($related['short_story']).'</div>
        <div class="clr"></div>
        </div>';
    // <-- вывод блока --

    // *************************
    // END MODERN RELATED NEWS
    // *************************



3. Открыть /language/Russian/adminpanel.lng

В любое удобное место вставляем:

'opt_sys_related_n' => "Обрезание описания",
'opt_sys_relatedd_n' => "Количество символов в описании к похожей новости.",
'opt_sys_related_img' => "Размер изображения",
'opt_sys_relatedd_img' => "Масимальный размер бОльшей стороны изображения в похожей новости.",



4. Кладём в папку {THEME}/images/ файл nothumb.gif желаемого размера.


5. Настраиваем вывод в админке.

Настройка обрезания содержания и размера картинки производится в админке, в разделе Настройка системы -> Оптимизация запросов к базе данных.


Вывод блока осуществляется тегом {related-news} без всяких
    .

    Вот и всё. Теперь имеем удобный вид похожих новостей.



    Приятной работы!



    P.S.
    Стоит обратить внимание на то, что если например и для похожих новостей и для custom установлен одинаковый размер картинки, то одна и та же картинка будет показываться и в похожей новости и в custom-новости, естественно при совпадении id новости smile это немного уменьшает "захламлённость" сервера. Так же при очистке кеша все превьюшки будут удалены.

    Конструктивные предложения как всегда принимаются с радостью.

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

Комментарии

ПафНутиЙ
ПафНутиЙ 25 марта 2011 18:08
это лучше делать отдельным модулем, либо хаком, advanced-custom вам не поможет
ManHunter
ManHunter 3 апреля 2011 14:36
Тем у кого вылазит Not Supported File! Thumbnails can only be made from .jpg, gif and .png images! , нужно проверить адрес изображения в новости, т.к. это сообщение вылазит когда ссылка на изображение есть, а при переходе к нему по данной ссылке оказывается, что оно отсутствует на сервере. Это самая распространённая ошибка.
ПафНутиЙ
ПафНутиЙ 4 апреля 2011 14:47
ManHunter,
не всегда, ещё так происходит, если ссылка ведёт на внешний сайт, или формат не тот... в общем глюков хватает :)
blazer-05
blazer-05 24 июня 2011 17:56
Админ у меня проблема с хаком второй версией. Все сделал как написано в инструкции, но не выводятся картинки? Новости выводятся как положено а картинки нет, только отображается этот файлик nothumb.gif и все.
Помогите плиз.
ПафНутиЙ
ПафНутиЙ 24 июня 2011 22:21
ссылку на сайт дайте.
blazer-05
blazer-05 25 июня 2011 09:22
Вот http://teachlessons.ru/ посмотрите в полной новости. Наверно по такой же проблеме и не выводится в блоке "Случайная новость" картинка?
fortune
fortune 25 июня 2011 13:30
Цитата: ManHunter
Тем у кого вылазит Not Supported File! Thumbnails can only be made from .jpg, gif and .png images! , нужно проверить адрес изображения в новости, т.к. это сообщение вылазит когда ссылка на изображение есть, а при переходе к нему по данной ссылке оказывается, что оно отсутствует на сервере. Это самая распространённая ошибка.

Еще проще убить своего хостера! Проверьте логи сервера, какую ошибку дает? Мне помогло, добился от хостера, чтоб тот включил модуль PHP по умолчанию не включеный, к примеру не установлена библиотека GD2, а в моем случае еще и буферизация на серве гнала, тамбнейлзы в папке CACHE не создавались!А вообще погуглите, там все есть, кому нагиб хостера помогает, а кому просто в htaccess файл пару строчек добавить, проверьте все права на каталоги и файлы!
ПафНутиЙ! Благодарю за модуль! Прямо кстати пришелся! Ставил на ДЛЕ 9.3!
blazer-05
blazer-05 25 июня 2011 14:01
В моем случае у меня коммерческого хостинга нет. У меня сайты расположены на моем компьютере и по умолчанию в настройках апача и рнр5 все разрешено. На другом моем сайте который тоже на DLE 9.3 данный модуль работает без проблем и остальные модуля тоже прекрасно работают. А вот на последнем сайте что-то не получается с картинками, но почему они не хотят работать не могу понять?
ПафНутиЙ
ПафНутиЙ 25 июня 2011 20:05
Если адрес картинки не совпадает с адресом сайта (т.е. картинка лежит на удалённом сайте) модуль будет выдавать такую ошибку.
blazer-05
blazer-05 25 июня 2011 20:47
Нет, картинка загружена на сайт при создании новости в админке DLE
ПафНутиЙ
ПафНутиЙ 25 июня 2011 21:16
значит это тёмные силы электричества smile
blazer-05
blazer-05 25 июня 2011 21:20
Кстатии ошибка в моем случае вообще не пишется просто пустое место т.е. выводится заглушка "картинка отсутствует"
aligon
aligon 25 июля 2011 11:23
Простите, я не понял, так вводит картинки для 2-ой версии хака из дополнительного поля?
ПафНутиЙ
ПафНутиЙ 29 июля 2011 07:05
Простмте, я не понял того, что вы не поняли. smile
denson
denson 15 августа 2011 13:35
День добрый, ПафНутий!
Меня интересует вопрос по CSS.
Как мне вывести похожие новости в аналогичном вашему блоке, т.е. картинка слева, а текст справа... название сверху?
У меня выходит сплошняком(
http://img23.binimage.org/56/49/12/1234567.jpg
ПафНутиЙ
ПафНутиЙ 15 августа 2011 13:52
поставьте блоку с картинкой в css правило float: left;
denson
denson 15 августа 2011 13:55
Да я пробовал... не могу понять где в css это строка за картинку отвечающая(
ПафНутиЙ
ПафНутиЙ 15 августа 2011 13:56
код блока дайте
denson
denson 15 августа 2011 14:00
это в fullstory.tpl:
[related-news]<div style="padding-top: 12px;" class="copy"><h2>Похожие новости:</h2></div> <div class="copy">{related-news}</div>[/related-news]

а это в css:

.copy {font: 8pt Tahoma; color:#4c4c4c;}
.copy a {color:#4c4c4c; text-decoration: underline;}
.copy a:hover {color:#4c4c4c; text-decoration: none;}
ПафНутиЙ
ПафНутиЙ 15 августа 2011 14:42
дайте код, который генерируется в браузере, это не то. А ещё лучше ссылку на сайт.
denson
denson 15 августа 2011 14:44
ссылка http://dislink.ru/
ПафНутиЙ
ПафНутиЙ 15 августа 2011 15:06
В css-файл добавить:
.related_image{float:left; padding-right: 10px;}
.clr {height:0;clear:both;overflow:hidden;
denson
denson 15 августа 2011 15:11
Спасибо огромное, ПафНутий за доброту и содействие!!! Всё встало на свои места. Единственное только отступа нет между похожими новостями.
ПафНутиЙ
ПафНутиЙ 15 августа 2011 15:12
.related_block {margin-bottom: 10px;}
denson
denson 15 августа 2011 15:21
Огромное спасибо, ПафНутиЙ! Всё ровно. Буду пробовать прописать аккурат еще и для вывода ТОП-5 в блоке справа, а то и там что-то местами неровно и слитно.
denson
denson 15 августа 2011 15:24
Огромное спасибо, ПафНутиЙ! Всё ровно отображается. Попробую по аналогии сделать аккуратно в блоке справа при выводе ТОП-5.
ПафНутиЙ
ПафНутиЙ 15 августа 2011 15:56
denson,
Дерево коментов сожрало ветку wink
denson
denson 15 августа 2011 16:00
Сильно сожрало? wink Я ставил ставил... так добром и не поставил?)
ПафНутиЙ
ПафНутиЙ 15 августа 2011 16:28
Нет, не очень, 2 коммента ваших.
А ставили вы не то дерево, вот это дерево работает, и отлично, в отличии от аналогов (в т.ч. тот, что стоит сейчас на этом сайте) на parent_id
denson
denson 15 августа 2011 16:34
У меня стоит Дерево комментариев, но я особо не проверял. Так работает вроде no

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

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

Информация

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