Привязываем генератор RSS ленты к нашему движку

 

Здравствуйте дорогой читатель Блога RS! В прошлом посте мы писали функцию генерации rss файла. Сегодня же мы прикрутим этот генератор к нашей админ панели, что позволит одним щелчком мыши разместить новый пост в rss ленте. По сути у нас уже все готово, осталось немного подредактировать некоторые функции и обработчик.

 

 

Предисловие

 

Как обычно, хочу сказать пару слов для тех, кто пришел на мой блог в первые. Этот пост, как и большинство на этом блоге, является продолжением глобального цикла статей "Создать блог с нуля". Я описываю метод написание движка, если быть точнее пишу его вместе с Вами, и уже руки чешутся его поставить, и писать Вам посты уже из новой админ панели . Так вот, если Вы хотите научится на практике писать свой проект на php, видеть живой пример реализации нужного функционала на Вашем самописном сайте, то Вы попали туда куда нужно Переходите по ссылке выше и приступайте к изучению написанного мной материала. Я стараюсь пояснять каждую строчку написанного мной кода, и если что с удовольствием отвечу на Ваш вопрос, даже если он ( вопрос ) из ряда "что такое php?" или "что такое сайт?"

Если я Вас заинтриговал, то подпишитесь на RSS ленту блога через ридер, или же по почте.

 

Цель

 

  • Первым делом нужно будет скопировать функцию, которую мы писали в прошлом посте, в файл configpost.php
  • Далее добавить новую строку в шаблоне configpost.html
  • Добавить пару строк в функцию configpost()
  • Ну и на по следок, изменить обработчик в файле configpost.php

Как видите сегодня много думать не придется

 

Переносим функцию rss()

 

Открываем файл rss.php копируем функцию, и вставляем ее в файл, в самый низ, configpost.php. Вот полный код функции, с уже отредактированным путем к файлу

function rss($site)
{
$rssHEADER = mysql_query("SELECT * FROM page WHERE id='1'");//Вытаскиваем инфу о сайте
$myrowHEADER = mysql_fetch_array($rssHEADER);

//формируем шапку
$header = "<?xml version=\"1.0\" encoding=\"windows-1251\"?>\n<rss version=\"2.0\">\n\t<channel>\n\t\t<title>".$myrowHEADER[title]."</title>\n\t\t<link>".$site."</link>\n\t\t<description>".$myrowHEADER[meta_d]."</description>\n\t\t<language>ru-ru</language>\n";//Шапка xml документа

$rssRESULT = mysql_query("SELECT id,date_b,title,text FROM blog WHERE rss='1' ORDER BY id DESC LIMIT 5");//Вытаскиваем 5 постов из БД
$myrow = mysql_fetch_array($rssRESULT);

if($myrow != "")//если есть посты которые нужно поместить в rss ленту
{
do
{
//приобразуем дату из БД в вид ГГГГ-ММ-ДД ( у нас в БД вот такой вид ДД/ММ/ГГГГ ЧЧ:ММ )
$datePOST = explode(" ",$myrow[date_b]);//делим дату на массив. В первом элементе массива будет ДД/ММ/ГГГГ а во втором ЧЧ:ММ
$dateMS = $datePOST[1];//сохраняем минуты и сек в отдельной переменной
$datePOST = explode("/",$datePOST[0]);//Делим первый элемент массива на другой массив. В новом массиве будет 3 элемента. Первый содержит ДД, второй ММ и третий ГГГГ
$dateUNIX = strtotime($datePOST[0]."-".$datePOST[1]."-".$datePOST[2]);//Формируем дату в виде ДД-ММ-ГГГГ после чего превращаем ее в целое число
$datePOST = date("D, d M Y ",$dateUNIX);//превращаем дату в вид Thu, 16 Feb 2012 (пример)
$datePOST = $datePOST.$dateMS.":01 GMT";//пристыковываем к дате еще и время (пример Thu, 16 Feb 2012 04:43:01 GMT)

$link = $site."index.php?blog=".$myrow[id];//генерируем ссылку
$txt = explode("<p>[end]</p>",$myrow[text]);//отделяем анонс от текста поста
$txt = strip_tags($txt[0]);//чистим анонс от html кода

//генерируем xml код
$xmlcode .= "\t\t<item>\n\t\t\t<title>".$myrow[title]."</title>\n\t\t\t<link>".$link."</link>\n\t\t\t<description>".$txt."</description>\n\t\t\t<pubDate>".$datePOST."</pubDate>\n\t\t</item>\n";
}
while($myrow = mysql_fetch_array($rssRESULT));

$end = "\t</channel>\n</rss>";//закрываем теги xml документа
$result = $header.$xmlcode.$end;//склеиваем части xml кода

$rssFILE = fopen("../rss/rss.xml", "w+");//открываем файл rss ленты
fwrite($rssFILE,$result);//записываем в него полученный xml код
fclose($rssFILE);//закрываем rss ленту
}
}

 

