* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. */ /** * \file mahnung/admin/tracking_patterns.php * \ingroup mahnung * \brief Konfigurations-Seite fuer Tracking-Pattern (Regex + URL-Template). * Live-Vorschau via /custom/mahnung/ajax/regex_preview.php. */ $res = 0; if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; } $tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; $tmp2 = realpath(__FILE__); $i = strlen($tmp) - 1; $j = strlen($tmp2) - 1; while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { $i--; $j--; } if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; } if (!$res && file_exists("../../main.inc.php")) { $res = @include "../../main.inc.php"; } if (!$res && file_exists("../../../main.inc.php")) { $res = @include "../../../main.inc.php"; } if (!$res) { die("Include of main fails"); } require_once DOL_DOCUMENT_ROOT.'/custom/mahnung/class/mahnungtrackingpattern.class.php'; global $langs, $user, $db; $langs->loadLangs(array('admin', 'mahnung@mahnung')); if (!$user->admin && !$user->hasRight('mahnung', 'setup')) { accessforbidden(); } $action = GETPOST('action', 'aZ09'); $rowid = GETPOSTINT('rowid'); // POST: Speichern (Neu oder Update) if (($action === 'save_new' || $action === 'save_edit') && $user->hasRight('mahnung', 'setup')) { $p = new MahnungTrackingPattern($db); if ($action === 'save_edit' && $rowid > 0) { if ($p->fetch($rowid) <= 0) { setEventMessages('Pattern nicht gefunden', null, 'errors'); header('Location: '.$_SERVER['PHP_SELF']); exit; } } $p->provider = trim(GETPOST('provider', 'aZ09')); $p->label = trim(GETPOST('label', 'alphanohtml')); $p->regex = (string) GETPOST('regex', 'nohtml'); // Regex kann Sonderzeichen enthalten $p->url_template = trim(GETPOST('url_template', 'alphanohtml')); $p->priority = GETPOSTINT('priority'); if ($p->priority <= 0) { $p->priority = 100; } $p->active = GETPOST('active', 'int') ? 1 : 0; // Basis-Validierung $errors = array(); if ($p->provider === '') { $errors[] = $langs->trans('MahnungTrackingPatternProviderRequired'); } if ($p->label === '') { $errors[] = $langs->trans('MahnungTrackingPatternLabelRequired'); } if (!MahnungTrackingPattern::isValidRegex($p->regex)) { $errors[] = $langs->trans('MahnungTrackingPatternRegexInvalid'); } if (strpos($p->url_template, 'https://') !== 0) { $errors[] = $langs->trans('MahnungTrackingPatternUrlMustHttps'); } if (strpos($p->url_template, '{nr}') === false) { $errors[] = $langs->trans('MahnungTrackingPatternUrlMissingPlaceholder'); } if (!empty($errors)) { setEventMessages('', $errors, 'errors'); } else { $ret = ($action === 'save_new') ? $p->create() : $p->update(); if ($ret > 0) { setEventMessages($langs->trans('MahnungTrackingPatternSaved'), null, 'mesgs'); header('Location: '.$_SERVER['PHP_SELF']); exit; } else { setEventMessages($p->error ?: 'Speichern fehlgeschlagen', null, 'errors'); } } } // POST/GET: Loeschen if ($action === 'delete' && $rowid > 0 && $user->hasRight('mahnung', 'setup')) { $p = new MahnungTrackingPattern($db); if ($p->fetch($rowid) > 0 && $p->delete() > 0) { setEventMessages($langs->trans('MahnungTrackingPatternDeleted'), null, 'mesgs'); } header('Location: '.$_SERVER['PHP_SELF']); exit; } // Toggle active if ($action === 'toggle_active' && $rowid > 0 && $user->hasRight('mahnung', 'setup')) { $p = new MahnungTrackingPattern($db); if ($p->fetch($rowid) > 0) { $p->active = $p->active ? 0 : 1; $p->update(); } header('Location: '.$_SERVER['PHP_SELF']); exit; } llxHeader('', $langs->trans('MahnungTrackingPatternsSetup')); print load_fiche_titre($langs->trans('MahnungTrackingPatternsSetup'), ''.dol_escape_htmltag($langs->trans('Back')).'', 'fa-route'); print '
'.$langs->trans('MahnungTrackingPatternsIntro').'
'; $service = new MahnungTrackingPattern($db); $all = $service->fetchAll(false); // Edit-Modus laden $editP = null; if ($action === 'edit' && $rowid > 0) { $tmp = new MahnungTrackingPattern($db); if ($tmp->fetch($rowid) > 0) { $editP = $tmp; } } // Liste der bestehenden Patterns print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; if (empty($all)) { print ''; } foreach ($all as $p) { print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; } print '
'.$langs->trans('MahnungTrackingPatternLabel').''.$langs->trans('MahnungTrackingPatternProvider').''.$langs->trans('MahnungTrackingPatternRegex').''.$langs->trans('MahnungTrackingPatternUrlTemplate').''.$langs->trans('MahnungTrackingPatternPriority').''.$langs->trans('Status').'
'.$langs->trans('MahnungTrackingPatternsEmpty').'
'.dol_escape_htmltag($p['label']).''.dol_escape_htmltag($p['provider']).''.dol_escape_htmltag($p['regex']).''.dol_escape_htmltag($p['url_template']).''.((int) $p['priority']).''; $toggleLabel = $p['active'] ? $langs->trans('Active') : $langs->trans('Disabled'); $toggleColor = $p['active'] ? 'badge-status4' : 'badge-status8'; print ''.dol_escape_htmltag($toggleLabel).''; print ''; print ''.img_picto($langs->trans('Edit'), 'edit').' '; print ''.img_picto($langs->trans('Delete'), 'delete').''; print '
'; // Formular: Neu / Edit $isEdit = ($editP !== null); $formAction = $isEdit ? 'save_edit' : 'save_new'; $valProv = $editP ? $editP->provider : ''; $valLabel = $editP ? $editP->label : ''; $valRegex = $editP ? $editP->regex : '/\\b(\\d{14})\\b/'; $valUrl = $editP ? $editP->url_template : 'https://example.com/track?nr={nr}'; $valPrio = $editP ? (int) $editP->priority : 100; $valActive = $editP ? (int) $editP->active : 1; print '

