Joomla! Programmierung/Programmierung/Plugins/Inhalt

Aus Joomla! Dokumentation
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

[Bearbeiten] Einleitung

Inhalt- oder „Content Plugins” stellen nebend den Modulen die häufigste und zugleich auch einfachste Form von Erweiterung dar, mit denen sich Ausgaben bzw. Inhalte verschiedener Artikel dynamisch verändern lassen. Hierzu zählt beispielsweise das automatische Ersetzen und Umwandeln von Schlüsselbegriffen in einem Artikel oder einer Komponente. Wie für alle Plugins stehen auch der Plugin Gruppecontent” einige Events bereit.

Diese Anleitung beschreibt an einem einfachen Beispiel das Ersetzen verschiedener Platzhalter in einem Artikel. Zu diesem Zweck verwenden wir das Event „onContentPrepare”.

[Bearbeiten] environment_vars.xml

Beginnen wir mit dem sogenannten „XML Manifest”, der Installationsdatei des Plugin. Hier werden neben einigen Angaben zum Autor, die für die Installation nötigen Anweisungen vorgenommen. Die Verwendung dieser Datei und auch der Sprachdatei ist allgemein gültig und unabhängig vom jeweiligen Event.

<?xml version="1.0" encoding="utf-8"?>
<extension version="2.5" type="plugin" group="content" method="upgrade">
    <name>Content - Environment Vars</name>
    <author>Joomla!-Nafu</author>
    <creationDate>June 2012</creationDate>
    <copyright>Copyright (C) Joomla!-Nafu</copyright>
    <license>GNU General Public License, http://www.gnu.org/licenses/gpl-2.0.html</license>
    <authorEmail>kontakt[at]joomla-nafu.de</authorEmail>
    <authorUrl>http://www.joomla-nafu.de</authorUrl>
    <version>1.0</version>
    <description>PLG_ENVIRONMENT_VARS_DESCRIPTION</description>
    <files>
        <filename plugin="environment_vars">environment_vars.php</filename>
        <filename>helper.php</filename>
        <filename>index.html</filename>
    </files>
    <languages>
        <language tag="de-DE">de-DE.plg_content_environment_vars.ini</language>
        <language tag="de-DE">de-DE.plg_content_environment_vars.sys.ini</language>
    </languages>
    <config>
        <fields name="params">
            <fieldset name="basic">
                <field name="enabled" type="radio" default="1" label="PLG_ENVIRONMENT_VARS_ENABLE" description="PLG_ENVIRONMENT_VARS_ADDITIONAL_SWITCH">
                    <option value="0">JNO</option>
                    <option value="1">JYES</option>
                </field>
            </fieldset>
        </fields>
    </config>
</extension>

[Bearbeiten] Erläuterung

Nach der Angabe des verwendeten Zeichensatzes werden sämtliche Anweisungsblöcke der XML-Datei vom <extension>...</extension> Tag umschlossen.

Wie in unserem Beispiel zu sehen wurden der Anweisung <extension> die erforderlichen Attribute version, type, group und method hinzugefügt.

<extension version="2.5" type="plugin" group="content" method="upgrade">
  • version="2.5": Bezeichnet die Joomla!-Version, auf der das Plugin installiert werden kann.
  • type="plugin": Durch diese Anweisung teilen Sie dem Installationsscript mit, dass es sich um ein Plugin handelt. Bei Komponenten würde hier „component” stehen. Bei Modulen „module”.
  • group: Hier wird dem Installationsvorgang mitgeteilt, um welche Plugin Gruppe es sich handelt.
  • method="upgrade" (optional): Das Plugin kann installiert werden, ohne die bereits installierte Version löschen zu müssen.
<name>Content - Environment Vars</name>
<author>Joomla!-Nafu</author>
<creationDate>June 2009</creationDate>
<copyright>Copyright (C) Joomla!-Nafu</copyright>
<license>GNU General Public License, http://www.gnu.org/licenses/gpl-2.0.html</license>
<authorEmail>kontakt[at]joomla-nafu.de</authorEmail>
<authorUrl>http://www.joomla-nafu.de</authorUrl>
<version>1.0</version>
<description>PLG_ENVIRONMENT_VARS_DESCRIPTION</description>

Der dann folgende Anweisungsblock enthält Informationen zum Autor, Lizenz- und Versionsangaben sowie der Angabe optionaler Kontaktdaten und unterliegt einschließlich der Beschreibung keinen stilistischen Vorgaben.

