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

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

27.10
106
39 509
Хак - расширенный вывод 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 это немного уменьшает "захламлённость" сервера. Так же при очистке кеша все превьюшки будут удалены.

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

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

Комментарии

Marille
Marille 27 октября 2010 18:26
Какой вы невозможный умница request

Подскажите, пожалуйста, а если картинку нужно забирать из дополнительного поля со стороннего хостинга - достаточно будет прописать дополнительные поля, как в Блоке случайных новостей? И какое значение нужно задать, чтобы выводились только картинки, без заголовков и описания. Спасибо.
ПафНутиЙ
ПафНутиЙ 27 октября 2010 19:14
Для вывода новостей через {custоm} достаточно в шаблоне, указанном в строке подключении убрать всё кроме тега {image}.
Для похожих новостей заменяем:
<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>';

например на:
<div class="related_block">
        <div class="related_image" style="width:'.$config['related_img'].'; height:'.$config['related_img'].';">'.$related_images.'</div>
        </div>';


и для уменьшения нагрузки убрать всё что написано между
//<-----Обработка картинок ---
и
// -- вывод блока -->
т.е. вывод и обрезание краткого содержания.

и будут одни картинки.

по выводу из доп полей пока не готов сказать.
despjke
despjke 3 ноября 2010 04:30
не думаю, что создовать уменьшенные картинки это хорошая идея
ПафНутиЙ
ПафНутиЙ 3 ноября 2010 06:52
интересно, чем аргументировано такое мнение?
despjke
despjke 3 ноября 2010 15:34
ну посуди сам, занимает место, жрет ресурсы системы на создание уменьшенных копий изображений, а как я понял после очистки кэша проподут и снова надо будет создовать, таким образом или сервак не будет успевать создоват их т.е thumbы и выдаст страницу без картинок(так у меня и окозалось), или же будет очень долго грузиться, лучче зделать просто брать изображения но выводить в уменьшенном ввиде по средстов ксс
ПафНутиЙ
ПафНутиЙ 3 ноября 2010 20:25
жрет ресурсы системы