Редактируем шаблон

 

Открываем файл configpost.html и добавляем новую строчку в таблице. Вот код шаблона

<p align="right"><a href="index.php?page=all_content">К списку постов</a></p><br/>
<form action="index.php?page=cfgpost&id=[_id]" method="post" name="form">
<table width="700px" cellpadding="5" cellspacing="0" border="0" align="center">
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Видим пост в ленте новостей?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewindex">
[_cfgvi]
</select>
</td>
</tr>
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Разрешить комментировать пост?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewcomm">
[_cfgcomm]
</select>
</td>
</tr>
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Разместить в файле sitemap.xml?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="sm">
[_cfgsm]
</select>
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="xmlsmup">
[_cfgsmup]
</select>
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="xmlsmpr">
[_cfgsmpr]
</select>
</td>
</tr>
<tr>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="left">Разместить пост в RSS ленте?</td>
<td style="border-bottom:1px solid #dcdcdc;" valign="top" align="right">
<select style="font-family:Verdana;font-weight:100;font-size:11px;" name="viewrss">
[_cfgrss]
</select>
</td>
</tr>
<tr>
<td valign="top" colspan="2" align="center">
<br/><br/><input type="submit" value="Сохранить настройки">
</td>
</tr>
</table>
</form>
<br/><br/>

Как видите все тоже самое, что мы проделывали в посте "Привязываем генератор sitemap.xml к движку". Я вообще подумывал дать Вам, что то вроде домашнего задания, ведь данный пост почти, что дубль поста по ссылке выше.

Прошу обратить внимание на атрибут name нового тега select. И на новое код слово [_cfgrss]

 

Редактируем функцию configpost()

 

Что нам тут необходимо добавить? Сразу после

...
//--Приоритетность URL---
//-----Разместить в файле sitemap.xml?----

пишем

//-----Разместить пост в RSS ленте?----
$vrssQUEtxt = array("Нет","Да");//Вариант для человека
$vrssQUEint = array(0,1);//Вариант для скрипта
$vrss = queCFG($myrow_index[rss],$vrssQUEtxt,$vrssQUEint);//формируем option для пункта "Разместить пост в RSS ленте?"
//-----Разместить пост в RSS ленте?----

Если Вы читали предыдущие несколько постов, то Вы скорее всего узнаете такие строчки. Объяснять второй ( а может и третий ) раз не буду. Тут есть комментарии должно быть все понятно.

Осталось добавить строчку кода, которая заменит новое код-слово на тег option. Сразу после

...
$sm_read = str_replace("[_cfgsmpr]",$smpr,$sm_read);//приоритет

пишем

$sm_read = str_replace("[_cfgrss]",$vrss,$sm_read);//rss лента

Собственно это все изменения в данной функции

 

Редактируем обработчик

 

Я дам Вам полный код обработчика, и поясню новые строчки

