Hallo, Gast! (Registrieren)

Wir wünschen allen Besuchern frohe Ostern!

Letzte Ankündigung: MyBB 1.8.37 veröffentlicht (04.11.23)


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste
Wie ist ein Plugin aufgebaut?
#1
Im folgenden wird erklärt, aus welchen Teilen ein Plugin für das MyBB besteht. Als Beispiel dient das Plugin "Übersicht", aus dessen Code einzelne Teile zur Erklärung aufgeführt werden.

1. Benötigte Daten für das Plugin-System
Hier wird festgelegt, an welchem Haken ("Hook") das Plugin ausgeführt und welches Plugin integriert wird.
PHP-Code:
$plugins->add_hook("index_start""overview"); 
In diesem Fall wird das Plugin "overview" am Haken "index_start" eingesetzt.

2. Informationen zum Plugin
Hier werden Informationen, wie Name, Verfasser, usw. angegeben, die später im Plugin-Manager angezeigt werden.
PHP-Code:
function overview_info()
{
    return array(
        
"name"        => "Übersicht",
        
"description" => "Fügt eine Übersichtsbox auf der Startseite ein, die über neueste Mitglieder, Themen und Beiträge informiert.",
        
"website"     => "https://www.mybb.de",
        
"author"      => "MyBBoard.de",
        
"authorsite"  => "https://www.mybb.de",
        
"version"     => "1.2",
        );

3. Aktionen bei Aktivierung
Hier werden alle Aktionen aufgeführt, die bei der Aktivierung des Plugins erfolgen.
PHP-Code:
function overview_activate() {
// Gobale Variablen
global $db;

// Hier alle Aktionen!

3.1 Templates ändern
PHP-Code:
require "./inc/adminfunctions_templates.php";
    
find_replace_templatesets("index"'#\$header(\r?)\n#'"\$header\n\$overview\n"); 
Hier wird das Template "index" geändert. Es wird gesucht nach "\$header(\r?)\n" und ersetzt durch "\$header\n\$overview\n".

3.2 Templates einfügen
PHP-Code:
$templatearray = array(
        
"tid" => "NULL",
        
"title" => "index_overview",
        
"template" => "<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"0\" class=\"tborder\"><tr><td colspan=\"3\"><table  border=\"0\" cellspacing=\"0\" cellpadding=\"3\" width=\"100%\"><tr class=\"thead\"><td><strong>\$lang->overview_overview</strong></td></tr></table></td>
  </tr>
  <tr>
      \$column_newmembers
      \$column_newthreads
      \$column_newposts
      </tr>
</table>\$overview_copyright<br />"
,
        
"sid" => "-1",
        );
        
$db->insert_query(TABLE_PREFIX."templates"$templatearray); 
Das neue Template "index_overview" wird in die Datenbank geschrieben. Der Inhalt der Templates wird hinter ""template" =>" angegeben.

3.3 Einstellungsgruppe erstellen
PHP-Code:
$overview_group = array(
        
"gid" => "NULL",
        
"name" => "&Uuml;bersicht",
        
"description" => "",
        
"disporder" => "1",
        
"isdefault" => "no",
        );
    
$db->insert_query(TABLE_PREFIX."settinggroups"$overview_group);
    
$gid $db->insert_id(); 
Die Einstellungsgruppe mit dem Namen "&Uuml;bersicht" wird in der Datenbank angelegt. Die Einstellungsgruppe erscheint dann im Admin-CP unter "Foreneinstellungen" -> "Ändern".

3.4 Einstellungen einfügen
PHP-Code:
$overview_1 = array(
        
"sid" => "NULL",
        
"name" => "overview_max",
        
"title" => "Anzahl der zu zeigenden Benutzer/Themen",
        
"description" => "Wie viele Benutzer/Themen/Beitr&auml;ge sollen gezeigt werden?",
        
"optionscode" => "text",
        
"value" => "5",
        
"disporder" => "1",
        
"gid" => intval($gid),
        );
    
$db->insert_query(TABLE_PREFIX."settings"$overview_1); 
Mit diesem Schritt wird die Einstellungsgruppe "&Uuml;bersicht" mit Einstellungen gefüllt. In diesem Fall wird die Einstellung "Wie viele Benutzer/Themen/Beiträge sollen gezeigt werden?" angelegt. Dabei wird zur Eingabe der Daten ein Textfeld angeboten und der Standardwert ist 5. Der Name der Einstellung ist "overview_max" und diese wird in der Einstellungsgruppe als erste Einstellung angezeigt.

3.5 Einstellungen erneuern
PHP-Code:
rebuild_settings(); 
Mit diesem Befehl wird die Datei, in der die Einstellungen gespeichert werden (inc/settings.php), neu geschrieben und die neue Einstellungsgruppe mit den neuen Einstellungen wird ind die Datei übernommen.

Aktionen bei Deaktivierung
Hier werden alle Aktionen aufgeführt, die bei der Deaktivierung des Plugins erfolgen.
PHP-Code:
function overview_deactivate() {
// Gobale Variablen
global $db;

// Hier alle Aktionen!

3.1 Templateänderungen zurücksetzen
PHP-Code:
require "./inc/adminfunctions_templates.php";
    
find_replace_templatesets("index"'#\$overview(\r?)\n#'""0); 
Das Prinzip entspricht dem Vorgehen bei der Templateänderung während der Aktivierung. Im Template "index" wird gesucht nach "\$overview(\r?)\n". Dieser Teil wird entfernt, da er duch nichts ersetzt wird.

3.2 Templates löschen
PHP-Code:
$db->query("DELETE FROM ".TABLE_PREFIX."templates WHERE title='index_overview'"); 
Das Template "index_overview wird durch diesen Befehl aus der Datenbank gelöscht.

3.3 Einstellungsgruppe löschen
PHP-Code:
$query $db->query("SELECT gid FROM ".TABLE_PREFIX."settinggroups WHERE name='&Uuml;bersicht'");
    
$g $db->fetch_array($query);
    
$db->query("DELETE FROM ".TABLE_PREFIX."settinggroups WHERE gid='".$g['gid']."'"); 
Zunächst wird die Gruppen-ID ("gid") der Einstellungsgruppe ermittelt. Anschließend wird die Gruppe anhand der ID in der Datenbankk gelöscht.

3.4 Einstellungen löschen
PHP-Code:
$db->query("DELETE FROM ".TABLE_PREFIX."settings WHERE gid='".$g['gid']."'"); 
Es werden alle Einstellungen gelöscht, die der im vorigen Schritt ermittelten Gruppen-ID zugeteilt sind.

3.5 Einstellungen erneuern
PHP-Code:
rebuild_settings(); 
Mit diesem Befehl wird die Datei, in der die Einstellungen gespeichert werden (inc/settings.php), neu geschrieben.

4. Funktionen des Plugins
PHP-Code:
function overview() {
// Gobale Variablen
global $db$mybb$cache$templates$lang$overview;

// Hier alle Funktionen!

In diesen Teil wird der PHP-Code eingefügt, der ausgeführt werden soll. Da dieser je nach Aufgabe des Plugins verschieden ist, werden hier keine Beispiele gegeben.

5. Funktion: Einstellung erneuern
PHP-Code:
if(!function_exists("rebuild_settings"))
{
    function 
rebuild_settings()
    {
        global 
$db;
        
$query $db->query("SELECT * FROM ".TABLE_PREFIX."settings ORDER BY title ASC");
        while(
$setting $db->fetch_array($query))
        {
            
$setting['value'] = addslashes($setting['value']);
            
$settings .= "\$settings['".$setting['name']."'] = \"".$setting['value']."\";\n";
        }
        
$settings "<?php\n/*********************************\ \n  DO NOT EDIT THIS FILE, PLEASE USE\n  THE SETTINGS EDITOR\n\*********************************/\n\n$settings\n?>";
        
$file fopen("./inc/settings.php""w");
        
fwrite($file$settings);
        
fclose($file);
    }

Wenn während der Aktivierung oder Deaktivierung die Einstellungen erneuert werden müssen, muss am Ende des Plugins der oben genannte Code eingefügt werden, der die Anweisung ausführt.

Ich hoffe, dass dieses Tutorial einen guten Überblick darüber verschafft, wie das Plugin-System des MyBB funktioniert und wie ein Plugin aufgebaut ist.

Noch ein Hinweis: Einstellungen des MyBB werden im PHP-Code aufgerufen durch
PHP-Code:
$mybb->settings['Einstellungsname'
Im Fall dieses Beispiels würde also
PHP-Code:
echo $mybb->settings['overview_max']; 
die Zahl 5 augeben.

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
#2
Der Punkt:
5. Funktion: Einstellung erneuern
stimmt nicht mehr oder?
Ich bekomme immer den Fehler, das er die Datei nicht finden kann.
Kann es sein das die Funktion geändert wurde?

Anbei mal das Plugin


Angehängte Dateien
.php   hideonindex.php (Größe: 2,58 KB / Downloads: 12)

Zitieren
#3
Ersetze
PHP-Code:
$file fopen("./inc/settings.php""w"); 
mal durch
PHP-Code:
$file fopen(MYBB_ROOT."inc/settings.php""w"); 
Geht es dann?

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
#4
Ja, wahrscheinlich schon.
Die Funktion wurde aber so wie es aussieht umbenannt. So klappt es auch:
PHP-Code:
    rebuildsettings(); 
Ist ja auch schon etwas älter der Beitrag. Dachte nur, vielleicht sollte man ihn korregieren, falls jemand, so wie ich, versucht damit ein PlugIn zu bauen.

Zitieren
#5
Punkte 3.3 und 3.4 aus der Anleitung ist eigentlich das was ich jetzt in meinem Plugin brauche, aber igitt, gibts da keine fertigen Funktionen für die das Datenbank-Gefuddel für mich übernehmen? Wenn ich mir vorstelle daß da jedes Plugin irgendwie selber an der Datenbank rumspielt wird mir ganz mulmig. Wink

Auf jeden Fall muss man da wohl einen bei weitem eindeutigeren Namen wählen als "Übersicht", denn wenn das zwei Plugins machen löscht das eine Plugin das Einstellungsmenü des anderen.
Zitieren
#6
Die Datenbank-Querys sind eigentlich total unproblematisch, anders geht es nicht. Natürlich musst du dir die Namen gut überlegen, damit es keine Probleme gibt.
[Bild: banner.png]

Bitte die Foren-Regeln beachten und im Profil die verwendete MyBB-Version angeben.
Zitieren
#7
Ich habe jetzt doch einen anderen Weg gefunden: In der Installationsanleitung schreiben wie die Settings heissen und den User die Gruppe und Einstellungen darunter selber anlegen lassen. Smile (Wenn jedes Plugin das eigentlich selber macht, warum kann man im Admin CP überhaupt selber irgendwelche Settings anlegen? Für was?)
Zitieren
#8
(15.11.2008, 21:46)frostschutz schrieb: (Wenn jedes Plugin das eigentlich selber macht, warum kann man im Admin CP überhaupt selber irgendwelche Settings anlegen? Für was?)
Du kannst das für viele Dinge gebrauchen. Z.B. kannst du eine Einstellung für eine Farbe oder Text erstellen und die Angaben direkt in den Templates verwenden.

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
#9
Da das Einstellungen anlegen im Admin CP etwas umständlich ist, sich dafür aber Einstellungsgruppen sehr leicht samt allen Unterpunkten löschen lassen, hab ichs jetzt so gelöst, daß das Plugin die Einstellungen nicht selbst entfernt. In activate() werden die Gruppen und Einstellungen anlegt, sofern sie noch nicht existieren.

Damit kann man das Plugin auch einfach mal deaktivieren / deinstallieren, und wieder neu installieren, ohne gleich die Einstellungen zu verlieren / auf Standardwerte zurückzusetzen.

Was hier noch fehlt: Sollte sich die Beschreibung einer Einstellung mal ändern, wird die nicht geupdated sofern die Einstellung schon existiert. Aber bei grundlegenden Funktionsänderungen ist es wahrscheinlich eh besser, der Einstellung einen neuen Namen zu geben.

Michael, falls das zu sehr ins Detail / Offtopic für diesen Thread geht - lösche meine Antworten hier einfach wieder.

PHP-Code:
function subforum_bulb_activate()
{
    
/**
     *    Called whenever a plugin is activated via the Admin CP. This should essentially make a plugin
     *    "visible" by adding templates/template changes, language changes etc.
     */

    // Apparently MyBB does not offer a plugin API for creating settings.
    // So we have to meddle with the DB directly. Yay.
    
global $db;

    
// Check if the settings group exists.
    
$query $db->query("SELECT gid FROM ".TABLE_PREFIX."settinggroups WHERE name='subforumbulb'");

    if(
$db->num_rows($query))
    {
        
// It exists, get the gid.
        
$gid $db->fetch_array($query);
        
$gid $gid['gid'];
    }

    else
    {
        
// It does not exist, create it and get the gid.
        
print "group does not exist<br>";
        
$db->insert_query("settinggroups",
                          array(
"gid" => "NULL",
                                
"name" => "subforumbulb",
                                
"title" => "Subforum Bulb",
                                
"description" => "Custom settings for the Subforum Bulb plugin.",
                                
"disporder" => "100",
                                
"isdefault" => "no"));
        
$gid $db->insert_id();
    }

    
// Check if the classic option exists.
    
$query $db->query("SELECT sid FROM ".TABLE_PREFIX."settings WHERE gid=$gid AND name='subforum_bulb_classic'");

    if(
$db->num_rows($query) == 0)
    {
        
// It does not exist, create it.
        
$db->insert_query("settings",
                          array(
"sid" => "NULL",
                                
"name" => "subforum_bulb_classic",
                                
"title" => "Classic Bulbs",
                                
"description" => "When set to YES, Subforum Bulb will stick to the original icons (Default).<br /><br />In this mode all the plugin does is prevent a parent forum to be marked as read when there are actually no new posts (MyBB bugfix).<br /><br />When set to NO, it will make use of new combined icons that show the status of the parent forum and the dominant subforum.",
                                
"optionscode" => "yesno",
                                
"value" => 1,
                                
"disporder" => 1,
                                
"gid" => $gid));
    }

    
// Check if the sorting options exists.
    
$query $db->query("SELECT sid FROM ".TABLE_PREFIX."settings WHERE gid=$gid AND name='subforum_bulb_sort'");

    if(
$db->num_rows($query) == 0)
    {
        
// It does not exist, create it.
        
$db->insert_query("settings",
                          array(
"sid" => "NULL",
                                
"name" => "subforum_bulb_sort",
                                
"title" => "Mini Subforum Sorting",
                                
"description" => "When set to NO, do nothing (Default).<br /><br />When set to YES, it will change the order of the subforums in the mini subforum list (subforum 1, subforum 2, and 3 more) so that it will show more important subforums first (unread &gt; read &gt; locked).",
                                
"optionscode" => "yesno",
                                
"value" => 0,
                                
"disporder" => 2,
                                
"gid" => $gid));
    }

    
// Rebuild the settings file.
    
rebuild_settings();

Zitieren
#10
(16.11.2008, 00:41)frostschutz schrieb: Damit kann man das Plugin auch einfach mal deaktivieren / deinstallieren, und wieder neu installieren, ohne gleich die Einstellungen zu verlieren / auf Standardwerte zurückzusetzen.
Danke für das Codebeispiel! Der Sinn des Deaktivierens ist es ja, dass die Datenbankänderungen etc. erhalten bleiben und erst beim Deinstallieren entfernt werden. Die hier genannte Anleitung ist auch etwas veraltet; in der Doku finden sich aktuellere Informationen.

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