bericht/ajax/create_grid_page.php
Eduard Wisch dbddee7791
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
feat: Block C — Editor-Polish, Vorher/Nachher, Versionierung, Batch-Modus
Desktop-Editor Polish:
- Aktives Seiten-Thumbnail deutlich markiert (scale + shadow + blauer
  Label-Hintergrund)
- Titel-Feld pro Seite in der DB (llx_bericht_page.title)

Phase 5.2 Vorher/Nachher-Layout:
- Neuer layout-Typ 'before_after' in bericht_render_page_to_pdf
- Zwei Bilder nebeneinander, Labels 'Vorher' / 'Nachher', Titel oben
- 'VN'-Button in der Anhänge-Grid-Leiste
- create_grid_page akzeptiert before_after
- Layout-Dropdown hat before_after + title_only Option

Phase 5.2b Title-Only Seiten:
- Reine Titel/Zwischentitel-Seiten ohne Bild
- 32pt Titel zentriert, optional Notiz darunter
- bericht_render_page_to_pdf behandelt title_only separat

Phase 5.3 Bericht-Versionierung:
- Neue Spalten version + fk_bericht_parent in llx_bericht
- Bericht::duplicateAsNewVersion() kopiert alles inkl. Seiten
- '🔀 Neue Version'-Button im Editor-Footer
- Versions-Links in der Meta-Zeile (v1, v2, v3 …) mit Sprungmöglichkeit
- Alte Versionen bleiben unverändert erhalten

Phase 5.6 Batch-Modus:
- Neue Seite bericht_batch.php mit Filter (Datum von/bis, Suche)
- Checkbox-Liste aller finalisierten Berichte
- 'Ausgewählte als Sammel-PDF herunterladen' → FPDI merged alle
  final_pdf_path in ein neues PDF mit Inhaltsverzeichnis-Seite
- Link im Admin-Setup

api/pages.php:
- POST-Update akzeptiert jetzt auch title und layout zusätzlich zu
  note und rotation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-09 09:10:56 +02:00

49 lines
1.9 KiB
PHP

<?php
/* Erstellt eine neue Multi-Image-Seite mit gewähltem Layout
* und setzt mehrere Bilder gleich rein.
* POST: berichtid, layout, relpaths[] (JSON-Array), token
*/
require_once __DIR__.'/_inc.php';
global $db, $user;
if (!$user->hasRight('bericht', 'write')) bericht_ajax_fail('Permission denied', 403);
$berichtid = (int) ($_POST['berichtid'] ?? 0);
$layout = (string) ($_POST['layout'] ?? 'grid_4');
$relpaths_raw = (string) ($_POST['relpaths'] ?? '[]');
$relpaths = json_decode($relpaths_raw, true);
if (!is_array($relpaths) || empty($relpaths)) bericht_ajax_fail('Keine Bilder ausgewählt');
$valid_layouts = array('grid_2', 'grid_2v', 'grid_4', 'grid_6', 'before_after');
if (!in_array($layout, $valid_layouts, true)) $layout = 'grid_4';
$bericht = new Bericht($db);
if ($bericht->fetch($berichtid) <= 0) bericht_ajax_fail('Bericht nicht gefunden', 404);
// Höchste page_order ermitteln
$res = $db->query("SELECT COALESCE(MAX(page_order),0) AS m FROM ".$db->prefix()."bericht_page WHERE fk_bericht = ".((int) $berichtid));
$next_order = ($res && ($o = $db->fetch_object($res))) ? ((int) $o->m) + 1 : 1;
// Neue Page anlegen — dummy source_path, da Bilder über page_image kommen
$page = new BerichtPage($db);
$page->fk_bericht = $berichtid;
$page->page_order = $next_order;
$page->source_type = 'grid';
$page->source_path = ''; // bei grid leer
$page->layout = $layout;
$page->image_scale = 1.0;
$page->image_align = 'fit';
if ($page->create() <= 0) bericht_ajax_fail('Page-Insert fehlgeschlagen');
// Bilder in Slots verteilen
$slot_count = BerichtPage::slotCountForLayout($layout);
$slot = 0;
foreach ($relpaths as $rel) {
if ($slot >= $slot_count) break;
$full = bericht_resolve_data_path($rel);
if (!$full || !file_exists($full)) continue;
$page->setSlotImage($slot, $rel, 0);
$slot++;
}
bericht_ajax_ok(array('pageid' => $page->id, 'created_slots' => $slot));