Закрыть
Загрузка данных
Логин:   Пароль:      
Регистрация   Забыли пароль?

Важные объявления:

Призовой фонд bigstreet




Что такое призовой фонд скрипта социальных сетей bigstreet - это фонд который позволит спонсировать лучшие разработки на основе bigstreeta они могут быть как модули, дополнения, так и дизайн, шаблоны, моды и хаки. Чем больше соберем призового фонда - тем быстрее будет продвигатся разработка, так как желающие что-то сделать полезное всегда найдутся.

Фонд помощи разработчикам bigstreet

+ 500 рублей

15 горячих:


Сообщество

Opensource

Нестандартные модули, блоки, шаблоны и собственные сборки BigStreet.

Публикации   Пользователи   RSS
Закрыть
Загрузить:
Указать:
Выравнивание:    Копирайт:
Альт
Цвет шрифта Закрыть
Белый Розовый Серебряный Оливковый Красно-коричневый Лимонный Зеленый Темно-синий Желтый Красный Серый Фиолетовый Водный Зеленовато-голубой Голубой
Выделить маркером Закрыть
Розовый Серебряный Оливковый Красно-коричневый Лимонный Зеленый Темно-синий Желтый Красный Серый Фиолетовый Водный Зеленовато-голубой Голубой Черный
Смайлики ;) Закрыть
Улыбка Нахмуриться Подмигивание Язык Смех Смущение Нерешительность Сюрприз Поцелуй Вопль Класс Денежки Ошибся Невинность Плач Рот на замке

RSS для комментариев в топиках и прямом эфире

Долгое время досадовал я на то, что никто на Большой улице пока еще не прицепил RSS на комментарии.
Хотелось такую штуку достаточно давно, причем, как для модуля Эфир, так и для комментариев в топиках.
Недавно припекло и решил взяться за дело сам…
Пришлось немного поднапрячься (т.к. php вообще-то не мой конёк), но лишь немного, благодаря тому, что в исходниках модуля BLOG уже есть пример реализации RSS. Нужно было просто дописать кое-что по аналогии с существующим вариантом. Результат не расстроил. Потому, не смотря на то, что времени на постописательство сейчас совершенно нет, решил запостить план действий для того, кто захочет сделать подобное на своем сайте.
Надеюсь, пост окажется полезным.


RSS для модуля Эфир

1. В папке modules/onair/ создаем файл rss.action.php следующего содержания:

  1.  
  2. <?php
  3.  
  4. require_once('system/mappers/comments.mysql.mapper.php');
  5. $oCommentsMapper = new Comments_MySQLMapper(System_Database::getInstance('site'));
  6. System_Essences::getEssence('Comments');
  7.  
  8. $rights = (string)((int)$oSession->isModeratorStatus() . (int)$oSession->isAdministratorStatus());
  9.  
  10. if (false === ($aCommentsRes = System_Cacher::Get("all_comments_rss_{$rights}"))) {
  11.                         if ($aCommentsRes = $oCommentsMapper->getCollectionOnAir(1, 15, $oSession)) {
  12.                                 System_Cacher::Set($aCommentsRes, "all_comments_rss_{$rights}", array(), 3600);
  13.                         }
  14. }
  15.  
  16. if (isset($aCommentsRes) and !empty($aCommentsRes['aCollection']))
  17. {
  18.         $oLastComment = array_pop($aCommentsRes['aCollection']);
  19.         array_push($aCommentsRes['aCollection'], $oLastComment);
  20.         $lastmodified = $oLastComment->getAdded();
  21.        
  22.         $aCollection = array();
  23.         foreach ($aCommentsRes['aCollection'] AS $oComment)
  24.         {
  25.                 $oComment->setAdded(date("D, d M Y H:i:s", strtotime($oComment->getAdded())).' +0300');
  26.                 $last_build_date = $oComment->getAdded();
  27.                 array_push($aCollection, $oComment);
  28.         }
  29.         $oSmarty->assign('aComments', $aCommentsRes['aCollection']);
  30.         $oSmarty->assign('last_build_date', $last_build_date);
  31. }
  32. header('Content-Type: application/rss+xml; charset=UTF-8');
  33. header('Content-Type: text/xml; charset=UTF-8');
  34.  
  35. ?>
  36.  



