xPlugins

Mit xPlugins werden die Funktionen von TobbiVM erweitert. Ob es sich um ein Galeriesystem handelt, um die Einblendung von Zufallsartikeln, der Anzeige einer Uhr im Template oder oder oder. Es kann also der gesamte Funktionsumfang mit wenigen Mausklicks vergrößert werden.
Plugin auf den Webspace laden, im Backend die Plugin-Erkennung starten und das Plugin aktivieren. So einfach geht das. Jedes Plugin hat integrierte Hilfeseiten, die das weitere Vorgehen und die Einstellungen genau beschreiben. Mit Ausnahme der Bezahlfunktionen und der Versandmodule kann für jeden Zweck ein Plugin geschrieben werden.

xPlugin-Typen

Es gibt zwei Typen von xPlugins.

Das erste, sogenannte Head-Plugin, wird durch eine oder mehrere Zeilen im Head-Bereich der Html-Seite eingebunden. Ein Vertreter dieses Typs ist die jQuery-Bibliothek. Dadurch das solche Erweiterungen mittels xPlugin eingebunden werden verhindert auch das versehentlich, gleichzeitig, mehrere Versionen von jQuery eingebunden werden. Bei den Head-Plugins können keine Einstellungen (außer Ein/Aus) vorgenommen werden. Dieser Typ wird vor allem zum Einbinden von externen Librarys sowie Template-Erweiterungen genutzt.

Der zweite Typ ist das Content-Plugin. Installiert und aktiviert wird es genau so wie ein Head-Plugin. Ganz im Gegensatz zu einem Head-Plugin wird, je nach Plugin, ein Script im Head-Bereich und/oder im Content-Bereich eingefügt. Das Content-Plugin kann nur in den Bereichen genutzt werden, die du auch im Backend bearbeiten kannst. Also auf allen Seiten, die editierbar sind.
Dieses Einbinden geschieht in der Regel durch einen sogenannten Platzhalter in der Form von „{Pluginname}". Genau andieser Stelle wird vom Plugin der entsprechende Code eingefügt.

Aufbau eines xPlugins

Der Aufbau eines xPlugins erfolgt nach den folgenden Regeln. Als Beispiel dient hier das Fancybox-xPlugin.

Aufbau der benötigten Verzeichnisstruktur:

/xplugin/
            Name_des_xPlugins/
                                         freie Gestaltung der weiteren Verzeichnisse

Nur wenn Textausgaben direkt durch das xPlugin vorgenommen werden
/language/
               de_DE/
                         LC_MESSAGES/
                                                Sprachdatei *.mo und *.po
/admin/
           xplugin/
           language/
                        de_DE/
                                  LC_MESSAGES/
                                                         Sprachdatei *.mo und *.po

Falls für das xPlugin keine Sprachausgabe notwendig ist so kann die Sprachdatei natürlich entfallen.

Der Verzeichnisname der im xPlugin angelegt wird muss für bestimmte Dateien und Klassennamen übernommen werden.

Wird ein Verzeichnis mit dem Namen „fancybox" angelegt so sind einige Vorgaben einzuhalten.

Anzulegende Dateien:

/admin/xplugin/fancybox/config.php

Hier werden die Standardwerte für die Datenbank angelegt. Besonders ist auf die Syntax des Feldes „plugin_config" zu achten!

