Итак вот такой код сниппета который выводит прямой эфир
Очень хорошее решение для оживления общения на сайте, но есть одно но, выводятся комментарии которые еще не прошли модерацию.
+ Даже если формат ввода установлен как фильтрованый html всеравно в блоке со сниппетом отлично выводится голый html
Сниппет известный, к сожалению в таком исполнении он больше похож на мечту спаммера а не рабочий вариант.
Подскажите как, что, где можно изменить что бы применить фильтры, либо хотя бы брать комментарии только из уже прошедших модерацию.
$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);
}
?>
Комментарии
Ну первая проблема решается довольно просто
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 есть опасность остаться с незакрытым тэгом, поэтому я бы не советовал обрезать комментарий,
или попробовать просканировать результат и закрыть не закрытые тэги (вроде должна быть подобная функция в апи при построении тизера - самому искать лень)
Благодарю за подробно, попробуем..
Хм, у меня такой же снип интересно
<?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> <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
Можно Вас попросить опубликовать Ваш новый вариант сниппета последних комментариев
ну подружить с фильтром у меня так и не получилось, все равно в блоке вывода упорно анкоры проходят при настроенных фильтрах
я бы и без фильтра был бы рад
всеж таки не грузить user_load
Пару тройку дней подождите, в связи с довольно частыми вопросами по этому (когда то давно мной предложенному) сниппету взялся написать небольшой модуль ...
В отличие от снипета модуль будет более универсальным (хотя может это и «велосипед» но все же )
Что будет:
1. Возможность настройки вывода через темлэйт файл (отдельно итем для блока и страницы)
2. В переменных шаблона предполагаю следующие (которые можно будет варьировать в шаблоне)
Имя (линк на профиль если не анонимус) на автора последнего комментария
Аватар автора последнего комментария
Тайтл (линк) комментируемой ноды
Наименование типа ноды
Количество комментариев
адрес ссылки на последний комментарий
Дата-время последнего комментария
Дата-время создания ноды
Автор ноды (линк на профиль)
Аватар автора ноды
Кусок комментария длиной определенной в конфиге (либо весь комментарий)
3. Ну еще несколько настроек, как то количесвто элементов в блоке и количество элементов в странице и т.п.
т.е. варьируя эти переменные в шаблоне можно будет достаточно просто получить блок "Прямой эфир" допустим как на хабрахабре
Если у кого есть предложения, какие еще переменные и настройки добавить - предлагайте.
спасибо, буду ждать