- 134-tool registry with programmatic SEO (unique titles/H1/descriptions, JSON-LD graphs, sitemap index, canonical 301 enforcement via required filter) - DB-backed job queue (SKIP LOCKED) with drivers: Ffmpeg, Images (GD), Pdf (qpdf/gs/poppler), Youtube (thumbnails), Qr (server-side PNG) - Security: SSRF guard, MIME validation, rate limits, API-key auth, bcrypt admin login, security headers - Admin panel: dashboard, tools/categories/guides CRUD, SEO audit, analytics, job inspector with retry, system health, feature flags - Docker deployment (nginx + web/api FPM pools + scalable workers), PHPUnit suite (19 tests / 1139 assertions), PWA manifest + service worker
18 lines
1.1 KiB
PHP
18 lines
1.1 KiB
PHP
<?= view('partials/admin_nav') ?>
|
||
<h1 style="font-size:1.7rem;margin-bottom:1rem">Settings & feature flags</h1>
|
||
<form method="post" action="/admin/settings" class="tool-panel" style="max-width:640px">
|
||
<?= csrf_field() ?>
|
||
<?php foreach ($flags as $key => $label): ?>
|
||
<label style="display:flex;gap:.7rem;align-items:flex-start;padding:.7rem 0;border-bottom:1px solid #f2f2f5">
|
||
<input type="checkbox" name="<?= esc($key) ?>" value="1" <?= ($values[$key] ?? '')==='1' ? 'checked' : '' ?>>
|
||
<span style="font-size:.93rem"><?= esc($label) ?></span>
|
||
</label>
|
||
<?php endforeach ?>
|
||
<div style="margin-top:1rem">
|
||
<label for="retention_hours" style="font-size:.85rem;font-weight:650">File retention override (hours, 1–72)</label>
|
||
<input id="retention_hours" name="retention_hours" type="number" min="1" max="72" placeholder="site default"
|
||
value="<?= esc($values['retention_hours'] ?? '') ?>" style="border:1.5px solid var(--ink-300);border-radius:9px;padding:.5rem .6rem;width:140px">
|
||
</div>
|
||
<button class="btn-primary" type="submit" style="margin-top:1.2rem">Save settings</button>
|
||
</form>
|