Compare commits

..

3 Commits

Author SHA1 Message Date
Thomas Spohr
fd88be717e Ohne Zugriffsebenen 2026-02-14 13:07:19 +01:00
Thomas Spohr
c744863094 Test 2026-02-01 12:59:54 +01:00
Thomas Spohr
530ff9f3a0 Voe Umbau mit Joomla-Cron 2026-02-01 12:46:12 +01:00
30 changed files with 459 additions and 60 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
EIS.docx Normal file

Binary file not shown.

BIN
com_eis/.DS_Store vendored

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -42,3 +42,7 @@ COM_EIS_TOOLBAR_CLOSE="Schließen"
COM_EIS_MSG_PATH_NOT_EXISTS="Hinweis: Das Verzeichnis „%s“ existiert nicht."
COM_EIS_MSG_PATH_NOT_READABLE="Hinweis: Das Verzeichnis „%s“ ist nicht lesbar."
COM_EIS_ACCESS_TITLE="Zugriff (Top-Level-Ordner)"
COM_EIS_FIELD_VIEWLEVEL="Zugriffsebene"
COM_EIS_ACCESS_HELP="Nur für Ordner der ersten Ebene. Unterordner und Dateien erben die Einstellung."

View File

@@ -27,6 +27,16 @@ CREATE TABLE IF NOT EXISTS `#__eis_settings` (
UNIQUE KEY `uniq_param` (`param`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__eis_folder_access` (
`folder_id` INT UNSIGNED NOT NULL,
`viewlevel_id` INT UNSIGNED NOT NULL,
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`folder_id`),
KEY `idx_viewlevel` (`viewlevel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Standardwert für den PDF-Pfad (leer = noch nicht gesetzt)
INSERT IGNORE INTO `#__eis_settings` (`param`, `value`, `created`, `modified`)

View File

@@ -34,6 +34,15 @@ CREATE TABLE IF NOT EXISTS `#__eis_documents` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE IF NOT EXISTS `#__eis_folder_access` (
`folder_id` INT UNSIGNED NOT NULL,
`viewlevel_id` INT UNSIGNED NOT NULL,
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`folder_id`),
KEY `idx_viewlevel` (`viewlevel_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Falls es Altbestände ohne neue Spalten gab, Spalten idempotent ergänzen
ALTER TABLE `#__eis_documents`
ADD COLUMN IF NOT EXISTS `title` VARCHAR(255) DEFAULT NULL,

Binary file not shown.

View File

@@ -11,6 +11,7 @@ use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\Database\DatabaseDriver;
use EIS\Component\EIS\Administrator\Helper\SettingsHelper;
use EIS\Component\EIS\Administrator\Service\DocumentScanner;
class DisplayController extends BaseController
{
@@ -19,50 +20,29 @@ class DisplayController extends BaseController
/**
* Button-Aktion: PDF-Verzeichnis scannen und in Datenbank speichern
*/
public function scan(): void
{
{
// CSRF prüfen (Form hat Token)
if (!Session::checkToken('post')) {
throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
}
$app = Factory::getApplication();
/** @var DatabaseDriver $db */
$db = Factory::getDbo();
// Pfad aus Settings laden (Key/Value); Default /var/www/pdf
$path = SettingsHelper::getSetting('document_root', '/var/www/pdf');
try {
$newIds = DocumentScanner::run();
if (!$path || !is_dir($path)) {
$app->enqueueMessage(
Text::sprintf('COM_EIS_MSG_PATH_NOT_EXISTS', $path) ?: ('Pfad ungültig oder nicht gesetzt: ' . $path),
'error'
);
$this->setRedirect(Route::_('index.php?option=com_eis&view=main', false));
return;
}
// Verzeichnis rekursiv scannen
$data = $this->scanFolder($path);
// Alte Einträge löschen (Hinweis: Dann sind ALLE eingefügten „neu“)
$db->truncateTable('#__eis_documents');
// In Datenbank speichern und neue IDs sammeln (nur Dateien)
$newIds = $this->saveToDb($data, null, $db);
// Neue IDs im UserState für die View -> virtueller Ordner "Neue Dokumente"
// Wie bisher: New IDs für die View (virtueller Ordner "Neue Dokumente")
$app->setUserState('com_eis.new_ids', $newIds);
// NEU: dauerhaft speichern (für das Frontend-Modul)
SettingsHelper::setSetting('last_new_ids', json_encode($newIds, JSON_UNESCAPED_SLASHES));
SettingsHelper::setSetting('last_scan_at', date('Y-m-d H:i:s'));
// Erfolgsmeldung
$app->enqueueMessage(Text::_('COM_EIS_MSG_SCAN_DONE') ?: 'PDF-Struktur erfolgreich gespeichert.', 'message');
$this->setRedirect(Route::_('index.php?option=com_eis&view=main', false));
} catch (\Throwable $e) {
$app->enqueueMessage($e->getMessage(), 'error');
}
$this->setRedirect(Route::_('index.php?option=com_eis&view=main', false));
}
/**
* Rekursive Verzeichnisanalyse
*/
@@ -164,6 +144,7 @@ class DisplayController extends BaseController
$query = $db->getQuery(true)
->update($db->quoteName('#__eis_documents'))
->set($db->quoteName('title') . ' = ' . ($title === '' ? 'NULL' : $db->quote($title)))
->set($db->quoteName('modified') . ' = ' . $db->quote(\Joomla\CMS\Factory::getDate()->toSql()))
->where($db->quoteName('id') . ' = ' . (int)$id);
try {
@@ -175,4 +156,63 @@ class DisplayController extends BaseController
$this->setRedirect(Route::_('index.php?option=com_eis&view=main', false));
}
public function saveAccess(): void
{
if (!\Joomla\CMS\Session\Session::checkToken('post')) {
throw new \RuntimeException(\JText::_('JINVALID_TOKEN'), 403);
}
$app = \Joomla\CMS\Factory::getApplication();
$db = \Joomla\CMS\Factory::getDbo();
$folderId = (int) $app->input->post->get('folder_id', 0);
$viewlevelId = (int) $app->input->post->get('viewlevel_id', 0);
// Validierung: folderId muss Top-Level-Ordner sein
if ($folderId <= 0) {
$app->enqueueMessage('Ungültiger Ordner.', 'error');
$this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false));
return;
}
// prüfen, ob Top-Level-Ordner
$q = $db->getQuery(true)
->select($db->quoteName(['id','is_folder','parent_id']))
->from($db->quoteName('#__eis_documents'))
->where($db->quoteName('id') . ' = ' . (int)$folderId);
$db->setQuery($q);
$row = $db->loadAssoc();
if (!$row || (int)$row['is_folder'] !== 1 || $row['parent_id'] !== null) {
$app->enqueueMessage('Nur Top-Level-Ordner können berechtigt werden.', 'warning');
$this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false));
return;
}
// Viewlevel validieren
if ($viewlevelId <= 0) {
// löschen (öffentlich)
$db->setQuery(
$db->getQuery(true)
->delete($db->quoteName('#__eis_folder_access'))
->where($db->quoteName('folder_id') . ' = ' . (int)$folderId)
)->execute();
$app->enqueueMessage('Berechtigung entfernt (öffentlich).', 'message');
$this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false));
return;
}
// upsert
$sql = 'INSERT INTO ' . $db->quoteName('#__eis_folder_access')
. ' (' . $db->quoteName('folder_id') . ', ' . $db->quoteName('viewlevel_id') . ') VALUES ('
. (int)$folderId . ', ' . (int)$viewlevelId . ')'
. ' ON DUPLICATE KEY UPDATE ' . $db->quoteName('viewlevel_id') . ' = VALUES(' . $db->quoteName('viewlevel_id') . ')';
$db->setQuery($sql)->execute();
$app->enqueueMessage('Berechtigung gespeichert.', 'message');
$this->setRedirect(\Joomla\CMS\Router\Route::_('index.php?option=com_eis&view=main', false));
}
}

