Infusion

Aus PHP-Fusion Wiki

(Weitergeleitet von Infusions)
Wechseln zu: Navigation, Suche

Um die Vielzahl an Erweiterungen und Mods, die es für PHP-Fusion gibt, auch Anwendern mit weniger guten Programmier-Kenntnissen zur Verfügung zu stellen, hat man ein einheitliche Struktur dieser Erweiterungen, sowie die Möglichkeit einer Installationsroutine geschaffen. Mithilfe der Infusions-Verwaltung kannst Du diese Erweiterungen de-/installieren und updaten.

Inhaltsverzeichnis

[Bearbeiten] Download

Eine sehr große und ständig aktualisierte Aufzählung an Erweiterungen findest Du in der Download Datenbank der deutschen Support Seite. Solltest Du dort nicht fündig werden, lohnt vielleicht ein Blick in die Download Listen der anderen Support Seiten. Eine Übersicht über diese Seite findest du hier.

[Bearbeiten] Installation

Die meisten Infusionen haben eine Textdatei beiliegen die den Installationsvorgang beschreibt, daher gibt es hier nur eine kurze generelle Anleitung.

Infusionen werden in der Administration über den Punkt Infusionen installiert. Dabei erscheint eine Liste der bereits installierten Infusionen sowie eine DropDown-Liste, aus der man eine neu zu installierende Infusion auswählen kann. Noch nicht installierte Infusionen erscheinen in der Liste rot, bereits installierte grün. Wurde eine Infusion zwischenzeitig aktualisiert und auf den Server geladen (in den Ordner /infusions), wird diese blau dargestellt.

[Bearbeiten] Programmierung

Um neue Infusionen zu programmieren, gibt es eine Vorlage: das Infusion Developer Kit (alternativer Download auf der deutschen Support Seite).

Die wichtigste Datei hier ist die infusion.php, mit der die Installation einer Infusion ermöglicht wird. Grob gesagt hat sie folgenden Aufbau:

  • Sprachdatei ermitteln
  • Generelle Informationen der Infusion
  • Datenbankänderungen

Weiterhin haben die meisten Infusionen noch einen Ordner locale, der die Sprachdateien enthält sowie gelegentlich ein vordefiniertes Seitenpanel, welches dann in den Panels zu finden ist.

Wenn eine Infusion programmiert wird, die in der Mitte erscheinen soll, so ist zu beachten, dass die Infusion nach einem bestimmten Schema andere PHP-Dateien aufruft.

<?php
require_once "../../maincore.php";
require_once BASEDIR."subheader.php";
require_once BASEDIR."side_left.php";
 
//der Programmcode der Infusion
 
require_once BASEDIR."side_right.php";
require_once BASEDIR."footer.php";
?>

Zunächst wird die maincore.php aufgerufen, welche alle Funktionen und Konstanten lädt und bereitstellt. Anschließend wird der Kopfteil und die linke Panel-Seite geladen. Nun erfolgt die Programmierung und Ausgabe des mittleren Bereichs, der neuen Infusion. Abschließend werden dann noch die rechte Panel-Seite und der Fußteil geladen.


[Bearbeiten] Sprachdatei finden

if (file_exists(INFUSIONS."infusion_title/locale/".$settings['locale'].".php")) {
	include INFUSIONS."infusion_title/locale/".$settings['locale'].".php";
} else {
	include INFUSIONS."infusion_title/locale/English.php";
}

Es wird die in den Haupteinstellungen gespeicherte Sprache gesucht. Hier ist lediglich der Ordnername der Infusion anzupassen (infusion_title).


[Bearbeiten] Generelle Informationen der Infusion

Der nächste Abschnitt der infusion.php enthält die Informationen über die Infusion selber.

$inf_title
Name der Infusion, idealerweise in der Sprachdatei hinterlegt
$inf_title = $locale['xxx100'];
$inf_description
Beschreibung der Infusion, idealerweise in der Sprachdatei hinterlegt
$inf_description = $locale['xxx101'];
$inf_version
Version der Infusion, wichtig für spätere Updates über das Backend Infusionen


$inf_developer
Name des Infusions-Entwicklers


$inf_email
eMail-Adresse des Entwicklers


$inf_weburl
WebURL des Entwicklers


$inf_folder
Name des Ordners der Infusion


$inf_admin_image
Name des Bildes, falls im Backend eine Konfiguration der Infusion möglich ist. Kann leer bleiben, dann wird ein Standard-Bild verwendet.


$inf_admin_panel
Name der Datei, mit der die Konfiguration der Infusion aufgerufen werden kann


$inf_link_name
Name des Links, der in den Seitenlinks angezeigt wird, idealerweise in der Sprachdatei hinterlegt
$inf_link_name = $locale['xxx102'];
$inf_link_url
Name der Datei, auf die verlinkt wird