//ОБРАБОТЧИК
//определяем переменные
if(isset($_POST['viewindex']))$viewindex = $_POST['viewindex'];
if(isset($_POST['viewcomm']))$viewcomm = $_POST['viewcomm'];
if(isset($_POST['sm']))$sm = $_POST['sm'];
if(isset($_POST['xmlsmup']))$xmlsmup = $_POST['xmlsmup'];
if(isset($_POST['xmlsmpr']))$xmlsmpr = $_POST['xmlsmpr'];
if(isset($_POST['viewrss']))$viewrss = $_POST['viewrss'];

//обращение к БД
if(isset($viewindex) AND isset($viewcomm) AND isset($sm) AND isset($xmlsmup) AND isset($xmlsmpr) AND isset($viewrss))//если переменная форма была заполнена и отправленна
{
$smCONFIGresult = mysql_query("SELECT sm,xmlsm,rss FROM blog WHERE id='$id'");//Выводим из базы данных некоторые данные для проверки
$smCONFIG = mysql_fetch_array($smCONFIGresult);

$newXMLconfig = $xmlsmup."|".$xmlsmpr;//Склеиваем инфу об обновление и приоритете в одну переменную ( monthly|0.2 )
$addrss = $smCONFIG[rss];

$newCONFIG = mysql_query ("UPDATE blog SET viewindex='$viewindex',viewcomm='$viewcomm',sm='$sm',xmlsm='$newXMLconfig',rss='$viewrss' WHERE id='$id'");//обнавляем настройки

if($smCONFIG[sm] != $sm OR $smCONFIG[xmlsm] != $newXMLconfig) sitemap($server_root);//Если настройки карты сайты изменились, то записываем их в файл
if($addrss != $viewrss) rss($server_root);//если пункт был изменен, то запускаем функцию rss()

header("location: ".getenv('HTTP_REFERER'));//Переносим пользовотеля на страницу с списком настроек
exit;
}
//ОБРАБОТЧИК

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

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

Строчка обнавление базы данных так же подверглась изменениям ( добавилось rss='$viewrss' )

На по следок идет строчка кода, ради которой создавалась переменная addrss

if($addrss != $viewrss) rss($server_root);//если пункт был изменен, то запускаем функцию rss()

Из кода понятно, что если введенные администратором данные не совпадают с данными в базе данных, значит необходимо запустить функцию генерации rss ленты. Весь этот пост, точный аналог поста "Привязываем генератор sitemap.xml к движку", так что черпая информацию от туда и глядя на код в этом посте, можно разобраться как все работает

Вот как все это приблизительно выглядит

 

Заключение

 

Если у Вас есть какие либо вопросы, то пользуйтесь формой ниже. Что бы не пропускать следующие посты подпишитесь на RSS ленту блога через ридер, или же по почте

Пост получился коротким, но зато у нас теперь в админ панели есть еще один пункт настроек постов.

Всего Вам наилучшего, у меня все!

Исходник

______

P.S.: Иногда просто хотеть, даже если имеются средства на это, уехать в какую то другую страну мало! Вы например знаете как оформляется виза по приглашению в латвию? Вот и я не знал, пока не почитал. Что самое занятное, для каждой отдельно взятой страны свои заморочки с документами, поэтому не знающему человеку необходимо сначала посетить сайт, на подобие finskayaviza.ru, что бы вооружится знаниями без которых очень трудно разобраться...

 

Возможно Вам будут интересны следующие заметки

Комментарии (7)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Rio-Shaman, 18 Марта 2012 г. 21:03 пишет:
Автор
Получилось так, что пришлось восстанавливать движок по материалам на блоге, отличный шанс проверить работоспособный ли код. Почти все коды работоспособны. Но вот именно в этом посте нашел небольшую недоговоренность. Забыл упомянуть, что в функции configpost($id) необходимо переправить запрос в базу данных, вот как должен выглядеть запрос:

$result_index = mysql_query("SELECT viewindex,viewcomm,sm,xmlsm,rss FROM blog WHERE id='$id'");
$myrow_index = mysql_fetch_array($result_index);