Um in Ihrer Beschreibung HTML Anweisungen verwenden zu können, muss diese mit <![CDATA[...]]> umschlossen werden. Die darin befindlichen Informationen werden dadurch vom XML Parser ignoriert.

Hinweis: Eine weitere Möglichkeit ist es, die HTML Formatierungen in die Sprachdatei auszulagern. Dies hat im Gegensatz zur Verwendung von CDATA den Vorteil dass die Beschreibung sowohl bei der Installation, als auch in der Backend Administration des Plugin korrekt Dargestellt wird.

[Bearbeiten] Dateien

Im Bereich <files> wird mit dem Attribut plugin="environment_vars" der Name des Plugins übergeben, welcher nach der Installation in der Datenbank unter: #prefix_plugins|Plugin_Name|element verwendet wird. Weiterhin wird der Name der PHP Datei notiert, die später den Einstiegspunkt darstellt.

<files>
    <filename plugin="environment_vars">environment_vars.php</filename>
    <filename>helper.php</filename>
    <filename>index.html</filename>
</files>

Sowohl die Installationsdatei (environment_vars.xml), als auch alle zusätzlichen Dateien werden vom Installationsprozess in das Verzeichnis: Folder blue.png Joomla!Hauptverzeichnis/plugins/content/environment_vars kopiert.

Wenn man ein größeres Plugin schreibt, das Unterordner beinhaltet, ist für diese die Syntax <folder>Unterordner</folder> zu empfehlen. Dadurch werden alle Dateien und Unterverzeichnisse des betreffenden Ordners vom Installationsvorgang berücksichtigt, müssen also nicht extra aufgelistet werden.

[Bearbeiten] Parameter

Um dem Plugin mehr Funktionalität geben zu können haben wir die Möglichkeit verschiedene Parameter einzubauen. Diese Parameter werden in der XML Datei über den Tag <config>...</config> angegeben und erscheinen später im Backend in den Einstellungen des Plugins. Joomla! stellt eine Reihe von Standard Parametern, wie Eingabefelder oder Auswahllisten bereit, mit deren Hilfe man das Verhalten oder die Ausgabe des Plugin beeinflussen kann. Es ist ebenso möglich eigene Parameter Elemente zu erstellen.

<config>
    <fields name="params">
        <fieldset name="basic">
            <field name="enabled" type="radio" default="1" label="PLG_ENVIRONMENT_VARS_ENABLE" description="PLG_ENVIRONMENT_VARS_ADDITIONAL_SWITCH">
                <option value="0">JNO</option>
                <option value="1">JYES</option>
            </field>
        </fieldset>
    </fields>
</config>

Im späteren Verlauf dieses Beispiels werden wir zeigen, wie auf diese Paramter zugegriffen werden kann.

Weitere Informationen: XML Parameter Elemente

[Bearbeiten] Übersetzung

Wenn Sie vorhaben Ihr Plugin der Allgemeinheit zur Verfügung zu stellen sollten Sie darauf achten, dass die Beschreibungen aller Parameter, also der Einstellungen im Backend, sowie deren Informationstexte vom System übersetzt werden können. Wir benutzen dafür folgende Anweisung:

<languages>
    <language tag="de-DE">de-DE.plg_content_environment_vars.ini</language>
    <language tag="de-DE">de-DE.plg_content_environment_vars.sys.ini</language>
</languages>

Weitere Informationen zu Sprachdateien können Sie dem nächsten Abschnitt entnehmen.

[Bearbeiten] de-DE.plg_content_environment_vars.ini

Der Name der Sprachdatei wird nach dem Schema xx-XX.plg_Gruppe_NameDesPlugins.ini erstellt. Der erste Teil stellt den Ländercode dar, wobei für die Übersetzung die Sprache in Joomla! installiert sein muss. Eine Liste der Ländercodes finden Sie unter http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes in der Spalte 639-1. Der zweite Teil enthält den Namen der Gruppe welcher das Plugin angehört.

Plugin Sprachdateien werden vom System in das Verzeichnis Folder blue.png administrator/language/xx-XX kopiert. In unserem Fall also Folder blue.png administrator/language/de-DE.

PLG_ENVIRONMENT_VARS_ENABLE_PLUGIN=Plugin aktivieren
PLG_ENVIRONMENT_VARS_ADDITIONAL_SWITCH=Zusätzlicher Parameter zum deaktivieren oder aktiveren des Plugins
PLG_ENVIRONMENT_VARS_DESCRIPTION=<strong>Environment Vars - Joomla! 2.5.x Content Plugin</strong><br />Ersetzt definierte Konstanten mit Umgebungsvariablen.

