YForm Datenliste: Spalte als Link formatieren

Quell-ID: GitHub Discussion #42

Use Case

In der YForm-Datenliste (Table Manager) soll eine Spalte als anklickbarer Link zur Bearbeitung des Datensatzes formatiert werden.

Verwendete AddOns

  • YForm

Lösung

Über den Extension Point YFORM_DATA_LIST kann die Spaltenformatierung angepasst werden:

<?php
// In boot.php des project-AddOns

rex_extension::register('YFORM_DATA_LIST', function (rex_extension_point $ep) {
    $table = $ep->getParam('table');
    
    // Prüfen ob Tabelle existiert und richtige Tabelle
    if (!$table || $table->getTableName() !== 'rex_akkreditieren') {
        return;
    }
    
    $list = $ep->getSubject();

    $list->setColumnFormat(
        'name',
        'custom',
        function ($a) {
            $editLink = rex_yform_manager::url('rex_akkreditieren', $a['list']->getValue('id'));
            return '<a href="' . rex_escape($editLink, 'url') . '">' . rex_escape($a['list']->getValue('name')) . '</a>';
        }
    );
});

Mehrere Spalten formatieren

<?php
rex_extension::register('YFORM_DATA_LIST', function (rex_extension_point $ep) {
    $table = $ep->getParam('table');
    if (!$table) {
        return;
    }
    $tableName = $table->getTableName();
    
    if ($tableName !== 'rex_produkte') {
        return;
    }
    
    $list = $ep->getSubject();

    // Name als Link
    $list->setColumnFormat('name', 'custom', function ($a) use ($tableName) {
        $url = rex_yform_manager::url($tableName, $a['list']->getValue('id'));
        return '<a href="' . rex_escape($url, 'url') . '">' . rex_escape($a['value']) . '</a>';
    });
    
    // Status als Badge
    $list->setColumnFormat('status', 'custom', function ($a) {
        $status = $a['value'];
        $class = $status == 1 ? 'success' : 'danger';
        $text = $status == 1 ? 'Aktiv' : 'Inaktiv';
        return '<span class="badge badge-' . $class . '">' . $text . '</span>';
    });
    
    // Datum formatieren
    $list->setColumnFormat('createdate', 'custom', function ($a) {
        return rex_formatter::format($a['value'], 'date', 'd.m.Y H:i');
    });
});

Besserer Ansatz

Zentrale Formatierungs-Klasse

<?php
// In lib/YFormListFormatter.php

class YFormListFormatter
{
    /**
     * Formatiert eine Spalte als Edit-Link
     */
    public static function editLink(string $tableName, string $column, ?string $labelColumn = null): void
    {
        rex_extension::register('YFORM_DATA_LIST', function ($ep) use ($tableName, $column, $labelColumn) {
            $table = $ep->getParam('table');
            if (!$table || $table->getTableName() !== $tableName) {
                return;
            }
            
            $list = $ep->getSubject();
            $displayColumn = $labelColumn ?? $column;
            
            $list->setColumnFormat($column, 'custom', function ($a) use ($tableName, $displayColumn) {
                $id = $a['list']->getValue('id');
                $label = $a['list']->getValue($displayColumn);
                $url = rex_yform_manager::url($tableName, $id);
                return '<a href="' . rex_escape($url, 'url') . '">' . rex_escape($label) . '</a>';
            });
        });
    }
    
    /**
     * Formatiert eine Spalte als Status-Badge
     */
    public static function statusBadge(string $tableName, string $column, array $labels = []): void
    {
        $defaultLabels = [
            0 => ['text' => 'Inaktiv', 'class' => 'danger'],
            1 => ['text' => 'Aktiv', 'class' => 'success'],
        ];
        $labels = array_merge($defaultLabels, $labels);
        
        rex_extension::register('YFORM_DATA_LIST', function ($ep) use ($tableName, $column, $labels) {
            $table = $ep->getParam('table');
            if (!$table || $table->getTableName() !== $tableName) {
                return;
            }
            
            $list = $ep->getSubject();
            
            $list->setColumnFormat($column, 'custom', function ($a) use ($labels) {
                $value = (int) $a['value'];
                $config = $labels[$value] ?? ['text' => $value, 'class' => 'secondary'];
                return '<span class="badge badge-' . $config['class'] . '">' . 
                       rex_escape($config['text']) . '</span>';
            });
        });
    }
    
    /**
     * Formatiert eine Spalte als Datum
     */
    public static function dateFormat(string $tableName, string $column, string $format = 'd.m.Y'): void
    {
        rex_extension::register('YFORM_DATA_LIST', function ($ep) use ($tableName, $column, $format) {
            $table = $ep->getParam('table');
            if (!$table || $table->getTableName() !== $tableName) {
                return;
            }
            
            $list = $ep->getSubject();
            
            $list->setColumnFormat($column, 'custom', function ($a) use ($format) {
                if (empty($a['value'])) {
                    return '-';
                }
                return rex_formatter::format($a['value'], 'date', $format);
            });
        });
    }
}

Verwendung in boot.php

<?php
// In boot.php

if (rex::isBackend()) {
    // Name als Link
    YFormListFormatter::editLink('rex_produkte', 'name');
    
    // Status als Badge
    YFormListFormatter::statusBadge('rex_produkte', 'status', [
        0 => ['text' => 'Entwurf', 'class' => 'warning'],
        1 => ['text' => 'Veröffentlicht', 'class' => 'success'],
        2 => ['text' => 'Archiviert', 'class' => 'secondary'],
    ]);
    
    // Datum formatiert
    YFormListFormatter::dateFormat('rex_produkte', 'createdate', 'd.m.Y H:i');
}

Diese modulare Lösung ist wiederverwendbar und hält die boot.php übersichtlich.