2. В папке modules/onair/templates/ создаем файл rss.tpl:

  1.  
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  4. <channel>
  5.  
  6.         <title>Эфир сайта {$oSettings->getMetaTitle()}</title>
  7.         <link>{$oRouter->getPathWeb()}/onair/rss/</link>
  8.         <atom:link href="{$oRouter->getPathWeb()}/onair/rss/" rel="self" type="application/rss+xml" />
  9.         <language>ru</language>
  10.         <description><![CDATA[{$oSettings->getMetaDescription()}]]></description>
  11.         <managingEditor>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</managingEditor>
  12.         <webMaster>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</webMaster>
  13.         <copyright>{$oRouter->getPathWeb()}</copyright>
  14.         <lastBuildDate>{$last_build_date}</lastBuildDate>
  15.         <generator>{$oRouter->getPathWeb()}</generator>
  16.         <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  17.  
  18.         {foreach item=oComment from=$aComments}
  19.         <item>
  20.         <title>{$oComment->getEssenceTitle()}</title>
  21.         <link>{$oRouter->getPathWeb()}/blog/topic/{$oComment->getEssenceId()}/#comment_{$oComment->getId()}</link>
  22.         <description><![CDATA[<b>{$oComment->getAuthorLogin()}:</b> {$oStringsTool->unparseText($oComment->getText())}]]></description>
  23.         <pubDate>{$oComment->getAdded()}</pubDate>
  24.         <guid isPermaLink="true">{$oRouter->getPathWeb()}/blog/topic/{$oComment->getEssenceId()}/#comment_{$oComment->getId()}</guid>
  25.         </item>
  26.         {/foreach}
  27.  
  28. </channel>
  29. </rss>
  30.  


RSS поток эфира будет отдаваться по адресу:
  1.  
  2. http://domain.ru/onair/rss
  3.  

Теперь пишем ссылку на канал в любом месте шаблона — и все готово.


RSS для комментариев в топиках

Очень полезная фича для тех, кто не зарегистрирован или не отвечал в топике, но, тем не менее, считает топик интересным и желает следить за комментариями конкретно этого топика.

1. Редактируем modules/blog/rss.action.php:

После строк:
  1.  
  2.                                 $oSmarty->assign('oUser', $oUser);
  3.                         }                      
  4.                        
  5.                 }
  6.         break;
  7.  


и перед:
  1.  
  2. default:
  3.                 if (false === ($aTopicsRes = System_Cacher::Get("approved_topics_rss_{$rights}"))) {
  4.                         if ($aTopicsRes = $oTopicsMapper->getCollectionLast(1, 7, $oSession)) {
  5.                                 System_Cacher::Set($aTopicsRes, "approved_topics_rss_{$rights}", array(), 1800);
  6.                         }
  7.                 }
  8.  


нужно вставить:
  1.  
  2. // rss-комментарии к топику
  3.  
  4.         case('topic'):
  5.  
  6.                         $oTopic = null;
  7.                        
  8.                         if (false === ($oTopic = System_Cacher::Get("topic_by_id_".System_Router::getParam(1)))) {
  9.                                 if ($oTopic = $oTopicsMapper->findById(System_Router::getParam(1))) {
  10.                                         System_Cacher::Set($oTopic, "topic_by_id_".System_Router::getParam(1), array(), 3600);
  11.                                 }
  12.                         }
  13.  
  14.                 $oSmarty->assign('oTopic', $oTopic);
  15.                        
  16.                                 if (!$oTopic)
  17.                                 {
  18.                                         new System_Error('Запрошенная страница не найдена.');
  19.                                         System_Router::setCurrentModule('errors');
  20.                                         System_Router::setCurrentAction('404');
  21.                                 }else{
  22.                                
  23.                 require_once 'system/essences/comments.essence.php';
  24.                 require_once('system/mappers/comments.mysql.mapper.php');
  25.                 $oCommentsMapper = new Comments_MySQLMapper(System_Database::getInstance('site'));
  26.                                
  27.                                 if (false === ($aCommentsRes = System_Cacher::Get("topic_comments_rss_{$oTopic->getId()}_{$rights}"))) {
  28.  
  29.                                         if ($aCommentsRes = $oCommentsMapper->getCollectionByTopic($oTopic, 1, 10, $oSession)) {
  30.                                                 System_Cacher::Set($aCommentsRes, "topic_comments_rss_{$oTopic->getId()}_{$rights}", array(), 3600);
  31.                                        
  32.                                         }
  33.                                 }
  34.  
  35.                         if (isset($aCommentsRes)) {
  36.                         $oSmarty->assign('aComments', $aCommentsRes['aCollection']);
  37.                         }
  38.                 }                      
  39.                        
  40.         break;
  41.  
  42. // rss-комментарии к топику
  43.  


Далее перед
  1.  
  2. header('Content-Type: application/rss+xml; charset=UTF-8');
  3. header('Content-Type: text/xml; charset=UTF-8');
  4.  


добавляем:
  1.  
  2. // rss-комментарии к топику
  3.  
  4. if (isset($aCommentsRes) and !empty($aCommentsRes['aCollection']))
  5. {
  6.         $oLastComment = array_pop($aCommentsRes['aCollection']);
  7.         array_push($aCommentsRes['aCollection'], $oLastComment);
  8.         $lastmodified = $oLastComment->getAdded();
  9.        
  10.         $aCollection = array();
  11.         foreach ($aCommentsRes['aCollection'] AS $oComment)
  12.         {
  13.                 $oComment->setAdded(date("D, d M Y H:i:s", strtotime($oComment->getAdded())).' +0300');
  14.                 $last_build_date = $oComment->getAdded();
  15.                 array_push($aCollection, $oComment);
  16.         }
  17.         $oSmarty->assign('aComments', $aCommentsRes['aCollection']);
  18.         $oSmarty->assign('last_build_date', $last_build_date);
  19. }
  20.  
  21. // rss-комментарии к топику
  22.  



