Комментарии, форма комментариев, порядок вывода.

Доброго времени суток всем.

Потратил много времени на поиск, перечитал ФАКу и не нашел ответов.
Нужно изменить порядок вывода комментариев.
Нужно, что бы новые комментарии отображались сверху
Форма комментариев тоже должна отображаться вверху и быть все время активна. А надпись «Добавить комментарий» вообще убрать.
Все решения данной проблемы для старых версий ЛС.
Прошу совета бывалых.

Итоги:

Новые комментарии отображаются сверху.
Форма добавления комментариев тоже находится вверху, сразу под топиком, но не активная, все равно нужно нажимать на ссылку (это не решено)
Древовидный вывод комментариев при таком выводе комментариев не используется.
Все эти приблуды доступны и гостям сайта(используется плагин OpenComments), заценить можно здесь allorg.com.ua/

Спасибо за советы и верное направление 1099511627776 и aex
С ув. O3OH

36 комментариев

avatar
Попробуйте для начала в templates/comment_tree.tpl все что после:

{hook run='comment_tree_end' iTargetId=$iTargetId sTargetType=$sTargetType}

Перекинуть в верх. Это должно перекинуть форму ввода на верх
avatar
Спасибо, но не помогло.
avatar
Вообщем вывернул код наизнанку, уже и не знаю, что куда перебросил, но вышло! Спасибо!
avatar
Нужно, что бы новые комментарии отображались сверху
Тогда возможно Вам надо будет отказаться от древовидной структуры
И погуглить на тему " Smarty foreach reverse ". К примеру здесь www.sitepoint.com/forums/showthread.php?410459-Smarty-reverse-order-of-a-foreach
avatar
Как говорится «Угадал все буквы, но не прочитал слово», читал, спасибо за ссылку, но ничего не понял…
avatar
Чтобы новые комменты сверху были? Чем это не подходит?
  • aex
  • 0
avatar
Описано как
В файле /classes/modules/comment/mapper/Comment.mapper.class.php найти функцию
public function GetCommentsByTargetId($sId,$sTargetType)
и в ней найти строчку
ORDER by comment_id asc;
и поменять в ней asc на desc.

Делаю так как описано, но смущает, что это «Получить комменты по владельцу»
/**
	 * Получить комменты по владельцу
	 *
	 * @param  int $sId	ID владельца коммента
	 * @param  string $sTargetType	Тип владельца комментария
	 * @return array
	 */
	public function GetCommentsByTargetId($sId,$sTargetType) {
		$sql = "SELECT 
					comment_id,					
					comment_id as ARRAY_KEY,
					comment_pid as PARENT_KEY
				FROM 
					".Config::Get('db.table.comment')."
				WHERE 
					target_id = ?d 
					AND			
					target_type = ?
				ORDER by comment_id desc;	
					";
		if ($aRows=$this->oDb->select($sql,$sId,$sTargetType)) {
			return $aRows;
		}
		return null;
	}


После замены ничего не меняется, а таких функций с таким значением еще много…
avatar
Во всех найденых строчках «ORDER by comment_id asc;» поменял asc на desc. Помогло. Спасибо.
avatar
Можешь показать свой сайт? Интересно глянуть, как выглядит дерево ответов на комментарий.
avatar
Дерево ответов на комментарий невозможно использовать, если разрешить в конфиге вложенность, то летит к чертям вся верстка… я с этим еще не разобрался, а сайт мой allorg.com.ua/
avatar
Почему не возможно? Ну вот, смотри, старые коменты внизу, новые вверху, ответы идут, как положено, ветками. Вложенность в конфиге разрешена. Верстка не летит. Все ОК.

avatar
Как? Подскажите?
avatar
Ну там же написано. Вывод ппоменяй на desc. Не везде, а там где тебе нужно.
avatar
А я везде поменял…
avatar
Можете мне дать код Вашего файла Comment.mapper.class.php?
avatar
У тебя же такой же самый, только две буковки отличаются :) Поменяй их и будет, как у меня.
avatar
Я перепробовал всевозможные варианты замены двух буковок, не получается… вот и прошу код у Вас.
avatar
Сейчас выложу куда-нибудь, скачаешь.
avatar
Ссылка в личке.
avatar
Спасибо!
avatar
Сделал все как написано, частично не получается…
Пишу комментарий, нажимаю «Опубликовать», он добавляется в конец всех комментариев, при обновлении страницы встает на первое место… В целом, комментарии стали выводится как нужно, но этот баг с обновлением страниц напрягает, не подскажете где копать? Почему он сначала попадает в конец, а при обновлении в начало? Было предположение что копать нужно в comment_tree.tpl, нашел вот такую конструкцию на 63 строчке:

{assign var="nesting" value="-1"}
	{foreach from=$aComments item=oComment name=rublist}
		{assign var="cmtlevel" value=$oComment->getLevel()}
		
		{if $cmtlevel>$oConfig->GetValue('module.comment.max_tree')}
			{assign var="cmtlevel" value=$oConfig->GetValue('module.comment.max_tree')}
		{/if}
		
		{if $nesting < $cmtlevel} 
		{elseif $nesting > $cmtlevel}    	
			{section name=closelist1  loop=$nesting-$cmtlevel+1}</div>{/section}
		{elseif not $smarty.foreach.rublist.first}
			</div>
		{/if}
		
		<div class="comment-wrapper" id="comment_wrapper_id_{$oComment->getId()}">
		
		{include file='comment.tpl'} 
		{assign var="nesting" value=$cmtlevel}
		{if $smarty.foreach.rublist.last}
			{section name=closelist2 loop=$nesting+1}</div>{/section}    
		{/if}
	{/foreach}


Пробовал менять Last на Frist, частично получилось, теперь коммент при нажатии на кнопку «Опубликовать» добавляется ВТОРЫМ по счету, почему хоть не первым??? Помогите пожалуйста, уже всю голову сломал, где это исправить?
avatar
Я решил проблему, опять частично)))
в начале {assign var=«nesting» value="-1"} поменял value="-1" на +1… опубликованные комментарии начали сразу выводится сверху, но есть проблема, если после него добавить еще один, он будет выводится после предыдущего, а не над ним… после обновления страницы структура приходит в норму… будем дальше пыхтеть и эксперементировать
avatar
все перепробовал, моих знаний и сил не хватает… Сообщество, направьте на верный путь
avatar
Копать надо в comments.js
// Вставка комментария
	this.inject = function(idCommentParent, idComment, sHtml) {
		var newComment = $('<div>', {'class': 'comment-wrapper', id: 'comment_wrapper_id_'+idComment}).html(sHtml);
		if (idCommentParent) {
			// Уровень вложенности родителя
			var iCurrentTree = $('#comment_wrapper_id_'+idCommentParent).parentsUntil('#comments').length;
			if(iCurrentTree == ls.registry.get('comment_max_tree')) {
				// Определяем id предыдушего родителя
				var prevCommentParent = $('#comment_wrapper_id_'+idCommentParent).parent();
				idCommentParent = parseInt(prevCommentParent.attr('id').replace('comment_wrapper_id_',''));
			}
			$('#comment_wrapper_id_'+idCommentParent).append(newComment);
		} else {
			$('#comments').append(newComment);
		}
		ls.hook.run('ls_comment_inject_after',arguments,newComment);
	};


Вот это
$('#comments').append(newComment);

менять надо на то, что вам нужно.
Например,
if ($('#comments > .comment-wrapper').length)
    $('#comments > .comment-wrapper:first').before(newComment);
else 
    $('#comments').append(newComment);
avatar
А как быть со вложенными комментариями? они все равно отображаются в конце подсписка и становятся на место только после перезагрузки страницы.
avatar
$('#comment_wrapper_id_'+idCommentParent).append(newComment); — что нужно изменить здесь?
avatar
по идее не должны:
$('#comments > .comment-wrapper:first').before(newComment);

тут стоит before
avatar
Не, дочерние списки добавляются именно в приведенном мной строке, а потому не подпадают под приведенную Вами ветку.
avatar
в той строке комментарии добавляются с самым верхним уровнем, а не при ответе на другой комментарий
avatar
Перепроверил только что. ответы на посты вставляет именно строка $('#comment_wrapper_id_'+idCommentParent).append(newComment);
avatar
попробуйте тогда prepend вместо append
avatar
Опробовано. тогда комментарий сразу появляется выше родительского поста.
avatar
вы хотите, чтобы в дочерних было от новых к старым? Тогда же потеряется суть ответов
avatar
Самому эта идея не нравится, начальство настаивает. Хотя уже почти переубедил. Но ведь ответы итак будут по убыванию даты показываться, если GetCommentsByTargetId сортировать comment_id BY desc, все равно ответы будут выстраиваться по убыванию.
avatar
Тогда меняйте ту строчку на
$('#comment_wrapper_id_'+idCommentParent+' .comment:eq(0)').after(newComment);
avatar
Спасибо, помогло.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.