Hier sieht man, dass die Sprachtags, die in der Installationsdatei und den PHP-Dateien verwendet werden, in die betreffende Sprache übersetzt werden. Die Sprachtags, üblicherweise auf Englisch, in Großbuchstaben, zusammengeschrieben bzw. mit Unterstrich und systematisch benannt, sind sozusagen Platzhalter, für welche die hier definierten Texte eingesetzt werden. Wenn es für einen der Platzhalter keine Entsprechung in den Sprachdateien gibt, wird der Platzhalter selbst ausgegeben.

Wie oben zu sehen, werden die Platzhalter in die xml-Datei wie normaler Text geschrieben, in PHP-Dateien bedient man sich der Klasse JText. Folgender Beispielcode würde also in einer PHP-Datei des Plugins die Pluginbeschreibung ausgeben:

<?php
echo JText::_('PLG_ENVIRONMENT_VARS_DESCRIPTION');
?>

Hinweis: Die Sprachdateien müssen mit der Endung .ini im UTF-8 Format gepeichert werden und dürfen kein BOM enthalten.

[Bearbeiten] de-DE.plg_content_environment_vars.sys.ini

Diese Datei ist optional und beinhaltet nur Übersetzungen, die direkt bei der Installation verwendet werden sollen. In diesem Fall können wir also unsere Pluginbeschreibung noch zusätzlich in diese Datei schreiben:

PLG_ENVIRONMENT_VARS_DESCRIPTION=<strong>Environment Vars - Joomla! 2.5.x Content Plugin</strong><br />Ersetzt definierte Konstanten mit Umgebungsvariablen.

[Bearbeiten] environment_vars.php

<?php
/**
 * @author      Joomla!-Nafu
 * @authorurl   http://www.joomla-nafu.de
 * @Version     1.0
 * @license     GNU General Public License, http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Environment Vars - Joomla! 1.5.x Content Plugin - Replacing Defined Constants With Environment Variables
 * Copyright (C) 2009 - Joomla!-Nafu
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Pdeaublic License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses/>.
**/
 
// Standard Überprüfung ob die Datei über das Framework aufgerufen wurde
defined( '_JEXEC' ) or die( 'Nah, Joomla! - you know,...' );
 
// Import der JPlugin Klasse
jimport( 'joomla.plugin.plugin' );
 
// Erweitern der Klasse JPlugin
class plgContentEnvironment_Vars extends JPlugin {
 
    /**
     *  Zu Beginn muss die Sprachdatei geladen werden.
    **/
 
    public function __construct(& $subject, $config) {
        parent::__construct($subject, $config);
        $this->loadLanguage();
    }
 
    /**
     *  Aufruf der Event-Methode
     *
     *  Die Methode "onContentPrepare" stellt die erste Stufe der Generierung
     *  der Artikel Ausgabe dar und wird für Content Plugins am häufigsten verwendet.
     *
     *  @param  object      Übergabe des Artikel Objekts. Die Verwendung von $article->text ist ebenso möglich.
     *  @param  object      Das $params Objekt enthält alle Artikel zugehörigen Parameter.
     *  @param  int         Seitenzahl
    **/
 
