Seite 1 von 1

Topic in "Who is online" nur für Admin?

Verfasst: 12.01.2013 15:45
von LisaserstesForum
Hi, ich habe heute die MOD Topic in "Who is online" gefunden und installiert.
Ich möchte aber gern, dass nur der Admin sehen kann, welches Thema gelesen wird, für die anderen User soll die Anzeige wie vorher bleiben.

Ist das einfach möglich?
Die Installation ist sehr kurz (3 Schritte):
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"
Finde:

Code: Alles auswählen

						$location = sprintf($user->lang['READING_TOPIC'], $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['READING_TOPIC_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['READING_TOPIC_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['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
						}
						// END: Topic in "Who is online"

Re: Topic in "Who is online" nur für Admin?

Verfasst: 12.01.2013 20:46
von WileCoyote
Ersetzte

Code: Alles auswählen

$view_online = ($auth->acl_get('u_viewonline')) ? true : false;
mit

Code: Alles auswählen

$view_online = ($auth->acl_get('a_')) ? true : false;

Re: Topic in "Who is online" nur für Admin?

Verfasst: 12.01.2013 21:44
von LisaserstesForum
Hi WileCoyote, danke für die Antwort, leider sehen die normalen User es immer noch. (Cache wurde natürlich geleert)

Re: Topic in "Who is online" nur für Admin?

Verfasst: 13.01.2013 15:19
von HabNurNeFrage
Ich verstehe es so:
Die Mod verändert die viewonline Ansicht komplett von "User x macht dies und jenes in Forum so und so" zu "User x macht dies und jenes in Thema so und so".
Daher bekommt nun jeder, der überhaupt Zugriff auf viewonline hat, nun diese veränderte Version zu Gesicht. Daran ändert auch die kleine Modifikation der Auth-Variablen nichts.

Lösungsansatz 1: Usern den Zugang zu viewonline komplett verwehren. Einfach umsetzbar, aber nicht gewünscht und einige User werden sich beschweren.
(Falls gewünscht, hier die Vorgehensweise: viewtopic.php?f=74&t=200170 )

Lösungsansatz 2: Beide Versionen von viewonline.php vorhalten und über die Template-Datei eine Auswahl treffen, dass für bestimmte Gruppen oder Rollen entweder die eine oder die andere Version verlinkt wird. So könnte man eine viewonline.php (original Version) für alle und eine admin_viewonline.php (gemoddete Version) im Root ablegen und im Template auf der index_body.html per Abfrage unterschiedliche Verlinkungen für User und Admins/Mods ausgeben lassen.

Anm. zu meiner Lösung: Wer den Namen der zusätzlichen viewonline.php errät, könnte per Direkteingabe der URL trotzdem darauf zugreifen. Meiner Meinung reicht es hier aber, einen schwer zu erratenden Dateinamen zu verwenden, da ein eventueller Zugriff eines registrierten Users ja auch keinen Beinbruch darstellen würde.

Diesen Teil in der index_body.html würde ich dazu anpassen wollen:
<!-- IF U_VIEWONLINE --><h4><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h4><!-- ELSE --><h4>{L_WHO_IS_ONLINE}</h4><!-- ENDIF -->

Folgendes funktioniert nicht, veranschaulicht aber meinen Denkansatz:

Code: Alles auswählen

<!-- IF U_VIEWONLINE and U_ACP or U_MCP--><h4><a href="./hxz34_viewonline.php">{L_WHO_IS_ONLINE}</a></h4>
<!-- ELSEIF U_VIEWONLINE and U_UCP--><h4><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h4>
<!-- ELSE --><h4>{L_WHO_IS_ONLINE}</h4><!-- ENDIF --><!-- ENDIF -->
Hoffentlich ist mein Ansatz nicht völlig daneben :oops:

Re: Topic in "Who is online" nur für Admin?

Verfasst: 14.01.2013 15:33
von LisaserstesForum
Hi HabNurNeFrage, danke für deine Antwort. Eine zweite viewonline.php möchte ich eigentlich nicht und den Userns die Liste sperren möchte ich auch nicht.

Ich habe leider so gut wie keine PHP-Kentnisse, aber ich hab jetzt mal den Code von einer ähnlichen MOD angeschaut und möchte euch fragen, ob es nicht so gehen würde:
(Im Beispiel nehme ich den letzten Code, da er nicht so lang ist)

Das ist die Installationsanleitung:
Finde:

Code: Alles auswählen

                      $location = sprintf($user->lang['READING_TOPIC'], $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['READING_TOPIC_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['READING_TOPIC_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['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
                      }
                      // END: Topic in "Who is online"    
Anstatt den Code zu ersetzen kann ich da nicht ein if ($auth->acl_get('a_')){ öffnen, dort den Code aus der Installanleitung einfügen und nach else{ den Original-Code einfügen und somit erhalten?
Also so:

Code: Alles auswählen

                 if ($auth->acl_get('a_')){
                          // 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['READING_TOPIC_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['READING_TOPIC_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['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
                          }
                          // END: Topic in "Who is online"
                           }
                          else{
                          $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
                           }

Re: Topic in "Who is online" nur für Admin?

Verfasst: 15.01.2013 21:44
von LisaserstesForum
Damit hat es geklappt, falls es irgendwann mal jemand braucht, hier ist die Anleitung für die MOD, wenn sie nur für den Admin sichtbar sein soll:

Topic in "Who is online" only for admin

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"
if ($auth->acl_get('a_')){
$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"
                                if ($auth->acl_get('a_')){
                                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']);
                                }
                                }
                                else{
                                $location = sprintf($user->lang['REPLYING_MESSAGE'], $forum_data[$forum_id]['forum_name']);
                                }
                                // END: Topic in "Who is online"  
Finde:

Code: Alles auswählen

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

Code: Alles auswählen

                        // BEGIN: Topic in "Who is online"
                        if ($auth->acl_get('a_')){
                        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['READING_TOPIC_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['READING_TOPIC_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['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
                        }
                        }
                        else{
                        $location = sprintf($user->lang['READING_TOPIC'], $forum_data[$forum_id]['forum_name']);
                        }
                        // END: Topic in "Who is online"  

language/en/common.php
Finde:

Code: Alles auswählen

    'READING_TOPIC'                =>
Danach einfügen:

Code: Alles auswählen

    'READING_TOPIC_TOPIC'        => 'Liest Thema "%2$s" in %1$s',
Finde:

Code: Alles auswählen

    'REPLYING_MESSAGE'            =>
Danach einfügen:

Code: Alles auswählen

    'REPLYING_MESSAGE_TOPIC'    => 'Beantwortet Thema "%2$s" in %1$s',
Beide Dateien speichern, hochladen, Cache leeren.