это проблемы админа smile жмущего $$ за нормальный хостинг. А ресурсов отжирается не так уж много, сам посуди - пусть даже выводится 30 новостей, в чём я лично сомневаюсь, картинки уходят в кеш при первом вызове этих новостей, и далее вызываются 30 картинок из кеша по 2-3px вместо 30 картинок (пусть дяже они небольшие) по 40-250px, и где после этого жрутся ресурсы?
despjke
despjke 3 ноября 2010 20:39
ты меня не понял, у меня хостинг бесплатный т.е в локалке, от провайдера инета собственно (я там сам работаю), поэтому я не жмусь ни в каких$$ я хотел сказать почему бы просто не брать картинки с постов на прямую и не уменьшать их задавая определенную высоту и ширину, а не делать дупликаты картинок
despjke
despjke 3 ноября 2010 20:44
какой бы ни был сервер, хороший админ понимает, что без оптимизации и правильного использования ресурсов системы будет очень тяжело железу работать стабильно и без ошибок
ПафНутиЙ
ПафНутиЙ 4 ноября 2010 00:25
я же ответил уже.
включи калькулятор и посчитай, сколько уйдёт ресурсов, если 2000 раз загрузить 30 картинок по 100кб. и если 1999 раз загрузить 30 картинок по 3 кб плюс один раз 30 картинок уменьшить до этого размера.
despjke
despjke 4 ноября 2010 04:46
но ведь при очистке кэша они удаляются ?
ПафНутиЙ
ПафНутиЙ 4 ноября 2010 05:42
а что мешает назначить другую папку? в кеш картинки складываются просто для того, чтобы не захламлять сервак. но можно положить их в любую папку и например удалять раз в неделю-месяц....
despjke
despjke 4 ноября 2010 07:25
ну тогда целесообразней не удалять их =) ну не будем тут спорить как школяры ... это не имеет никакого смысла, к стати у меня к те вопрос оффтоп, но все же ты пробовал выдернуть с вконтактов файл wall.js ? т.е ее то взять легко, а применить например в том же модуле графити, чтоб было как вконтакте красивое окошко с рисовалкой ато графити каторое есть для дле открывается на отдельной странице и воопше не красиво выглядит=( я пробывал, но ничего путного из этого пока не вышло там очень много функций все привязано к id и тд было бы хорошо если ты разбераешься в нем и как то мог бы код почистить
ПафНутиЙ
ПафНутиЙ 6 ноября 2010 17:05
нет, не пробовал и не собираюсь - не вижу смысла..
Kim
Kim 7 января 2011 20:06
Подскажите пожалуйста как сделать, чтобы похожие новости отображались в две колонки? В сети есть информация, но только к хаку который выводит публикации без картинок...

И ещё, если не трудно, скажите пожалуйста, как сделать превьюшку кликабельной, т.е. ссылкой.

Благодарю.
ПафНутиЙ
ПафНутиЙ 7 января 2011 23:46
Цитата: Kim
Подскажите пожалуйста как сделать, чтобы похожие новости отображались в две колонки?

через CSS (float:left; и width)
Цитата: Kim
И ещё, если не трудно, скажите пожалуйста, как сделать превьюшку кликабельной, т.е. ссылкой.

переписать скрипт заново, но я этого не буду делать.
Kim
Kim 8 января 2011 00:00
Цитата: ПафНутиЙ
переписать скрипт заново, но я этого не буду делать.


С кликабельностью уже справились.
А вот по поводу двух колонок... нельзя ли немного подробнее?
ПафНутиЙ
ПафНутиЙ 8 января 2011 00:21
На основе этой статьи можно реализовать, принцип тот же.
ВладимирВВ1
ВладимирВВ1 15 января 2011 21:39
в хаке новые материалы у меня выводятся только на гл. стр. Как я понимаю это из-за тега aviable="main" в котором прописывается раздел вывода. Вопрос: как сделать так чтобы они выводились во всех разделах? или в разделах по выбору?
ПафНутиЙ
ПафНутиЙ 16 января 2011 16:27
Вывод чего либо на разных страницах описан в документации _http://dle-news.ru/extras/online/startnews.html
ManHunter
ManHunter 4 февраля 2011 18:16
ПафНутиЙ,
А возможно ли реализовать уменьшение картинки по одной стороне (ширине или длине)?
Дело в том, что квадратная картинка не пишется в дизайн.
ПафНутиЙ
ПафНутиЙ 6 февраля 2011 10:34
да, возможно.
RiMLiN
RiMLiN 7 февраля 2011 14:14
А как сделать что бы эти новости были лишь для определенной категории?например [releated] - обычный,а [releated2] уже как написано в статье?
ПафНутиЙ
ПафНутиЙ 7 февраля 2011 14:51
ну это я не скажу, может быть стоит продублировать функцию вывода похожих новостей с разными тегами и выводить эти теги через [aviable=
RiMLiN
RiMLiN 7 февраля 2011 18:30
Можно поподробнее как это осуществить?
ПафНутиЙ
ПафНутиЙ 7 февраля 2011 18:31
я a php не силён, подробнее не скажу.
AutoLeX
AutoLeX 11 февраля 2011 17:30
Подскажите, у меня при использовании хака {custоm} выдает ошибки Not Supported File! Thumbnails can only be made from .jpg, gif and .png images!, как можно это исправить, повидимому у меня не стоят какие то библиотеки, поэтому не обрабатываются картинки. Или что то я не так сделал. Помогите решить проблему.
ПафНутиЙ
ПафНутиЙ 11 февраля 2011 19:12
Если честно - хз, у многих эта ошибка вылазиет, я не знаю решения этой гадости.....
да и вообще неудачный хак получился... если не работает - снесите его нафиг.
kekc
kekc 17 марта 2011 05:51
ПафНутиЙ,
Подскажите как реализовать, вывод новостей в две колонки в определенной категории?

уже крыша едет не могу воткнуть :crazy:
ПафНутиЙ
ПафНутиЙ 17 марта 2011 06:39
http://pafnuty.name/statyi/72-vyvod-novostej-v-2-kolonki-jquery-edition.html
только jquery-код взять в тег [category=1,2,3]...[/category] и всё.
NewsMaker777
NewsMaker777 25 марта 2011 14:53
Подскажите плз, как сделать блок похожих новостей, чтобы они выводились по шаблону как и в краткой новости + картинка из доп.поля
например http://u.to/eNLY внизу, где "Также рекомендуем посмотреть".Как их сделать в две калонки я знаю
З.Ы. Ставил advanced-custom на dle 9.2 не работает.

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

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

Информация

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