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
}
}