Пагинация комментариев

Столкнулся с проблемой... Сам не уверен, что смогу понятно объяснить суть проблемы. В общем, есть блок комментариев (Он находится практически под каждым объектом на стенке + на странице самого объекта), отображаются последние 10 комментов, чтобы просмотреть предыдущие 10 надо нажать на кнопку Предыдущие комментарии 20 / 89 (цифры 20 / 89 могут быть другие). Комментарии постоянно добавляются и некоторые удаляются, как спам или прочий хлам. Сценарий выполняется отлично, все комменты выводятся по порядку, пока не добавишь или удалишь коммент. После добавления или удаления коммента, нажимая на кнопку Предыдущие комментарии 20 / 89 некоторые комменты могут потеряться или повториться дважды. Добавлением/Удалением коммента я нарушаю корректность пагинации.

Я пробовал добавлять/отнимать количество добавленных/удаленных комментов к лимиту в запрос, это нарушает цепочку пагинации еще больше.

На данный момент накрутил функцию viewMoreFeed в модуле "comment", файла "ajax.class.php":
	public function viewMoreFeed()
	{
		$total = $this->get('total') ? (int) $this->get('total') : null;
		$page  = $this->get('page');
		$pageLimit = phpfox::getParam('comment.comment_page_limit');

		$comments = phpfox::getService('comment')->getCommentsForFeed($this->get('comment_type_id'), $this->get('item_id'), $pageLimit, $total);
		if (!($count = count($comments)))
		{
			phpfox_error::set(phpfox::getPhrase('comment.no_comments'));

			return false;
		}

		if ($pageLimit < $total)
		{
			$count = phpfox::getService('comment')->getCommentsCount($this->get('comment_type_id'), $this->get('item_id'));
		}

		if ($page == 1)
		{
			$totalFeed = phpfox::getParam('comment.total_comments_in_activity_feed');
			if ($count > $total)
			{
				$totalFeed = $totalFeed + ($count - $total);
			}
			else if ($count < $total)
			{
				$totalFeed = $totalFeed - ($total - $count);
			}
			array_splice($comments, -$totalFeed, $count);
		}
		else if ($page > 1 && $count != $total)
		{
			if ($count > $total)
			{
				$pageLimit = $pageLimit - ($count - $total);
			}
			else if ($count < $total)
			{
				$pageLimit = $pageLimit + ($total - $count);
			}
			$comments = phpfox::getService('comment')->getCommentsForFeed($this->get('comment_type_id'), $this->get('item_id'), $pageLimit, $total);
			if (!count($comments))
			{
				phpfox_error::set(phpfox::getPhrase('comment.no_comments'));

				return false;
			}
		}
		$total = $count;

		foreach ($comments as $comment)
		{
			$this->template()->assign([
					'aComment' => $comment,
					'aFeed'    => ['feed_id' => $this->get('item_id')]
				])->getTemplate('comment.block.mini'
			);
		}
		
		if ($this->get('append'))
		{
			$this->prepend('#js_feed_comment_view_more_' . ($this->get('feed_id') ? $this->get('feed_id') : $this->get('item_id')), $this->getContent(false));
			
			phpfox::getLib('pager')->set([
					'ajax'    => 'comment.viewMoreFeed', 
					'page'    => phpfox::getLib('request')->getInt('page'), 
					'size'    => $this->get('pagelimit'), 
					'count'   => $total,
					'phrase'  => phpfox::getPhrase('comment.view_previous_comments'),
					'icon'    => 'misc/comment.png',
					'aParams' => [
						'comment_type_id' => $this->get('comment_type_id'),
						'item_id'   => $this->get('item_id'),
						'append'    => true,
						'pagelimit' => $this->get('pagelimit'),
						'total'     => $total
					]
				]
			);	

			$this->template()->getLayout('pager');
			$this->html('#js_feed_comment_pager_' . ($this->get('feed_id') ? $this->get('feed_id') : $this->get('item_id')), $this->getContent(false));
		}
		else 
		{
			$feedId = $this->get('feed_id') ? $this->get('feed_id') : $this->get('item_id');

			if (($pageLimit < $total) && ceil($total / $pageLimit) > $page)
			{
				$page++;
				$limit = $pageLimit * $page;
				if ($limit > $total)
				{
					$limit = $total;
				}

				$html  = '<a href="#" class="comment_mini_link_block comment_mini_link_block_hidden" style="display: none;" onclick="return false;">' . phpfox::getPhrase('feed.loading') . '</a>';
				$html .= '<a href="' . phpfox::getLib('url')->makeUrl($this->get('comment_type_id'), [$this->get('item_id'), 'comment']) . '" onclick="$(\'#js_feed_comment_ajax_link_' . $feedId . '\').show(); $(this).parent().find(\'.comment_mini_link_block_hidden\').show(); $(this).hide(); $.ajaxCall(\'comment.viewMoreFeed\', \'comment_type_id=' . $this->get('comment_type_id') . '&amp;item_id=' . $this->get('item_id') . '&amp;feed_id=' . $feedId . '&amp;page=' . $page . '&amp;total=' . $total . '\', \'GET\'); return false;" class="comment_mini_link_block no_ajax_link">' . phpfox::getPhrase('comment.view_previous_comments') . ' ' .$limit . ' / ' . $total . '</a>';

				$this->html('#js_feed_comment_view_more_link_' . $feedId . ' .comment_mini_link', $html);
				$this->hide('#js_feed_comment_ajax_link_' . $feedId);
			}
			else
			{
				$this->hide('#js_feed_comment_view_more_link_' . $feedId);
			}

			$this->prepend('#js_feed_comment_view_more_' . $feedId, $this->getContent(false));
		}

		$this->call('$Core.loadInit();');
	}

Работает отлично только для параметра пагинации page со значением 1, следующие значения (2, 3, 4...) работают как попало, после удаления / добавления коммента.
Решил проблему путем изменения выборки комментариев. Выборка осуществлялась с упором на номер страницы и лимитом, я сделал упор на последний комментарий на странице. То есть получаю ID последнего коммента в загруженных комментах и при следующей загрузки комментов, выбираю комменты, которые имеют ID меньше последнего. Надеюсь понятно объяснил.

Есть еще один вариант решения проблемы - сделать сортировку комментов по порядку. На данный момент комментарии выводятся самые последние, разворачиваются предыдущие, "страница" за "страницей". Сделав выборку по порядку, мы избежим подобных проблем.