Contao: Hilfeseite fürs Backend

von Patrick Froch (Kommentare: 2)

Manchmal möchte man im Contao-Backend eine Seite ausgeben, die keine direkte Beziehung zu einer Tabelle hat. Sei es wie bei der Systemwartung oder einfach nur eine Hilfeseite. In diesem Beitrag wird letzteres beispielhaft umgesetzt.

Ordnerstruktur

Wir benötigen für die Ausgabe natürlich einige Ordner und Dateien. Ich habe die Struktur hier einmal abgebildet und werde nun nach und nach den Aufbau erläutern.

easy_page/
├── assets
│   ├── .htaccess
│   └── img
│       ├── icon.png
│       └── logo.png
├── classes
│   └── contao
│       └── EasyPage.php
├── config
│   ├── autoload.php
│   └── config.php
├── languages
│   └── de
│       └── modules.php
└── templates
    └── help.html5

Autoload

Zunächst legen wir den Autoload-Eintrag für die Ausgabeklasse und das Template in der Datei system/modules/easy_page/config/autoload.php an.

<?php
/**
 * Register the namespaces
 */
ClassLoader::addNamespaces(array
(
    'esit\easy_page'
));


/**
 * Register the classes
 */
ClassLoader::addClasses(array
(
    'esit\easy_page\classes\contao\EasyPage' => "system/modules/easy_page/classes/contao/EasyPage.php"
));


/**
 * Register the templates
 */
TemplateLoader::addFiles(array
(
    'help' => "system/modules/easy_page/templates",
));

Konfiguration

Nun erstellen wir die Konfiguration für unsere Backend-Seite (system/modules/easy_page/config/config.php). Es ist fast wie ein normaler Backend-Eintrag, nur dass es keine Tabelle gibt, sondern eine Callback-Methode.

<?php
$GLOBALS['BE_MOD']['system']['help'] = array(
    'callback'  => '\esit\easy_page\classes\contao\EasyPage',
    'icon'      => 'system/modules/easy_page/assets/img/icon.png'
);

Sprachdatei

Damit der Menüpunkt nun auch in deutsch angezeigt wird, erstellen wir die entsprechende Sprachdatei (system/modules/easy_page/languages/de/modules.php).

<?php
    $GLOBALS['TL_LANG']['MOD']['help'] = array('Hilfe', 'Contao-Backend-Hilfe');

Ausgabe

Jetzt fehlt nur noch die Klasse für die Ausgabe. Wir speichern folgendes in der Datei system/modules/easy_page/classes/contao/EasyPage.php.

<?php
namespace esit\easy_page\classes\contao;

/**
 * Class EasyPage
 * @package esit\easy_page\classes\contao
 */
class EasyPage
{


    /**
     * Erzeugt die Ausgabe für die Hilfeseite im BE.
     * @return string
     */
    public function generate()
    {
        $objTemplate = new \Contao\BackendTemplate('help');
        return $objTemplate->parse();
    }
}

Ich habe mich entschieden in der Klasse nur ein Template zu nutzen, um die Ausgabe zu erzeugen. So kann man zwar die Hilfeseite nicht übersetzen, aber den ganzen Text in eine Sprachdatei zu stecken, fand ich auch nicht gut. Es wäre aber zum Beispiel auch möglich unterschiedliche Templates für die einzelnen Sprachen anzulegen und entsprechend der eingestellten Sprache zu laden.

Template

Als letztes benötigen wir noch das Template mit der Ausgabe (system/modules/easy_page/templates/help.html5).

