Seite 1 von 1

Topic in WHO IS ONLINE

Verfasst: 15.03.2013 19:40
von Maugrim
Hallo!

Ich habe mir obige Mod installiert.
Läuft auch gut!


Allerdings hat er einen kleinen Bug (oder ich habe was falsch eingebaut? kA)

Funktionsweise.

wenn man auf Wer ist Online clickt, kann man sehen in WELCHEN Foren oder Themen sich die User aufhalten, und wo sie gerade eine Antwort schreiben

Wenn man nur eine reguläre Antwort erstellt, steht auch in Wer ist Online (Schreibt eine Nachricht im Thema (NAME DES THEMAS) ...)
Wenn man aber auf ändern oder zitieren clickt, dann steht nur folgendes (Schreibt eine Nachricht im Thema ...) Also der Name des Themas wird nicht angezeigt

Was kann da fehlen, damit es bei den beiden auch umgesetzt wird?


Code:
viewonline.php
Finde:

Code: Alles auswählen

$logged_visible_online = $logged_hidden_online = $counter = 0;
Danach einfügen:

Code: Alles auswählen

// BEGIN: Topic in "Who is online"
$topic_ids = $post_ids = $topic_post_ids = $topic_titles = array();
while ($row = $db->sql_fetchrow($result))
{
	if ($row['user_id'] != ANONYMOUS && !isset($prev_id[$row['user_id']]))
	{
		$view_online = false;
		if (!$row['session_viewonline'])
		{
			$view_online = ($auth->acl_get('u_viewonline')) ? true : false;
		}
		else
		{
			$view_online = true;
		}

		$prev_id[$row['user_id']] = 1;

		if (!$view_online)
		{
			continue;
		}
	}
	else if ($show_guests && $row['user_id'] == ANONYMOUS && !isset($prev_ip[$row['session_ip']]))
	{
		$prev_ip[$row['session_ip']] = 1;
	}
	else
	{
		continue;
	}

	preg_match('#^([a-z/]+)#i', $row['session_page'], $on_page);
	if (!sizeof($on_page))
	{
		$on_page[1] = '';
	}
	if (!in_array($on_page[1], array('viewtopic', 'posting')))
	{
		continue;
	}

	preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
	if (sizeof($on_page))
	{
		$topic_ids[] = $on_page[1];
		continue;
	}

	preg_match('#p=([0-9]+)#', $row['session_page'], $on_page);
	if (sizeof($on_page))
	{
		$post_ids[] = $on_page[1];
		continue;
	}
}

unset($prev_id, $prev_ip);

if (sizeof($topic_ids) || sizeof($post_ids))
{
	if (sizeof($post_ids))
	{
		$sql = 'SELECT topic_id, post_id FROM ' . POSTS_TABLE . ' WHERE ' . $db->sql_in_set('post_id', $post_ids);
		$post_result = $db->sql_query($sql);
		while ($row = $db->sql_fetchrow($post_result))
		{
			$topic_post_ids[$row['post_id']] = $row['topic_id'];
			$topic_ids[] = $row['topic_id'];
		}
		$db->sql_freeresult($post_result);
	}

	$sql = 'SELECT topic_id, topic_title FROM ' . TOPICS_TABLE . ' WHERE ' . $db->sql_in_set('topic_id', array_unique($topic_ids));
	$topic_result = $db->sql_query($sql);
	while ($row = $db->sql_fetchrow($topic_result))
	{
		$topic_titles[$row['topic_id']] = $row['topic_title'];
	}
	$db->sql_freeresult($topic_result);
}

$db->sql_rowseek(0, $result);
// END: Topic in "Who is online"
Finde:

Code: Alles auswählen

								$location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
Ersetze mit:

Code: Alles auswählen

								// BEGIN: Topic in "Who is online"
								preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
								preg_match('#p=([0-9]+)#', $row['session_page'], $on_page_p);
								if (sizeof($on_page) && isset($topic_titles[$on_page[1]]))
								{
									$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$on_page[1]]);
									$location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&t=' . $on_page[1]);
								}
								else if (sizeof($on_page_p) && isset($topic_post_ids[$on_page_p[1]]))
								{
									$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page[1]]]);
									$location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1]);
								}
								else
								{
									$location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
								}
								// END: Topic in "Who is online"

Re: Topic in WHO IS ONLINE

Verfasst: 15.03.2013 19:52
von BNa
Maugrim hat geschrieben:Wenn man aber auf ändern oder zitieren clickt, dann steht nur folgendes (Schreibt eine Nachricht im Thema ...) Also der Name des Themas wird nicht angezeigt
Klar, weil der Mod nicht die posting.php > mode > was_auch_immer berücksichtigt und dafür auch nicht gemacht ist.

Re: Topic in WHO IS ONLINE

Verfasst: 15.03.2013 20:40
von Maugrim
Danke ;)

Er wird aber in die mode= case eingebaut
der untere Codeblock wird direkt hinter diesem Teil eingebaut

case 'reply':
case 'quote':

Ich hab aber den Fehler schon selbst gefunden

im zweiten Code-Snippet muss es statt

Code: Alles auswählen

$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page[1]]]);

Code: Alles auswählen

$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page_p[1]]]);
heissen
jetzt werden auch die Namen der Beiträge angezeigt!


Da man aber beim mode=reply nur zum ersten Beitrag gelinkt wird, bei den cases edit und quote aber ein spezieller Beitrag vorhanden ist, muss man noch folgende Änderung vornehmen

vorher

Code: Alles auswählen

$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page[1]]]);
                           $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1]);
nachher

Code: Alles auswählen

$location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page_p[1]]]);
                           $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1] . '#p' .$on_page_p[1]);


Und wenn man so wie ich, es ein wenig ordentlicher haben will, dann macht man für alle drei cases eine eigene Abfrage. Damit bei allen dreien auch eine eigene Beschreibung ausgegeben wird (beim Antworten, steht Schreibt einen Beitrag, beim Zitieren steht Zitiert einen Beitrag, und beim Ändern steht Bearbeitet einen Beitrag)

Ob das jetzt aber Codetechnisch die beste Lösung ist, weiß ich nicht, bin ja kein php Programmierer. Falls es eine elegantere Lösung gibt, würde ich mich über einen Tip freuen :)


der komplette Code, wie ich ihn jetzt habe:

Code: Alles auswählen

		case 'posting':
		case 'viewforum':
		case 'viewtopic':
			$forum_id = $row['session_forum_id'];

			if ($forum_id && $auth->acl_get('f_list', $forum_id))
			{
				$location = '';
				$location_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);

				if ($forum_data[$forum_id]['forum_type'] == FORUM_LINK)
				{
					$location = sprintf($user->lang['READING_LINK'], $forum_data[$forum_id]['forum_name']);
					break;
				}

				switch ($on_page[1])
				{
					case 'posting':
						preg_match('#mode=([a-z]+)#', $row['session_page'], $on_page);
						$posting_mode = (!empty($on_page[1])) ? $on_page[1] : '';

						switch ($posting_mode)
						{
							case 'reply':
                            
                            // BEGIN: Topic in "Who is online"
                            preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
                            preg_match('#p=([0-9]+)#', $row['session_page'], $on_page_p);
                            if (sizeof($on_page) && isset($topic_titles[$on_page[1]]))
                            {
                               $location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$on_page[1]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&t=' . $on_page[1]);
                            }
                            else if (sizeof($on_page_p) && isset($topic_post_ids[$on_page_p[1]]))
                            {
                               $location = sprintf($user->lang['REPLYING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page_p[1]]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1]);
                            }
                            else
                            {
                               $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
                            }
                            // END: Topic in "Who is online"
                            
							break;
              
							case 'quote':
                                       
                            // BEGIN: Topic in "Who is online"
                            preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
                            preg_match('#p=([0-9]+)#', $row['session_page'], $on_page_p);
                            if (sizeof($on_page) && isset($topic_titles[$on_page[1]]))
                            {
                               $location = sprintf($user->lang['QUOTING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$on_page[1]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&t=' . $on_page[1]);
                            }
                            else if (sizeof($on_page_p) && isset($topic_post_ids[$on_page_p[1]]))
                            {
                               $location = sprintf($user->lang['QUOTING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page_p[1]]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1] . '#p' .$on_page_p[1]);
                            }
                            else
                            {
                               $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
                            }
                            // END: Topic in "Who is online"
                            
							break;
              
              case 'edit':
                         
                            // BEGIN: Topic in "Who is online"
                            preg_match('#t=([0-9]+)#', $row['session_page'], $on_page);
                            preg_match('#p=([0-9]+)#', $row['session_page'], $on_page_p);
                            if (sizeof($on_page) && isset($topic_titles[$on_page[1]]))
                            {
                               $location = sprintf($user->lang['EDITING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$on_page[1]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&t=' . $on_page[1]);
                            }
                            else if (sizeof($on_page_p) && isset($topic_post_ids[$on_page_p[1]]))
                            {
                               $location = sprintf($user->lang['EDITING_MESSAGE_TOPIC'], $forum_data[$forum_id]['forum_name'], $topic_titles[$topic_post_ids[$on_page_p[1]]]);
                               $location_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $forum_id . '&p=' . $on_page_p[1] . '#p' .$on_page_p[1]);
                            }
                            else
                            {
                               $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
                            }
                            // END: Topic in "Who is online"
                            
							break;                            

							default:
								$location = sprintf($user->lang['POSTING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
							break;
						}
					break;

Re: Topic in WHO IS ONLINE

Verfasst: 15.03.2013 21:13
von BNa
Maugrim hat geschrieben:Und wenn man so wie ich, es ein wenig ordentlicher haben will, dann macht man für alle drei cases eine eigene Abfrage.
Das werden wir zukünftig bei solchen Abfragen per default machen zB. in der nächsten Version von dem hier, weils einfach mal ordentlicher ist. Sehr schön, so hast Du einen syntaktischen Fehler entdeckt und das ganze mal angeschoben.

Re: Topic in WHO IS ONLINE

Verfasst: 16.03.2013 09:14
von zx9r-treiber
Es wäre ja schön gewesen wenn man dazu geschrieben hätte um welchen Mod es genau geht ..... es gib wohl mehrere mit dem Titel = who is online

Betrifft die Aussage nun den Mod

NV "Who was here?"
Autor =nickvergessen
Installierte = Version1.2.1
Aktuelle = Version1.2.1

denn dort ist es genau so mit der (ungenauen Angabe) wo betroffener User gerade ist oder schreibt.

Re: Topic in WHO IS ONLINE

Verfasst: 16.03.2013 19:52
von Maugrim
Der Mod heisst: Topic in Who is Online

...

Re: Topic in WHO IS ONLINE

Verfasst: 16.03.2013 20:01
von zx9r-treiber
Also ein eigenständiger Mod. Danke, ich werde ihn beobachten und wenn die vorgeschlagenen Änderungen aufgenommen sind auch bestimmt einbauen und versuchen ihn auch unter Subsilver2 ans laufen zu bekommen. :D

Re: Topic in WHO IS ONLINE

Verfasst: 16.03.2013 20:33
von Maugrim
der von BNa hat imo mehr als "nötig"
Weil wie oft kommt es schon vor, dass jemand eine Datei hochläd oder runterläd, oder einen Beitrag meldet?

Ich hab nur die vier Fälle

Lesen, Antworten, Bearbeiten, Zitieren

wenn er aber mal fertig ist, werde ich ihn gegenenfalls statt dem einbauen, welchen ich zZ drin hab. Wenn er Codesparender geschrieben ist (wovon ich mal ausgehe)
ich muss ja nicht ALLE Änderungen vornehmen