bericht/ajax/replace_page_source.php
Eduard Wisch 4102ebfe5b
All checks were successful
Deploy bericht / deploy (push) Successful in 13s
Editor-Ueberarbeitung 1.5.0: Anhaenge-Kacheln, echte Seitengeometrie, Arbeiten ohne Reload [deploy]
Anhaenge-Spalte: Kachelraster mit Server-Thumbnails statt Dateinamen-Liste (Bilder per GD,
PDFs per PDF.js), Grossansicht per Klick, Auswahlreihenfolge sichtbar, Sortierung/Filter
(Aufnahmezeit per eigenem EXIF-Parser, da im Prod-Container ohne exif-Modul), ziehbare
Spaltenbreite, Kachelgroesse, Drag & Drop auf Seitenliste/Arbeitsflaeche/Raster-Plaetze.

Arbeitstisch zeigt jetzt Kopf-, Inhalts- und Fussbereich passend zur echten Seitengeometrie
(bericht_page_geometry()) - Editor und PDF-Erzeugung rechnen mit denselben Werten, das PDF
setzt die Arbeitsflaeche 1:1 statt sie ein zweites Mal einzupassen.

Neu: Bild einer Seite austauschen (auch einzelne Raster-Plaetze), Seiten mehrfach markieren
und sammeln loeschen/duplizieren, Autosave mit Verlassen-Warnung, Tastenkuerzel, kein
location.reload() mehr nach Hinzufuegen/Loeschen/Hochladen (ajax/fragments.php).

Nebenbei behoben: dol_dir_list() ohne mode=1 (Dateigroesse leer), PDF.js-Worker-Pfad ohne
/custom-Praefix, PDFs liefen als Download statt inline, Groessen-Select blieb leer,
Mehrfach-Upload nahm nur die erste Datei, Race-Condition bei schnellem Seitenwechsel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 00:33:20 +02:00

66 lines
2.7 KiB
PHP

<?php
/* Tauscht das Quellbild einer bestehenden Seite aus.
*
* POST: pageid, relpath, mime, token
* slot (optional) — bei Grid-Layouts der zu ersetzende Slot (0-basiert)
*
* Seitenreihenfolge, Notiz und Annotationen bleiben erhalten; nur die Quelle
* wird ersetzt. Damit muss man eine falsch gewaehlte Seite nicht loeschen und
* hinten neu anhaengen.
*/
require_once __DIR__.'/_inc.php';
global $db, $user;
if (!$user->hasRight('bericht', 'write')) bericht_ajax_fail('Permission denied', 403);
$pageid = (int) ($_POST['pageid'] ?? 0);
$relpath = (string) ($_POST['relpath'] ?? '');
$mime = (string) ($_POST['mime'] ?? '');
$slot = isset($_POST['slot']) && $_POST['slot'] !== '' ? (int) $_POST['slot'] : null;
if (!$pageid || $relpath === '') bericht_ajax_fail('Parameter fehlen');
$full = bericht_resolve_data_path($relpath);
if (!$full || !file_exists($full)) bericht_ajax_fail('Datei nicht gefunden', 404);
$res = $db->query("SELECT rowid, fk_bericht, COALESCE(layout,'single') AS layout"
." FROM ".$db->prefix()."bericht_page WHERE rowid = ".((int) $pageid));
if (!$res || !($row = $db->fetch_object($res))) bericht_ajax_fail('Seite nicht gefunden', 404);
// Bericht darf nicht finalisiert sein
$b = new Bericht($db);
if ($b->fetch((int) $row->fk_bericht) <= 0) bericht_ajax_fail('Bericht nicht gefunden', 404);
if ((int) $b->status === Bericht::STATUS_FINAL) {
bericht_ajax_fail('Der Bericht ist finalisiert und kann nicht mehr geändert werden', 403);
}
if ($row->layout !== 'single' && $slot !== null) {
// Grid: nur den einen Slot ersetzen
if (strpos($mime, 'image') !== 0 && $mime !== '') {
bericht_ajax_fail('In Raster-Layouts sind nur Bilder möglich');
}
$slots = BerichtPage::slotCountForLayout($row->layout);
if ($slot < 0 || $slot >= $slots) bericht_ajax_fail('Ungültiger Slot');
$p = new BerichtPage($db);
$p->id = (int) $row->rowid;
$p->fk_bericht = (int) $row->fk_bericht;
$p->layout = $row->layout;
if ($p->setSlotImage($slot, $relpath, 0) > 0) {
bericht_ajax_ok(array('slot' => $slot));
}
bericht_ajax_fail('DB-Fehler beim Ersetzen des Slots');
}
// Single: source_path/source_type der Seite ersetzen
$source_type = (strpos($mime, 'pdf') !== false || preg_match('/\.pdf$/i', $relpath)) ? 'pdf' : 'image';
$sql = "UPDATE ".$db->prefix()."bericht_page SET"
." source_path = '".$db->escape($relpath)."',"
." source_type = '".$db->escape($source_type)."',"
." source_page = 1,"
." rotation = 0"
." WHERE rowid = ".((int) $pageid);
if ($db->query($sql)) {
bericht_ajax_ok(array('source_type' => $source_type));
}
bericht_ajax_fail('DB-Fehler beim Ersetzen der Seite');