Вывод Личных сообщений в обратном порядке, движок XenForo 1.1.3.

Omega_Cool

Новичок
Помогите пожалуйста реализовать вывод Личных сообщений в XenForo в обратном порядке
Мне просто не понятна структура запросов в XenForo и в каких она местах хранится

Я лишь нашёл вывод текста личных сообщений, хранится он тут
 

Omega_Cool

Новичок
Так, ладно, справился с выводом в обратном порядке, добавив

PHP:
		if (!empty($this->_params['canReplyConversation']))
		{

			$this->_params['qrEditor'] = XenForo_ViewPublic_Helper_Editor::getQuickReplyEditor($this, 

'message');

		}
	}
}
это

PHP:
			$this->_params['messages'] = array_reverse($this->_params['messages']);
Но теперь проблема в другом, сообщения то показываются в обратном порядке, но 1ая страница осталась первой, а вторая осталась второй, а нужно что бы на первой выводились последние сообщения
 

Omega_Cool

Новичок
и вод код отвечающий за это

PHP:
	/**
	 * Displays a conversation.
	 *
	 * @return XenForo_ControllerResponse_Abstract
	 */
	public function actionView()
	{
		$conversationId = $this->_input->filterSingle('conversation_id', XenForo_Input::UINT);
		$conversation = $this->_getConversationOrError($conversationId);

		$page = $this->_input->filterSingle('page', XenForo_Input::UINT);
		$messagesPerPage = XenForo_Application::get('options')->messagesPerPage;

		$conversationModel = $this->_getConversationModel();

		$recipients = $conversationModel->getConversationRecipients($conversationId);
		$messages = $conversationModel->getConversationMessages($conversationId, array(

			'perPage' => $messagesPerPage,
			'page' => $page,

		));

		$conversation['showMarkRead'] = $conversation['isNew'];

		$maxMessageDate = $conversationModel->getMaximumMessageDate($messages);
		if ($maxMessageDate > $conversation['last_read_date'])
		{
			$conversationModel->markConversationAsRead(
				$conversationId, XenForo_Visitor::getUserId(), $maxMessageDate, $conversation

['last_message_date']
			);

			$conversation['showMarkRead'] = false;
		}

		$attachmentParams = $conversationModel->getAttachmentParams($conversation, array(
			'conversation_id' => $conversationId
		));

		$messages = $conversationModel->getAndMergeAttachmentsIntoConversationMessages($messages);

		$messages = $conversationModel->prepareMessages($messages, $conversation);

		$viewParams = array(
			'conversation' => $conversation,
			'recipients' => $recipients,

			'canEditConversation' => $conversationModel->canEditConversation($conversation),
			'canReplyConversation' => $conversationModel->canReplyToConversation($conversation),
			'canInviteUsers' => $conversationModel->canInviteUsersToConversation($conversation),

			'attachmentParams' => $attachmentParams,
			'attachmentConstraints' => $this->getModelFromCache('XenForo_Model_Attachment')-

>getAttachmentConstraints(),
			'canViewAttachments' => $conversationModel->canViewAttachmentOnConversation($conversation),

			'messages' => $messages,
			'lastMessage' => end($messages),
			'page' => $page,
			'messagesPerPage' => $messagesPerPage,
			'totalMessages' => $conversation['reply_count'] + 1
		);

		return $this->responseView('XenForo_ViewPublic_Conversation_View', 'conversation_view', $viewParams);
	}
 

Beavis

Banned
в запросе к базе данных, который получает список сообщений, укажи направление сортировки с помощью ORDER BY
 

Omega_Cool

Новичок
в запросе к базе данных, который получает список сообщений, укажи направление сортировки с помощью ORDER BY
так вот я и прошу уточнить куда и как вставить, я привык работать с запросами типо $sql SELECT * FROM t1 WHERE бла бла бла... а тут таких не имеется
 

Beavis

Banned
может ещё за тебя всё сделать?
тебе же сказали "в conversationModel"
ты нашёл класс conversationModel ? или нам за тебя поискать?
 

Omega_Cool

Новичок
может ещё за тебя всё сделать?
тебе же сказали "в conversationModel"
ты нашёл класс conversationModel ? или нам за тебя поискать?
PHP:
		$conversationModel = $this->_getConversationModel();
PHP:
		$recipients = $conversationModel->getConversationRecipients($conversationId);
		$messages = $conversationModel->getConversationMessages($conversationId, array(

			'perPage' => $messagesPerPage,
			'page' => $page,

		));
Я прошу помочь... если бы сам мог разабраться я бы вообще не писал тут
 

Beavis

Banned
сделай
PHP:
echo get_class($conversationModel);
, посмотри в каком классе находится код, залезь туда и смотри разбирайся
 

Omega_Cool

Новичок
допустим вставил, обновил страницу,
получилось - XenForo_Model_Conversation
Мб что то не правильно сделал. Чё то я ваще туплю
 