$xPluginConfig[] = array(
 'plugin_name' => 'Fancybox 2.1.5',
 'plugin_code' => 'gallery',
 'plugin_config' =>
 'scripts::' .  // Der auf „scripts::" folgende Code wird 1:1 in den Headbereich eingefügt
 '<script type="text/javascript" src="xplugin/fancybox/source/jquery.fancybox.js?v=2.1.5"></script>' .
 '<link rel="stylesheet" href="xplugin/fancybox/source/jquery.fancybox.css?v=2.1.5" type="text/css" media="screen" />' .
 '<link rel="stylesheet" type="text/css" href="xplugin/fancybox/source/helpers/jquery.fancybox-thumbs.css?v=1.0.7" />' .
 '<script type="text/javascript" src="xplugin/fancybox/source/helpers/jquery.fancybox-thumbs.js?v=1.0.7"></script>' .
 '|' .
 'config::' .   // Der auf „config::" folgende Code enthält die Standardwerte des xPlugins
 'width:650,maxWidth:800,maxHeight:600,openEffect:elastic,closeEffect:elastic,' .
 'nextEffect:elastic,prevEffect:elastic,openSpeed:500,closeSpeed:500,nextSpeed:500,' .
 'prevSpeed:500,openOpacity:1,closeOpacity:1,arrows:1,closeBtn:1,mouseWheel:1,' .
 'autoPlay:1,playSpeed:3000',
 'plugin_typ' => 'C',
 'plugin_help' => // Hier wird der Hilfetext in Form von Html-Code eingefügt
 '<b>Aufruf der Galleriefunktion:</b><br>
     {xPlugin:gallery,Pfad/zu/den/Bilddateien}<br>
     Der Pfad ist ohne führenden Schrägstrich und ab dem Benutzer-Bildverzeichnis anzugeben.
     Dies ist in der Standardkonfiguration "images/user".<br><br>
     <table cellpadding="0" cellspacing="0" class="plugin_help">
    <colgroup>
       ....
       
        <tr>
            <td>playPlay</td>
            <td>Dauer der Einblendung der Galleriebilder in der Slideshow, (1000 Einheiten = 1 Sekunde). <span style="color:#888">Standard: 3000</span></td>
        </tr>
    </tbody>
</table>
'
);

 

/admin/xplugin/fancybox.xplugin.php

Alle, als Public deklarierte, Methoden müssen angelegt werden. Auch wenn diese nicht gebraucht werden sollten.

// Klassenname = Verzeichnisname!
class fancybox extends validate
{
    // In die Seite (head-Bereich) einzufügender Codeblock mit {Platzhaltern} die durch,
    // im Backend angegebene, Werte ersetzt werden. PHP-Scripts sind nicht erlaubt!

    private $_config = array();
    private $_script = "<script type=\"text/javascript\">
        $(document).ready(function() {
            /*
             *  Simple image gallery. Uses default settings
             */

      $('.fancybox').fancybox({
            maxWidth: {maxWidth},
                maxHeight: {maxHeight},
                openEffect: '{openEffect}',
                closeEffect: '{closeEffect}',
                nextEffect: '{nextEffect}',
                prevEffect: '{prevEffect}',
                openSpeed: {openSpeed},
                closeSpeed: {closeSpeed},
                nextSpeed: {nextSpeed},
                prevSpeed: {prevSpeed},
                openOpacity: {openOpacity},
                closeOpacity: {closeOpacity},
                arrows: {arrows},
                closeBtn: {closeBtn},
                mouseWheel: {mouseWheel},
                autoPlay: {autoPlay},
            playSpeed: {playSpeed}
       });
         });
    </script>
    <style type=\"text/css\">
        .fancybox-custom {
            box-shadow: 0 0 50px #222;
            max-width: {width}px;
        }
    </style>";

    /*
     * Initialisierung der im Backend, veränderbaren, Einstellungen
     * mit Angabe von Maximal-, Minimalwert, Istwert und Variblentyp.
     */
    public function __construct()
    {
        $this->_config[] = array('text' => _('Width'), 'name' => 'width',
         'typ' => 'i', 'value' => 650, 'min' => 100, 'max' => 3000, 'set' => '');
        $this->_config[] = array('text' => _('maxWidth'), 'name' => 'maxWidth',
         'typ' => 'i', 'value' => 800, 'min' => 150, 'max' => 3000, 'set' => '');
        $this->_config[] = array('text' => _('maxHeight'), 'name' => 'maxHeight',
         'typ' => 'i', 'value' => 600, 'min' => 100, 'max' => 3000, 'set' => '');

        ...

        $this->_config[] = array('text' => _('Playspeed'), 'name' => 'playSpeed',
         'typ' => 'i', 'value' => 3000, 'min' => 0, 'max' => 20000, 'set' => '');
    }