    public function onContentPrepare( $article, $params, $page = 0 ) {
 
        /**
         *  Prefix
         *
         *  Das hier erstellte Prefix wird bei der Status Prüfung und im Regulären
         *  Ausdruck benutzt.
        **/
        $prefix = 'ev_';
 
        /**
         *  Um Ressourcen zu sparen wird an dieser Stelle überprüft ob der String
         *  "{ev_" im Artikel vorkommt. Wenn der Vergleich "true" ist
         *  , also der String nicht im Text enthalten ist wird der Vorgang beendet.
         *  Andernfalls wird das Plugin weiter ausgeführt.
        **/
        if ( JString::strpos( $article->text, '{'.$prefix ) === false ) {
 
            return true;
 
        }
 
        /**
         *  Regulärer Ausdruck - Schlüsselwort
         *
         *  Zur Identifizierung unserer Schlüsselwörter benötigen
         *  wir ein Erkennungsmuster. Sie können dafür ein beliebiges Wort
         *  oder eine Zeichenfolge verwenden, sollten jedoch bei Ihrer Auswahl
         *  darauf achten, dass der verwendete Begriff so in keinem Artikel oder
         *  Ausgabe vorkommt.
         *
         *  Beispiel: Mit $regexpr = '/Datum/' soll das Wort "Datum" durch das aktuelle
         *  Datum ersetzt werden.
         *
         *  In diesem Fall würde das Plugin sämtliche Vorkommen von "Datum" umwandeln.
         *  Besser wäre: '/{Datum}/' oder '/{plg_.*?}/i'
         *  Näheres zur Verwendung von Regulären Ausdrücken finden sie in den
         *  weiterführenden Links.
        **/
        $regexpr = '/{'.$prefix.'.*?}/i';
 
        /**
         *  Seitens Joomla! ist es im Falle eines deaktivierten Plugins nicht
         *  vorgesehen, dass die in einem Artikel enthaltenen Schlüsselwörter
         *  gefiltert werden.
         *
         *  Über die XML Datei haben wir einen zusätzlichen Schalter
         *  eingebaut, mit dessen Hilfe wir diese Funktion nachrüsten. Bei
         *  ausgeschaltetem Plugin wird der übergebene Text vom Regulären
         *  Ausdruck, und somit allen notierten Schlüsselwörtern bereinigt.
         *
         *  Wenn Sie das Plugin über Joomla! deaktivieren verbleiben die
         *  Schlüsselbegriffe ungefiltert im Artikel.
        **/
        if ( !$this->params->get( 'enabled', 1 ) ) {
 
            // Ersetzen der Schlüsselwörter durch eine leere Zeichenfolge
            $article->text = preg_replace( $regexpr, '', $article->text );
 
            return true;
 
        }
 
        /**
         *  Mit der Funktion preg_match_all() werden alle Zeichenfolgen die unserem
         *  Suchmuster entsprechen in einem Array gespeichert.
        **/
        preg_match_all( $regexpr, $article->text, $matches );
 
        // Liefert die Suche kein Ergebnis wird das Plugin regulär beendet
        if ( !count( $matches[0] ) ) {
 
            return true;
 
        }
 
        // Bereitstellung einiger Objekte und Variablen
        $user        = JFactory::getUser();
        $date_format = $pluginParams->get( 'date_format', '%d.%m.%Y' );
 
        // Import der Helper Klasse
        JLoader::import( 'mod_environment_vars.helper', JPATH_SITE.DS.'modules' );
 
        /**
         *  Unterscheidung zwischen angemeldetem Benutzer oder Gast
         *
         *  In Abhängigkeit vom Status des Besuchers werden den zu ersetzenden
         *  Platzhaltern aus unserem Text die entsprechenden Informationen
         *  zugewiesen.
        **/
		if ( $user->get( 'guest' ) ) {
 
            // Gast
            $user_vars = array(
                    '{'.$prefix.'id}'       => 0,
                    '{'.$prefix.'name}'     => 'Gast',
                    '{'.$prefix.'username}' => 'Gast',
                    '{'.$prefix.'email}'    => 'mail@domain.tld' );
 
		} else {
 
            // Angemeldeter Benutzer
            $user_vars = array(
                    '{'.$prefix.'id}'       => $user->get( 'id' ),
                    '{'.$prefix.'name}'     => $user->get( 'name' ),
                    '{'.$prefix.'username}' => $user->get( 'username' ),
                    '{'.$prefix.'email}'    => $user->get( 'email' ) );
        }
 
    	// Informationen zum Artikel
        $article_vars = array(
                '{'.$prefix.'article_id}'       => $article->id,
                '{'.$prefix.'article_title}'    => $article->title,
                '{'.$prefix.'article_author}'   => $article->author,
                '{'.$prefix.'article_section}'  => $article->section,
                '{'.$prefix.'article_category}' => $article->category );
 
    	// Allgemeine Informationen
        $environment_vars = array(
                '{'.$prefix.'today}' => JHTML::_( 'date', 'now', $date_format ) );
 
        // Weitere Informationen
 
        // Zusammenführen aller Informationen zu einem Array
        $all_vars = array_merge( $user_vars, $article_vars, $environment_vars );
 
        //
        $all_keys = array_keys( $all_vars );
 
        /**
         *  Ersetzt die Schlüsselwörter mit den im Plugin
         *  zugewiesenen Daten.
        **/
        $article->text = str_replace( $all_keys, $all_vars, $article->text );
 
    }
 
}