Вурдалак

Продвинутый новичок
Теперь найди XenForo_Model_Conversation (если, например, у тебя NetBeans, то Ctrl + O), там найди метод getConversationMessages() и исправь что нужно.
 

Omega_Cool

Новичок
PHP:
	public function actionPopup()
	{
		$visitor = XenForo_Visitor::getInstance();
		$conversationModel = $this->_getConversationModel();

		$maxDisplay = 10;

		$conversationsUnread = $conversationModel->getConversationsForUser($visitor['user_id'],
			array('is_unread' => true),
			array(
				'join' => XenForo_Model_Conversation::FETCH_LAST_MESSAGE_AVATAR,
				'limit' => $maxDisplay
			)
		);

PHP:
		if (count($conversationsUnread) < $maxDisplay)
		{
			$cutOff = XenForo_Application::$time - 3600 * XenForo_Application::get('options')-

>conversationPopupExpiryHours;

			$conversationsRead = $conversationModel->getConversationsForUser($visitor['user_id'],
				array(
					'is_unread' => false,
					'last_message_date' => array('>', $cutOff)
				),
				array(
					'join' => XenForo_Model_Conversation::FETCH_LAST_MESSAGE_AVATAR,
					'limit' => $maxDisplay - count($conversationsUnread)
				)
			);
		}
		else
		{
			$conversationsRead = array();
		}
PHP:
		$fetchOptions = array();
		if ($fetchFirstMessage)
		{
			$fetchOptions['join'] = XenForo_Model_Conversation::FETCH_FIRST_MESSAGE;
		}

PHP:
	protected function _getConversationModel()
	{
		return $this->getModelFromCache('XenForo_Model_Conversation');
	}
Вот они все..., но ничего похожего на getConversationMessages() я не вижу
 

Вурдалак

Продвинутый новичок
Тебе нужно найти где определяется класс XenForo_Model_Conversation, что ты показываешь какие-то рандомные куски?
 

Omega_Cool

Новичок
Спасибо, сюда DESC вставил

PHP:
	public function getConversationMessages($conversationId, array $fetchOptions = array())
	{
		$limitOptions = $this->prepareLimitFetchOptions($fetchOptions);

		return $this->fetchAllKeyed($this->limitQueryResults(
			'
				SELECT message.*,
					user.*, IF(user.username IS NULL, message.username, user.username) AS username,
					user_profile.*
				FROM xf_conversation_message AS message
				LEFT JOIN xf_user AS user ON
					(user.user_id = message.user_id)
				LEFT JOIN xf_user_profile AS user_profile ON
					(user_profile.user_id = message.user_id)
				WHERE message.conversation_id = ?
				ORDER BY message.message_date DESC
			', $limitOptions['limit'], $limitOptions['offset']
		), 'message_id', $conversationId);
	}
Решено ;)
 

Omega_Cool

Новичок
только вот конечно с выводом новых сообщений проблема, они выводятся так же ниже всего текста, а ещё функция "Есть ещё сообщения. Посмотреть их?" пытаясь перенести на вторую страницу выдаёт

Mysqli prepare error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'message.*, user.*, IF(user.username IS NULL, message.username, user.usernam' at line 1

Zend_Db_Statement_Mysqli->_prepare() in Zend/Db/Statement.php at line 115
Zend_Db_Statement->__construct() in Zend/Db/Adapter/Mysqli.php at line 381
Zend_Db_Adapter_Mysqli->prepare() in Zend/Db/Adapter/Abstract.php at line 478
Zend_Db_Adapter_Abstract->query() in Zend/Db/Adapter/Abstract.php at line 753
Zend_Db_Adapter_Abstract->fetchRow() in XenForo/Model/Conversation.php at line 51
XenForo_Model_Conversation->getConversationMessageById() in XenForo/ControllerPublic/Conversation.php at line 315
XenForo_ControllerPublic_Conversation->actionMessage() in XenForo/FrontController.php at line 310
XenForo_FrontController->dispatch() in XenForo/FrontController.php at line 132
XenForo_FrontController->run() in E:/AppServ/www/index.php at line 13
 

Вурдалак

Продвинутый новичок
Судя по трейсу тут не вызывается getConversationMessages(), т.е. проблема в чём-то другом. В getConversationMessageById(), например.
 

Omega_Cool

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

Вурдалак

Продвинутый новичок
Помогите пожалуйста реализовать вывод Личных сообщений в XenForo в обратном порядке
Но теперь проблема в другом, сообщения то показываются в обратном порядке, ..., а нужно что бы на первой выводились последние сообщения
Я вообще не понимаю что ты хочешь: по умолчанию в XenForo, как я вижу, сообщения выводятся от новых к старым, ты просил выводить в обратном порядке, то есть от старых к новым, но почему-то удивляешься теперь почему новые оказываются не на первой странице. А где им быть?
 
Сверху