Redaxo YForm - Datensatz kopieren

Redaxo YForm - Datensatz kopieren

veröffentlicht am 02.12.2017

Der TableManager von Redaxo ist ein wunderbares Tool, um im Backend von Redaxo leicht und schnell Tabellen anzulegen. Ebenso ist es dann ein leichtes, in die neuen Tabellen die entsprechenden Datensätze einzugeben.

Ein entscheidendes Feature fehlt jedoch in diesem Zusammenhang: Das Kopieren von Datensätzen.

Diese Funktionalität vermisst man anfangs nicht. Arbeitet man jedoch häufig mit dem Tablemanager, so nervt es zusehends, dass man einen Datensatz nicht kopieren kann, sondern immer alles neu eingeben muss. Dies wird besonders deutlich, wenn sich in den Datensätzen etliche Inhalte nicht ändern und daher übernommen werden können.

Vielen Dank an dieser Stelle an die FriendsOfRedaxo, in deren GitHub Bereich ein nützlicher und einfach zu integrierender Trick hinterlegt ist, mit dem es möglich ist, einen Button zum Kopieren von Datensätzen einzublenden.

Ich möchte diesen sehr nützlichen Tipp an dieser Stelle nochmal aufgreifen und mit einigen Abbildungen verdeutlichen.

1. Schritt

Im "Project"-Addon von Redaxo das nachfolgende Skript als yform_copy.php im Ordner "backend" speichern.

Neues Skript im project-Addon
Neues Skript im project-Addon

 

<?php
$orgTable = rex_request('table_name', 'string', '');
$orgId = rex_request('data_id', 'int', 0);

if (rex_request('copy', 'bool')) {

    if ($orgTable != '' && $orgId > 0) {
        $sql = rex_sql::factory();
        $data = $sql->getArray('SELECT * FROM ' . $orgTable . ' WHERE `id` = :id', ['id' => $orgId]);
        if ($sql->getRows() == 1) {
            $data = $data[0];

            $sql = rex_sql::factory();
            $sql->setTable($orgTable);
            foreach ($data as $fieldName => $fieldValue) {
                switch ($fieldName) {
                    case 'id':
                        break;
                    case 'name':
                        $sql->setValue($fieldName, 'Kopie ' . $fieldValue);
                        break;
                    case 'status':
                        $sql->setValue($fieldName, '0');
                        break;
                    default:
                        $sql->setValue($fieldName, $fieldValue);
                        break;
                }
            }
            $sql->insert();
            $newId = $sql->getLastId();
        }
    }

    while(@ob_end_clean()){}

    $context = rex_context::fromGet();
    header('Location: ' . $context->getUrl(['data_id' => $newId, 'func' => 'edit', 'copy' => 0], false));
    exit();
}

if ($orgId > 0) {
    $context = rex_context::fromGet();
    echo '<a class="btn btn-primary pull-right" href="' . $context->getUrl(['copy' => 1]) . '">Datensatz kopieren</a>';
}

 

Die Felder "name" und "status" in der switch-Anweisung können an die eigenen Tabellenfelder angepasst werden, es können auch neue hinzugefügt werden. Das Skript funktioniert jedoch auch ohne Anpassung.

 

2. Schritt

Per TableManager in der gewünschten Tabelle ein YForm Feld "php" anlegen und dort die Angaben machen, wie aus dem Screenshot ersichtlich:

Das neue PHP-Feld in der jeweiligen Tabelle des Tablemanagers

 

Das Ergebnis:

Der neue Button sollte nun beim Editieren eines Datensatzes in der entsprechenden Tabelle zu sehen sein.

Redaxo YForm - Datensatz kopieren

Redaxo YForm - Datensatz kopieren