_*.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 '';
}
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/