_*.csv → struct-Daten (Spalte pid + Felder; "schema.feld" für andere Schemas, * z. B. relations.related; Mehrfachwerte mit Komma) * * Ablauf: * „Paket einspielen“ (beliebig oft): gitbacked aus → entpacken → CSV einlesen * „Abschließen“ (einmal): Suchindex für alle neuen Seiten → gitbacked an → edwiki-git-sync.php * * Alles läuft in kurzen Etappen (Seite lädt sich selbst neu), damit lima-city nicht abbricht. * Anders als der CSV-Import im Admin-Menü bleiben andere Schemas der Seite (z. B. relations) erhalten. * * Benutzung: Datei neben doku.php legen, als Admin anmelden, https://…/edwiki-import.php aufrufen. * Pakete per Formular hochladen oder per FTP nach data/tmp/edwiki-import/eingang/ legen. */ if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/'); require_once DOKU_INC . 'inc/init.php'; use dokuwiki\plugin\struct\meta\Assignments; use dokuwiki\plugin\struct\meta\StructException; global $INPUT, $conf; header('Content-Type: text/html; charset=utf-8'); header('X-Robots-Tag: noindex'); const EDW_SELF = 'edwiki-import.php'; const EDW_SYNC = 'edwiki-git-sync.php'; const EDW_BUDGET = 20; // Sekunden Arbeit pro Aufruf const EDW_SUMMARY = 'Import-Paket'; $work = $conf['tmpdir'] . '/edwiki-import'; $inbox = $work . '/eingang'; $stateFile = $work . '/state.json'; io_mkdir_p($inbox); $t0 = microtime(true); // ------------------------------------------------------------------ Hilfen function edw_page($title, $body, $refresh = false) { $meta = $refresh ? '' : ''; echo '' . $meta . '' . hsc($title) . '' . '' . '

' . hsc($title) . '

' . $body . ''; exit; } function edw_state() { global $stateFile; $s = @json_decode((string)@file_get_contents($stateFile), true); return is_array($s) ? $s : ['step' => 'idle', 'packages' => [], 'index' => [], 'csv' => [], 'log' => [], 'gitbacked_off' => false]; } function edw_save($s) { global $stateFile; io_saveFile($stateFile, json_encode($s, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); } function edw_log(&$s, $msg) { $s['log'][] = date('H:i:s') . ' ' . $msg; if (count($s['log']) > 400) $s['log'] = array_slice($s['log'], -400); } function edw_time_left() { global $t0; return microtime(true) - $t0 < EDW_BUDGET; } function edw_form($action, $label, $extra = '') { return '
' . '' . '' . $extra . '
'; } function edw_gitbacked_set($on) { if (!is_dir(DOKU_PLUGIN . 'gitbacked')) return true; // nicht installiert $ok = $on ? plugin_enable('gitbacked') : plugin_disable('gitbacked'); // PHP-Zwischenspeicher (OPcache) würde die alte Plugin-Einstellung sonst noch eine Weile verwenden if (function_exists('opcache_invalidate')) { foreach (glob(DOKU_CONF . 'plugins*.php') ?: [] as $f) @opcache_invalidate($f, true); } return $ok; } /** true, wenn gitbacked in DIESEM Aufruf noch aktiv ist (Handler geladen) */ function edw_gitbacked_active() { return class_exists('action_plugin_gitbacked_editcommit', false); } /** sicherer Zielpfad für einen ZIP-Eintrag, sonst null */ function edw_target($name, &$kind, &$id) { global $conf; $name = str_replace('\\', '/', $name); if ($name === '' || substr($name, -1) === '/' || strpos($name, '..') !== false || $name[0] === '/') return null; if (preg_match('#^pages/(.+)\.txt$#', $name, $m)) { $id = str_replace('/', ':', $m[1]); if (cleanID($id) !== $id) return null; $kind = 'page'; return wikiFN($id); } if (preg_match('#^media/(.+)$#', $name, $m)) { $id = str_replace('/', ':', $m[1]); if (cleanID($id) !== $id) return null; $kind = 'media'; return mediaFN($id); } if (preg_match('#^([a-z0-9_]+)_[^/]*\.csv$#', $name)) { $kind = 'csv'; $id = $name; return null; // wird gesondert behandelt } return null; } // ------------------------------------------------------------------ Zugriff if (!auth_isadmin()) { http_response_code(403); edw_page('Kein Zugriff', '

Bitte zuerst im Wiki als Administrator anmelden und die Seite neu laden.

'); } @set_time_limit(EDW_BUDGET + 30); $s = edw_state(); if ($_SERVER['REQUEST_METHOD'] === 'POST' && empty($_POST) && (int)($_SERVER['CONTENT_LENGTH'] ?? 0) > 0) { edw_page('Paket zu groß', '

Die Datei (' . round($_SERVER['CONTENT_LENGTH'] / 1048576, 1) . ' MB) ist größer als die Upload-Grenze des Servers (' . hsc(ini_get('post_max_size')) . ').

' . '

Bitte per FTP nach data/tmp/edwiki-import/eingang/