2. Редактируем modules/blog/templates/rss.tpl:

Перед (примерно середина файла)
  1.  
  2. {else}
  3.  


нужно добавить:
  1.  
  2. {elseif $oRouter->getParam(0) == topic}
  3.         <title>{$oTopic->getTitle()} - лента комментариев</title>
  4.         <link>{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/</link>
  5.         <atom:link href="{$oRouter->getPathWeb()}/blog/rss/topic/{$oTopic->getId()}/" rel="self" type="application/rss+xml" />
  6.         <language>ru</language>
  7.         <description>{$oTopic->getTitle()} на сайте {$oRouter->getPathWeb()}, комментарии темы в RSS</description>
  8.         <managingEditor>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</managingEditor>
  9.         <webMaster>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</webMaster>
  10.         <copyright>{$oRouter->getPathWeb()}</copyright>
  11.         <lastBuildDate>{$last_build_date}</lastBuildDate>
  12.         <generator>{$oRouter->getPathWeb()}</generator>
  13.         <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  14.  
  15.         {foreach item=oComment from=$aComments}
  16.         <item>
  17.         <title>{$oComment->getAuthorLogin()}</title>
  18.         <link>{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/#comment_{$oComment->getId()}</link>
  19.         <description><![CDATA[ {$oStringsTool->unparseText($oComment->getText())}]]></description>
  20.         <pubDate>{$oComment->getAdded()}</pubDate>
  21.         <guid isPermaLink="true">{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/</guid>
  22.         </item>
  23.         {/foreach}
  24.  


RSS поток комментариев к топику будет отдаваться по адресу:
  1.  
  2. http://domain.ru/blog/rss/topic/1
  3.  

Ссылку на канал можно указать в файле шаблона sample.topic_comments.tpl

Кому сложно / лениво ковырять код самолично, можно скачать готовый вариант RSS для комментариев отдельным файлом. Распакуйте и залейте файл feed.action.php в modules/blog/, а файл feed.tpl в modules/blog/templates/.

Соответственно, ссылка на поток будет во втором случае:
  1.  
  2. http://domain.ru/blog/feed/topic/1
  3.  


В полевых условиях тестировал только RSS для Эфира. Кто располагает временем, погоняйте пожалуйста RSS для комментариев в топиках… возможно я что-нибудь упустил.

UPDATE
В файл sample.header.tpl темы оформления добавляем после строки:
  1.  
  2. <link rel="alternate" type="application/rss+xml" href="{$oRouter->getPathWeb()}/blog/rss/" title="RSS">
  3.  


следующие условия:
  1.  
  2. {if $oRouter->getCurrentModule() == 'blog' and $oRouter->getCurrentAction() == 'topic' and $oTopic}<link rel="alternate" type="application/rss+xml" href="{$oRouter->getPathWeb()}/blog/rss/topic/{$oTopic->getId()}/" title="{$oTopic->getTitle()|htmlspecialchars} - комментарии в RSS">{/if}
  3.  
  4. {if $oRouter->getCurrentModule() == 'onair'}<link rel="alternate" type="application/rss+xml" href="{$oRouter->getPathWeb()}/onair/rss/" title="{$oRouter->getPathWeb()|htmlspecialchars} - эфир в RSS">{/if}
  5.  
tommyred 20 июля 2009 20:58 комментариев: 6
:) 4,18 :(
просмотров: 1014

Комментарии:
Молодец, tommyred, как только доберусь до поднятия сайта на БС обязательно воспользуюсь этими знаниями.
galo4kin galo4kin   21 июля 2009 11:07
:) 0 :( #
Жалко, что повторно нельзя поднимать рейтинг, а так только спасибо!
inetlover inetlover   21 июля 2009 17:01
:) 1 :( #
еще можно в шаблонах прописать


Finnr Finnr   22 июля 2009 15:32
:) 0 :( #
хм...


Finnr Finnr   22 июля 2009 15:34
:) 0 :( #
ну в общем не судьба))

link rel=«alternate» type=«application/rss+xml» внутри хеад, как сейчас «Все одобреные публикации»
Finnr Finnr   22 июля 2009 15:35
:) 3 :( #
Точно, как раз это упустил, спасибо. Пост дополнил.
tommyred tommyred   23 июля 2009 09:34
:) 0 :( #
Написать комментарий
Только зарегистрированные пользователи могут оставлять комментарии.





Подписаться на рассылку
"Бесплатный движок bigstreet.ru"


 
© 2009. | О сайте | Инструкции | Обратная связь
© Powered by BigStreet RC1-maps SVN Сервис коротких адресов День святого Валентина
www.webmoney.ru Участник проекта CMS Magazine


Работа с БД:
 Время - 6.989
 Запросов - 12
Работа с кэшем:
 Время - 0.3849
 Записей - 2
 Прочтений - 5
Общее время:
 7.9307