Hallo, Gast! (Registrieren)

Letzte Ankündigung: MyBB 1.8.38 veröffentlicht (30.04.24)


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste
WOL - Location Plugin?
#1
Wäre es möglich, benutzerdefinierte Locations als ein Plugin zu schreiben? Also ich hab ja gesehen, dass es hooks in der functions_online.php gibt, aber jeglicher versuch ist gescheitert. Ich fände es einfacher (und übersichtlicher) es in ein Plugin zu schreiben, als alles manuell in die Datei reinzuschreiben zwecks update, etc. Außerdem wäre es auch besser für manche Plugin-Autoren, die benutzerdefinierte Locations benötigen würden...

Hier ist das, was ich bis jetzt habe...aber leider funktioniert der Code nicht...

PHP-Code:
<?

//Custom Online Location Plugin (Adding them manually)

$plugins->add_hook("fetch_wol_activity_end", "file");
$plugins->add_hook("build_friendly_wol_location_end", "location");

function customonlineloc_info()
{
    return array(
        "name"        => "Custom Online Location",
        "description"    => "Adds custom Online Locations (Needed for some plugins)",
        "website"        => "http://MyBBoard.de",
        "author"        => "Kioshi",
        "authorsite"    => "http://MyBBoard.de",
        "version"        => "1.0",
        "compatibility" => "14*",
    );
}

function customonlineloc_activate()
{
}

function customonlineloc_deactivate()
{
}

function customonlineloc_file(&$user_activity)
{
  global $uid_list, $aid_list, $pid_list, $tid_list, $fid_list, $eid_list, $plugins, $user, $parameters;
  
  switch($filename)
  {
      case "blog":
        $user_activity['activity'] = "blog";
        break;
   }
}

