We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 30354
    • 227 Posts
    Всем привет!
    Недавно опробовал замечательный сниппет для комментариев 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/
      http://www.avizion.ru/ — строим стартап!
      http://tonatos.ru/ — Заходите в гости...
      • 13923
      • 39 Posts
      А в чем смысл RSS для комментариев...? Объясните чайнику =))
        • 30354
        • 227 Posts
        А в чем смысл RSS для комментариев...? Объясните чайнику =))
        Ну как это! smiley
        Подписался на рсс для комментов. фблоге. И следишь за ними: мало ли кто/что ответит! На сайт не приходится заходить, ради того, чтобы проверить ответили или нет на твой конкретный коммент, например.
        Я уже не говорю про самого блоггера, который по правил хорошего тона должен отвечать (или хотя бы видеть!) на все комменты в своем блоге. Иной раз лень заходить, а вдруг кто-нить из стародавнего архива что-нить откомментит - вжисть не найти! smiley
          http://www.avizion.ru/ — строим стартап!
          http://tonatos.ru/ — Заходите в гости...
          • 897
          • 1,620 Posts
          ну так браза! разумнее "мыло" пульнуть.
            "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

            Не используйте Revo для "просто сайтов". Используйте Evo

            Who can defeat the Russian bear?
            • 30354
            • 227 Posts
            Мыло мылом, но RSS универсальнее smiley И в яндекс сунул, и в агрегатор пульнул, и стиль один: не гут, если посты по rss, а комменты мылом. Все в куче!
              http://www.avizion.ru/ — строим стартап!
              http://tonatos.ru/ — Заходите в гости...
              • 13923
              • 39 Posts
              Кстати случайно набрел на тему в форуме http://modxcms.com/forums/index.php/topic,9628.0...
              Может полезно кому.
                • 13923
                • 39 Posts
                Кстати, никто не знает, почему могут недоходить оповещения о новых комментариях Jot... Вроде функцию включил... Может где-то надо указать параметры учетной записи мыла?