Всем привет!
Недавно опробовал замечательный сниппет для комментариев Jot.
Обычный UserComments был просто подобием на систему комментов, ибо был писан как компромисс для системы, в которой комментарии не предусмотрены изначально. Jot восполняет этот пробел, и предостаавляет человеческое комментирование. Среди моментов, наиболее мне понравившихся:
- Возможность редактирования польователем своих комментов
- Отдельная таблица в базе для комментариев
- Более высока надежность, список запрещенных слов и т.д.
- Премодерация (за это особенное спасибо!
- Высока гибкость вывода за счет интеграции с PHx
- ну и по мелочам... всем советую!
Правда, генерит просто нечеловеческое количество запросов, ибо на простую страницу и още выходит по 40 запросов...
Но о чем, собственно, я хочу сказать.... Слюняво вглядываясь в кнопочки "Подписаться на RSS для комментариев" на других блогах, я задался вопросом, почему б не прикрутить и себе. Начал рыться в репозитории, и в мануалах по Jot, но таковой функции не нашел... Казалось бы просто, и мудрить особо не надо, ведь подписка на почту там есть.
В итоге, пришел к выводу, что неплохо бы подобную штуку и написать, коль в её еще нет...
Так что написал. Сниппет пока в
стадии бета-теста, сам xml валидация проходит не до конца, но работает в агрегаторах вроде исправно.
Кому интересно, можете взглянуть.
<?php
/*
JotRSS — сниппет, подключающий все записи в базе Jot к RSS ленте,
Использование:
Создайте новый сниппет и назовите его "JotRSS"
Создайте новую страницу и установите следующие параметры:
* Заголовок JotRSS
* Псевдоним jot_rss
* Шаблон — "blank"
* Отображать в меню - нет
* Опебликовано - да
* Тип содержимого "text/xml"
На странице подключите сниппет: [!JotRSS!]
И RSS лента с комментариями будет доступна по адресу http://www.ваш_сайт.ru/jot_rss/
*/
/* Параметра */
// Время ttl
$ttl = ($ttl) ? intval($ttl):120;
// Копирайты
$copyright = isset($copyright) ? $copyright:'© «A priori» 2006';
// Название ленты
$title = isset($title) ? $title:'«A priori» RSS — Подписка на комментарии';
// e-mail администратора
$webadmin = isset($webadmin) ? $webadmin:'[email protected]';
// Описание ленты
$description = isset($description) ? $description:'';
// Строка "Генератор лены"
$generator = isset($generator) ? $generator:'JotRSS, powered by MODx CMF © Tonatos';
// Количество комментариев в ленте, 0 - все комментарии
$topitems = isset($topitems) ? $topitems : 20;
/* Код */
include_once($modx->config['rb_base_dir'] . 'snippets/jot/includes/jot.db.class.inc.php');
global $modx;
function closeTags($text) {
$openPattern = "/<([^\/].*?)>/";
$closePattern = "/<\/(.*?)>/";
$endOpenPattern = "/<([^\/].*?)$/";
$endClosePattern = "/<(\/.*?[^>])$/";
$endTags='';
//$text=preg_replace($endOpenPattern,'',$text);
//$text=preg_replace($endClosePattern,'',$text);
preg_match_all($openPattern,$text,$openTags);
preg_match_all($closePattern,$text,$closeTags);
//print_r($openTags);
//print_r($closeTags);
$c=0;
$loopCounter = count($closeTags[1]); //used to prevent an infinite loop if the html is malformed
while($c<count($closeTags[1]) && $loopCounter) {
$i=0;
while($i<count($openTags[1])) {
$tag = trim($openTags[1][$i]);
if(strstr($tag,' ')) {
$tag = substr($tag,0,strpos($tag,' '));
}
//echo $tag.'=='.$closeTags[1][$c]."\n";
if($tag==$closeTags[1][$c]) {
$openTags[1][$i]='';
$c++;
break;
}
$i++;
}
$loopCounter--;
}
$results = $openTags[1];
$results = preg_replace("'<img*>'", '', $results);
if(is_array($results)) {
$results = array_reverse($results);
foreach($results as $tag) {
$tag = trim($tag);
if(strstr($tag,' ')) {
$tag = substr($tag,0,strpos($tag,' '));
}
if(!stristr($tag,'br') && !stristr($tag,'img') && !empty($tag)) {
$endTags.= '</'.$tag.'>';
}
}
}
return $text.$endTags;
}
$content = $modx->getFullTableName('jot_content');
$select_base = new CJotDataDb;
$orderby = ' order by id desc ';
$viewtype = ' and published = 1 ';
$sql = "select * from " . $content . " where mode = '0' " . $viewtype . $orderby;
$array_comments = $select_base->GetCommentsArray($sql);
$count = count($array_comments);
$pid = "id=";
for ($i = 0; $i < $count; $i++) {
$pid[$i]= $array_comments[$i]["uparent"];
}
$query = "SELECT id, pagetitle, alias FROM ". $modx->getFullTableName("site_content");
if (!$rs = $modx->db->query($query)) {
return '';
}
while ($row = $modx->db->getRow($rs)) {
$resource[] = $row;
}
$b_count = count($resource);
for ($i=0; $i<$count; $i++) {
for ($j=0; $j<$b_count; $j++) {
if ($array_comments[$i]["uparent"] == $resource[$j]["id"]) {
$content_value[$i]["title"] = $resource[$j]["pagetitle"];
$content_value[$i]["alias"] = $resource[$j]["alias"];
}
}
}
$current_page = $modx->config['site_url'].$modx->makeUrl($modx->documentIdentifier);
$exportRSS.= '<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>'.$title.'</title>
<link>'.$current_page.'</link>
<description>'.$description.'</description>
<language>ru</language>
<copyright>'.$copyright.'</copyright>
<webMaster>'.$webadmin.'</webMaster>
<ttl>'.$ttl.'</ttl>
<generator>'.$generator.'</generator>'."\n\n";
if ($topitems!=0&&$count>$topitems) {
$count = $topitems;
}
for ($i = 0; $i < $count; $i++) {
if (intval($array_comments[$i]["createdby"]) < 0) {
$user = $modx->getWebUserInfo(-($array_comments[$i]["createdby"]));
} else {
$user = $modx->getUserInfo($array_comments[$i]["createdby"]);
}
$link = $modx->config['site_url']."[~".$array_comments[$i]["uparent"]."~]#comment_place";
$exportRSS.= ' <item>'."\n";
$exportRSS.= ' <title>'.$content_value[$i]["title"].' — '.$array_comments[$i]["title"].'</title>'."\n";
$exportRSS.= ' <link>'.$link.'</link>'."\n";
$exportRSS.= ' <author>'.$user["username"].'</author>'."\n";
$exportRSS.= ' <description>'."\n";
$exportRSS.= ' <![CDATA['.closeTags($array_comments[$i]["content"]).']]>'."\n";
$exportRSS.= ' </description>'."\n";
$exportRSS.= ' <pubDate>'.strftime('%a %B %d, %Y, %H:%M:%S', $array_comments[$i]["createdon"]).'</pubDate>'."\n";
$exportRSS.= ' </item>'."\n\n";
}
$exportRSS.= ' </channel>
</rss>';
$output = $exportRSS;
return $output;
?>
Еще раз повторю, что не до конца дотестил его, и не факт, что он надежен. Есл кто найдет ошибки, буду рад их поправить...
Рабочий пример
http://tonatos.ru/feed_comment/