<div style="margin: 20px">

    <img src="system/modules/easy_page/assets/img/logo.png">
    <h1 style="font-size: 2em;">Hilfe</h1>
    <p>
        Weit hinten, hinter den Wortbergen, fern der Länder Vokalien und Konsonantien leben die Blindtexte.
        Abgeschieden wohnen sie in Buchstabhausen an der Küste des Semantik, eines großen Sprachozeans. Ein kleines
        Bächlein namens Duden fließt durch ihren Ort und versorgt sie mit den nötigen Regelialien. Es ist ein
        paradiesmatisches Land, in dem einem gebratene Satzteile in den Mund fliegen. Nicht einmal von der
        allmächtigen Interpunktion werden die Blindtexte beherrscht – ein geradezu unorthographisches Leben.
    </p><p>
        Eines Tages aber beschloß eine kleine Zeile Blindtext, ihr Name war Lorem Ipsum, hinaus zu gehen in die weite
        Grammatik. Der große Oxmox riet ihr davon ab, da es dort wimmele von bösen Kommata, wilden Fragezeichen und
        hinterhältigen Semikoli, doch das Blindtextchen ließ sich nicht beirren. Es packte seine sieben Versalien,
        schob sich sein Initial in den Gürtel und machte sich auf den Weg. Als es die ersten Hügel des Kursivgebirges
        erklommen hatte, warf es einen letzten Blick zurück auf die Skyline seiner Heimatstadt Buchstabhausen, die
        Headline von Alphabetdorf und die Subline seiner eigenen Straße, der Zeilengasse. Wehmütig lief ihm eine
        rhetorische Frage über die Wange, dann setzte es seinen Weg fort. Unterwegs traf es eine Copy. Die Copy warnte
        das Blindtextchen, da, wo sie herkäme wäre sie
    </p>
</div>

Hier wird nur ein Blindtext ausgegeben, man könnte aber ebenso gut beliebige Programmabläufe verarbeiten (wie bei der Systemwartung) oder Formulare ausgeben.

Ergebnis

Das Ergebnis könnte dann ungefähr so aussehen:

Backend

Zurück

Einen Kommentar schreiben

Kommentar von Nina |

Die Seite steht am Ende der Navigation. Wie bekommt man sie ganz an den Anfang? Also z.B. in "Inhalte" noch vor "Artikel"?

Antwort von Patrick Froch

Hallo Nina,

dazu musst Du den Eintrag in der Datei config/config.php wie folgt anpassen:

$arrMyExt['mynewextension']['help'] = array(
    'callback'  => '\esit\easy_page\classes\contao\EasyPage',
    'icon'      => 'system/modules/easy_page/assets/img/icon.png'
);

array_insert($GLOBALS['BE_MOD'], 0, $arrMyExt);

Da der Eintrag dann aber nicht mehr in der Rubrik "System" angezeigt wird, musst Du noch einen Eintrag in die Sprachdatei languages/de/modules.php einfügen:

$GLOBALS['TL_LANG']['MOD']['mynewextension']    = array('Hilfe', 'Contao-Backend-Hilfe');

Die Reihenfolge lässt sich aber nicht ganz genau festlegen, da eine andere Erweiterung ja ebenfalls ihre Einträge ganz oben platzieren kann. Hier gilt dann, wer zuletzt komm steht ganz oben. ;)

EDIT: Um den Eintrag unter Inhalte anzuzeigen muss der Eintrag in der Datei config/config.php wie folgt aussehen:

$arrMyExt['help'] = array(
    'callback'  => '\esit\easy_page\classes\contao\EasyPage',
    'icon'      => 'system/modules/easy_page/assets/img/icon.png'
);

array_insert($GLOBALS['BE_MOD']['content'], 0, $arrMyExt);

Dann entfällt auch der Eintrag in der Datei languages/de/modules.php. Dies macht aber in meinen Augen wenig Sinn, da es sich ja nicht um einen Inhalt fürs Frontend handelt.

Kommentar von Falk |

Hallo,

könnten Sie dies auch für Contao 4.3 erläutern? Wir stellen gerade auf Contao 4 um und finden leider hierzu nichts in der "Super Doku" *Ironieoff* wie man die autoload.php und darin befindliche classen für ein Backend Menu Eintrag ansteuert... :(

Vielen Dank :-)

Antwort von Patrick Froch

Hallo,

wie man eine Contao4-Erweiterung als Bundle erstellt, habe ich bereits in dem Artikel "Contao 4: Erweiterung als Bundle" beschreiben. Weitere Texte zu Contao 4 finden sich auf dieser Übersichtsseite. Außerdem ist es auch möglich eine Contao3-Erweiterung in Contao4 zu nutzen. Sie wird einfach unter `TL_ROOT/system/modules/` gespeichert und dann wird z.B. folgendes in die `TL_ROOT/app/AppKernel.php` eingetragen:

public function registerBundles()
{
    $bundles = [
        // ...
        new ContaoModuleBundle('ORDNERderERWEITERUNG', $path);
    );
}

Dann sollte die Erweiterung mit Contao4 funktionieren. Ob dies in alle Fälle funktioniert, kann ich nicht sagen. Bei meinen Tests hat es bis jetzt aber geklappt.