$inf_link_visibility
Angabe, wer den Link sehen darf. Es gelten die Werte 0 (Gäste), 101 (Member), 102 (Admin) und 103 (Super-Admin) (vgl. Userlevel)


$inf_newtables
Anzahl der neuen Datenbank-Tabellen


$inf_insertdbrows
Anzahl der einzufügenden Zeilen in Tabellen. Dies kann u.U. für Einmalinitialisierungen benötigt werden
$inf_altertables
Anzahl der Tabellen, die um x Spalten erweitert werden müssen


$inf_deldbrows
Anzahl der Zeilen, die aus einer Tabelle gelöscht werden sollen

[Bearbeiten] Datenbankänderungen

Der letzte Teil betrifft die eigentlichen Änderungen an der Datenbank. Hierfür sind Grundkenntnisse von MySQL notwendig.

$inf_newtable_[1] = "table_name (
field1 SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
field2 TINYINT(5) UNSIGNED DEFAULT '1' NOT NULL,
field3 VARCHAR(200) DEFAULT '' NOT NULL,
field4 VARCHAR(50) DEFAULT '' NOT NULL,
PRIMARY KEY (field1)
) TYPE=MyISAM;";

Es wird eine neue Tabelle table_name angelegt.

$inf_insertdbrow_[1] = "table_name (field1, field2, field3, field4) VALUES('', '', '', '')";

Es wird in die Tabelle table_name eine Zeile eingefügt

$inf_altertable_[1] = "table_name ADD field5 INT 10 NOT NULL";

Die bereits bestehende Tabelle table_name wird um eine Spalte erweitert

$inf_deldbrow_[1] = "other_table WHERE id = 10";

Aus der Tabelle other_table wird der Datensatz 10 gelöscht. $inf_deldbrow wird sehr selten verwendet.

Sollen mehr als eine Tabelle angelegt oder geändert werden, so ist die Ziffer in den eckigen Klammern zu inkrementieren.

[Bearbeiten] PHP-Fusion 6 Infusion konvertieren zu PHP-Fusion 7

Seitdem die Version 7 von PHP-Fusion veröffentlicht wurde, haben sich Entwickler und Programmierer damit beschäftigt, neue Infusions, Modifikationen oder Panels für diese Version zur Verfügung zu stellen oder ältere Infusions einfach kompatible zu machen, was durchaus weniger zeitaufwändig ist. Die Version 7 wurde so intensiv überarbeitet, dass es nötig ist einige Änderungen an alten Infusions durchzuführen, um sie im System wieder nutzen zu können.

Hier wird erklärt, welche wichtigen Schritte notwendig sind, um eine Infusion für die Version 6 unter Version 7 lauffähig zu machen. Als Grundlage diente das PHP-Fusion Core 7 Edition Infusion SDK, wobei die wichtigen Schritte in der beigefügten Readme.txt auf Englisch genannt werden.

[Bearbeiten] Änderungen an der infusion.php

In Version 7 kann eine Infusion mehrere Admin-Panels und Seiten-Links anlegen. Die Dazu benötigten Informationen werden jeweils in einem Array gespeichert.

Für die Admin-Panel benutzen wird die Variable so:

$inf_adminpanel[1] = array(
"title" => $locale['textbaustein1'],
"image" => "grafik.gif",
"panel" => "dateiname.php",
"rights" => "XXX"
);


Die vier verwendeten Informationen sind:

title - Der Name des Links, der unter der Grafik im Admin Panel auftaucht. image - Die Grafik, die im Admin Panel für diesen Link verwendet wird. panel - Der Name der zu verlinkenden Datei rights - In Version 7 muss jede Infusion einen eigenen Zugriffscode besitzen, welche aus maximal 4 Großbuchstaben bestehen muss.


Ähnlich verhält es sich mit den Seiten-Links

$inf_sitelink[1] = array(
"title" => $locale['textbaustein2'],
"url" => "dateiname.php",
"visibility" => "0"
);


Hier gibt es diesmal drei Informationen: title - Der Name des Seiten-Links url - Der Name der zu verlinkenden Datei visibility - Definiert die Sichtbarkeit (0 für öffentlich, 101 für Moderatoren, 102 für Administratoren oder 103 für Super-Administratoren).

[Bearbeiten] Header und Footer Code

Die Version 7 hat ein ganz neues Templatesystem, welches folgende Veränderungen voraussetzt:

Die ersten Programmzeilen in Version 6 sahen auf normalen Seiten so aus:

require_once "../../maincore.php";
require_once BASEDIR."subheader.php";
require_once BASEDIR."side_left.php";

und endete so:

require_once BASEDIR."side_right.php";
require_once BASEDIR."footer.php";


In Version 7 muss das nun so aussehen:

