YForm-Tabellen und Formulare im eigenen Addon einbinden

Changelog:

  • V 2.0 / 30.01.2021
    • benötigt YForm ab V3.4: Titel per EP ausblenden
    • neue Struktur der Properties in package.yml
    • Text und Musterscript komplett neu

Zielsetzung

Statt der klassischen Variante mit rex_list/rex_form steht mit dem Addon YForm eine Alternative zur Verfügung, die über wesentlich mehr Datentypen und weitere Features (z.B. Suchfunktion, Massenänderung) verfügt. Der Artikel befasst sich mit YForm-Tabellen, die mit dem Table-Manager angelegt und verwaltet werden.

Hier soll gezeigt werden, wie einfach es möglich ist, per YForm verwaltete Tabellen in einem Addon so zu nutzen, als seien es originäre Listen- und Formular-Seiten des Addons. Es erfordert nur wenig Aufwand. Im Endergebnis kann es z.B. so aussehen:

Beispiel

Wie macht das YForm?

Das Manager-Plugin für den Table-Manager stellt ein Seiten-Script zum Aufruf einer Tabelle zur Verfügung: yform/plugins/manager/pages/data_edit.php.

Der unbedingt notwendige Aufruf-Parameter ist der Tabellenname ($table_name), der aus der URL übernommenen wird (...&table_name=«tabellenmane»). data_edit.php ruft den Tabellennamen aus $_REQUEST['table_name'] ab.

Zum Ausgabestandard gehört auch die Titelzeile. Innerhalb eines Addon ist sie meist redundant, wenn das Addon seine Seiten über eine übliche pages/index.php verwaltet und mit einem Titel versieht.

Kann man das adaptieren?

Eine relativ einfache Variante ist, data_edit.php in das pages-Verzeichnis des Addons zu kopieren und so anzupassen, dass der initiale Tabellenname fest vorgegeben ist. Unerwünschte Titelzeilen können per EP YFORM_MANAGER_DATA_PAGE_HEADER unterdrückt werden.

Mehrere Tabellen erfordern mehrere Adaptionen der data_edit.php. Zudem müssen Änderung in der Originaldatei erkannt und ggf. nachgezogen werden.

Die folgende Lösung arbeitet mit einem standardisierten Script im Addon, dass seine Parameter wie z.B. den Tabellennamen aus der package.yml entnimmt.

Umsetzung

Der Vorschlag beruht auf zwei Teilen:

  • In der package.yml werden die Seiten für YForm-Tabellen konfiguriert
  • Den Seitenaufbau übernimmt ein vorgeschaltetes Script (pages/yform.php), das auf Basis der package.yml den Aufruf der data_edit.php vorbereitet und durchführt.

package.yml

Der einfache erste Gedanke, in der package.yml die Seitendefinition um Tabellenangaben zu erweitern, ist grundsätzlich machbar. Leider sind die Daten in den Properties schwierig auffindbar, da REDAXO nur ausgewählte Seiten-Properties direkt abrufbar in die Page-Properties lädt.

Um den einfachen Zugriff zu ermöglichen, wird ein eigener Zweig yform: angelegt. Zu jeder Seite gibt es einen eigenen Eintrag mit den Tabellen-Parametern.

YForm-Tabellen als Seiten festlegen

Im folgenden Beispiel wird eine Seitenstruktur gezeigt, deren erste Seite (...&page=«addon»/config) klassisch auf ein Script pages/config.php verweist. Die Seiten ...&page=«addon»/mapset und ...&page=«addon»/layer hingegen greifen auf das im nächsten Absatz beschriebene Script pages/yform.php zu.

page:
    title: translate:geolocation_title
    subpages:
        config:
            title: translate:geolocation_config
        mapset:
            title: translate:geolocation_mapset
            subPath: pages/yform.php
        layer:
            title: translate:geolocation_layer
            subPath: pages/yform.php

YForm-Seiten konfigurierten

Die YForm-Tabellen werden über den Seitennamen, der sich aus der Page-Definiton ergibt, im Zweig yform: identifiziert (Beispiel: «addon»/mapset). Mögliche Properties sind

Property Beschreibung Typ Default
table_name Der Name der Tabelle, die bearbeitet werden soll notwendig  
wrapper_class CSS-Klassename für einen <div>-Tag, der um das von data_edit.php generierte HTML gelegt wird. Das erleichtert die Suche in Output-Filtern und ermöglicht individuelle CSS-Konfigurationen optional keine <div>-Klammer
show_title Wenn angegeben und auf true gesetzt wird die (meist im Addon überflüssige) Titelzeile doch eingeblendet. optional false
yform:
    «addon»/mapset:
        table_name: rex_geolocation_mapset
    «addon»/layer:
        table_name: rex_geolocation_layer

Das Script pages/yform.php sucht im Zweig yform: den Eintrag zur aktuellen Seite wie von \rex_be_controller::getCurrentPage() ermittelt.

pages/yform.php

Die eigentliche Seitensteuerung bleibt beim Script data_edit.php. Das im Addon vorgeschaltete Script pages/yform.php hat vier Aufgaben:

  • Platziere den Parameter ...&table_name=«tabellenmane» in der URL per Simulation.
      $_REQUEST['table_name'] = $table_name;
    
  • Erzeuge das YForm-HTML für die Tabellenseite via data_edit.php.
      include \rex_path::plugin('yform','manager','pages/data_edit.php');
    
  • Optional: blende die YForm-Titelzeile aus.
      if( !$show_title ){
          \rex_extension::register(
              'YFORM_MANAGER_DATA_PAGE_HEADER',
              function( \rex_extension_point $ep ) {
                  if ($ep->getParam('yform')->table->getTableName() === $ep->getParam('table_name')) {
                      return '';
                  }
              },
              \rex_extension::EARLY,['table_name'=>$table_name]
          );
      }
    
  • Optional: setze eine DIV-Klammer mit eigener Klasse um das YForm-HTML.
      if( $wrapper_class ){
          echo '<div class="',$wrapper_class,'">';
      }
      include \rex_path::plugin('yform','manager','pages/data_edit.php');
      if( $wrapper_class ) {
          echo '</div>';
      }
    

Die Parameter werden der package.yml entnommen. Die YML-Struktur ist oben beschrieben.

$yform = $this->getProperty('yform',[]);
$yform = $yform[\rex_be_controller::getCurrentPage()] ?? [];

$table_name = $yform['table_name'] ?? '';
$show_title = true === ($yform['show_title'] ?? false);
$wrapper_class = $yform['wrapper_class'] ?? '';

if( $table_name ) {
    $_REQUEST['table_name'] = $table_name;
}

if( !$show_title ){
    \rex_extension::register(
        'YFORM_MANAGER_DATA_PAGE_HEADER',
        function( \rex_extension_point $ep ) {
            if ($ep->getParam('yform')->table->getTableName() === $ep->getParam('table_name')) {
                return '';
            }
        },
        \rex_extension::EARLY,['table_name'=>$table_name]
    );
}

if( $wrapper_class ){
    echo '<div class="',$wrapper_class,'">';
}

include \rex_path::plugin('yform','manager','pages/data_edit.php');

if( $wrapper_class ) {
    echo '</div>';
}

Testumgebung

  • REDAXO 5.11
  • YFORM 3.4