View File

@@ -0,0 +1,107 @@
<?php
namespace EIS\Component\EIS\Administrator\Service;
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\Database\DatabaseDriver;
use EIS\Component\EIS\Administrator\Helper\SettingsHelper;
class DocumentScanner
{
/**
* Führt den Scan aus.
* @return int[] IDs der eingefügten Dateien
*/
public static function run(?string $path = null, ?DatabaseDriver $db = null): array
{
$db = $db ?: Factory::getDbo();
$app = Factory::getApplication();
// Pfad laden, wenn nicht übergeben
$path = $path ?: SettingsHelper::getSetting('document_root', '/var/www/pdf');
if (!$path || !is_dir($path)) {
// Kein enqueueMessage, damit es auch im Task sauber läuft
throw new \RuntimeException('Pfad ungültig oder nicht gesetzt: ' . (string)$path);
}
$data = self::scanFolder($path);
// Achtung: du löscht aktuell immer alles -> danach ist alles "neu"
$db->truncateTable('#__eis_documents');
$newIds = self::saveToDb($data, null, $db);
// Dauerhaft speichern (Frontend-Modul nutzt das ja schon)
SettingsHelper::setSetting('last_new_ids', json_encode($newIds, JSON_UNESCAPED_SLASHES));
SettingsHelper::setSetting('last_scan_at', date('Y-m-d H:i:s'));
return $newIds;
}
private static function scanFolder(string $dir): array
{
$result = [];
if (!is_dir($dir)) {
return $result;
}
$entries = @scandir($dir);
if ($entries === false) {
return $result;
}
foreach ($entries as $file) {
if ($file === '.' || $file === '..') {
continue;
}
$fullPath = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($fullPath)) {
$result[] = [
'name' => $file,
'children' => self::scanFolder($fullPath)
];
} elseif (is_file($fullPath) && strtolower(pathinfo($file, PATHINFO_EXTENSION)) === 'pdf') {
$result[] = [
'name' => $file,
'path' => $fullPath
];
}
}
usort($result, static fn($a, $b) => strcasecmp((string)$a['name'], (string)$b['name']));
return $result;
}
private static function saveToDb(array $items, ?int $parentId, DatabaseDriver $db): array
{
$insertedFileIds = [];
foreach ($items as $item) {
$name = $db->quote($item['name']);
$path = $db->quote($item['path'] ?? '');
$parent = $parentId !== null ? (int)$parentId : 'NULL';
$isFolder = isset($item['children']) ? 1 : 0;
$query = $db->getQuery(true)
->insert($db->quoteName('#__eis_documents'))
->columns(['name', 'path', 'parent_id', 'is_folder'])
->values("$name, $path, $parent, $isFolder");
$db->setQuery($query)->execute();
$insertedId = (int) $db->insertid();
if ($isFolder && !empty($item['children'])) {
$childIds = self::saveToDb($item['children'], $insertedId, $db);
$insertedFileIds = array_merge($insertedFileIds, $childIds);
} else {
$insertedFileIds[] = $insertedId;
}
}
return $insertedFileIds;
}
}

