CLI-Anwendungen in Joomla 3

Joomla 3 bietet dir folgende nützliche Funktion: das Erstellen von CLI-Anwendung (Command Line Interface).


Was ist eine CLI-Anwendung genau? Wann verwendest du idealerweise die CLI? Wie sieht eine einfache Beispielanwendung aus?

Was ist eine CLI-Anwendung?

Wie du sicher weißt, ist Joomla eine Webanwendung: Das heißt, sie wird auf Anfrage eines Browsers auf einem Webserver gestartet. Möchtest du, dass das Content Management System deiner Website unabhängig vom Aufruf über den Internetbrowser etwas durchführt? Zum Beispiel wäre es ideal, wenn das CMS jede Nacht eine Sicherung anfertigt, oder?

In den ersten Versionen von Joomla waren Lösungen unter Verwendung von cURL oder Wget integriert, um eine Aufgabe automatisch ablaufen zu lassen. Dazu war ein zusätzlicher Authentifizierungsschlüssel als Parameter notwendig – Joomla emulierte den Benutzer. Mit Joomla 2.5 nahm die Arbeit eine andere Richtung: Eine spezielle Anwendung wurde erstellt, um das Content Management System unabhängig vom Webserver zu nutzen – die CLI. Mithilfe der CLI ist es möglich, Joomla als PHP-Skript über die Befehlszeile auszuführen. Dies ist die Voraussetzung für das Automatisieren von Aufgaben.

Die ersten Entwürfe von CLI-Anwendungen in Joomla 2.5 waren komplex. In Joomla 3.0 ist die Trennung zwischen dem Framework (Bibliotheken) und dem CMS weiter fortgeschritten. So ist alles übersichtlicher, weil CLI und CMS unabhängig voneinander laufen.

Wann verwendest du die CLI idealerweise?

Einen wichtigen Anwendungsfall habe ich schon erwähnt: eine Backup-Erweiterung. Es überrascht dich sicher nicht, dass Akeeba eine CLI-App enthält. Mit dieser CLI-App führst du die Sicherung über die Befehlszeile aus.

Es gibt viele weitere Verwendungszwecke. Ein paar Ideen:

  • E-Commerce-Bereinigung: Lösche jede Nacht alle ausstehenden Bestellungen die älter als x Tage sind.
  • Statistiken: Rufe täglich Zugriffsdaten aus einer Tabelle, verarbeite diese und erstelle eine grafische Ausgabe.
  • Überwachung: Überprüfe die Joomla-Protokolle oder die Datenbanktabellen. So stellst du sicher, dass alles einwandfrei funktioniert. Wenn sich bei dir täglich drei neue Benutzer anmelden, ist es sinnvoll, wenn du dir eine Warnung ausgeben lässt, wenn sich innerhalb kurzer Zeit 50 neue User registrieren.

Für all diese Aufgaben ist Joomla keine Voraussetzung. Ein pures PHP-Skript erreicht das gleiche Ziel. Eine CLI-Anwendung bietet dir folgende Vorteile:

  • Du verwendest das gleiche Framework, das du beim Programmieren von Erweiterungen nutzt und mit dem du dich auskennst.
  • Es ist unkompliziert den Programm-Code deiner Erweiterungen oder von Joomla selbst wiederzuverwenden.

Wie schreibst du eine CLI-Anwendung?

Sehen wir uns ein Beispiel an:

<?php
const _JEXEC = 1;
if (file_exists(dirname(__DIR__) . '/defines.php'))
{
    require_once dirname(__DIR__) . '/defines.php';
}
if (!defined('_JDEFINES'))
{
    define('JPATH_BASE', dirname(__DIR__));
    require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';

class HelloWorld extends JApplicationCli
{
  public function doExecute()
  {
    $this->out('Hello World');
  }
}

JApplicationCli::getInstance('HelloWorld')->execute();

Diese Datei habe ich im Unterverzeichnis cli gespeichert und über die Kommandozeile mit Hilfe von php test.php gestartet.

Die ersten Codezeilen sind in fast allen CLI-Anwendungen gleich. Sie sind notwendig, wenn du auf Joomla Programmcode aufbaust. Diese wenigen Zeilen ermöglicht es dir, alle Funktionen des CMS zu nutzen – wiederzuverwenden.

const _JEXEC = 1;
if (file_exists(dirname(__DIR__) . '/defines.php'))
{
    require_once dirname(__DIR__) . '/defines.php';
}
if (!defined('_JDEFINES'))
{
    define('JPATH_BASE', dirname(__DIR__));
    require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';

Danach kommt dein Code in deiner Klasse.

class HelloWorld extends JApplicationCli
{
  public function doExecute()
  {
    $this->out('Hello World');
  }
}

Die letzte Zeile sorgt dafür, dass die Aufgabe, die in execute beschrieben ist, erledigt wird: Hier definierst du die CLI-App und führst mit ihr die Funktion execute aus.

JApplicationCli::getInstance('HelloWorld')->execute();

Zu Beginn scheiben Programmierer den gesamten Code in die Methode execute. Diesen splitten sie dann in der Regel später auf mehrere Funktionen auf, denn: Hochwertiger Code besteht aus vielen kleinen übersichtlichen Programmteilen, die zusammengehörige Aufgaben in der Anwendung bündeln und von einer Methode aus gestartet werden!

Weitere Beispiele findest du im Ordner cli deines Content Management Systems.

Schlussfolgerungen

Joomla CLI-Apps sind praktisch, wenn du dich fragst, wie du einen Task in deiner Joomla Erweiterung automatisch startest.

 

Haben wir dein Interesse geweckt? Dann meldet dich gerne zu einem Treffen per Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein! an.

 

 

> 1587

Joomler auf der ganzen Welt

https://volunteers.joomla.org/

> 11

Joomler in Koblenz

https://www.jug-koblenz.de/

> 2

Joomler in Mayen

https://ug-mayen.de/

 

 

Newsletter