Привет всем, начну свою первую статью на сайте с очень полезной вещи для тех, кто использует сайты без базы данных, то есть на текстовых или xml файлах.


Что нам может потребоваться?

  • Xml файл, который поймут все агрегаторы, вроде Google Reader
  • Хранилище новостей
  • Удобная админка, в которой можно легко добавлять и удалять новости.

XML файл

На данное время существует уже целых 7 видов rss потока, которые по функциональности не отличаются друг от друга. Но предпочтительней, все таки, использовать последнею версию. Сейчас это 2.0

Как выглядит разметка показывают на каждом втором говносайте по кодингу, так что я сразу перейду в полезной части, а именно, как из легкого и удобного текстового файла, в котором хранятся новости информацию засунуть в rss поток.


Листинг файла rss.php <?php // news-to-rss // 20.12.11 // http://artygrand.ru/php/news-to-rss $sitetitle = 'mysupersite.ru'; // Название вашего сайта $sitedescription= 'is very cool'; //слоган или еще что нибудь, можно описание $author = 'клевый я'; //ну автор - это ты. $lastBuildDate = date('r', filemtime('news.txt')); //дата последней новости $rss = '<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" > <channel> <title>'.$sitetitle.'</title> <atom:link href="http://'.$_SERVER['SERVER_NAME'].'/rss" rel="self" type="application/rss+xml" /> <link>http://'.$_SERVER['SERVER_NAME'].'</link> <description>'.$sitedescription.'</description> <lastBuildDate>'.$lastBuildDate.'</lastBuildDate> <generator>http://artygrand.ru/php/news-to-rss</generator> <language>ru</language> <sy:updatePeriod>daily</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> ';

Только что мы записали заголовок rss канала, со всей интересной информацией. sy:updatePeriod и sy:updateFrequency желательно указать реальные, что бы агрегаторы приходили вовремя. Так же можно указать и другие настройки, но и с этими все прекрасно будет работать.

Листинг файла rss.php $content = array_reverse(file('news.txt', FILE_SKIP_EMPTY_LINES I FILE_IGNORE_NEW_LINES)); foreach ($content as $item) { $pieces = explode('I', $item); $posttitle = $pieces[0]; $postlink = $pieces[1]; $pubDate = date('r', $pieces[2]); $guid = $pieces[2]; $shortpost = strip_tags($pieces[3]); $fullpost = $pieces[3]; $rss = $rss.' <item> <title>'.$posttitle.'</title> <link>'.$postlink.'</link> <pubDate>'.$pubDate.'</pubDate> <dc:creator>'.$author.'</dc:creator> <guid isPermaLink="false">'.$guid.'</guid> <description><![CDATA['.$shortpost.']]></description> <content:encoded><![CDATA['.$fullpost.']]></content:encoded> </item> '; } $rss = $rss.'</channel> </rss>'; header("Content-Type: text/xml"); echo $rss; ?>

Здесь считываются все данные с текстового файла в массив, и в обратном порядке выводятся в красивый код. Почему в обратном? Для того что бы последняя новость оказалась первой в rss канале.

База данных будет выглядеть примерно так.

Листинг файла news.txt Заголовок 1Iссылка на другую страницуI1316452500Iтекст новости с <em>html тегами</em> Заголовок 2Iссылка на страницуI1316452500Iтекст новости с <a href="link">ссылкой</a> Заголовок 3Iссылка на сайтI1316452500Iтекст новости с <em>html тегами</em>

1316452500 - это дата поста, поставленная автоматически функцией time()

Ну а теперь самое интересное. Скрипт админки, который добавляет новости. Тут всего 3 функции: посмотреть все написанные новости, добавить новость и удалить новость. Можно, по желанию, добавить еще и редактирование новостей.

Листинг файла admin.php switch ( $_GET['act'] ){ case 'news': // Страница новостей $content = getNews(); generatePage(); break; case 'add_news': // Функция добавления новости addNews(); break; case 'del_news': // Функция удаления новости delNews(); break; default: $content = getPagesList(); generatePage(); } //---Собираем страницу админки--- function generatePage() { global $content; $rawtemplate = file_get_contents('index.html'); //Парсим шкурку $page = str_replace('{content}',$content,$rawtemplate); echo $page; } //---Отображатель новостей--- function getNews(){ $page = '<h3>Добавлятель новостей</h3> <p>Заполнение всех полей гарантирует нормальную работу RSS</p> <form action="?act=add_news" method="post"> <p>Заголовок <input type="text" size="97" value="" name="title"></p> <p>Ссылка <input type="text" size="100" value="" name="link"></p> <p>Текст новости. <span class="gray">Можно использовать html теги (a, s, strong, em, br и другие)</span></p> <p><textarea rows="5" cols="84" name="news"></textarea></p> <p id="buttons"><button type="submit">Сохранить</button> <button type="reset">Очистить все</button></p> </form>'.PHP_EOL; $rawnews = array_reverse(file('news.txt', FILE_SKIP_EMPTY_LINES)); $page = $page.'<div id="news"><h4>Что уже написано?</h4>'.PHP_EOL; foreach ($rawnews as $id => $item) { $pieces = explode('I', $item); $id = count($rawnews) - $id - 1; $page = $page.' <div class="f0"><p class="link">'.date('d M Y', $pieces[2]).': <a href="'.$pieces[1].'">'.$pieces[0].'</a></p><a class="f2" href="?act=del_news&id='.$id.'" onclick="return confirm('Точно удалить?')">Удалить</a>'.PHP_EOL.' <p class="newstext">'.$pieces[3].'</p></div>'.PHP_EOL; } $page = $page.'</div>'; return $page; } //---Добавлятель новостей--- function addNews(){ if (isset($_POST['news']) and $_POST['news'] !== '') { $title = stripslashes($_POST['title']); $link = stripslashes($_POST['link']); $news = stripslashes($_POST['news']); $title = preg_replace('/(nIrIt)/', '', $title); $link = preg_replace('/( InIrIt)/', '', $link); $news = preg_replace('/(nIrIt)/', ' ', $news); $news = preg_replace('/[ ]+/', ' ', $news); $data = $title.'I'.$link.'I'.time().'I'.$news.PHP_EOL; $file = 'news.txt'; file_put_contents($file, $data, FILE_APPEND); } } //---Удалятель новостей--- function delNews(){ if (isset($_GET['id']) and $_GET['id'] !== '') { $rawnews = file('news.txt', FILE_SKIP_EMPTY_LINES I FILE_IGNORE_NEW_LINES); unset($rawnews[$_GET['id']]); $news_to_put = implode(PHP_EOL, $rawnews); $news_to_put = preg_replace('/['.PHP_EOL.']+/', PHP_EOL, $news_to_put); file_put_contents('news.txt', $news_to_put); } }

При переходе по ссылке admin.php?act=news будут отображены все написанные новости вместе с формой для ввода новых.

D файле index.html же находится любая готовая страница, в которой есть блок {content}, который и заменяется на контент. Так что этот код можно засунуть в уже функционирующую админку.

И самое последнее, и самое интересное, это превратить неинтересное site.ru/rss.php в интересное site.ru/rss

Для этого надо всего лишь в файле .htaccess прописать

RewriteEngine On RewriteBase / RewriteRule ^rss$ /rss.php [L]

Вот и все, ребята. Пример функционирования можно глянуть у меня на сайте по ссылке http://artygrand.ru/rss. Сами новости на главной. А админку не покажу.

Скачать все файлы из статьи можно по ссылке.