Перейти к контенту
  • 0

Кнопочка "к последнему сообщению" в подписках на темы


Вопрос

Прошло пару лет, заглянул опять в движек, ностальгия пробила... Решил опять поиграться. :)

 

Поставил себе задание, вроде не особо сложное:

Отображать в профиле в разделе подписок на темы в случае если в теме есть новое сообщение значек со ссылкой перехода к последнему непрочитанному сообщению.

Тоесть вот этот значек: new_post.png

 

Нашел в скине как это выглядит в просмотре тем:

skin_forum -> render_forum_row

{$data['go_new_post']}

 

Нашел в скине куда я хочу это вставить:

skin_ucp -> subs_row

вставить перед строчкой:

<a href="{$this->ipsclass->base_url}showtopic={$data['tid']}">{$data['title']}</a> 

 

Здесь все вроде просто. Понятное дело что этого не достаточно и надо лезть теперь в файлы.

 

По логике я думаю что надо использовать файл sources -> action_public -> usercp.php

А пример можно брать с sources -> action_public -> topics.php

 

Тут уже сложнее, так как пхп я практически не знаю.

По моим предположениям в оригинальном решении за такую функцию отвечает кусок кода:

		//-----------------------------------------
	// Last time stuff...
	//-----------------------------------------

	if ($last_time  && ($topic['last_post'] > $last_time))
	{
		$this->forum_has_unread_topics++;
		$topic['go_new_post']  = "<a href='{$this->ipsclass->base_url}showtopic={$topic['tid']}&view=getnewpost'><{NEW_POST}></a>";
	}
	else
	{
		$topic['go_new_post']  = "";
	}

Правда коечто уже смутило - переменная используется $topic а не $data. Момента смены переменной я не нашел.

 

Чтобы не усложнять себе жизнь, времено выкенем все лишнее на проверку есть ли новые сообщения, и оставим только:

$topic['go_new_post']  = "<a href='{$this->ipsclass->base_url}showtopic={$topic['tid']}&view=getnewpost'><{NEW_POST}></a>";

Пусть выводит вообще перед всеми темами.

Теперь вопрос как и куда это использовать в файле sources -> action_public -> usercp.php

Имхо самая подходящая функция для этого это function tracker()