Binary file not shown.

View File

@@ -4,38 +4,114 @@ namespace EIS\Component\EIS\Administrator\View\Main;
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\Database\DatabaseDriver;
use EIS\Component\EIS\Administrator\Helper\TreeHelper;
class HtmlView extends BaseHtmlView
{
/** @var string HTML des Baums (inkl. virtuellem Ordner „Neue Dokumente“, falls vorhanden) */
protected $treeHtml = '';
/** HTML des Baums (inkl. virtuellem Ordner „Neue Dokumente“, falls vorhanden) */
protected string $treeHtml = '';
/** Liste aller Viewlevels: [ ['id'=>int, 'title'=>string], ... ] */
protected array $viewLevels = [];
/**
* Map der gesetzten ACLs für Top-Level-Ordner:
* [ folder_id (int) => viewlevel_id (int), ... ]
*/
protected array $folderAccess = [];
public function display($tpl = null): void
{
$app = Factory::getApplication();
/** @var DatabaseDriver $db */
$db = Factory::getDbo();
// Daten für den Baum holen
// 1) Baum-Daten
$items = TreeHelper::getItems();
// Neu hinzugekommene IDs aus dem letzten Scan (können leer sein)
// neu hinzugekommene IDs aus letztem Scan (können leer sein)
$newIds = (array) $app->getUserState('com_eis.new_ids', []);
// Baum rendern (virtueller Ordner „Neue Dokumente“ + normaler Baum)
// Baum rendern (virtueller Ordner „Neue Dokumente“ + regulärer Baum)
$this->treeHtml = TreeHelper::renderTreeWithNew($items, $newIds);
// Template rendern
// 2) Viewlevels laden
$this->viewLevels = $this->loadViewLevels($db);
// 3) gesetzte ACLs für Top-Level-Ordner laden
$this->folderAccess = $this->loadFolderAccess($db);
// Template ausgeben
parent::display($tpl);
// Optional: nur einmal anzeigen -> State leeren
// „Neue Dokumente“ einmalig zeigen State leeren
$app->setUserState('com_eis.new_ids', []);
}
/** Ermöglicht im Template: $this->treeHtml */
/** Für Template: HTML des Baums */
public function getTreeHtml(): string
{
return (string) $this->treeHtml;
return $this->treeHtml;
}
/** Für Template: Liste der Viewlevels */
public function getViewLevels(): array
{
return $this->viewLevels;
}
/**
* Für Template/JS: Map folder_id => viewlevel_id (nur Top-Level-Ordner)
* Beispiel: [ 12 => 3, 15 => 5 ]
*/
public function getFolderAccess(): array
{
return $this->folderAccess;
}
/** Lädt alle Viewlevels sortiert nach Titel */
private function loadViewLevels(DatabaseDriver $db): array
{
$q = $db->getQuery(true)
->select($db->quoteName(['id', 'title']))
->from($db->quoteName('#__viewlevels'))
->order($db->quoteName('title') . ' ASC');
$db->setQuery($q);
$rows = (array) $db->loadAssocList();
// Safety: Normalisieren der Typen
foreach ($rows as &$r) {
$r['id'] = (int) ($r['id'] ?? 0);
$r['title'] = (string) ($r['title'] ?? '');
}
return $rows;
}
/**
* Lädt ACL-Zuweisungen aus #__eis_folder_access.
* Es werden nur Top-Level-Ordner-IDs erwartet (per Controller validiert).
*/
private function loadFolderAccess(DatabaseDriver $db): array
{
$q = $db->getQuery(true)
->select($db->quoteName(['folder_id', 'viewlevel_id']))
->from($db->quoteName('#__eis_folder_access'));
$db->setQuery($q);
$rows = (array) $db->loadAssocList();
$map = [];
foreach ($rows as $r) {
$fid = (int) ($r['folder_id'] ?? 0);
$vid = (int) ($r['viewlevel_id'] ?? 0);
if ($fid > 0 && $vid > 0) {
$map[$fid] = $vid;
}
}
return $map;
}
}

