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.