require_once "../../maincore.php";
require_once THEMES."templates/header.php";
require_once THEMES."templates/footer.php";


Für Admin Seiten gibt es ähnliche Anpassungen:

Version 6:

require_once "../../maincore.php";
require_once BASEDIR."subheader.php";
require_once ADMIN."navigation.php";


echo "</td>\n";
require_once BASEDIR."footer.php";


wird in Version 7 zu:

require_once "../../maincore.php";
require_once THEMES."templates/admin_header.php";
require_once THEMES."templates/footer.php";

Hier gibt es einen kleinen Widerspruch mit dem SDK, was besagt, dass admin_footer.php verwendet werden muss, leider gibt es diese Datei (noch) gar nicht, die footer.php sollte aber problemlos funktionieren.

[Bearbeiten] Veränderungen in der IN_FUSION Überprüfung

Aus Sicherheitsgründen werden in Panels oder anderen "includeten" Dateien eine IN_FUSION Überprüfung durchgeführt, um sicherzustellen, dass man die Datei nicht selber aufruft sondern nur mit der gesamten Seite. Schlägt die Überprüfung fehl, so startet eine Header-Weiterleitung. Diese Weiterleitung hat auf einigen Servern zu sehr hochen Auslastungen geführt, weshalb folgende Änderung mehr als sinnvoll ist:

Beispiel für die Überprüfung in Version 6:

if (!defined("IN_FUSION")) { header("Location: ../../index.php"); exit; }


Die neue Methode in Version 7:

if (!defined("IN_FUSION")) { die("Access Denied"); }


es wurde nur

header("Location: ../../index.php");
exit;

durch

die("Access Denied");

ersetzt.


[Bearbeiten] Entfallenen Funktionen

Einige Funktionen haben sich verändert oder sind hinzugekommen. Die wichtigsten beiden Änderungen sind:

fallback(); wird nun von redirect(); übernommen

tablebreak(); wurde ganz entfernt, weil der Abstandshalter nun automatisch durch Cascading Style Sheets (CSS) eingefügt wird.


[Bearbeiten] Verwendung von Super Globals

Ebenfalls zur Sicherheit beitragend ist die Verwendung von Super Globals, weshalb "Register Globals" in PHP-Fusion v7 deaktiviert wurde. Das heißt, man muss nun $_GET, $_POST, $_COOKIE etc verwenden. Die beiden häufigsten Super Globals sind $_GET und $_POST;

$_GET wird für Variablen auf der Adresszeile oder URL benutzt $_POST liefert versteckte Variablen, die durch Formulare übertragen wurden.

Weitere Informationen zu Super Globals sind hier zu finden: http://php.net

Achtung: Ganz wichtig ist, dass alle Super Globals Variablen überprüft und gereinigt werden, bevor man sie zum Beispiel für Datenbankabfragen einsetzt. Wenn man die Variablen keiner Sicherheitsüberprüfung, wie durch stripinput() etc, unterzieht, ist es für Hacker eine gefunden Sicherheitslücke, mit der man im schlimmsten Fall die gesamte Webseite hacken kann.

[Bearbeiten] Multisite

Eine neue Funktion von PHP-Fusion v7 nennt sich Multisite. Multisite macht es möglich, mehrere PHP-Fusion Seiten über eine Datenbank ganz oder teilweise laufen zu lassen. Die Systemtabellen sind in includes/multisite.php definiert. Jede Infusion, eine oder mehrere Tabellen in der Datenbank anlegt, hat diese in einer eigene infusion_db.php definiert. Wie die Datei auszusehen hat, kann man diesem Beispiel entnehmen:

<?php
/*-------------------------------------------------------+
| PHP-Fusion Content Management System
| Copyright © 2002 - 2008 Nick Jones
| http://www.php-fusion.co.uk/
+--------------------------------------------------------+
| Filename: infusion_db.php
| Author: INSERT NAME HERE
+--------------------------------------------------------+
| This program is released as free software under the
| Affero GPL license. You can redistribute it and/or
| modify it under the terms of this license which you
| can read by viewing the included agpl.txt or online
| at www.gnu.org/licenses/agpl.html. Removal of this
| copyright header is strictly prohibited without
| written permission from the original author(s).
+--------------------------------------------------------*/
if (!defined("IN_FUSION")) { die("Access Denied"); }
 
if (!defined("DB_INFUSION_TABLE")) {
define("DB_INFUSION_TABLE", DB_PREFIX."infusion_table");
}
?>


Hier noch zwei Beispiele, wie man in Version 6 auf die Datenbank zugegriffen hat:

$result = dbquery("SELECT * FROM ".$db_prefix."users");
 
 
$rows = dbcount("(*)", "users");


So macht man es nun in Version 7:

$result = dbquery("SELECT * FROM ".DB_USERS);
 
 
$rows = dbcount("(*)", DB_USERS);