Eigene Aktion erstellen
Aus SMFPortal.de Wiki
In diesem Artikel geht es darum eigene Aktionen in sein Forum einzubinden. Für php und SMF Neulinge bietet sich die Modifikation Custom Action Mod, mit deren Hilfe man die hier beschriebenen Änderungen direkt im ACP vornehmen kann. Wer etwas tiefer in die Materie einsteigen möchte ist dagegen hier genau richtig. Das Beispiel bezieht sich auf die SMF 2.0RC1 Version, sollte aber auch mit einer 1.1.X Version nachvollziehbar sein.
Inhaltsverzeichnis |
Einführung
Eine "Aktion" im SMF ist das was man sieht wenn man auf einen Link im Hauptmenü klickt. Als Beispiel sei hier mal die Suche erwähnt, diese ruft man im SMF über index.php?action=search auf. In der Datei index.php findet man auch sehr schnell die entsprechende Codestelle die für diese Aktion zuständig ist:
// Here's the monstrous $_REQUEST['action'] array - $_REQUEST['action'] => array($file, $function).
$actionArray = array(
'activate' => array('Register.php', 'Activate'),
'admin' => array('Admin.php', 'AdminMain'),
.
.
.
'search' => array('Search.php', 'PlushSearch1'),
'search2' => array('Search.php', 'PlushSearch2'),
.
.
.
'xmlhttp' => array('Xml.php', 'XMLhttpMain'),
);
Die Aktion Search verweist also auf die Funktion PlushSearch1 in der Datei Search.php. Diese Datei findet man im Odner Sources und dort kann man sich die Funktion auch ansehen:
void PlushSearch1() - shows the screen to search forum posts (action=search), and uses the simple version if the simpleSearch setting is enabled. - uses the main sub template of the Search template. - uses the Search language file. - requires the search_posts permission. - decodes and loads search parameters given in the URL (if any). - the form redirects to index.php?action=search2.
Die wichtigsten Statements findet man gleich zu Anfang der Funktion:
loadLanguage('Search');
.
.
.
loadTemplate('Search', 'search');
Hier wird zuerst mit loadLanguage die entsprechende Sprachdatei aus dem Ordner Themes/default/languages eingebunden (je nach benutzter Sprache die passende, in der Regel also Search.german.php) und danach wird das Template geladen - in diesem Fall die Datei Search.template.php aus dem Themeordner. Die Definition der Funktion loadTemplate findet man in der Datei Load.php im Sources Ordner:
void loadTemplate(string template_name, array style_sheets = array(), bool fatal = true) - loads a template file with the name template_name from the current, default, or base theme. - uses the template_include() function to include the file. - detects a wrong default theme directory and tries to work around it. - if fatal is true, dies with an error message if the template cannot be found.
Das war im groben schon der komplette Ablauf, nach diesem Schema durchlaufen im SMF praktisch alle Vorgänge, sei es die Suchfunktion, das Posten von neuen Beiträgen oder die Anzeige der Hilfeseiten. Zur Übersicht der Ablauf in Kurz:
- die index.php wird ausgeführt, die entsprechende Aktion wird im "Actionarray gesucht".
- die der Aktion zugewiesene Datei wird geladen und die angegebene Funktion wird ausgeführt. Hier werden Template- und Sprachdateien geladen. In dieser Funktion finden normalerweise auch alle Datenbankabfragen statt, es werden alle Kontextbezogenen Variablen initialisiert und Eingaben und Rechte werden überprüft. Danach wird im Schritt
- die Templatefunktion aus der geladenen Templatedatei (in den meisten Fällen die Funktion template_main) ausgeführt. Templates setzen sich in der Regel zusammen aus lauter "echo" Befehlen umrahmt von ein paar Schleifen und If-Abfragen - Datenbankabfragen etc. sollten hier aber nicht mehr stattfinden.
Subtemplates werden geladen indem man den Template-Namen in der Source Datei das Array "context" einfügt (Beispiel: $context['sub_template'] = 'results';). Dieses Beispiel beschränkt sich aber auf ein Maintemplate ohne weitere Subtemplates.
Eine eigene Aktion definieren
Ein einfaches Hallo Welt Beispiel zum Nachvollziehen. Als erstes bearbeiten wir die Datei index.php und fügen in das Aktionarray eine Zeile Code ein
$actionArray = array(
'hallo' => array('HalloWelt.php', 'Hallo'),
'activate' => array('Register.php', 'Activate'),
'admin' => array('Admin.php', 'AdminMain'),
Normalerweise ist das Array alphabetisch sortiert, der Übersichtlichkeit halber ist es in diesem Beispiel ganz oben eingefügt. Man könnte seine eigenen Funktionen auch ganz unten anfügen, das hat auf die Funktion nachher keinerlei Einfluss.
Danach erstellen wir eine neue datei im Ordner Sources und nennen diese HalloWelt.php. Der Inhalt:
<?php
if (!defined('SMF'))
die('Hacking attempt...');
function Hallo() {
global $context;
loadTemplate('HalloWelt');
$context['message_to_show']="Hallo Welt!";
}
?>
Im letzten Schritt erstellen wir das Template, dazu einfach eine neue Datei im Ordner des aktuellen Themes anlegen mit dem Namen HalloWelt.template.php und folgendem Inhalt:
<?php
function template_main() {
global $context;
echo '<div class="windowbg2">' , $context['message_to_show'] , '</div>';
}
?>
So einfach kann's gehen, wenn man jetzt das Forum aufruft sollte die neue Aktion unter index.php?action=hallo zur Verfügung stehen.
Eigene Aktion als Startseite
Um die neu erstellte Aktion als Startseite anzuzeigen sind nur zwei Änderungen nötig. Als erstes in der index.php diese Codestelle:
// Action and board are both empty... BoardIndex!
if (empty($board) && empty($topic))
{
require_once($sourcedir . '/BoardIndex.php');
return 'BoardIndex';
}
ändern in
// Action and board are both empty... BoardIndex!
if (empty($board) && empty($topic))
{
require_once($sourcedir . '/HalloWelt.php');
return 'Hallo';
}
Dadurch verliert man aber den Zugriff auf den BoardIndex. dieser wird dann auf eine andere Aktion "umgelenkt":
$actionArray = array(
'hallo' => array('HalloWelt.php', 'Hallo'),
'forum' => array('BoardIndex.php', 'BoardIndex'),
'activate' => array('Register.php', 'Activate'),
'admin' => array('Admin.php', 'AdminMain'),
Soll bei jeder unbekannten Aktion statt des BoardIndex auch die neu erstellte Aktion angezeigt werden bearbeitet man noch folgende Stelle in der index.php
// Fall through to the board index then... require_once($sourcedir . '/BoardIndex.php'); return 'BoardIndex';
Inzwischen sollte hoffentlich klar sein was dort geändert werden muß, wenn nicht dann bitte diesen Artikel nochmal vom Anfang durcharbeiten ;) Ansonsten viel Spaß beim ausprobieren.