RSS для комментариев в топиках и прямом эфире
Долгое время досадовал я на то, что никто на Большой улице пока еще не прицепил RSS на комментарии. Хотелось такую штуку достаточно давно, причем, как для модуля Эфир, так и для комментариев в топиках. Недавно припекло и решил взяться за дело сам… Пришлось немного поднапрячься (т.к. php вообще-то не мой конёк), но лишь немного, благодаря тому, что в исходниках модуля BLOG уже есть пример реализации RSS. Нужно было просто дописать кое-что по аналогии с существующим вариантом. Результат не расстроил. Потому, не смотря на то, что времени на постописательство сейчас совершенно нет, решил запостить план действий для того, кто захочет сделать подобное на своем сайте. Надеюсь, пост окажется полезным.
RSS для модуля Эфир
1. В папке modules/onair/ создаем файл rss.action.php следующего содержания:
<?php
require_once('system/mappers/comments.mysql.mapper.php');
$oCommentsMapper = new Comments_MySQLMapper(System_Database::getInstance('site'));
System_Essences::getEssence('Comments');
$rights = (string)((int)$oSession->isModeratorStatus() . (int)$oSession->isAdministratorStatus());
if (false === ($aCommentsRes = System_Cacher::Get("all_comments_rss_{$rights}"))) {
if ($aCommentsRes = $oCommentsMapper->getCollectionOnAir(1, 15, $oSession)) {
System_Cacher::Set($aCommentsRes, "all_comments_rss_{$rights}", array(), 3600);
}
}
if (isset($aCommentsRes) and !empty($aCommentsRes['aCollection']))
{
$oLastComment = array_pop($aCommentsRes['aCollection']);
array_push($aCommentsRes['aCollection'], $oLastComment);
$lastmodified = $oLastComment->getAdded();
$aCollection = array();
foreach ($aCommentsRes['aCollection'] AS $oComment)
{
$oComment->setAdded(date("D, d M Y H:i:s", strtotime($oComment->getAdded())).' +0300');
$last_build_date = $oComment->getAdded();
array_push($aCollection, $oComment);
}
$oSmarty->assign('aComments', $aCommentsRes['aCollection']);
$oSmarty->assign('last_build_date', $last_build_date);
}
header('Content-Type: application/rss+xml; charset=UTF-8');
header('Content-Type: text/xml; charset=UTF-8');
?>
2. В папке modules/onair/templates/ создаем файл rss.tpl:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Эфир сайта {$oSettings->getMetaTitle()}</title>
<link>{$oRouter->getPathWeb()}/onair/rss/</link>
<atom:link href="{$oRouter->getPathWeb()}/onair/rss/" rel="self" type="application/rss+xml" />
<language>ru</language>
<description><![CDATA[{$oSettings->getMetaDescription()}]]></description>
<managingEditor>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</managingEditor>
<webMaster>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</webMaster>
<copyright>{$oRouter->getPathWeb()}</copyright>
<lastBuildDate>{$last_build_date}</lastBuildDate>
<generator>{$oRouter->getPathWeb()}</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
{foreach item=oComment from=$aComments}
<item>
<title>{$oComment->getEssenceTitle()}</title>
<link>{$oRouter->getPathWeb()}/blog/topic/{$oComment->getEssenceId()}/#comment_{$oComment->getId()}</link>
<description><![CDATA[<b>{$oComment->getAuthorLogin()}:</b> {$oStringsTool->unparseText($oComment->getText())}]]></description>
<pubDate>{$oComment->getAdded()}</pubDate>
<guid isPermaLink="true">{$oRouter->getPathWeb()}/blog/topic/{$oComment->getEssenceId()}/#comment_{$oComment->getId()}</guid>
</item>
{/foreach}
</channel>
</rss>
RSS поток эфира будет отдаваться по адресу:
http://domain.ru/onair/rss
Теперь пишем ссылку на канал в любом месте шаблона — и все готово.
RSS для комментариев в топиках
Очень полезная фича для тех, кто не зарегистрирован или не отвечал в топике, но, тем не менее, считает топик интересным и желает следить за комментариями конкретно этого топика.
1. Редактируем modules/blog/rss.action.php:
После строк:
$oSmarty->assign('oUser', $oUser);
}
}
break;
и перед:
default:
if (false === ($aTopicsRes = System_Cacher::Get("approved_topics_rss_{$rights}"))) {
if ($aTopicsRes = $oTopicsMapper->getCollectionLast(1, 7, $oSession)) {
System_Cacher::Set($aTopicsRes, "approved_topics_rss_{$rights}", array(), 1800);
}
}
нужно вставить:
// rss-комментарии к топику
case('topic'):
$oTopic = null;
if (false === ($oTopic = System_Cacher::Get("topic_by_id_".System_Router::getParam(1)))) {
if ($oTopic = $oTopicsMapper->findById(System_Router::getParam(1))) {
System_Cacher::Set($oTopic, "topic_by_id_".System_Router::getParam(1), array(), 3600);
}
}
$oSmarty->assign('oTopic', $oTopic);
if (!$oTopic)
{
new System_Error('Запрошенная страница не найдена.');
System_Router::setCurrentModule('errors');
System_Router::setCurrentAction('404');
}else{
require_once 'system/essences/comments.essence.php';
require_once('system/mappers/comments.mysql.mapper.php');
$oCommentsMapper = new Comments_MySQLMapper(System_Database::getInstance('site'));
if (false === ($aCommentsRes = System_Cacher::Get("topic_comments_rss_{$oTopic->getId()}_{$rights}"))) {
if ($aCommentsRes = $oCommentsMapper->getCollectionByTopic($oTopic, 1, 10, $oSession)) {
System_Cacher::Set($aCommentsRes, "topic_comments_rss_{$oTopic->getId()}_{$rights}", array(), 3600);
}
}
if (isset($aCommentsRes)) {
$oSmarty->assign('aComments', $aCommentsRes['aCollection']);
}
}
break;
// rss-комментарии к топику
Далее перед
header('Content-Type: application/rss+xml; charset=UTF-8');
header('Content-Type: text/xml; charset=UTF-8');
добавляем:
// rss-комментарии к топику
if (isset($aCommentsRes) and !empty($aCommentsRes['aCollection']))
{
$oLastComment = array_pop($aCommentsRes['aCollection']);
array_push($aCommentsRes['aCollection'], $oLastComment);
$lastmodified = $oLastComment->getAdded();
$aCollection = array();
foreach ($aCommentsRes['aCollection'] AS $oComment)
{
$oComment->setAdded(date("D, d M Y H:i:s", strtotime($oComment->getAdded())).' +0300');
$last_build_date = $oComment->getAdded();
array_push($aCollection, $oComment);
}
$oSmarty->assign('aComments', $aCommentsRes['aCollection']);
$oSmarty->assign('last_build_date', $last_build_date);
}
// rss-комментарии к топику
2. Редактируем modules/blog/templates/rss.tpl:
Перед (примерно середина файла)
нужно добавить:
{elseif $oRouter->getParam(0) == topic}
<title>{$oTopic->getTitle()} - лента комментариев</title>
<link>{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/</link>
<atom:link href="{$oRouter->getPathWeb()}/blog/rss/topic/{$oTopic->getId()}/" rel="self" type="application/rss+xml" />
<language>ru</language>
<description>{$oTopic->getTitle()} на сайте {$oRouter->getPathWeb()}, комментарии темы в RSS</description>
<managingEditor>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</managingEditor>
<webMaster>{$oSettings->getMailerFromEmail()} ({$oRouter->getPathWeb()})</webMaster>
<copyright>{$oRouter->getPathWeb()}</copyright>
<lastBuildDate>{$last_build_date}</lastBuildDate>
<generator>{$oRouter->getPathWeb()}</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
{foreach item=oComment from=$aComments}
<item>
<title>{$oComment->getAuthorLogin()}</title>
<link>{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/#comment_{$oComment->getId()}</link>
<description><![CDATA[ {$oStringsTool->unparseText($oComment->getText())}]]></description>
<pubDate>{$oComment->getAdded()}</pubDate>
<guid isPermaLink="true">{$oRouter->getPathWeb()}/blog/topic/{$oTopic->getId()}/</guid>
</item>
{/foreach}
RSS поток комментариев к топику будет отдаваться по адресу:
http://domain.ru/blog/rss/topic/1
Ссылку на канал можно указать в файле шаблона sample.topic_comments.tpl
Кому сложно / лениво ковырять код самолично, можно скачать готовый вариант RSS для комментариев отдельным файлом. Распакуйте и залейте файл feed.action.php в modules/blog/, а файл feed.tpl в modules/blog/templates/.
Соответственно, ссылка на поток будет во втором случае:
http://domain.ru/blog/feed/topic/1
В полевых условиях тестировал только RSS для Эфира. Кто располагает временем, погоняйте пожалуйста RSS для комментариев в топиках… возможно я что-нибудь упустил.
UPDATE В файл sample.header.tpl темы оформления добавляем после строки:
<link rel="alternate" type="application/rss+xml" href="{$oRouter->getPathWeb()}/blog/rss/" title="RSS">
следующие условия:
{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}
{if $oRouter->getCurrentModule() == 'onair'}<link rel="alternate" type="application/rss+xml" href="{$oRouter->getPathWeb()}/onair/rss/" title="{$oRouter->getPathWeb()|htmlspecialchars} - эфир в RSS">{/if}
| tommyred |
20 июля 2009 20:58 |
комментариев: 6 |
 |
4,18 |
 |
|
просмотров: 1014 |
Комментарии:
Только зарегистрированные пользователи могут оставлять комментарии.
|
|
link rel=«alternate» type=«application/rss+xml» внутри хеад, как сейчас «Все одобреные публикации»
Написать комментарий