Ein Blick in ein Contao-Widget

Heute will ich das TextField betrachten. Ich möchte in einem Modul ein einfaches Formular umsetzen und natürlich will ich wenn möglich bestehenden Code wiederverwenden. Eine Textbox möchte ich mit dem Widget TextField umsetzen. Soweit ich das verstanden habe ist ein “Widget” in Contao ein Element in einem Formular. Im Klassenkommentar der abstrakten Klasse Widget steht: “Provide methods to handle form widgets”. Wie sieht TextField nun aus und wie kann es verwendet werden?

Continue reading

Warum ist Contao so schnell?

In letzter Zeit habe ich mich vermehrt mit Contao beschäftigt. Deswegen will ich in diesem Artikel über die technischen Aspekte von Contao beschäftigen und eben auch ein paar Worte zur Programmierung verlieren. Erst vor kurzem hatte ich von einer mittelständigen Firma erfahren, dass Contao im Backend sehr schnell sei und andere Content-Management-Systeme sich davon eine Scheibe abschneiden sollten. Zumindest ist eines richtig: Contao ist schnell. Leo Feyer selbst spricht in seinem Buch “Das offizielle Contao-Buch” von bis ca. 60% schneller als andere CMS. Aber wo Licht ist, ist natürlich auch Schatten. Aber warum ist Contao schnell? Es gibt zwei wichtige Punkte:

  1. Contao verwendet mySQL und die Storage-Engine MyISAM
  2. Contao verzichtet auf ein komplexes ORM. Die Abfragen werden direkt in SQL verfasst.

Informationen über MyISAM habe ich bereits in “Fakten über MyISAM” aufgeführt. Sollte also eine Seite realisiert werden,  bei der mit sehr vielen konkurrierenden Schreibzugriffen zu rechnen ist, dann muß man mit Contao einen erhöhten Aufwand betreiben und Teile der Datenbank beispielsweise unter InnoDB betreiben, z. B. müßte man den Locking- und Transaktionsmechanismus vorwiegend selbst ergänzen.

Das Contao auf ein sogenanntes object-relational mapping, kurz ORM, verzichtet hat den Nachteil, dass der Entwickler mehr Verantwortung beim kreieren seiner SQL-Queries hat. Wer z. B. mit Typo 3 und dem ORM von Extbase gearbeitet hat, der weiß ganz sicher, welche Vorteile ein gutes ORM hat.

Klassen in Contao überschreiben

Um Klassen in einem Contao Modul zu überschreiben, wird in der config/config.php die eigene Klasse registriert:

$GLOBALS['FE_MOD']['navigationMenu']['navigation'] = ModuleMeineUeberschriebeneNavigationKlasse

Wir wollen ja eine bestehende Klasse erweitern, deswegen muß sich der Eintrag mit einem bestehenden Modul decken. Am besten schaut man dazu in das entsprechende Modul. Anschließend definiert man die Klasse im eigenen Modul-Ordner. Bitte darauf achten, dass der Ordner im Alphabet nach dem zu überschreibenden Modul kommt, da Contao die Module in alphabetischer Reihenfolge einliest. Die Klasse selbst leitet dann von der bereits vorhandenen Klasse ab:

class ModuleMeineUeberschriebeneNavigationKlasse extends ModuleNavigation
{
  // Hier wird Funktionalität überschrieben / erweitert
}

Vererbung von Inhalten in Typo3 und TemplaVoilà

Falls man mit TemplaVoilà eine Inhaltsspalte vererben möchte:

10 = CONTENT
10.table = tt_content
10.select.where = colPos=3
10.select.languageField = sys_language_uid
# die eigentliche Slide-Anweisung
10.slide = -1
# optional
10.slide {
# Sammeln aller Einträge in der Rootline
  collect = -1
  collectReverse = 1
}
10.wrap = <!--TYPO3SEARCH_begin--> | <!--TYPO3SEARCH_end-->

Typo3 – Baumstruktur im Backend

Nur eine Kurznotiz als Merkhilfe. Dies funktioniert seit Typo3 4.5.x (renderMode) und ist bis dato nicht dokumentiert.