Код у нее большой, но навернео для удобства надо вставить сюда:

 	function tracker()
	{
	$this->output .= $this->ipsclass->compiled_templates['skin_ucp']->subs_header();

		//-----------------------------------------
		// Remap...
		//-----------------------------------------

		$remap = array( 'none'      => 'subs_none_title',
					'immediate' => 'subs_immediate',
					'delayed'   => 'subs_delayed',
					'daily'     => 'subs_daily',
					'weekly'    => 'subs_weekly'
				  );

		//-----------------------------------------
		// Get forums module
		//-----------------------------------------

		require_once( ROOT_PATH.'sources/action_public/forums.php' );
		$this->forums = new forums();
		$this->forums->ipsclass =& $this->ipsclass;

		$this->forums->init();

		//-----------------------------------------
		// Are we checking for auto-prune?
		//-----------------------------------------

		$auto_explain = $this->ipsclass->lang['no_auto_prune'];

		if ($this->ipsclass->vars['subs_autoprune'] > 0)
		{
		$auto_explain = sprintf( $this->ipsclass->lang['auto_prune'], $this->ipsclass->vars['subs_autoprune'] );
		}

		//-----------------------------------------
		// Do we have an incoming date cut?
		//-----------------------------------------

		$this->ipsclass->input['datecut'] = isset($this->ipsclass->input['datecut']) ? intval($this->ipsclass->input['datecut']) : 0;

		$date_cut   = $this->ipsclass->input['datecut'] ? $this->ipsclass->input['datecut'] : 30;

		$date_query = $date_cut != 1000 ? " AND t.last_post > '".(time() - ($date_cut*86400))."' " : "";

		//-----------------------------------------
		// Get read topic markers
		//-----------------------------------------

	$topic_array = array();
	$forum_array = array();

	if ( $this->ipsclass->vars['db_topic_read_cutoff'] )
	{
		$this->ipsclass->DB->simple_construct( array( 'select' => '*',
													  'from'   => 'topic_markers',
													  'where'  => "marker_member_id=".$this->ipsclass->member['id'],
											)      );

		$this->ipsclass->DB->simple_exec();

		while( $db_row = $this->ipsclass->DB->fetch_row() )
		{
			$markers_read = "";
			$markers_read = unserialize(stripslashes($db_row['marker_topics_read']) );

			//-----------------------------------------
			// Got read topics?
			//-----------------------------------------

			if ( is_array( $markers_read ) and count( $markers_read ) )
			{
				foreach( $markers_read as $tid => $date )
				{
					$topic_array[ $tid ]['db_read'] = $date > $db_row['marker_last_cleared'] ? $date : $db_row['marker_last_cleared'];
				}
			}
			else if( is_array( $markers_read ) and !count ( $markers_read ) )
			{
				$forum_array[] = $db_row['marker_forum_id'];
			}
		}
	}

		//-----------------------------------------
		// Query the DB for the subby toppy-ics - at the same time
		// we get the forum and topic info, 'cos we rule.
		//-----------------------------------------

		$this->ipsclass->DB->cache_add_query( 'ucp_get_topic_tracker', array( 'mid' => $this->ipsclass->member['id'], 'date_query' => $date_query ) );
	$this->ipsclass->DB->cache_exec_query();

		if ( $this->ipsclass->DB->get_num_rows() )
		{
			$last_forum_id = -1;

			while( $topic = $this->ipsclass->DB->fetch_row() )
			{

 			$topic['db_read'] = $topic_array[$topic['tid']]['db_read'] ? $topic_array[$topic['tid']]['db_read'] : 0;

 			if( $topic['db_read'] == 0 )
 			{
	 			$topic['db_read'] = in_array($topic['forum_id'], $forum_array ) ? time() : 0;
 			}

				//-----------------------------------------
				// Got perms to see this forum?
				//-----------------------------------------

				if ( ! $this->ipsclass->forums->forum_by_id[ $topic['forum_id'] ] )
				{
					continue;
				}

				if ( $last_forum_id != $topic['forum_id'] )
				{
					$last_forum_id = $topic['forum_id'];

					$this->output .= $this->ipsclass->compiled_templates['skin_ucp']->subs_forum_row($topic['forum_id'], $topic['forum_name']);
				}

			$topic['last_post_date']  = $this->ipsclass->get_date( $topic['last_post'], 'LONG' );

			if ( $topic['description'] )
			{
				$topic['description'] .= "<br />";
			}

			$topic['track_started'] = $this->ipsclass->get_date( $topic['track_started'], 'LONG' );

			$topic = $this->forums->parse_data($topic);

			$this->output .= $this->ipsclass->compiled_templates['skin_ucp']->subs_row($topic, $remap[ $topic['topic_track_type'] ]);
		}

	}
	else
	{
		$this->output .= $this->ipsclass->compiled_templates['skin_ucp']->subs_none();
	}

	// Build date box

	$date_box = "<option value='1'>".$this->ipsclass->lang['subs_today']."</option>\n";

	foreach( array( 1,7,14,21,30,60,90,365 ) as $day )
	{
		$selected = $day == $date_cut ? ' selected="selected"' : '';

		$date_box .= "<option value='$day'$selected>".sprintf( $this->ipsclass->lang['subs_day'], $day )."</option>\n";
	}

	if ( $date_cut == 1000 )
	{
		$date_box .= "<option value='1000' selected='selected'>".$this->ipsclass->lang['subs_all']."</option>\n";
	}
	else
	{
		$date_box .= "<option value='1000'>".$this->ipsclass->lang['subs_all']."</option>\n";
	}

	$this->output .= $this->ipsclass->compiled_templates['skin_ucp']->subs_end($auto_explain, $date_box);

	$this->page_title = $this->ipsclass->lang['t_welcome'];
	$this->nav        = array( "<a href='".$this->ipsclass->base_url."act=UserCP&CODE=00'>".$this->ipsclass->lang['t_title']."</a>" );


}

 

Все, на данном этапе я уже встал. Попытки вставить нужную строчку ни к чему не приводят. Может не туда вставлял...

Попытки сменить переменную на $topic в скине тоже ни к чему не привели.

 

Хочу обратить вниманеи что пока я просто объявляю что $topic['go_new_post'] должно выводить значек, и отображатся он будет в таком случае перед всеми темами в подписках. Но даже это у меня не выходит.

 

Вопрос к читателям, что я не учел в синтаксисе? Или где моя ошибка?

Спасибо всем за помощь.

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Наверное у моего вопроса слишком много букофф... :)

Я просто постарался описать вообще все.

 

Но могу сократить пока вопрос до следующего:

Что и куда надо вписать в файл usercp.php для того чтобы обрабатывалась команда {$data['go_new_post']} которая упоминается в скине?

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.