Создание RSS потока в CodeIgniter
Опубликовано TermiT Дек 15, 2007 в Web 2.0 |
У нас (в Linux-Online) есть система управления репозиториями и системы сборки iso-образов с вебмордой на CodeIgniter'e. Естественно ведутся логи, сегодня подумал, что было бы удобно чтобы логи транслировались в RSS — ставим любой RSS ридер с поддержкой нотификаций в треи, красота. Естественно велик не стал изобретать — нашел вариант от Delek Allard'a. Изложу его на русском :)
Итак начнем с контроллера, который я назвал «feed»:
-
<?php
-
class Feed extends Controller
-
{
-
-
function Feed()
-
{
-
parent::Controller();
-
$this->load->model('posts_model', '', TRUE);
-
$this->load->helper('xml');
-
}
-
-
function index()
-
{
-
$data['encoding'] = 'utf-8';
-
$data['feed_name'] = 'DerekAllard.com';
-
$data['feed_url'] = 'http://www.derekallard.com';
-
$data['page_description'] = 'Code Igniter, PHP, and the World of Web Design';
-
$data['page_language'] = 'en-ca';
-
$data['creator_email'] = 'Derek Allard is at derek at derekallard dot com';
-
$data['posts'] = $this->posts_model->getRecentPosts();
-
$this->load->view('feed/rss', $data);
-
}
-
}
-
?>
Важно заметит, что без объявления заголовка (строка #18) браузер проинтерпретировал бы вывод как обычный текст или как xml файл и предложил бы его загрузить, естественно нам такого результата не хотелось. Также в строке #17 мы обращаемся к методу getRecentPosts из модели posts_model, который содержит следующий код:
-
function getRecentPosts ()
-
{
-
$this->db->orderby('post_date', 'desc');
-
$this->db->where('post_visible', 1);
-
$this->db->limit(10);
-
return $this->db->get('posts');
-
}
Выборка с условием, что колонка 'post_visible' должна содержать 1, необходима если вы не хотите отдавать пост на публику, например если это черновик. Теперь посмотрим шаблон (view) 'rss':
-
<?php
-
echo '<?xml version="1.0" encoding="utf-8"?>';
-
?>
-
<rss version=«2.0»
-
xmlns:dc=«http://purl.org/dc/elements/1.1/»
-
xmlns:sy=«http://purl.org/rss/1.0/modules/syndication/»
-
xmlns:admin=«http://webns.net/mvcb/»
-
xmlns:rdf=«http://www.w3.org/1999/02/22-rdf-syntax-ns#»
-
xmlns:content=«http://purl.org/rss/1.0/modules/content/»>
-
-
<channel>
-
-
<title><?php echo $feed_name; ?></title>
-
-
<link><?php echo $feed_url; ?></link>
-
<description><?php echo $page_description; ?></description>
-
<dc :language><?php echo $page_language; ?></dc>
-
<dc :creator><?php echo $creator_email; ?></dc>
-
-
<admin :generatorAgent rdf:resource=«http://www.codeigniter.com/» />
-
-
<?php foreach($posts->result() as $entry): ?>
-
-
<item>
-
-
-
<description><![CDATA[
-
]]></description>
-
</item>
-
-
<?php endforeach; ?>
-
-
</channel>
-
</rss>
В шаблоне я использовал PHP функцию echo для вывода строки «<?xml version="1.0"?>» , т.к. интерпритатор мог воспринять «<?» и «?>» за открывающиеся и закрывающиеся тэги PHP.
И наконец строка:
которая с помощью функции замены строк str_replace преобразует относительные пути к изображению в абсолютные.
Вот так всё оказалось просто. :)
