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' => 'PDF 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 ?? [];
$key = $tpl['template_key'] ?? '';
$flash = $this->flash();
$isTerms = ($key === 'handout_terms');
$isHandout = ($key === 'handout');
$isReturn = ($key === 'return');
$variables = [];
if (!$isTerms) {
$variables = [
'person_name' => 'Name des Empfängers / Rückgebers',
'asset_inventory_number' => 'Inventarnummer',
'asset_serial_number' => 'Seriennummer',
'asset_manufacturer' => 'Hersteller',
'asset_model' => 'Modell / Typ',
'asset_category' => 'Kategorie',
];
if ($isHandout) {
$variables['handout_date'] = 'Ausgabedatum';
$variables['signature_image'] = 'Unterschrift als Bild (wird automatisch eingefügt)';
$variables['terms'] = 'Übergabe-Bedingungen (Text von der Unterschriften-Seite)';
} else {
$variables['return_date'] = 'Rückgabedatum';
$variables['notes_section'] = 'Notizen-Abschnitt (automatisch formatiert)';
}
}
$sampleValues = [
'person_name' => 'Max Mustermann',
'asset_inventory_number' => 'INV-TEST-001',
'asset_serial_number' => 'SN123456789',
'asset_manufacturer' => 'Dell',
'asset_model' => 'Latitude 5540',
'asset_category' => 'Laptop',
'handout_date' => date('d.m.Y H:i'),
'return_date' => date('d.m.Y H:i'),
'signature_image' => '[Unterschrift – Vorschau]',
'notes_section' => '',
];
?>
<?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-file-pdf"></i>
<?= $this->e($tpl['name'] ?? '') ?>
<code class="tpl-key-badge"><?= $this->e($key) ?></code>
</h3>
<p class="text-muted small mb-0">
<?php if ($isTerms): ?>
<?= $this->t('Dieser Text wird auf der Unterschriften-Seite (<strong>/signature</strong>) zwischen den Gerätedaten und dem Unterschriftsfeld angezeigt. Kein Einloggen erforderlich.') ?>
<?php else: ?>
<?= $this->te('HTML-Vorlage für die generierte PDF-Bestätigung.') ?>
<?= $this->te('Die PDF wird als Anhang per E-Mail versandt und kann jederzeit im Inventar heruntergeladen werden.') ?>
<?php endif; ?>
</p>
</div>
</div>
<?php if (!$isTerms && !empty($variables)): ?>
<!-- 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 $pKey => $desc): ?>
<button type="button" class="var-chip" onclick="insertVariable('{{<?= $pKey ?>'+'}}')">
<code>{{<?= $pKey ?>}}</code>
<span class="var-desc"><?= $this->e($desc) ?></span>
</button>
<?php endforeach; ?>
</div>
</div>
</div>
<?php endif; ?>
<form action="/admin/assets/handover-settings/pdf/<?= urlencode($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-file-code"></i> <?= $isTerms ? 'Bedingungstext (HTML)' : 'PDF-Inhalt (HTML)' ?></h3>
</div>
<div class="card-body">
<div class="form-group mb-0">
<textarea id="body_html" name="body_html" rows="20" class="form-control"><?= $this->e($tpl['body_html'] ?? '') ?></textarea>
</div>
</div>
</div>
<?php if (!$isTerms): ?>
<!-- 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 (HTML-Darstellung)') ?></h3>
</div>
<div class="card-body">
<div id="pdfPreview" class="email-preview-frame"></div>
</div>
</div>
<?php endif; ?>
<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>
<!-- Reset -->
<div class="mt-3">
<form method="POST"
action="/admin/assets/handover-settings/pdf/<?= urlencode($key) ?>/reset"
onsubmit="return confirm('Standard-Vorlage wiederherstellen? Alle \u00c4nderungen gehen verloren.')">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<button type="submit" class="btn btn-default"><i class="fas fa-undo"></i> <?= $this->te('Standard wiederherstellen') ?></button>
</form>
</div>
<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); }
.tox-tinymce { border-radius:.375rem !important; }
</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('pdfPreview');
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: 500,
menubar: false,
plugins: 'link lists code table fullscreen',
toolbar: 'undo redo | blocks | bold italic underline | forecolor backcolor | bullist numlist | table | link | code fullscreen',
content_style: 'body { font-family: Arial, sans-serif; font-size: 13px; color: #1f2937; line-height: 1.5; }',
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; ?>