Umut hat den Namen festgelegt: aus dem Arbeitstitel "Kant CMS" wird KantSites. Geändert in allen Seitentiteln der Verwaltung, im Wortmarken-Schriftzug von Anmeldung und Seitenleiste, in den Fußzeilen, in den Demoinhalten für eine frische Installation, in package.json, .claude/launch.json und der Dokumentation. Die Bezeichnung der Website in der Datenbank heißt jetzt ebenfalls KantSites. Nicht angefasst: die bereits gespeicherten Demoinhalte der lokalen Installation. Titel wie "Die Grundlage · Kant CMS" und der Text im Kopfbereich sind Inhalt, nicht Systemname - die gehören in den Editor, nicht in ein Skript, das Revisionen umschreibt. 219 PHP-Tests / 881 Assertions grün, Playwright-Editortest grün. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
113 lines
6.7 KiB
Twig
113 lines
6.7 KiB
Twig
{% extends 'admin/shell.html.twig' %}
|
||
{% set nav = 'settings' %}
|
||
{% block title %}Einstellungen{% endblock %}
|
||
{% block heading %}Unternehmen und Adressen{% endblock %}
|
||
{% block lead %}Aus diesen Angaben entstehen die strukturierten Daten der Startseite. Was hier steht, ist genau das, was Suchmaschinen lesen – es gibt keine zweite, unsichtbare Fassung.{% endblock %}
|
||
{% block content %}
|
||
<section class="stack-section">
|
||
<div class="section-head"><h2>Unternehmensdaten</h2><span class="muted">Grundlage für Organization und LocalBusiness</span></div>
|
||
<form action="{{ path('admin_settings_save') }}" method="post" class="card card-body">
|
||
<input type="hidden" name="_csrf_token" value="{{ csrf_token('settings') }}">
|
||
<div class="fields">
|
||
<div>
|
||
<label for="legalName">Name des Unternehmens</label>
|
||
<input id="legalName" name="legalName" maxlength="200" value="{{ settings.legalName }}">
|
||
</div>
|
||
<div>
|
||
<label for="phone">Telefon</label>
|
||
<input id="phone" name="phone" maxlength="40" value="{{ settings.phone }}">
|
||
</div>
|
||
<div>
|
||
<label for="email">E-Mail</label>
|
||
<input id="email" name="email" type="email" maxlength="120" value="{{ settings.email }}">
|
||
</div>
|
||
<div>
|
||
<label for="street">Straße und Hausnummer</label>
|
||
<input id="street" name="street" maxlength="120" value="{{ settings.street }}">
|
||
</div>
|
||
<div>
|
||
<label for="postalCode">Postleitzahl</label>
|
||
<input id="postalCode" name="postalCode" maxlength="16" value="{{ settings.postalCode }}">
|
||
</div>
|
||
<div>
|
||
<label for="city">Ort</label>
|
||
<input id="city" name="city" maxlength="120" value="{{ settings.city }}">
|
||
</div>
|
||
<div>
|
||
<label for="country">Land</label>
|
||
<input id="country" name="country" maxlength="2" pattern="[A-Za-z]{2}" value="{{ settings.country }}">
|
||
<p class="field-help">Zweibuchstabiger Code, zum Beispiel DE.</p>
|
||
</div>
|
||
</div>
|
||
<label for="homePath">Startseite</label>
|
||
<select id="homePath" name="homePath">
|
||
{% for page in choosableHome %}<option value="{{ page.path }}"{{ settings.homePath == page.path ? ' selected' : '' }}>{{ page.title }} (/{{ page.path }})</option>{% endfor %}
|
||
</select>
|
||
<p class="field-help">Diese Seite antwortet unter <code>/</code>; ihre eigene Adresse leitet dauerhaft dorthin. Nur veröffentlichte Seiten sind wählbar, und die Startseite lässt sich nicht umbenennen oder in den Papierkorb legen.</p>
|
||
<label for="description">Kurzbeschreibung</label>
|
||
<input id="description" name="description" maxlength="300" value="{{ settings.description }}">
|
||
<label for="sameAs">Profile</label>
|
||
<textarea id="sameAs" name="sameAs" rows="3" placeholder="https://www.linkedin.com/company/…">{{ settings.sameAs|join('\n') }}</textarea>
|
||
<p class="field-help">Eine HTTPS-Adresse je Zeile, höchstens zwanzig.</p>
|
||
<label class="check-label" for="localBusiness"><input id="localBusiness" name="localBusiness" type="checkbox" value="1"{{ settings.localBusiness ? ' checked' : '' }}> Als lokales Unternehmen auszeichnen</label>
|
||
<p class="field-help">Braucht mindestens Straße und Ort. Sinnvoll bei einem Standort mit Kundenverkehr.</p>
|
||
<label class="check-label" for="llmsTxt"><input id="llmsTxt" name="llmsTxt" type="checkbox" value="1"{{ settings.llmsTxt ? ' checked' : '' }}> <code>llms.txt</code> ausliefern</label>
|
||
<p class="field-help">Eine maschinenlesbare Liste der veröffentlichten, indexierbaren Seiten. Optional. Kein Rankingfaktor und keine Voraussetzung für irgendeine Suchfunktion; ohne Aktivierung antwortet die Adresse mit 404.</p>
|
||
<label for="robotsExtra">Zusätzliche Zeilen für robots.txt</label>
|
||
<textarea id="robotsExtra" name="robotsExtra" rows="3">{{ settings.robotsExtra }}</textarea>
|
||
<p class="field-help">Nur Kommentarzeilen und einfache Anweisungen wie <code>Disallow: /pfad</code>. Höchstens dreißig Zeilen.</p>
|
||
<button class="primary" type="submit">Unternehmensdaten speichern</button>
|
||
</form>
|
||
</section>
|
||
|
||
<section class="stack-section">
|
||
<div class="section-head"><h2>Weiterleitungen <span class="count">{{ redirects|length }}</span></h2><span class="muted">Werden vor dem 404 geprüft.</span></div>
|
||
<form action="{{ path('admin_redirect_save') }}" method="post" class="card card-body">
|
||
<input type="hidden" name="_csrf_token" value="{{ csrf_token('settings') }}">
|
||
<div class="fields">
|
||
<div>
|
||
<label for="from">Alte Adresse</label>
|
||
<input id="from" name="from" maxlength="400" required placeholder="alte-seite">
|
||
</div>
|
||
<div>
|
||
<label for="to">Neue Adresse</label>
|
||
<input id="to" name="to" maxlength="400" placeholder="leistungen/webdesign">
|
||
<p class="field-help">Bei 410 leer lassen.</p>
|
||
</div>
|
||
<div>
|
||
<label for="status">Art</label>
|
||
<select id="status" name="status">
|
||
<option value="301">301 – dauerhaft verschoben</option>
|
||
<option value="410">410 – entfernt</option>
|
||
</select>
|
||
</div>
|
||
</div>
|
||
<button class="primary" type="submit">Weiterleitung speichern</button>
|
||
</form>
|
||
|
||
{% if redirects is not empty %}
|
||
<table class="table redirect-table">
|
||
<caption class="visually-hidden">Gespeicherte Weiterleitungen</caption>
|
||
<thead><tr><th scope="col">Alte Adresse</th><th scope="col">Ziel</th><th scope="col">Art</th><th scope="col">Entfernen</th></tr></thead>
|
||
<tbody>
|
||
{% for entry in redirects %}
|
||
<tr>
|
||
<td><code>/{{ entry.from }}</code></td>
|
||
<td>{% if entry.to %}<code>/{{ entry.to }}</code>{% else %}<span class="muted">—</span>{% endif %}</td>
|
||
<td>{{ entry.status }}</td>
|
||
<td>
|
||
<form action="{{ path('admin_redirect_save') }}" method="post">
|
||
<input type="hidden" name="_csrf_token" value="{{ csrf_token('settings') }}">
|
||
<input type="hidden" name="remove" value="{{ entry.id }}">
|
||
<button class="text-button danger-text" type="submit" aria-label="Weiterleitung von /{{ entry.from }} entfernen">Entfernen</button>
|
||
</form>
|
||
</td>
|
||
</tr>
|
||
{% endfor %}
|
||
</tbody>
|
||
</table>
|
||
{% endif %}
|
||
</section>
|
||
<p class="footnote">KantSites · Arbeitsstand</p>
|
||
{% endblock %}
|