1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-05-02 00:49:21 +03:00
ifhub.club/application/classes/actions/ActionRss.class.php

461 lines
17 KiB
PHP

<?php
/*
* LiveStreet CMS
* Copyright © 2013 OOO "ЛС-СОФТ"
*
* ------------------------------------------------------
*
* Official site: www.livestreetcms.com
* Contact e-mail: office@livestreetcms.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* ------------------------------------------------------
*
* @link http://www.livestreetcms.com
* @copyright 2013 OOO "ЛС-СОФТ"
* @author Maxim Mzhelskiy <rus.engine@gmail.com>
*
*/
/**
* Экшен бработки RSS
* Автор класса vovazol(http://livestreet.ru/profile/vovazol/)
*
* @package application.actions
* @since 1.0
*/
class ActionRss extends Action
{
/**
* Инициализация
*/
public function Init()
{
$this->SetDefaultEvent('index');
Router::SetIsShowStats(false);
}
/**
* Указывает браузеру правильный content type в случае вывода RSS-ленты
*/
protected function InitRss()
{
header('Content-Type: application/rss+xml; charset=utf-8');
}
/**
* Регистрация евентов
*/
protected function RegisterEvent()
{
$this->AddEvent('index', 'RssGood');
$this->AddEvent('full', 'RssFull');
$this->AddEvent('new', 'RssNew');
$this->AddEvent('allcomments', 'RssComments');
$this->AddEvent('comments', 'RssTopicComments');
$this->AddEvent('tag', 'RssTag');
$this->AddEvent('blog', 'RssColectiveBlog');
$this->AddEvent('personal_blog', 'RssPersonalBlog');
}
/**
* Вывод RSS интересных топиков
*/
protected function RssGood()
{
/**
* Получаем топики
*/
$aResult = $this->Topic_GetTopicsGood(1, Config::Get('module.topic.max_rss_count'), false);
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Config::Get('view.name') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Config::Get('view.name');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS новых топиков
*/
protected function RssNew()
{
/**
* Получаем топики
*/
$aResult = $this->Topic_GetTopicsNew(1, Config::Get('module.topic.max_rss_count'), false);
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Router::GetPath('/') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Вывод полнотекстового RSS интересных топиков
*/
protected function RssFull()
{
/**
* Получаем топики
*/
$aResult = $this->Topic_GetTopicsGood(1, Config::Get('module.topic.max_rss_count'), false);
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Config::Get('view.name') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Config::Get('view.name');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicFullText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS последних комментариев
*/
protected function RssComments()
{
/**
* Получаем закрытые блоги, чтобы исключить их из выдачи
*/
$aCloseBlogs = $this->Blog_GetInaccessibleBlogsByUser();
/**
* Получаем комментарии
*/
$aResult = $this->Comment_GetCommentsAll('topic', 1, Config::Get('module.comment.max_rss_count'), array(),
$aCloseBlogs);
$aComments = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Router::GetPath('/') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$comments = array();
foreach ($aComments as $oComment) {
$item['title'] = 'Comments: ' . $oComment->getTarget()->getTitle();
$item['guid'] = $oComment->getTarget()->getUrl() . '#comment' . $oComment->getId();
$item['link'] = $oComment->getTarget()->getUrl() . '#comment' . $oComment->getId();
$item['description'] = $oComment->getText();
$item['pubDate'] = $oComment->getDate();
$item['author'] = $oComment->getUser()->getLogin();
$item['category'] = 'comments';
$comments[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $comments);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS комментариев конкретного топика
*/
protected function RssTopicComments()
{
$sTopicId = $this->GetParam(0);
/**
* Топик существует?
*/
if (!($oTopic = $this->Topic_GetTopicById($sTopicId)) or !$oTopic->getPublish() or $oTopic->getBlog()->getType() == 'close') {
return parent::EventNotFound();
}
/**
* Получаем комментарии
*/
$aResult = $this->Comment_GetCommentsByFilter(array('target_id' => $oTopic->getId(),
'target_type' => 'topic',
'delete' => 0
), array('comment_id' => 'desc'), 1, 100);
$aComments = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Router::GetPath('/') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$comments = array();
foreach ($aComments as $oComment) {
$item['title'] = 'Comments: ' . $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl() . '#comment' . $oComment->getId();
$item['link'] = $oTopic->getUrl() . '#comment' . $oComment->getId();
$item['description'] = $oComment->getText();
$item['pubDate'] = $oComment->getDate();
$item['author'] = $oComment->getUser()->getLogin();
$item['category'] = 'comments';
$comments[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $comments);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS топиков по определенному тегу
*/
protected function RssTag()
{
$sTag = urldecode($this->GetParam(0));
/**
* Получаем топики
*/
$aResult = $this->Topic_GetTopicsByTag($sTag, 1, Config::Get('module.topic.max_rss_count'), false);
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Router::GetPath('/') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS топиков из коллективного блога
*/
protected function RssColectiveBlog()
{
$sBlogUrl = $this->GetParam(0);
/**
* Если блог существует, то получаем записи
*/
if (!$sBlogUrl or !($oBlog = $this->Blog_GetBlogByUrl($sBlogUrl)) or $oBlog->getType() == "close") {
return parent::EventNotFound();
} else {
$aResult = $this->Topic_GetTopicsByBlog($oBlog, 1, Config::Get('module.topic.max_rss_count'), 'good');
}
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = Router::GetPath('/') . ' / ' . $oBlog->getTitle() . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Вывод RSS топиков из персонального блога или всех персональных
*/
protected function RssPersonalBlog()
{
$this->sUserLogin = $this->GetParam(0);
if (!$this->sUserLogin) {
/**
* RSS-лента всех записей из персональных блогов
*/
$aResult = $this->Topic_GetTopicsPersonal(1, Config::Get('module.topic.max_rss_count'));
} elseif (!$oUser = $this->User_GetUserByLogin($this->sUserLogin)) {
return parent::EventNotFound();
} else {
/**
* RSS-лента записей персонального блога указанного пользователя
*/
$aResult = $this->Topic_GetTopicsPersonalByUser($oUser->getId(), 1, 1,
Config::Get('module.topic.max_rss_count'));
}
$aTopics = $aResult['collection'];
/**
* Формируем данные канала RSS
*/
$aChannel['title'] = Config::Get('view.name');
$aChannel['link'] = Router::GetPath('/');
$aChannel['description'] = ($this->sUserLogin)
? Router::GetPath('/') . ' / ' . $oUser->getLogin() . ' / RSS channel'
: Router::GetPath('/') . ' / RSS channel';
$aChannel['language'] = 'ru';
$aChannel['managingEditor'] = Config::Get('general.rss_editor_mail');
$aChannel['generator'] = Router::GetPath('/');
/**
* Формируем записи RSS
*/
$topics = array();
foreach ($aTopics as $oTopic) {
$item['title'] = $oTopic->getTitle();
$item['guid'] = $oTopic->getUrl();
$item['link'] = $oTopic->getUrl();
$item['description'] = $this->getTopicText($oTopic);
$item['pubDate'] = $oTopic->getDatePublish();
$item['author'] = $oTopic->getUser()->getLogin();
$item['category'] = htmlspecialchars($oTopic->getTags());
$topics[] = $item;
}
/**
* Формируем ответ
*/
$this->InitRss();
$this->Viewer_Assign('aChannel', $aChannel);
$this->Viewer_Assign('aItems', $topics);
$this->SetTemplateAction('index');
}
/**
* Формирует текст топика для RSS
*
*/
protected function getTopicText($oTopic)
{
$sText = $oTopic->getTextShort();
if ($oTopic->getTextShort() != $oTopic->getText()) {
$sText .= "<br><a href=\"{$oTopic->getUrl()}#cut\" title=\"{$this->Lang_Get('topic.read_more')}\">";
if ($oTopic->getCutText()) {
$sText .= htmlspecialchars($oTopic->getCutText());
} else {
$sText .= $this->Lang_Get('topic.read_more');
}
$sText .= "</a>";
}
return $sText;
}
/**
* Формирует полный текст топика (без ката) для RSS
*
*/
protected function getTopicFullText($oTopic)
{
return $oTopic->getText();
}
}