All checks were successful
Deploy bericht / deploy (push) Successful in 1s
DB-Klasse: - BerichtPage::getImages() liest llx_bericht_page_image - BerichtPage::setSlotImage() / clearImages() - BerichtPage::slotCountForLayout() - BerichtPage::slotRects() berechnet Slot-Positionen für 1/2/2v/4/6 - create()/update()/fetchAllForBericht() inkludieren layout/scale/align Endpoints (alle im Bericht-Modul): - ajax/save_page_options.php — speichert layout, image_scale, image_align - ajax/create_grid_page.php — erstellt Multi-Image-Seite mit gewähltem Layout - ajax/set_slot_image.php — setzt einzelnes Bild eines Slots - ajax/page_meta.php liefert layout/scale/align mit - ajax/page_image.php rendert Composite-PNG (GD) für Multi-Image-Seiten UI: - Layout-Dropdown in 3. Toolbar-Zeile (Single/Grid 2/2v/4/6) - Bildgröße-Dropdown (100/70/50/30%) — single-only - Position-Dropdown (Anpassen/Zentriert/Ecken) — single-only - 'Als Grid hinzufügen'-Buttons in der Anhänge-Liste (▭▭ ▯▯ ▦ ▦▦) - Auto-Sync der single-only-Felder beim Layout-Wechsel Rendering: - bericht_render_page_to_pdf() in lib/bericht.lib.php — zentrale Render-Funktion für Single + Grid + PDF-Quelle + image_scale + align - bericht_align_position() für die 6 Align-Modi - generate_pdf + preview_pdf nutzen die gemeinsame Funktion (DRY) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> [deploy]
49 lines
1.9 KiB
PHP
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');
|
|
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));
|