Quelltext des aktuellen Standes
<?php $this->layout('layouts/portal', [
'page_title' => $workflow['name'],
'ssp_active' => 'requests',
]);
$du = ($portal_address ?? 'du') !== 'sie';
// Gemeinsamer Feld-Renderer (auch vom öffentlichen Formular genutzt)
$wf = $workflow;
$view = $this;
$lookups = $lookups ?? [];
$dirOn = $directory_search ?? true;
require dirname(__DIR__) . '/public/_field_renderer.php';
?>
<a href="/portal/requests" class="ssp-back"><i class="fas fa-arrow-left" aria-hidden="true"></i> <?= $this->te('Meine Anträge') ?></a>
<div class="ssp-hello">
<h1><i class="fas <?= $this->e($wf['icon'] ?: 'fa-file-signature') ?>" aria-hidden="true"></i> <?= $this->e($wf['name']) ?></h1>
<?php if (!empty($wf['description'])): ?><p><?= $this->e($wf['description']) ?></p><?php endif; ?>
</div>
<div class="ssp-card ssp-form">
<form method="post" action="/portal/requests/new/<?= (int)$wf['id'] ?>" enctype="multipart/form-data" id="ssp-wf-form">
<input type="hidden" name="_csrf" value="<?= $this->csrf() ?>">
<input type="hidden" name="_title" value="<?= $this->e($wf['name']) ?>">
<?php if ($wf['subject_mode'] === 'person'): ?>
<?php if ($dirOn && !empty($persons)): ?>
<div class="form-group">
<label for="ssp-subj-person"><?= $this->te('Betroffene Person') ?></label>
<select id="ssp-subj-person" class="form-control form-control-sm" name="_subject_person_id">
<option value=""><?= $this->te('– bitte wählen –') ?></option>
<?php foreach ($persons as $p): ?>
<option value="<?= (int)$p['id'] ?>"><?= $this->e($p['display_name']) ?><?= $p['department'] ? ' (' . $this->e($p['department']) . ')' : '' ?></option>
<?php endforeach; ?>
</select>
</div>
<?php else: ?>
<div class="form-group">
<label for="ssp-subj-text"><?= $this->te('Betroffene Person') ?></label>
<input id="ssp-subj-text" class="form-control form-control-sm" type="text" name="_subject_text" placeholder="<?= $this->te('Name oder E-Mail') ?>">
</div>
<?php endif; ?>
<?php elseif ($wf['subject_mode'] === 'free'): ?>
<div class="form-group">
<label for="ssp-subj-free"><?= $this->te('Betrifft') ?></label>
<input id="ssp-subj-free" class="form-control form-control-sm" type="text" name="_subject_text">
</div>
<?php endif; ?>
<?php
$currentSection = null;
foreach ($fields as $f) {
$sec = (string)($f['section'] ?? '');
if ($sec !== ($currentSection ?? '') && $sec !== '') {
echo '<div style="font-weight:700;font-size:.82rem;color:var(--gray-600);text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--color-border);padding:.75rem 0 .3rem;margin-bottom:.6rem;">' . $view->e($sec) . '</div>';
}
$currentSection = $sec;
$renderField($f);
}
?>
<button class="btn btn-primary" type="submit" data-busy-label="Wird eingereicht …" style="margin-top:.5rem;"><i class="fas fa-paper-plane" aria-hidden="true"></i> <?= $this->te('Antrag absenden') ?></button>
</form>
</div>
<script>
// Wiederholzeilen-Felder (Repeater) wie im öffentlichen Formular bedienbar machen
document.getElementById('ssp-wf-form').addEventListener('click', function (e) {
var add = e.target.closest('.wf-rep-add');
if (add) {
var rows = add.closest('.wf-repeater').querySelector('.wf-rep-rows');
var clone = rows.querySelector('.wf-rep-row').cloneNode(true);
clone.querySelector('input').value = ''; clone.querySelector('input').removeAttribute('required');
rows.appendChild(clone); return;
}
var del = e.target.closest('.wf-rep-del');
if (del) {
var wrap = del.closest('.wf-rep-rows');
if (wrap.querySelectorAll('.wf-rep-row').length > 1) { del.closest('.wf-rep-row').remove(); }
else { del.closest('.wf-rep-row').querySelector('input').value = ''; }
}
});
</script>