Quelltext des aktuellen Standes
<?php $this->layout('layouts/admin', [
'page_title' => $page_title,
'current_admin_page' => 'assets-handover',
'breadcrumbs' => [
['label' => 'Übergabe-Einstellungen', 'url' => '/admin/assets/handover-settings'],
['label' => 'E-Mail bearbeiten'],
],
'page_actions' => '<a href="/admin/assets/handover-settings" class="btn btn-default"><i class="fas fa-arrow-left"></i> Zurück</a>',
]); ?>
<?php
$tpl = $template ?? [];
$isHandout = str_contains($tpl['template_key'] ?? '', 'handout');
$flash = $this->flash();
$variables = $isHandout ? [
'person_name' => 'Name des Mitarbeiters',
'asset_inventory_number' => 'Inventarnummer',
'asset_serial_number' => 'Seriennummer',
'asset_manufacturer' => 'Hersteller',
'asset_model' => 'Modell / Typ',
'handout_date' => 'Ausgabedatum',
] : [
'person_name' => 'Name des Mitarbeiters',
'asset_inventory_number' => 'Inventarnummer',
'asset_serial_number' => 'Seriennummer',
'asset_manufacturer' => 'Hersteller',
'asset_model' => 'Modell / Typ',
'return_date' => 'Rückgabedatum',
];
$sampleValues = $isHandout ? [
'person_name' => 'Max Mustermann',
'asset_inventory_number' => 'INV-TEST-001',
'asset_serial_number' => 'SN123456789',
'asset_manufacturer' => 'Dell',
'asset_model' => 'Latitude 5540',
'handout_date' => date('d.m.Y H:i'),
] : [
'person_name' => 'Max Mustermann',
'asset_inventory_number' => 'INV-TEST-001',
'asset_serial_number' => 'SN123456789',
'asset_manufacturer' => 'Dell',
'asset_model' => 'Latitude 5540',
'return_date' => date('d.m.Y H:i'),
];
?>
<?php if (!empty($flash['success'])): ?>
<div class="alert alert-success"><?= $this->e($flash['success']) ?></div>
<?php endif; ?>
<?php if (!empty($flash['error'])): ?>
<div class="alert alert-danger"><?= $this->e($flash['error']) ?></div>
<?php endif; ?>
<!-- Vorlage-Info -->
<div class="card card-outline card-primary mb-3">
<div class="card-header">
<h3 class="card-title">
<i class="fas fa-envelope"></i>
<?= $this->e($tpl['name'] ?? '') ?>
<code class="tpl-key-badge"><?= $this->e($tpl['template_key'] ?? '') ?></code>
</h3>
<p class="text-muted small mb-0">
<?= $this->te('Diese E-Mail wird direkt an den Mitarbeiter gesendet (extern, kein Login erforderlich). Im Anhang befindet sich die generierte PDF-Bestätigung.') ?>
</p>
</div>
</div>
<!-- Platzhalter -->
<div class="card card-outline card-primary mb-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-code"></i> <?= $this->te('Verfügbare Platzhalter') ?></h3>
</div>
<div class="card-body">
<div class="var-chips">
<?php foreach ($variables as $key => $desc): ?>
<button type="button" class="var-chip" onclick="insertVariable('{{<?= $key ?>'+'}}')">
<code>{{<?= $key ?>}}</code>
<span class="var-desc"><?= $this->e($desc) ?></span>
</button>
<?php endforeach; ?>
</div>
</div>
</div>
<form action="/admin/assets/handover-settings/email/<?= urlencode($tpl['template_key'] ?? '') ?>/update"
method="POST" id="templateForm">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<div class="card card-outline card-primary mb-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-envelope-open-text"></i> <?= $this->te('E-Mail-Inhalt') ?></h3>
</div>
<div class="card-body">
<div class="form-group">
<label for="subject_template"><?= $this->te('Betreff') ?></label>
<input type="text" id="subject_template" name="subject_template" class="form-control"
value="<?= $this->e($tpl['subject_template'] ?? '') ?>" required maxlength="500">
<small class="form-text text-muted"><?= $this->te('Platzhalter können auch im Betreff verwendet werden.') ?></small>
</div>
<div class="form-group">
<label for="body_html"><?= $this->te('E-Mail-Text (HTML)') ?></label>
<textarea id="body_html" name="body_html" rows="15" class="form-control"><?= $this->e($tpl['body_html'] ?? '') ?></textarea>
</div>
<div class="form-group mb-0">
<label style="display:flex;align-items:center;gap:0.5rem;cursor:pointer;font-weight:400;">
<input type="checkbox" name="is_enabled" value="1"
<?= !empty($tpl['is_enabled']) ? 'checked' : '' ?>>
<strong><?= $this->te('E-Mail-Versand aktiviert') ?></strong>
</label>
<small class="form-text text-muted"><?= $this->te('Wenn deaktiviert, wird keine E-Mail gesendet (PDF wird trotzdem generiert).') ?></small>
</div>
</div>
</div>
<!-- Vorschau -->
<div class="card card-outline card-primary mb-3">
<div class="card-header">
<h3 class="card-title"><i class="fas fa-eye"></i> <?= $this->te('Vorschau') ?></h3>
</div>
<div class="card-body">
<div id="emailPreview" class="email-preview-frame"></div>
</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary"><i class="fas fa-save"></i> <?= $this->te('Speichern') ?></button>
<a href="/admin/assets/handover-settings" class="btn btn-default"><?= $this->te('Abbrechen') ?></a>
</div>
</form>
<style>
.tpl-key-badge { font-size:.7rem; background:var(--gray-100); padding:.2rem .5rem; border-radius:.25rem; color:var(--gray-500); font-weight:400; }
.var-chips { display:flex; flex-wrap:wrap; gap:.5rem; }
.var-chip { display:flex; align-items:center; gap:.5rem; padding:.35rem .75rem; background:var(--gray-50); border:1px solid var(--gray-200); border-radius:.375rem; cursor:pointer; transition:all .15s; font-size:.8rem; }
.var-chip:hover { background:var(--blue-50); border-color:var(--blue-300); }
.var-chip code { font-weight:600; color:var(--blue-600); font-size:.75rem; }
.var-desc { color:var(--gray-500); font-size:.75rem; }
.email-preview-frame { border:1px solid var(--gray-200); border-radius:.375rem; padding:1.5rem; min-height:150px; font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif; font-size:.9rem; line-height:1.6; color:var(--gray-800); background:var(--color-bg); }
</style>
<script>
var sampleValues = <?= json_encode($sampleValues) ?>;
function insertVariable(varStr) {
if (typeof tinymce !== 'undefined' && tinymce.activeEditor) {
tinymce.activeEditor.insertContent(varStr);
} else if (window._fallbackEditor) {
window._fallbackEditor.focus();
document.execCommand('insertHTML', false, varStr);
}
}
function updatePreview() {
var previewEl = document.getElementById('emailPreview');
if (!previewEl) return;
var content = '';
if (typeof tinymce !== 'undefined' && tinymce.activeEditor) {
content = tinymce.activeEditor.getContent();
} else if (window._fallbackEditor) {
content = window._fallbackEditor.getContent();
}
for (var key in sampleValues) {
content = content.replace(
new RegExp('\\{\\{' + key + '\\}\\}', 'g'),
'<span style="background:#dbeafe;padding:0 3px;border-radius:2px;">' + sampleValues[key] + '</span>'
);
}
previewEl.innerHTML = content;
}
</script>
<?php if (TINYMCE_INSTALLED): ?>
<script src="<?= $this->asset('/assets/tinymce/tinymce.min.js') ?>"></script>
<script>
tinymce.init({
selector: '#body_html',
language: 'de',
language_url: '/assets/tinymce/langs/de.js',
height: 420,
menubar: false,
plugins: 'link lists code table fullscreen',
toolbar: 'undo redo | bold italic underline | bullist numlist | link table | forecolor backcolor | code fullscreen',
content_style: 'body { font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; font-size: 14px; color: #1f2937; line-height: 1.6; }',
promotion: false,
branding: false,
license_key: 'gpl',
setup: function(editor) {
editor.on('Change KeyUp', updatePreview);
editor.on('init', updatePreview);
}
});
</script>
<?php else: ?>
<link rel="stylesheet" href="<?= $this->asset('/assets/css/wysiwyg.css') ?>">
<script src="<?= $this->asset('/assets/js/wysiwyg.js') ?>"></script>
<script>
(function() {
var ta = document.getElementById('body_html');
var wrap = document.createElement('div');
wrap.className = 'wysiwyg-editor-container';
ta.parentNode.insertBefore(wrap, ta);
wrap.appendChild(ta);
window._fallbackEditor = new OpenNIT.WysiwygEditor(wrap, {
uploadUrl: '/upload/image',
csrfToken: document.querySelector('input[name="_csrf"]')?.value || '',
onChange: updatePreview
});
updatePreview();
}());
</script>
<?php endif; ?>