    /*
     * Erzeugt den Html-Code der den xPluginaufruf, in den geschweiften Klammern, ersetzt.
     *
     * @param string $code Plugin-call-code
     * @return code/replace html/text
     */

    public function getCode($code)
    {
        $codes = explode(':', $code);
        $path = './images/user/' . $codes[1];
        $path = str_replace('}', '', $path);
        $files = scandir($path);

        foreach ($files as $value)
        {
            if ((strpos("/" . $value . "/i", '.png') >= 1 or
                strpos("/" . $value . "/i", '.gif') >= 1 or
                strpos("/" . $value . "/i", '.jpg') >= 1) and
                strpos("/" . $value . "/i", 'tbn_') == FALSE and
                strpos("/" . $value . "/i", '.txt') == FALSE)
                $fileList[] = $value;
        }
           $code = '';

           ...

           $code .= '" alt="' . $alt . '" /></a>';
        }
        return $code;
    }

    /*
     * Erstellt ein Thumbnail des angegebenen Bildes
     *
     * @param string $path            Path to imagedir
     * @param string $name            Name of imagefile
     * @param string $thumbSize    Size og Thumbnail
     */

    private function _createThumbnail($path, $name, $thumbSize)
    {
        $sourceImage = $path . '/' . $name;
        $path = $path . '/';
        $art = strrchr($sourceImage, ".");
        list($width, $height) = getimagesize($sourceImage);
        $ratio = $width / $height;

        ...

        else if ($art == ".png")
        {
            unlink($path . "temp.png");
        }
    }

    /*
     * Erstellt den Html-Code für das Backend. Hier werden die veränderbaren
     * Einstellungen dargestellt.
     *
     * @param string $id Plugin-id from database
     * @return array assoziative with html code for template output
     */

    public function getConfigHtml($id)
    {
        db::getInstance()->where('plugin_id', $id);
        $result = db::getInstance()->getOne('plugin');
        $buffer = explode('|', $result['plugin_config']);
        foreach ($buffer as $bufferx)
        {
            if (preg_match("/config::/i", $bufferx) == 1)
            {
                $buffery = explode('::', $bufferx);
                $savedValues = explode(',', $buffery[1]);
                break;
            }
        }

        ...

        return $data;
    }

    /*
     * Erstellt den Html-Code für den Headbereich
     *
     * @param string $id            Plugin-id from database
     * @param string $config    Config-String with values
     *                                     Three types are possible
     *                                     scripts:: = scripts for head-area of html, copy 1:1
     *                                     head::    = e.g. scripts:: but here must set some values
     *                                                     for initialize
     *                                     config::  = e.g. scripts:: but here are setting config-
     *                                                     values who can set in backend
     * @return array assoziative with html code for template output
     */

    public function getScripts($id, $config = '')
    {
        $scripts = '<!-- gallery START -->';

        $buffer = explode('|', $config);

        ...

        return $scripts;
    }

    /*
     * Speichert, im Backend vorgenommene Änderungen in der Datenbank
     * @return boolean True if successful otherwise false
     */

    public function saveConfigdata($id)
    {
        db::getInstance()->where('plugin_id', $id);
        $result = db::getInstance()->getOne('plugin');
        $buffer = explode('|', $result['plugin_config']);
        foreach ($buffer as $bufferx)
        {
            if (preg_match("/config::/i", $bufferx) == 1)
            {
                $buffery = explode('::', $bufferx);
                $savedValues = explode(',', $buffery[1]);
                break;
            }
        }

        ...

        // Update the database
        db::getInstance()->where('plugin_id', $id);
        if (db::getInstance()->update('plugin', $data))
            message::setNoteRow(_('The data was successful saved.'), true);
    }

}

 

Der Unterschied zwischen den Dateien „/admin/xplugin/fancybox.xplugin.php" und „/xplugin/fancybox.xplugin.php" besteht lediglich darin das in letzterer die Methode entfernt wurde mit der Daten in die Datenbank geschrieben werden.
Dies ist ein Teil des Sicherheitskonzepts von TobbiVM-Shop.

Letzte Bearbeitung: 27.09.2016, 21:18