Nachdem im ersten Teil des Plugins einige Abfragen zum Status und Prüfungen auf Vorkommen von gesuchten Schlüsselwörtern gemacht wurden, beginnt mit dem Zuweisen der Werte über die jeweiligen Arrays die eigentliche Funktion.

Nehmen wir einmal an, Sie würden in Ihrem Artikel {ev_today} benutzen. Durch die Zweisung des Rückgabewerts der Klasse JHTML wird nun anhand der übergebenen Formatierung %d.%m.%Y das aktuelle Datum im Array gespeichert. Im weiteren Verlauf wird das Schlüsselwort ersetzt womit wir in unserem Beispiel als Ergebnis die Ausgabe: 17.07.2009 erhalten.

[Bearbeiten] Anpassung

Durch geringe Veränderung des Codes wäre es nun möglich die Ausgabe dieses Datums über das Backend zu formatieren. Erstellen Sie dafür einen weiteren Parameter des Typ text und fügen diesen in die XML Datei ein. Vergessen Sie dabei nicht nötigen Übersetzungen in der Sprachdatei zu notieren.

<params>
    ...
    <param name="date_format" type="text" default="" label="Date Format" description="Defining Date Output Format" />
</params>
...
DATE FORMAT=Datumsformat
DEFINING DATE OUTPUT FORMAT=Geben Sie hier das gewünschte Datumsformat ein.<br /><strong>Beispiel:</strong><br />%A %d.%m.%Y

Als nächstes holen wir uns das Datumsformat aus den Parametern und weisen den Inhalt der Variable $date_format zu. Der zuvor verwendete Standardwert %d.%m.%Y wird nun benutzt um die Variable mit Inhalt zu füllen, sollte der Parameter im Backend nicht gesetzt worden sein.

Um an den Wert des Parameters zu kommen wird der get() Methode des Parameter Objekts der Name des XML Elements übergeben.

// Bereitstellung einiger Objekte und Variablen
...
...
$date_format = $pluginParams->get( 'date_format', '%d.%m.%Y' )

Hinweis: Die Darstellung der aktuellen Uhrzeit ist abhängig vom Offset das Sie im Backend eingestellt haben. Es ist eventuell nötig die Zeitzone zu ändern um Sommer- und Winterzeit zu berücksichtigen.

Welche möglichen Formatierungen Ihnen zur Verfügung stehen, sehen sie in der PHP Funktionsreferenz::strftime.

[Bearbeiten] helper.php

Das Artikel Objekt das dem Plugin übergeben wird stellt bereits einige Informationen zur weiteren Verarbeitung bereit. Im Array $article_vars haben wir Daten, wie den Namen des Autors oder den Titel des Artikels zugewiesen. Zusätzlich wollen nun noch eine Link Liste weiterer Artikel des jeweiligen Autors bereitstellen. Die dafür nötigen Methoden finden wir in der zuvor eingebundenen Helper Klasse.

// Import der Helper Klasse
JLoader::import( 'mod_environment_vars.helper', JPATH_SITE.DS.'modules' );
<?php
/**
 * @author      Joomla!-Nafu
 * @authorurl   http://www.joomla-nafu.de
 * @Version     1.0
 * @license     GNU General Public License, http://www.gnu.org/licenses/gpl-2.0.html
 *
 * Environment Vars - Joomla! 1.5.x Content Plugin - Replacing Defined Constants With Environment Variables
 * Copyright (C) 2009 - Joomla!-Nafu
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, see <http://www.gnu.org/licenses/>.
**/
 
// Standard Überprüfung ob die Datei über das Framework aufgerufen wurde
defined( '_JEXEC' ) or die( 'Nah, Joomla! - you know,...' );
 
// Helper Klasse
class plgEnvironmentVarsHelper {
 
    /**
     *  
     *  
    **/
    public function todo() {
 
        //
 
    }
 
}

[Bearbeiten] index.html

Die index.html dient dazu, die Auflistung von Dateien in zusätzlich angelegten Ordnern zu unterbinden.

<html><body bgcolor="#FFFFFF"></body></html>

[Bearbeiten] Ausgabe

Abschließend soll die Ausgabe und Funktionsweise an einigen Beispielen aufgezeigt werden. Hierbei werden alle möglichen Schlüsselbegriffe in einem Artikel notiert und durch das Plugin ersetzt.

[Bearbeiten] Siehe auch

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Sonstiges
Team Navigation
Werkzeuge