Нужна помощь по сниппету прямой эфир

Главные вкладки

Аватар пользователя nayone nayone 4 мая 2010 в 1:00

Итак вот такой код сниппета который выводит прямой эфир
Очень хорошее решение для оживления общения на сайте, но есть одно но, выводятся комментарии которые еще не прошли модерацию.

+ Даже если формат ввода установлен как фильтрованый html всеравно в блоке со сниппетом отлично выводится голый html

Сниппет известный, к сожалению в таком исполнении он больше похож на мечту спаммера а не рабочий вариант.

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

<?php
 $number=5;
 $result = db_query_range(db_rewrite_sql(
 "SELECT n.type,n.title,n.nid,cm.cid,u.uid,u.name,cm.cnt,cc.timestamp, cc.comment
 FROM {node_comment_statistics} nc JOIN {node} n ON nc.comment_count > 0 AND n.nid=nc.nid
 INNER JOIN (SELECT max(c.cid) as cid ,c.nid,count(c.cid) as cnt  FROM {comments} c GROUP by c.nid ) cm
 ON cm.nid=n.nid
 INNER JOIN {comments} cc ON cc.cid=cm.cid
 INNER JOIN {users} u ON u.uid=cc.uid
 ORDER BY nc.last_comment_timestamp DESC"
),0,$number);
 $items=array();
 while($comment=db_fetch_object($result)){
 $items[] = '<b>'.theme('username',user_load($comment->uid)).
 ':</b> '. l($comment->title.' ('.$comment->cnt.')', 'node/'.
$comment->nid, array('fragment' => 'comment-'. $comment->cid)) . ": " . drupal_substr($comment->comment, 0, 199);
 }
 if(count($items)){
  print theme('item_list',$items);
 }
?>

Комментарии

Аватар пользователя olk olk 4 мая 2010 в 10:12

Ну первая проблема решается довольно просто

SELECT n.type,n.title,n.nid,cm.cid,u.uid,u.name,cm.cnt,cc.timestamp, cc.comment, cc.format
FROM {node_comment_statistics} nc JOIN {node} n ON nc.comment_count > 0 AND n.nid=nc.nid
INNER JOIN (SELECT max(c.cid) as cid ,c.nid,count(c.cid) as cnt FROM {comments} c WHERE c.status=0 GROUP by c.nid ) cm
ON cm.nid=n.nid
INNER JOIN {comments} cc ON cc.cid=cm.cid
INNER JOIN {users} u ON u.uid=cc.uid
ORDER BY nc.last_comment_timestamp DESC

cc.format понадобиться в дальнейшем для прогонки фильтров ...
Для решения второй надо содержание комментария прогнать через check_markup примерно так (в теле цикла)

$comment->comment = check_markup($comment->comment, $comment->format, FALSE);

В третьих, в этом сниппете не совсем корректно строится ссылка на комментарий (не учитывается пейджинг комментариев),
правильней будет примерно так (кстати вызов user_load тут тоже лишний):

 
  $query = comment_new_page_count($comment->cnt, 1, $comment);
  $items[] = '<strong>' . theme('username',$comment) . ':</strong>' .
  l($comment->title,"node/$comment->nid",
   array(
  'query' => $query,
  'fragment' => 'comment-'.$comment->cid,
  'html' => TRUE,
  'attributes'=>array('title'=>'Перейти к последнему комментарию')
  )) . ':' .  drupal_substr($comment->comment, 0, 199);

Тут при применении drupal_substr есть опасность остаться с незакрытым тэгом, поэтому я бы не советовал обрезать комментарий,
или попробовать просканировать результат и закрыть не закрытые тэги (вроде должна быть подобная функция в апи при построении тизера - самому искать лень)

Аватар пользователя Valeratal Valeratal 5 мая 2010 в 10:20

Хм, у меня такой же снип интересно

<?php<div class="live">
<?php
 $number
=15;
 
$result db_query_range(db_rewrite_sql(
 
"SELECT n.type,n.title,n.nid,cm.cid,u.uid,u.name,cm.cnt,cc.timestamp  
 FROM {node_comment_statistics} nc JOIN {node} n ON nc.comment_count > 0 AND n.nid=nc.nid
 INNER JOIN (SELECT max(c.cid) as cid ,c.nid,count(c.cid) as cnt  FROM {comments} c GROUP by c.nid ) cm 
 ON cm.nid=n.nid
 INNER JOIN {comments} cc ON cc.cid=cm.cid
 INNER JOIN {users} u ON u.uid=cc.uid 
 ORDER BY nc.last_comment_timestamp DESC"
),0,$number);
 
$items=array();
 while(
$comment=db_fetch_object($result)){
$items[] = '<div><dt class="uname">' theme('username',user_load($comment->uid)) .
 
':</dt>&nbsp;<dd class="where">' l($comment->title.' ('.$comment->cnt.')''node/'
$comment->nid, array('fragment' => 'comment-'$comment->cid)) . '</dd>';
 } 
 if(
count($items)){
    print 
'<div class="on-air"><dl>';
    foreach (
$items as $item) {
      print 
$item;
    } 
    print 
'</dl></div></div>';
 }
?>
<div class="read_more"><a href="/comments/recent">подробнее</a></div>?>

nayone
Можно Вас попросить опубликовать Ваш новый вариант сниппета последних комментариев

Аватар пользователя nayone nayone 5 мая 2010 в 21:28

"Valeratal" wrote:
nayone
Можно Вас попросить опубликовать Ваш новый вариант сниппета последних комментариев

ну подружить с фильтром у меня так и не получилось, все равно в блоке вывода упорно анкоры проходят при настроенных фильтрах

Аватар пользователя olk olk 5 мая 2010 в 22:39

Пару тройку дней подождите, в связи с довольно частыми вопросами по этому (когда то давно мной предложенному) сниппету взялся написать небольшой модуль ...
В отличие от снипета модуль будет более универсальным (хотя может это и «велосипед» но все же Smile )
Что будет:
1. Возможность настройки вывода через темлэйт файл (отдельно итем для блока и страницы)
2. В переменных шаблона предполагаю следующие (которые можно будет варьировать в шаблоне)
Имя (линк на профиль если не анонимус) на автора последнего комментария
Аватар автора последнего комментария
Тайтл (линк) комментируемой ноды
Наименование типа ноды
Количество комментариев
адрес ссылки на последний комментарий
Дата-время последнего комментария
Дата-время создания ноды
Автор ноды (линк на профиль)
Аватар автора ноды
Кусок комментария длиной определенной в конфиге (либо весь комментарий)

3. Ну еще несколько настроек, как то количесвто элементов в блоке и количество элементов в странице и т.п.

т.е. варьируя эти переменные в шаблоне можно будет достаточно просто получить блок "Прямой эфир" допустим как на хабрахабре

Если у кого есть предложения, какие еще переменные и настройки добавить - предлагайте.