Link zur Slice-Bearbeitung im Frontend

Quell-ID: GitHub Discussion #36

Use Case

Im Frontend soll ein Link angezeigt werden, mit dem eingeloggte Backend-Benutzer direkt zum Bearbeiten eines Slices (Modul-Inhalts) im Backend gelangen können.

Verwendete AddOns

  • REDAXO Core (ab Version 5.13.0)

Voraussetzung

Diese Funktion ist erst ab REDAXO 5.13.0 verfügbar, da dort die Methode $this->getCurrentSlice() in Modulen eingeführt wurde.

Lösung

<?php
// Im Modul-Output

if (rex_backend_login::hasSession()) {
    $slice = $this->getCurrentSlice();
    
    $link_url = rex_url::backendPage(
        'content/edit',
        [
            'article_id' => $slice->getArticleId(),
            'slice_id' => $slice->getId(),
            'clang' => $slice->getClangId(),
            'ctype' => $slice->getCtype(),
            'function' => 'edit'
        ]
    ) . '#slice' . $slice->getId();
    
    echo '<a href="' . $link_url . '" target="_blank" class="edit-link">Bearbeiten</a>';
}

Parameter erklärt

Parameter Beschreibung
article_id ID des Artikels
slice_id ID des Slices
clang Sprach-ID
ctype Content-Typ (Spalte)
function ‘edit’ für Bearbeitungsmodus

Besserer Ansatz

Als wiederverwendbares Fragment

<?php
// Fragment: fragments/slice_edit_link.php

/** @var rex_fragment $this */
$slice = $this->getVar('slice');
$user = rex::getUser();

if (!$slice || !$user) {
    return;
}

$url = rex_url::backendPage('content/edit', [
    'article_id' => $slice->getArticleId(),
    'slice_id' => $slice->getId(),
    'clang' => $slice->getClangId(),
    'ctype' => $slice->getCtype(),
    'function' => 'edit'
]) . '#slice' . $slice->getId();
?>

<a href="<?= $url ?>" 
   target="_blank" 
   class="slice-edit-link"
   title="Diesen Inhalt bearbeiten">
    <i class="fa fa-edit"></i>
    <span class="sr-only">Bearbeiten</span>
</a>

Verwendung im Modul

<?php
if (rex_backend_login::hasSession()) {
    $fragment = new rex_fragment();
    $fragment->setVar('slice', $this->getCurrentSlice());
    echo $fragment->parse('slice_edit_link.php');
}

Mit CSS für unauffällige Darstellung

/* Im Theme oder AddOn-Assets */
.slice-edit-link {
    position: absolute;
    top: 5px;
    right: 5px;
    opacity: 0;
    transition: opacity 0.3s;
    background: rgba(255, 255, 255, 0.9);
    padding: 5px 10px;
    border-radius: 3px;
    text-decoration: none;
}

.module-wrapper:hover .slice-edit-link {
    opacity: 1;
}

Globale Lösung über Extension Point

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

if (rex::isFrontend() && rex_backend_login::hasSession()) {
    rex_extension::register('SLICE_OUTPUT', function (rex_extension_point $ep) {
        $content = $ep->getSubject();
        $slice = $ep->getParam('slice');
        
        $url = rex_url::backendPage('content/edit', [
            'article_id' => $slice->getArticleId(),
            'slice_id' => $slice->getId(),
            'clang' => $slice->getClangId(),
            'ctype' => $slice->getCtype(),
            'function' => 'edit'
        ]) . '#slice' . $slice->getId();
        
        $editLink = '<a href="' . $url . '" target="_blank" class="slice-edit-btn">✏️</a>';
        
        return '<div class="slice-wrapper" data-slice-id="' . $slice->getId() . '">'
            . $editLink
            . $content
            . '</div>';
    });
}

Diese globale Lösung fügt automatisch jedem Slice einen Bearbeiten-Link hinzu, ohne dass die Module angepasst werden müssen.

Berechtigungsprüfung erweitern

<?php
if (rex_backend_login::hasSession()) {
    $user = rex_backend_login::createUser();
    $article = rex_article::getCurrent();
    
    // Prüfen ob Benutzer den Artikel bearbeiten darf
    if ($user && $article && $user->hasPerm('article[' . $article->getCategoryId() . ']')) {
        // Edit-Link anzeigen
    }
}