Binary file not shown.

View File

@@ -6,6 +6,10 @@ use Joomla\CMS\Router\Route;
use Joomla\CMS\Language\Text;
$hasTree = !empty($this->treeHtml);
// ACL-Daten aus der View (für Vorbelegung im Formular)
$viewLevels = method_exists($this, 'getViewLevels') ? (array) $this->getViewLevels() : [];
$aclMap = method_exists($this, 'getFolderAccess') ? (array) $this->getFolderAccess() : [];
?>
<style>
/* Layout */
@@ -75,7 +79,7 @@ $hasTree = !empty($this->treeHtml);
</div>
</div>
<!-- Rechte Seite: Inline-Bearbeitungsformular -->
<!-- Rechte Seite: Inline-Bearbeitung + ACL -->
<div class="eis-edit">
<h4><?php echo Text::_('COM_EIS_EDIT_TITLE') ?: 'Anzeigename bearbeiten'; ?></h4>
@@ -105,11 +109,46 @@ $hasTree = !empty($this->treeHtml);
<?php echo HTMLHelper::_('form.token'); ?>
</form>
<!-- ===== ACL: Zugriff (Top-Level-Ordner) ===== -->
<hr style="margin:1rem 0">
<h4><?php echo Text::_('COM_EIS_ACCESS_TITLE') ?: 'Zugriff (Top-Level-Ordner)'; ?></h4>
<form action="<?php echo Route::_('index.php?option=com_eis&task=display.saveAccess'); ?>"
method="post" id="eis-access-form">
<div class="control-group">
<label for="eis-folder-viewlevel">
<?php echo Text::_('COM_EIS_FIELD_VIEWLEVEL') ?: 'Zugriffsebene'; ?>
</label>
<select name="viewlevel_id" id="eis-folder-viewlevel" class="form-control">
<option value="0">(Öffentlich)</option>
<?php foreach ($viewLevels as $vl): ?>
<option value="<?php echo (int)$vl['id']; ?>">
<?php echo htmlspecialchars($vl['title'], ENT_QUOTES, 'UTF-8'); ?>
</option>
<?php endforeach; ?>
</select>
<div class="form-help">
<?php echo Text::_('COM_EIS_ACCESS_HELP') ?: 'Nur für Ordner der ersten Ebene. Unterordner und Dateien erben die Einstellung.'; ?>
</div>
</div>
<input type="hidden" name="folder_id" id="eis-folder-id" value="">
<?php echo HTMLHelper::_('form.token'); ?>
<div class="mt-2">
<button type="submit" class="btn btn-secondary" id="eis-access-save" disabled>
<?php echo Text::_('JSAVE'); ?>
</button>
</div>
</form>
<!-- ===== /ACL ===== -->
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
(function(){
const tree = document.getElementById('eis-tree');
const form = document.getElementById('eis-rename-form');
const idFld = document.getElementById('eis-id');
@@ -119,10 +158,26 @@ $hasTree = !empty($this->treeHtml);
const btnSave = document.getElementById('eis-save');
const btnClr = document.getElementById('eis-clear-title');
if (!tree || !form) return;
// ACL-Form Elemente
const aclForm = document.getElementById('eis-access-form');
const aclFolderId = document.getElementById('eis-folder-id');
const aclSelect = document.getElementById('eis-folder-viewlevel');
const aclBtn = document.getElementById('eis-access-save');
// PHP-Map folder_id => viewlevel_id an JS übergeben
const ACL_MAP = <?php echo json_encode($aclMap, JSON_UNESCAPED_SLASHES); ?>;
if (!tree) return;
let lastSelected;
// Helper: prüfen, ob li.folder Top-Level ist
function isTopLevelFolder(li){
if (!li) return false;
const parentLi = li.parentElement ? li.parentElement.closest('li.folder') : null;
return !parentLi; // kein übergeordneter <li.folder>
}
// Toggle (Caret) & Auswahl
tree.addEventListener('click', (e) => {
const t = e.target;
@@ -151,22 +206,37 @@ $hasTree = !empty($this->treeHtml);
t.classList.add('is-selected');
lastSelected = t;
// Daten aus data-Attributen (TreeHelper muss sie setzen)
// Daten aus data-Attributen
const id = li.getAttribute('data-id') || '';
const title = li.getAttribute('data-title') || '';
const name = li.getAttribute('data-name') || '';
const size = li.getAttribute('data-size') || ''; // optional
idFld.value = id;
nameFld.value = name;
titleFld.value= title;
sizeOut.textContent = size || '';
// Buttons ermöglichen
btnSave.disabled = !id;
btnClr.disabled = !id;
// ACL-Form: nur bei Top-Level-Ordner aktivieren und vorbelegen
if (li.classList.contains('folder') && isTopLevelFolder(li)) {
aclFolderId.value = id || '';
aclBtn.disabled = !aclFolderId.value;
// vorwählen
const current = (id && ACL_MAP[id]) ? String(ACL_MAP[id]) : '0';
if (aclSelect) {
for (const opt of aclSelect.options) {
opt.selected = (opt.value === current);
}
}
} else {
// kein Top-Level -> ACL-Form deaktivieren
aclFolderId.value = '';
aclBtn.disabled = true;
}
// Fokus ins Titel-Feld
titleFld.focus();
}
@@ -187,7 +257,7 @@ $hasTree = !empty($this->treeHtml);
document.querySelectorAll('.pdf-tree ul').forEach(ul => ul.style.display = 'none');
document.querySelectorAll('.pdf-tree .toggle').forEach(t => t.textContent = '▶');
});
});
})();
</script>
<?php endif; ?>

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
com_eis/site/.DS_Store vendored