'categories' => array(
       'exclude' => 0,
       'l10n_mode' => 'mergeIfNotBlank',
       'label' => $lPath.':foo',
       'config' => array(
         'type' => 'select',
         'renderMode' => 'tree',
         'treeConfig' => array(
         	 'parentField' => 'parent',
           'appearance' => array(
             'expandAll' => true,
             'showHeader' => true,
           ),
         ),
         'foreign_table' => 'foreign_table',
         'size' => 5,
         'autoSizeMax' => 20,
         'minitems' => 0,
         'maxitems' => 20,
      ),
    ),

Noch eine kleine Anmerkung zur Filterung des Baumes: falls man den Baum in verschiedenen Sysordnern verwendet kann man auch wunderbar mit der aktuellen PID Filtern. Dazu kann man “foreign_table_where” verwenden:

'foreign_table_where' => 'AND myTable.pid = ###CURRENT_PID###'

Ein eigener inputType in Contao

Ursprünglich wollte ich nur den Wert des tstamp Feldes eines Contao Backend Modules als Informationsfeld anzeigen lassen. Ich dachte, dass gibts sicherlich und deswegen schaute ich auf die Contao Dokumentation “Internal structure of a Data Container Array” unter den bereits vorhandenen Feldern nach. Zu meiner Verwunderung gab es da unter Felder nur folgende Liste:

  • text Textfeld
  • password Passwortfeld
  • textarea Textarea
  • select Drop-Down-Menü
  • checkbox Checkbox
  • radio Radio-Button
  • radioTable Tabelle mit Bildern und Radio-Buttons
  • inputUnit Textfeld mit Drop-Down-Menü zur Auswahl der Einheit
  • trbl Vier Textfelder mit Drop-Down-Menü zur Auswahl der Einheit
  • chmod CHMOD-Tabelle
  • pageTree Seitenbaum
  • fileTree Dateibaum
  • tableWizard Tabellenassistent
  • listWizard Listenassistent
  • optionWizard Optionsassistent
  • moduleWizard Modulassistent
  • checkboxWizard Checkbox-Assistent

Abgesehen von den ganzen Exoten gab es kein Feld, dass den Wert nur als “Label”, also als einfachen String anzeigt. In meinem Fall benötige ich ein Feld, dass einen Timestamp in ein Datum umwandelt und im Backend anzeigt.

Continue reading

CSS und Javascript Dateien in einem Contao Modul einbinden

CSS und Javascript Dateien können sehr pragmatisch in einem Contao Modul eingebunden werden. Folgender Code demonstriert das:

// append custom js
$GLOBALS['TL_JAVASCRIPT'][] = '/system/modules/meinmodul/html/js/common.js';
 
// append custom css
$GLOBALS['TL_CSS'][] = '/system/modules/meinmodul/html/css/search.css';

Als einziges muß man beachten, dass man im eventuell überschriebene fe_page-Template die Variablen <?php echo $this->stylesheets; ?> und <?php echo $this->head; ?> nicht entfernt hat. Es gibt noch eine weitere Variable, die in diesem Zusammenhang ganz interessant ist:

$GLOBALS['TL_HEAD'][] = '<script type="text/javascript">// <![CDATA[
mce:0
// ]]></script>';

Wie wir hier sehen, kann man damit auch leicht eigene Javascript-Blöcke in den Head-Bereich der Seite bekommen.

Falls man jedoch Javascript am Ende der Seite benötigt, kann dies über

$GLOBALS['TL_MOOTOOLS'][]='<script ... />

in die Seite einbinden. Wer sich etwas tiefer damit befassen will, kann ja einen Blick in die Datei \system\modules\frontend\PageRegular.php wagen. Dort werden diese Variablen ausgewertet und dem Template hinzugefügt.

Update

Weil ich immer wieder mal gefragt werde, hier auch der Weg, wie man eigenes CSS und Javascript über Contao einbinden kann, ohne ein Modul zu programmieren:

In der Theme einfach unter den Experten-Einstellungen in den zusätzliche <head>-Tags beliebige CSS und Javascript-Dateien einbinden:

Contao: CSS und Javascript im Backend einbinden