function customonlineloc_location(&$plugin_array)
{
        global $db, $lang, $uid_list, $aid_list, $pid_list, $tid_list, $pmid_list, $fid_list, $eid_list, $plugins, $parser, $mybb, $session;
        global $pms, $threads, $forums, $forums_linkto, $posts, $events, $usernames, $attachments, $br;
        
        switch($user_activity['activity'])
        {
          case "blog":
            $location_name = "Viewing Blogs";
            break;
        }        

Gruß Manuel
Bitte erst die Suche und die Doku benutzen.
Zitieren
#2
Du hast sehr viele globals definiert, die gar nicht alle gebraucht werden. Dafür fehlen die wichtigen. Wink In der Funktion customonlineloc_file() fehlt $user_activity und bei customonlineloc_location() fehlt $location_name. Sind diese nicht in den globals definiert, stehen die Variablen nur innerhalb der Funktion zur Verfügung.

Gruß,
Michael
[Bild: banner.png]
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
Zitieren
#3
Ich hab halt die globals von der functions_online.php benutzt^^

Habs jetzt so, geht aber immer noch nicht...
PHP-Code:
function customonlineloc_file(&$user_activity)
{
  global 
$user_activity;
  
  switch(
$filename)
  {
      case 
"blog":
        
$user_activity['activity'] = "blog";
        break;
   }
}

function 
customonlineloc_location(&$plugin_array)
{
        global 
$location_name;
        
        switch(
$user_activity['activity'])
        {
          case 
"blog":
            
$location_name "Viewing Blogs";
            break;
        }        


Fehler: (Alles bei "The following warnings occured" drinne)
  • First argument is expected to be a valid callback, 'location' was given
  • file() expects parameter 1 to be string, array given
Gruß Manuel
Bitte erst die Suche und die Doku benutzen.
Zitieren
#4
Versuchs mal so:
PHP-Code:
function customonlineloc_file()
{
    global 
$filename$user_activity;

    if(
$filename == 'blog')
    {
        
$user_activity['activity'] = "blog";
    }
}

function 
customonlineloc_location()
{
    global 
$user_activity$location_name;

    if(
$user_activity['activity'] == 'blog')
    {
        
$location_name "Viewing Blogs";
    }


Gruß,
Michael
[Bild: banner.png]
Support erfolgt NUR im Forum!
Bitte gelöste Themen als "erledigt" markieren.
Beiträge mit mangelhafter Rechtschreibung/Grammatik werden kommentarlos gelöscht.
Zitieren
#5
Gibt mir auch das:
  • Warning [2] file() expects parameter 1 to be string, array given - Line: 141 - File: G:\xampp\htdocs\mybb\inc\class_plugins.php PHP 5.2.6 (WINNT)
  • Warning [2] call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'location' was given - Line: 141 - File: G:\xampp\htdocs\mybb\inc\class_plugins.php PHP 5.2.6 (WINNT)
Gruß Manuel
Bitte erst die Suche und die Doku benutzen.
Zitieren
#6
So, habe mich der Sache mal angenommen (weil ich das per Plugin auch sehr viel angenehmer find als direkt die Dateien zu ändern), und habe erfolgreich die ersten Seiten hinzugefügt.

Hier hast ein paar Beispiel-Codeschnipsel Wink

PHP-Code:
$plugins->add_hook("fetch_wol_activity_end",          "myplugin_wol_activity");
$plugins->add_hook("build_friendly_wol_location_end""myplugin_wol_location"); 

PHP-Code:
function myplugin_wol_activity($user_activity)
{
    
/* $filename kann leider nicht per global bezogen werden, weil sie nur lokal in der anderen Funktion erstellt wurde.
    Somit muss man den Dateinamen neu ermitteln...
    (Zumindest war es mir nicht möglich, auf den bereits ermittelten FileName zuzugreifen) */
    
$split_loc explode(".php"$user_activity['location']);
    if(
$split_loc[0] == $user['location']) {
        
$filename '';
    } else {
        
$filename my_substr($split_loc[0], -my_strpos(strrev($split_loc[0]), "/"));
    }
    
    
/* Die Parameter hingegen wurden global deklariert und können so einfach verwendet werden */
    
global $parameters;
    
    
/* Nun können wir die eigenen Seiten hinzufügen */
    
switch ($filename)
    {
        case 
'mypage1':
            
// mypage1.php
            
$user_activity['activity'] = "mypage1";
            break;
        case 
'mypage2':
            
// mypage2.php?myid=[MYID]
            
$user_activity['activity'] = "mypage2";
            
$user_activity['myid'] = intval($parameters['myid']);
            break;
    }
    
    return 
$user_activity;


PHP-Code:
function myplugin_wol_location($array)
{
    
/* Im $array haben wir zum einen das user_activity-Array zum Auslesen, zum anderen können wir den location_name setzen */
    
switch ($array['user_activity']['activity'])
    {
        case 
'mypage1':
            
$array['location_name'] = "Is viewing MyPage 1";
            break;
        case 
'mypage2':
            
$array['location_name'] = "Is viewing MyPage 2 with MyID ".$array['user_activity']['myid'];
            break;
    }
    
    return 
$array;


btw: Muss man bei add_hook() nicht den ganzen Funktionsnamen angeben? Zumindest hab ich das immer so gemacht ^^ (Könnte den ersten Fehler erklären, weil er eben file() aufruft und nicht customonlineloc_file() Wink)
Was ist der Unterschied zwischen der Politik und der Informatik?
In der Informatik ignoriert man führende Nullen...
Zitieren
#7
Ich liebe dich dafür, dass es funktioniert!!!

Es ist eine Schande, dass ich nicht mal die Hooks richtig hatte...und das nach 6 Plugins, die ich selbst gecoded habe!!!

Also echt ein fettes Dankeschön!

Edit: Hätte da doch was...Wie funktioniert das mit deinem Code, wenn man mehrere $mybb->input['action']'s hat?
Gruß Manuel
Bitte erst die Suche und die Doku benutzen.
Zitieren
#8
Alle Variablen die per URL mit übergeben wurden sind im $parameters-Array, das heißt für die action brauchst du einfach $parameters['action'] auslesen und entsprechend die Fälle unterscheiden.
(Wurde die Action allerdings per Formular übertragen hat man glaube keinen Zugriff mehr drauf, weil nur die URL für die Parameter herangezogen werden kann)

Entweder du unterscheidest bereits im wol_activity(), dann hättest du im wol_location für jeden Aktion einen eigenen Case-Fall.
Oder du speicherst in wol_activity() die Aktion erst zwischen ($user_activity['action'] = $parameters['action']) und unterscheidest erst in der wol_location() die einzelnen Fälle (anhand von $array['user_activity']['action']).
(MyBB nutzt glaube die erste Variante)

PS: Auch ein Mentor kann Fehler machen und muss nicht alles wissen ^_____^
Was ist der Unterschied zwischen der Politik und der Informatik?
In der Informatik ignoriert man führende Nullen...
Zitieren
#9
MyBB nutzt keine der genannten Varianten. In der functions_online.php ist es relativ einfach dies zu tun^^

Die 1. Variante würde nicht einmal funktionieren. Denk daran, es wird .php und alles was danach kommt abgeschnitten, also würde es nicht funktionieren.

Die 2. Variante verstehe ich ehrlich gesagt nicht ganz (Evtl. Beispiel??)
Gruß Manuel
Bitte erst die Suche und die Doku benutzen.
Zitieren
#10
Du hast das mit dem Abschneiden wohl falsch verstanden: Klar im $filename hast du das nicht mehr, aber vorher werden ja in der Funktion, bevor der Plugin-Hook aufgerufen wird, die Parameter extrahiert und in $parameters gespeichert. Darauf greifen wir mit global $parameters zu Wink
Sofern eben die action in der URL steht, wird sie zwangsläufig auch in $parameters auftauchen.

Aber hier trotzdem mal ein beispiel zu den zwei Varianten (Hab mich wohl doch etwas zu kurz gefasst ^__^):



Variante 1: Untersuchen der Aktion in der myplugin_wol_activity()
PHP-Code:
function myplugin_wol_activity($user_activity)
{
    global 
$parameters;
    
    
$split_loc explode(".php"$user_activity['location']);
    if(
$split_loc[0] == $user['location']) {
        
$filename '';
    } else {
        
$filename my_substr($split_loc[0], -my_strpos(strrev($split_loc[0]), "/"));
    }

    switch (
$filename)
    {
        case 
'mypage':
            
//mypage.php?action=[MyAction]
            
if ($parameters['action'] == "something")
                
$user_activity['activity'] = "mypage_something";
            else if (
$parameters['action'] == "anything")
                
$user_activity['activity'] = "mypage_anything";
            else
                
$user_activity['activity'] = "mypage";                
            break;
    }

    return 
$user_activity;
}


function 
myplugin_wol_location($array)
{
    switch (
$array['user_activity']['activity'])
    {            
        case 
'mypage':
            
$array['location_name'] = "MyPage with no Action";
            break;
        
        case 
'mypage_something':
            
$array['location_name'] = "MyPage with Action Something";
            break;
        
        case 
'mypage_anything'
            
$array['location_name'] = "MyPage with Action Anything";
            break;
    }
    
    return 
$array;




Variante 2: Untersuchen der Aktion in der myplugin_wol_location()
PHP-Code:
function myplugin_wol_activity($user_activity)
{
    global 
$parameters;
    
    
$split_loc explode(".php"$user_activity['location']);
    if(
$split_loc[0] == $user['location']) {
        
$filename '';
    } else {
        
$filename my_substr($split_loc[0], -my_strpos(strrev($split_loc[0]), "/"));
    }

    switch (
$filename)
    {
        case 
'mypage':
            
//mypage.php?action=[MyAction]
            
$user_activity['action'] = $parameters['action'];
            
$user_activity['activity'] = "mypage";                
    }

    return 
$user_activity;
}


function 
myplugin_wol_location($array)
{
    switch (
$array['user_activity']['activity'])
    {            
        case 
'mypage':
            if (
$array['user_activity']['action'] == "something"
            {
                
$array['location_name'] = "MyPage with Action Something";
            }
            else if (
$array['user_activity']['action'] == "anything")
            {
                
$array['location_name'] = "MyPage with Action Anything";
            }
            else
            {
                
$array['location_name'] = "MyPage with no Action";
            }
            break;
    }
    
    return 
$array;




Der Unterschied ist letztendlich, wann die Aktion untersucht und entsprechend reagiert wird.
Bei der ersten Variante wird direkt untersucht und entsprechend der Wert für $user_activity['activity'] angepasst, sodass jede Aktion eine eigene Aktivität ist (Diesen Weg nimmt das MyBB in der functions_online.php).
Bei der zweiten Varianten werden zuerst alle Aktionen auf die gleiche Aktivität abgebildet und zusätzlich die Aktion mit gegeben, sodass sie später in der wol_location() untersucht wird und entsprechend der Satz zugewiesen wird.
Was ist der Unterschied zwischen der Politik und der Informatik?
In der Informatik ignoriert man führende Nullen...
Zitieren


Möglicherweise verwandte Themen…
Thema Verfasser Antworten Ansichten Letzter Beitrag
  "Location" als Pflichtangabe bei Anmeldung Bigmemo 1 1.282 12.07.2014, 22:53
Letzter Beitrag: MrBrechreiz
  PMs in WOL auslesen Manuel 0 1.228 30.10.2008, 16:11
Letzter Beitrag: Manuel
  location neben nachricht anzeigen futzek 4 1.990 22.02.2008, 15:25
Letzter Beitrag: Plexxart