Забыл вытащить информацию из колонки rss
Артем, 15 Апреля 2013 г. 20:36 пишет:
Гость
Добрый день.
Спасибо большое за ваш сайт, очень нужная и полезная информация.
У меня небольшой вопрос: я создал одну новость и решил добавить ее в ленту новостей. Она добавилась и все отлично. Но потом я передумал, и сделал настройку для новости, чтобы она не добавлялась в ленту. Но почему то rss.xml файл не обновлялся. Все делал по вашей статье.
Тогда я немного поэкспериментировал и получил вот что (это кусок вашей функции rss():

...
//генерируем xml код
$xmlcode .= "\t\t<item>\n\t\t\t<title>".$myrow[title]."</title>\n\t\t\t<link>"
.$link."</link>\n\t\t\t<description>".$txt
."</description>\n\t\t\t<pubDate>".$datePOST."</pubDate>\n\t\t</item>\\n";
}
while($myrow = mysql_fetch_array($rssRESULT));
$end = "\t</channel>\n</rss>";//закрываем теги xml документа
$result = $header.$xmlcode.$end;//склеиваем части xml кода
$rssFILE = fopen("../rss/rss.xml", "w+");//открываем файл rss ленты
fwrite($rssFILE,$result);//записываем в него полученный xml код
fclose($rssFILE);//закрываем rss ленту

При таком коде у меня не обновлялось, а вот при таком все получилось:

...
//генерируем xml код
$xmlcode .= "\t\t<item>\n\t\t\t<title>".$myrow[title]."</title>\n\t\t\t<link>"
.$link."</link>\n\t\t\t<description>".$txt
."</description>\n\t\t\t<pubDate>".$datePOST."</pubDate>\n\t\t</item>\n";
}
while($myrow = mysql_fetch_array($rssRESULT));
}
$end = "\t</channel>\n</rss>";//закрываем теги xml документа
$result = $header.$xmlcode.$end;//склеиваем части xml кода

$rssFILE = fopen("../rss/rss.xml", "w+");//открываем файл rss ленты
fwrite($rssFILE,$result);//записываем в него полученный xml код
fclose($rssFILE);//закрываем rss ленту
}


Не уверен ошибка ли это, но кстати в site.xml у меня тоже не обновлялось. И мой вариант и там решил проблему. У вас все обновляется с вашим вариантом?
Спасибо.
Алексей, 15 Апреля 2013 г. 21:25 пишет:
Автор
Я так понял Вы закрыли условие if сразу после цикла while. Да, это позволило бы обновлять rss ленту при каждом запуске скрипта.

Вообще по идеи строчка:

if($addrss != $viewrss) rss($server_root);//если пункт был изменен, то запускаем функцию rss()

призвана определить, нужно ли пересоздать rss ленту, или нет.
Данная строчка вроде выполняла свое предназначение. По крайней мере я не помню чтобы у меня были с rss лентой какие либо проблемы.
Ответ для пользователя: Артем
Артем, 15 Апреля 2013 г. 21:55 пишет:
Гость
Странно, но та новость, которая не должна быть в rss канале не удалялась. Когда же я закрыл "if", начала срабатывать только строчка

if($addrss != $viewrss) rss($server_root);

и никаких новостей больше нет, кроме основной информации о сайте. Ошибок это никаких не вызывало, заметил только потому, что у меня 1 новость пока и я играю с ее настройками, чтобы полностью протестировать.
Алексей, 16 Апреля 2013 г. 10:28 пишет:
Автор
Ясно в чем дело. Да, наблюдался такой глюк, когда в БД всего одна заметка. При удаление ее из RSS лены она не удалялась. Я не стал ничего исправлять, так как в боевых условиях заметок на блоге больше одной =)
Ответ для пользователя: Артем
Алексей, 12 Мая 2015 г. 07:50 пишет:
Читатель
Не понимаю как пользоваться rss лентой) Подскажите как ее просмотреть можно?
Алексей, 12 Мая 2015 г. 10:03 пишет:
Автор
Если мне память не изменяет, то rss лента должна быть вот по этому адресу (пример)
http://site.ru/rss/rss.xml
Ответ для пользователя: Алексей