Binary file not shown.

Binary file not shown.

BIN
mod_pdf_tree/.DS_Store vendored

Binary file not shown.

View File

@@ -130,6 +130,7 @@ class ModEisAnzeigeHelper
*/
public static function renderTreeWithNew(array $items): string
{
/*
$html = '';
// 1) Virtueller Ordner „Neue Dokumente“
@@ -164,7 +165,7 @@ class ModEisAnzeigeHelper
$html .= '</ul>';
}
}
*/
// 2) Normaler Baum
$html .= self::renderTree($items, null);

View File

@@ -0,0 +1,53 @@
<?php
defined('_JEXEC') or die;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
use Joomla\Component\Scheduler\Administrator\Traits\TaskPluginTrait;
use Joomla\Component\Scheduler\Administrator\Event\ExecuteTaskEvent;
use Joomla\Component\Scheduler\Administrator\Task\Status;
use EIS\Component\EIS\Administrator\Service\DocumentScanner;
final class PlgTaskEisdocumentscan extends CMSPlugin implements SubscriberInterface
{
use TaskPluginTrait;
protected const TASKS_MAP = [
'eisdocumentscan.documentscan' => [
'langConstPrefix' => 'PLG_TASK_EISDOCUMENTSCAN_TASK_DOCUMENTSCAN',
'method' => 'documentscan',
'form' => 'documentscan',
],
];
public static function getSubscribedEvents(): array
{
return [
// Wichtig: auf Trait-Methoden mappen!
'onTaskOptionsList' => 'advertiseRoutines',
'onExecuteTask' => 'standardRoutineHandler',
'onContentPrepareForm' => 'enhanceTaskItemForm',
];
}
/**
* Muss int Status zurückgeben
*/
public function documentscan(ExecuteTaskEvent $event): int
{
try {
DocumentScanner::run();
$this->logTask('EIS Dokumentenscan erfolgreich', 'info');
return Status::OK;
} catch (\Throwable $e) {
$this->logTask('EIS Dokumentenscan FEHLER: ' . $e->getMessage(), 'error');
return Status::KNOCKOUT;
}
}
}

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<extension type="plugin" group="task" method="upgrade">
<name>plg_task_eisdocumentscan</name>
<author>TS-IT24</author>
<version>1.0.2</version>
<description>Task Plugin: EIS Dokumentenscan</description>
<files>
<filename plugin="eisdocumentscan">eisdocumentscan.php</filename>
<folder>forms</folder>
<folder>language</folder>
</files>
<languages>
<language tag="de-DE">language/de-DE/de-DE.plg_task_eisdocumentscan.ini</language>
<language tag="de-DE">language/de-DE/de-DE.plg_task_eisdocumentscan.sys.ini</language>
</languages>
</extension>

Binary file not shown.

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<form>
<fieldset name="params" label="PLG_TASK_EISDOCUMENTSCAN_FIELDSET_PARAMS">
</fieldset>
</form>

View File

@@ -0,0 +1,4 @@
PLG_TASK_EISDOCUMENTSCAN_FIELDSET_PARAMS="Parameter"
PLG_TASK_EISDOCUMENTSCAN_TASK_DOCUMENTSCAN_TITLE="EIS: Dokumente scannen"
PLG_TASK_EISDOCUMENTSCAN_TASK_DOCUMENTSCAN_DESC="Scannt das PDF-Verzeichnis und aktualisiert die EIS-Datenbank."

View File

@@ -0,0 +1,2 @@
PLG_TASK_EISDOCUMENTSCAN="Task - EIS Dokumentenscan"
PLG_TASK_EISDOCUMENTSCAN_XML_DESCRIPTION="Scheduler-Task: scannt das PDF-Verzeichnis und aktualisiert die EIS-Datenbank."