Делаем картинки для RSS в блогах

+23
2.6K
Иллюстрация
В продолжении темы про вывод картинок… Меня попросили сделать для RSS вывод картинки в блогах. Ну так что давайте сделаем.

Главная особенность rss2.0 что картинка должна быть в теге <enclosure, указывать вес картинки и формат картинки.

поэтому тут одной строчкой нам не обойтись.

открываем файл components/blogs/prss.php (именно файл prss.php в каждом компоненте отвечает за формирование RSS.)
и видим что там нет такого тега.

Поэтому берем и меняем ваше содержание файла на этот:
  1.  
  2. <?php
  3. if(!defined('VALID_CMS')) { die('ACCESS DENIED'); }
  4.  
  5. function rss_blogs($item_id, $cfg){
  6.  
  7. $inDB = cmsDatabase::getInstance();
  8.  
  9. global $_LANG;
  10.  
  11. cmsCore::loadModel('blogs');
  12. $model = new cms_model_blogs();
  13.  
  14. if(!$model->config['component_enabled']) { return false; }
  15.  
  16. cmsCore::loadClass('blog');
  17. $inBlog = cmsBlogs::getInstance();
  18. $inBlog->owner = 'user';
  19.  
  20. $channel = array();
  21. $items = array();
  22.  
  23. // Формируем канал
  24. if ($item_id){
  25.  
  26. $blog = $inBlog->getBlog($item_id);
  27. if (!$blog) { return false; }
  28.  
  29. //Если доступа к блогу нет, возвращаемся
  30. if (!cmsUser::checkUserContentAccess($blog['allow_who'], $blog['user_id'])){
  31. return false;
  32. }
  33.  
  34. $inBlog->whereBlogIs($blog['id']);
  35.  
  36. $channel['title'] = $blog['title'];
  37. $channel['description'] = $_LANG['NEW_POSTS_IN_BLOGS'];
  38. $channel['link'] = HOST . $model->getBlogURL($blog['seolink']);
  39.  
  40. } else {
  41.  
  42. $channel['title'] = $_LANG['NEW_POSTS_IN_BLOGS'];
  43. $channel['description'] = $_LANG['NEW_POSTS_IN_BLOGS'];
  44. $channel['link'] = HOST . '/blogs';
  45.  
  46. }
  47.  
  48. // В RSS всегда только публичные посты
  49. $inBlog->whereOnlyPublic();
  50.  
  51. $inDB->orderBy('p.pubdate', 'DESC');
  52.  
  53. $inDB->limit($cfg['maxitems']);
  54.  
  55. $posts = $inBlog->getPosts(false, $model, true);
  56.  
  57. if($posts){
  58. $i=0;
  59. foreach($posts as $post){
  60. //print_r($posts);
  61. preg_match_all("/\[IMG\](.*?)\[\/IMG\]/",$posts[$i]['content'],$imagefirst); //ищем первую картинку она будет в $imagefirst[1][0]
  62. if($imagefirst[1][0]==''){
  63. preg_match_all("/\[img\](.*?)\[\/img\]/",$posts[$i]['content'],$imagefirst); //ищем первую картинку она будет в $imagefirst[1][0]
  64. }
  65.  
  66.  
  67. //print_r($imagefirst);
  68. $post['link'] = HOST . $post['url'];
  69. $post['description'] = mb_substr(strip_tags($post['content_html']), 0, 350). '...';
  70. $post['comments'] = $post['link'].'#c';
  71. $post['category'] = $post['blog_title'];
  72.  
  73. $post['size'] = round(filesize(PATH.''.$imagefirst[1][0]));
  74. $post['image'] = HOST . ''.$imagefirst[1][0];
  75. $items[] = $post;
  76. $i++;
  77. }
  78. }
  79.  
  80. return array('channel' => $channel,
  81. 'items' => $items);
  82.  
  83. }
  84. ?>
  85.  
  86.  
Для тех кому интересно разобраться поясню.

Мы проверяем переменную $posts[$i]['content'], где $i это элемент массива content.

в данной переменной мы ищем теги IMG, если не находим то наша переменная $imagefirst[1][0] получается пустая, значит сделаем проверку на тег в нижнем регистре img.

в итоге получаем код
  1.  
  2. preg_match_all("/\[IMG\](.*?)\[\/IMG\]/",$posts[$i]['content'],$imagefirst); //ищем первую картинку она будет в $imagefirst[1][0]
  3. if($imagefirst[1][0]==''){
  4. preg_match_all("/\[img\](.*?)\[\/img\]/",$posts[$i]['content'],$imagefirst); //ищем первую картинку она будет в $imagefirst[1][0]
  5. }
  6.  
  7.  
Важно, почему я $i приравнял к нулю. потому как элементы массива начинаются с 0.

Если есть вопросы, пожелания то прошу коментить=)

тестировалось на 1.10.1 и 1.10.2
а так для любой версии адаптировать можно.
-1
Def Def 11 лет назад #
Для какой версии системы?
0
Ruchechnik Ruchechnik 11 лет назад #
это я попросил подпилить joke спасибо еще раз , что помог реализовать;)
0
Таня Таня 10 лет назад #
Подскажите как для 1.9 адаптировать?
0
Helg Helg 10 лет назад #
Можно адаптировать под 1.10.3 ? И еще такой момент, при отсутствии картинки в посте уменя заместо ссылки на картинку указывает ссылку на главную страницу, можно и это тоже исправить?
0
kirkr kirkr 10 лет назад #
А что у вас не получилось? 1.10.3 тоже будет работать. Если картинки нет, то используйте условие:
Код PHP:
  1. if($imagefirst[1][0]==''){
  2. $post['size']=размерузаглушки;
  3. $post['image'] =картинка заглушки
  4. }else{
  5. $post['size'] = round(filesize(PATH.''.$imagefirst[1][0]));
  6. $post['image'] = HOST . ''.$imagefirst[1][0];
  7. }
0
Helg Helg 10 лет назад #
У меня заработал вот этот вариант http://instantcms.ru/blogs/kollektivnyi-razum/chtob-facebook-horosho-ponimal-chast2-blogi.html#comment_61183

В какое место условие вставить? А если вообще без заглушки, т.е. есть картинка выводим, нет - не выводим..
0
ValeraK ValeraK 10 лет назад #
А как правильно оформить без картинки?
Код PHP:
  1. $post['size']=размерузаглушки;
  2. $post['image'] =картинка заглушки
Делаю так исправьте пожалуйста если не совсем верно
Код PHP:
  1. $post['size']=200х200;
  2. $post['image'] =HOST . 'images/photos/no_article.jpg'.;
0
ValeraK ValeraK 10 лет назад #
Сделал заработало
Код PHP:
  1. $post['size']=round(filesize(PATH.'/images/photos/no_image.jpg'));
  2. $post['image'] =HOST . '/images/photos/no_image.jpg';
)

Еще от автора

Политика безопасности и соглашение
Много споров было что в текст публиковать.
Google & Yandex баннеры в компоненты Banners
Добрый день! Была поставлена задача добавить возможность выводить через позиции {Баннер=номер позиции} баннеры гугла и яндекса.
Готовим сервер VDS Nginx + php7.0-fpm +MySQL для Inst2
Добрый день! Данная записка более чем напоминание о том, что не забыть при установке и настройке VDS Nginx + php7.0-fpm +MySQL для Inst2.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.