'.dol_escape_htmltag($isEdit ? $langs->trans('MahnungTrackingPatternEditTitle') : $langs->trans('MahnungTrackingPatternNewTitle')).'

'; print '
'; print ''; print ''; if ($isEdit) { print ''; } print ''; print ''; print ''; print ''; print ''; print ''; print ''; print ''; print '
'.$langs->trans('MahnungTrackingPatternLabel').''; print ''; print '
'.$langs->trans('MahnungTrackingPatternProvider').''; print ''; print '
'.$langs->trans('MahnungTrackingPatternRegex').''; print ''; print '
 
'; print '
'.$langs->trans('MahnungTrackingPatternUrlTemplate').''; print ''; print '
'.$langs->trans('MahnungTrackingPatternUrlHint').'
'; print '
'.$langs->trans('MahnungTrackingPatternPriority').''; print ' '; print ''.$langs->trans('MahnungTrackingPatternPriorityHint').''; print '
'.$langs->trans('Status').''; print ' '.$langs->trans('Active'); print '
'.$langs->trans('MahnungTrackingPatternSample').''; print ''; print '
 
'; print '
'; print '
'; print ' '; if ($isEdit) { print ''.dol_escape_htmltag($langs->trans('Cancel')).''; } print '
'; print '
'; // Live-Vorschau-JS $ajaxUrl = DOL_URL_ROOT.'/custom/mahnung/ajax/regex_preview.php'; $labelInvalid = dol_escape_js($langs->trans('MahnungTrackingPatternRegexInvalid')); $labelValid = dol_escape_js($langs->trans('MahnungTrackingPatternRegexValid')); $labelMatch = dol_escape_js($langs->trans('MahnungTrackingPatternMatch')); $labelNoMatch = dol_escape_js($langs->trans('MahnungTrackingPatternNoMatch')); print << (function() { var regexEl = document.getElementById('pat_regex'); var urlEl = document.getElementById('pat_url'); var sampleEl = document.getElementById('pat_sample'); var statusEl = document.getElementById('regex_status'); var previewEl = document.getElementById('pat_preview'); var debounceTimer = null; function update() { clearTimeout(debounceTimer); debounceTimer = setTimeout(function() { var regex = regexEl.value; var sample = sampleEl.value; var url = urlEl.value; if (!regex) { statusEl.textContent = ''; previewEl.innerHTML = ' '; return; } var fd = new FormData(); fd.append('regex', regex); fd.append('sample', sample); fd.append('url_template', url); fetch('$ajaxUrl', { method: 'POST', body: fd, credentials: 'same-origin' }) .then(function(r) { return r.json(); }) .then(function(data) { if (!data.valid) { statusEl.textContent = '✗ ' + '$labelInvalid' + (data.error ? ' — ' + data.error : ''); statusEl.style.color = '#c33'; previewEl.innerHTML = ' '; return; } statusEl.textContent = '✓ ' + '$labelValid'; statusEl.style.color = '#2a8'; if (data.match) { var html = '$labelMatch' + ': ' + escapeHtml(data.match) + ''; if (data.preview_url) { html += ' → ' + escapeHtml(data.preview_url) + ''; } previewEl.innerHTML = html; } else if (sample.trim() !== '') { previewEl.innerHTML = '$labelNoMatch'; } else { previewEl.innerHTML = ' '; } }) .catch(function() { statusEl.textContent = '(Preview-Fehler)'; }); }, 300); } function escapeHtml(s) { return String(s).replace(/[&<>"']/g, function(c) { return { '&':'&', '<':'<', '>':'>', '"':'"', "'":''' }[c]; }); } function escapeAttr(s) { return escapeHtml(s); } if (regexEl && urlEl && sampleEl) { [regexEl, urlEl, sampleEl].forEach(function(el) { el.addEventListener('input', update); el.addEventListener('change', update); }); // Initial-Preview falls Sample schon befuellt update(); } })(); EOT; llxFooter(); $db->close();