From 103fea5c488494bd876e5b4ed6e3600cc09f34dd Mon Sep 17 00:00:00 2001 From: Thomas Spohr Date: Tue, 26 Aug 2025 20:28:35 +0200 Subject: [PATCH] Mit neuen Manfest --- .DS_Store | Bin 14340 -> 14340 bytes com_eis/.DS_Store | Bin 10244 -> 10244 bytes com_eis/Archiv.zip | Bin 6375756 -> 6380595 bytes com_eis/administrator/.DS_Store | Bin 6148 -> 6148 bytes com_eis/administrator/language/.DS_Store | Bin 6148 -> 6148 bytes .../language/de-DE/de-DE.com_eis.ini | 49 +++- .../language/de-DE/de-DE.com_eis.sys.ini | 7 +- .../language/en-GB/en-GB.com_eis.ini | 39 ++- .../language/en-GB/en-GB.com_eis.sys.ini | 6 +- .../administrator/sql/install.mysql.utf8.sql | 43 ++-- com_eis/administrator/src/.DS_Store | Bin 6148 -> 6148 bytes .../src/Controller/ConfigController.php | 66 +++-- .../src/Controller/DisplayController.php | 102 +++++--- .../src/Helper/SettingsHelper.php | 45 ++++ .../administrator/src/Helper/TreeHelper.php | 137 +++++++--- .../src/View/Config/HtmlView.php | 19 +- .../administrator/src/View/Main/HtmlView.php | 29 ++- com_eis/administrator/tmpl/.DS_Store | Bin 6148 -> 6148 bytes com_eis/administrator/tmpl/config/default.php | 86 +++++-- com_eis/administrator/tmpl/main/default.php | 235 ++++++++---------- 20 files changed, 559 insertions(+), 304 deletions(-) create mode 100644 com_eis/administrator/src/Helper/SettingsHelper.php diff --git a/.DS_Store b/.DS_Store index a61c8b089dd63489ef6dda9c96186328c5bff1d0..5661c244a3b41819a510a32b841019475ebf51d4 100644 GIT binary patch delta 1200 zcmeH_*-ukJ6vpp2qTEXdJ2frE0op&iS3ME8G?C zt|#r)(I;-_DNg*isU?uV!g&9Tj=D4&lu*O=WGGTBSDnTZ8TDTz{*oS*1T0lrzKa>6xQ*^CuP0 zm|a$}=$V;WMo=pi8?wBe%wkR*$$4E{eXyl1*t(gyW!bpk;4Xz-lvf7yqzjt^!Sz8k z5Q}gJA0^8x2K{p)s=ga;n#0E`%rE=2;1<i< zZwjfApW$+`&z+L4w^ZrieA!@uvjPD%5buaD;Z@?6+moW5jS=#N{7tI6)N9~UgxPBA z?2#@={nB0Ox%5VQFMX8010WcRVKBjp3^?IJCUP+jY;MpB5A zxJVXplOi&il#+5%MQX`fqgDdLO3ULmZirue8dadsWas<^zZz$7c$eXN@|y7_4~@DZC!U)?LwJg z6j`AR6y2d9x`9((Y)c{s!Q&-~8}zjJy5J%PR^ z8ffW%W|OY`xc**?{O(A)7O77}e1D%+p0P}hIK_P@J?A+7vOs)@g>Zrd9K9^y*slmYStH7+X84mj!hr#$-N2%~6Dh)rP#= z^;o%FK3fqXrFOH||J$0+=Q5!wbv{p%?u%6`~JcVvxDz_2fBSwh|YKE^}=A8$lRRiHnqy zDzbqD$TreT4wKX5IvF50$bIsZydZDL2lAPGAz#S|`GGjZ!;B0}g9A=XM;_*&0CQ1> zYSdsE8qo|58?gyKw4(!Cu?=;*uowHVAHC?uF&xK9oWeO=!Bt$t9o)q|JitS|z*`LC z9X{bJM(~X))I>9=N;9d0I_V5LlNQlpT1i*ZM(U<5@{-vm2eWgHL9s5bTvD~P`X7S= zMcztjp(>Xd_E~~k#dxE8Y{nSzv2uamN#T6XMV!(9*jbUv zxjbuk%Gb#WV_kBqcB9)MdjJP<2uE<#pnJmLdk*Ju0T&U$0B+(IZbvyk!E?OAd)aNV b$y1K1$VUrUWP)oXPQJ~a`k&(%IadAxTn;n7 diff --git a/com_eis/.DS_Store b/com_eis/.DS_Store index 5423f059159d2be687ac9db54a70d52e5c409937..5ccbf1b576c44f3c56c4ba4b2c5f210e63c4c26e 100644 GIT binary patch delta 464 zcmZn(XbG6$&nUPtU^hRb;N*j1a+9?Lc$pcQZh_dFBLt4KF+P~AAg))>&XCHG$xzIo z$56qL%aBu0lH^lbTvEiqz~Idg%uorGDFLd;Wzc5`W5{R7VJHQ%Q-PxT3@!|bK)FO9 zD-_62WherRmM~-h)#U=kL2CSf;uSzu$v~a?K)oqIF?XO?IaqxXLuwpQz?C5nsH7a| zjAVvvuoZa>>0ohBpcC|gq96m~fm%Qg)dxBa)6srVN2AGX_7=axzL{M?f_-p!*PKl6 F0su*YVR`@n delta 64 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 diff --git a/com_eis/administrator/language/.DS_Store b/com_eis/administrator/language/.DS_Store index 706556ea67e22b3f0c8fb07f4c524186e9cf96df..30f1ba463214e53b429e8f707f9268a341b8e44c 100644 GIT binary patch delta 22 dcmZoMXffEJ!NkNKGFgkMj)|3X^D3q&Q2<4~1-k$M delta 22 ccmZoMXffEJ!NkO9FgetInput(); - $db = Factory::getDbo(); - - // Eingabe - $pdfPath = $input->getString('pdf_path', ''); - - // Existiert ein Eintrag? - $query = $db->getQuery(true) - ->select('COUNT(*)') - ->from($db->quoteName('#__eis_settings')); - $db->setQuery($query); - $exists = (int) $db->loadResult() > 0; - - if ($exists) { - // Update - $query = $db->getQuery(true) - ->update($db->quoteName('#__eis_settings')) - ->set($db->quoteName('pdf_path') . ' = ' . $db->quote($pdfPath)); - } else { - // Insert - $query = $db->getQuery(true) - ->insert($db->quoteName('#__eis_settings')) - ->columns([$db->quoteName('pdf_path')]) - ->values($db->quote($pdfPath)); + // CSRF + if (!Session::checkToken('post')) { + throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403); } - $db->setQuery($query)->execute(); + $app = Factory::getApplication(); + $input = $app->getInput(); - $app->enqueueMessage('Pfad gespeichert: ' . $pdfPath, 'message'); + // Feldname aus dem Config-Template + $path = (string) $input->post->get('document_root', '', 'string'); + $path = trim($path); + + // Minimal-Validierung & Normalisierung + // (Hier kein striktes is_readable(), damit man den Pfad auch erst konfigurieren kann, + // wenn das Verzeichnis später angelegt/umgehängt wird. Warnen ist aber hilfreich.) + if ($path === '') { + $app->enqueueMessage(Text::_('COM_EIS_MSG_INVALID_PATH') ?: 'Bitte einen gültigen Pfad angeben.', 'warning'); + $this->setRedirect(Route::_('index.php?option=com_eis&view=config', false)); + return; + } + + // Doppelte Slashes und trailing Slash bereinigen + $path = preg_replace('#/+#', '/', $path); + // Lass den Root-Slash stehen, entferne sonst trailing Slash + if ($path !== '/' && str_ends_with($path, '/')) { + $path = rtrim($path, '/'); + } + + // Optional: Hinweise zur Existenz/Lesbarkeit (nur Hinweis, kein Hard-Error) + if (!is_dir($path)) { + $app->enqueueMessage(Text::sprintf('COM_EIS_MSG_PATH_NOT_EXISTS', $path) ?: "Hinweis: Verzeichnis existiert nicht: {$path}", 'notice'); + } elseif (!is_readable($path)) { + $app->enqueueMessage(Text::sprintf('COM_EIS_MSG_PATH_NOT_READABLE', $path) ?: "Hinweis: Verzeichnis nicht lesbar: {$path}", 'notice'); + } + + // Persistieren + SettingsHelper::setSetting('document_root', $path); + + $app->enqueueMessage(Text::_('COM_EIS_MSG_SAVED_SUCCESS') ?: 'Einstellungen wurden gespeichert.', 'message'); $this->setRedirect(Route::_('index.php?option=com_eis&view=config', false)); } } diff --git a/com_eis/administrator/src/Controller/DisplayController.php b/com_eis/administrator/src/Controller/DisplayController.php index dd15b78..ab8e989 100644 --- a/com_eis/administrator/src/Controller/DisplayController.php +++ b/com_eis/administrator/src/Controller/DisplayController.php @@ -5,8 +5,12 @@ namespace EIS\Component\EIS\Administrator\Controller; \defined('_JEXEC') or die; use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Controller\BaseController; +use Joomla\CMS\Router\Route; +use Joomla\CMS\Session\Session; use Joomla\Database\DatabaseDriver; +use EIS\Component\EIS\Administrator\Helper\SettingsHelper; class DisplayController extends BaseController { @@ -17,36 +21,39 @@ class DisplayController extends BaseController */ public function scan(): void { - $db = Factory::getDbo(); + // CSRF prüfen (Form hat Token) + if (!Session::checkToken('post')) { + throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403); + } - // Pfad aus Tabelle laden - $query = $db->getQuery(true) - ->select($db->quoteName('pdf_path')) - ->from($db->quoteName('#__eis_settings')) - ->order('id ASC') - ->setLimit(1); + $app = Factory::getApplication(); + /** @var DatabaseDriver $db */ + $db = Factory::getDbo(); - $db->setQuery($query); - $path = $db->loadResult(); + // Pfad aus Settings laden (Key/Value); Default /var/www/pdf + $path = SettingsHelper::getSetting('document_root', '/var/www/pdf'); if (!$path || !is_dir($path)) { - Factory::getApplication()->enqueueMessage('Pfad ungültig oder nicht gesetzt: ' . $path, 'error'); - $this->setRedirect('index.php?option=com_eis&view=main'); + $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 + // Alte Einträge löschen (Hinweis: Dann sind ALLE eingefügten „neu“) $db->truncateTable('#__eis_documents'); - // In Datenbank speichern - $this->saveToDb($data, null, $db); + // In Datenbank speichern und neue IDs sammeln + $newIds = $this->saveToDb($data, null, $db); + + // Neue IDs im UserState für die View -> virtueller Ordner "Neue Dokumente" + $app->setUserState('com_eis.new_ids', $newIds); // Erfolgsmeldung - Factory::getApplication()->enqueueMessage('PDF-Struktur erfolgreich gespeichert.', 'message'); - $this->setRedirect('index.php?option=com_eis&view=main'); + $app->enqueueMessage(Text::_('COM_EIS_MSG_SCAN_DONE') ?: 'PDF-Struktur erfolgreich gespeichert.', 'message'); + $this->setRedirect(Route::_('index.php?option=com_eis&view=main', false)); } /** @@ -59,7 +66,12 @@ class DisplayController extends BaseController return $result; } - foreach (scandir($dir) as $file) { + $entries = @scandir($dir); + if ($entries === false) { + return $result; + } + + foreach ($entries as $file) { if ($file === '.' || $file === '..') { continue; } @@ -78,18 +90,26 @@ class DisplayController extends BaseController } } + // Alphabetisch stabil sortieren (Ordner/Dateien je Ebene) + usort($result, static function ($a, $b) { + return strcasecmp((string)$a['name'], (string)$b['name']); + }); + return $result; } /** * Struktur rekursiv in die Datenbank schreiben + * @return int[] Insert-IDs aller neu eingefügten Dateien (für „Neue Dokumente“) */ - private function saveToDb(array $items, ?int $parentId, DatabaseDriver $db): void + private function saveToDb(array $items, ?int $parentId, DatabaseDriver $db): array { + $insertedFileIds = []; + foreach ($items as $item) { $name = $db->quote($item['name']); - $path = $db->quote($item['path'] ?? ''); // Leerer String statt NULL - $parent = $parentId !== null ? (int) $parentId : 'NULL'; + $path = $db->quote($item['path'] ?? ''); // leer statt NULL + $parent = $parentId !== null ? (int)$parentId : 'NULL'; $isFolder = isset($item['children']) ? 1 : 0; $query = $db->getQuery(true) @@ -97,45 +117,55 @@ class DisplayController extends BaseController ->columns(['name', 'path', 'parent_id', 'is_folder']) ->values("$name, $path, $parent, $isFolder"); - $db->setQuery($query); - $db->execute(); + $db->setQuery($query)->execute(); - $insertedId = $db->insertid(); + $insertedId = (int)$db->insertid(); if ($isFolder && !empty($item['children'])) { - $this->saveToDb($item['children'], $insertedId, $db); + // Kinder speichern + $childIds = $this->saveToDb($item['children'], $insertedId, $db); + // Nur Datei-IDs sammeln + $insertedFileIds = array_merge($insertedFileIds, $childIds); + } else { + // Datei -> ID merken + $insertedFileIds[] = $insertedId; } } + + return $insertedFileIds; } + public function rename(): void { // CSRF prüfen - \Joomla\CMS\Session\Session::checkToken() or jexit(\JText::_('JINVALID_TOKEN')); + if (!Session::checkToken('post')) { + throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403); + } - $app = \Joomla\CMS\Factory::getApplication(); - $id = (int) $app->input->get('id'); - $title = trim((string) $app->input->get('title', '', 'STRING')); + $app = Factory::getApplication(); + $id = (int) $app->input->post->get('id', 0); + $title = trim((string) $app->input->post->get('title', '', 'string')); if ($id <= 0) { - $app->enqueueMessage('Ungültige ID', 'error'); - $this->setRedirect('index.php?option=com_eis&view=main'); + $app->enqueueMessage(Text::_('JERROR_AN_ERROR_HAS_OCCURRED') ?: 'Ungültige ID', 'error'); + $this->setRedirect(Route::_('index.php?option=com_eis&view=main', false)); return; } - /** @var \Joomla\Database\DatabaseDriver $db */ - $db = \Joomla\CMS\Factory::getDbo(); + /** @var DatabaseDriver $db */ + $db = Factory::getDbo(); $query = $db->getQuery(true) ->update($db->quoteName('#__eis_documents')) ->set($db->quoteName('title') . ' = ' . ($title === '' ? 'NULL' : $db->quote($title))) - ->where($db->quoteName('id') . ' = ' . (int) $id); + ->where($db->quoteName('id') . ' = ' . (int)$id); try { $db->setQuery($query)->execute(); - $app->enqueueMessage('Anzeigename gespeichert', 'message'); + $app->enqueueMessage(Text::_('COM_EIS_MSG_SAVED_SUCCESS') ?: 'Anzeigename gespeichert', 'message'); } catch (\Throwable $e) { - $app->enqueueMessage('Fehler beim Speichern: ' . $e->getMessage(), 'error'); + $app->enqueueMessage((Text::_('COM_EIS_MSG_SAVED_ERROR') ?: 'Fehler beim Speichern: ') . $e->getMessage(), 'error'); } - $this->setRedirect('index.php?option=com_eis&view=main'); + $this->setRedirect(Route::_('index.php?option=com_eis&view=main', false)); } } diff --git a/com_eis/administrator/src/Helper/SettingsHelper.php b/com_eis/administrator/src/Helper/SettingsHelper.php new file mode 100644 index 0000000..85fddd6 --- /dev/null +++ b/com_eis/administrator/src/Helper/SettingsHelper.php @@ -0,0 +1,45 @@ +getQuery(true) + ->select($db->quoteName('value')) + ->from($db->quoteName('#__eis_settings')) + ->where($db->quoteName('param') . ' = ' . $db->quote($param)); + $db->setQuery($q); + $val = $db->loadResult(); + + return ($val !== null && $val !== '') ? $val : $default; + } + + public static function setSetting(string $param, $value): void + { + $db = Factory::getDbo(); + + // Basis-INSERT per Query-Builder zusammenstellen … + $qb = $db->getQuery(true) + ->insert($db->quoteName('#__eis_settings')) + ->columns([$db->quoteName('param'), $db->quoteName('value'), $db->quoteName('modified')]) + ->values( + $db->quote($param) . ', ' . + $db->quote((string) $value) . ', ' . + $db->quote(date('Y-m-d H:i:s')) + ); + + // … und dann als String um "ON DUPLICATE KEY UPDATE" erweitern. + $sql = (string) $qb + . ' ON DUPLICATE KEY UPDATE ' + . $db->quoteName('value') . ' = VALUES(' . $db->quoteName('value') . '), ' + . $db->quoteName('modified') . ' = VALUES(' . $db->quoteName('modified') . ')'; + + $db->setQuery($sql)->execute(); + } +} diff --git a/com_eis/administrator/src/Helper/TreeHelper.php b/com_eis/administrator/src/Helper/TreeHelper.php index ba62edd..97f18b8 100644 --- a/com_eis/administrator/src/Helper/TreeHelper.php +++ b/com_eis/administrator/src/Helper/TreeHelper.php @@ -5,6 +5,7 @@ namespace EIS\Component\EIS\Administrator\Helper; \defined('_JEXEC') or die; use Joomla\CMS\Factory; +use Joomla\CMS\Language\Text; use Joomla\Database\DatabaseDriver; class TreeHelper @@ -30,12 +31,46 @@ class TreeHelper // alphabetisch nach name foreach ($grouped as &$group) { - usort($group, fn($a, $b) => strcasecmp($a['name'], $b['name'])); + usort($group, static fn($a, $b) => strcasecmp((string)$a['name'], (string)$b['name'])); } return $grouped; } + /** + * Kombiniert: Virtueller Ordner "Neue Dokumente" (falls $newIds vorhanden) + normaler Baum + */ + public static function renderTreeWithNew(array $items, array $newIds = []): string + { + $html = ''; + + // 1) Virtueller Ordner "Neue Dokumente" + $newFiles = self::collectFilesByIds($items, $newIds); + if (!empty($newFiles)) { + $label = Text::_('COM_EIS_VIRTUAL_NEW') ?: 'Neue Dokumente'; + + $html .= '
    '; + $html .= '
  • '; + $html .= ' '; + $html .= '🆕 ' . htmlspecialchars($label, ENT_QUOTES, 'UTF-8') . ' (' . (int) count($newFiles) . ')'; + + // Kinder sichtbar + $html .= '
      '; + foreach ($newFiles as $row) { + $html .= self::renderSingleFileLi($row); + } + $html .= '
    '; + + $html .= '
  • '; + $html .= '
'; + } + + // 2) Normaler Baum + $html .= self::renderTree($items, null); + + return $html; + } + /** Baum rendern (nutzt title als alternativen Anzeigenamen) */ public static function renderTree(array $items, ?int $parentId = null): string { @@ -46,39 +81,27 @@ class TreeHelper $html = '
    '; foreach ($items[$parentId] as $item) { - $isFolder = (bool) $item['is_folder']; - $rawName = $item['title'] ?: $item['name']; - $display = preg_replace('/\.pdf$/i', '', (string) $rawName); - $display = htmlspecialchars($display, ENT_QUOTES, 'UTF-8'); - $id = (int) $item['id']; + $isFolder = !empty($item['is_folder']); + $rawName = (string)($item['title'] ?? '') !== '' ? (string)$item['title'] : (string)$item['name']; + $display = preg_replace('/\.pdf$/i', '', $rawName); + $display = htmlspecialchars((string)$display, ENT_QUOTES, 'UTF-8'); + $id = (int)$item['id']; + if ($isFolder) { $fileCount = self::countFilesRecursive($items, $id); $html .= '
  • '; - $html .= ' '; - $html .= '📁 ' . $display . ' (' . (int)$fileCount . ')'; - $html .= self::renderTree($items, $id); - $html .= '
  • '; + . ' data-count="' . (int)$fileCount . '"' + . '>' + . ' ' + . '📁 ' . $display . ' (' . (int)$fileCount . ')' + . self::renderTree($items, $id) + . ''; } else { - $sizeStr = ''; - if (!empty($item['path']) && is_file($item['path'])) { - $size = @filesize($item['path']); - if ($size !== false) { - $sizeStr = ' (' . self::formatFileSize((int) $size) . ')'; - } - } - - $html .= '
  • '; - $html .= '📄 ' . $display . $sizeStr . ''; - $html .= '
  • '; + $html .= self::renderSingleFileLi($item, $display); } } @@ -86,6 +109,64 @@ class TreeHelper return $html; } + /** Einzelnes
  • für Datei (wird auch vom virtuellen Ordner genutzt) */ + private static function renderSingleFileLi(array $item, ?string $displayAlreadyEscaped = null): string + { + $rawName = (string)($item['title'] ?? '') !== '' ? (string)$item['title'] : (string)$item['name']; + $display = $displayAlreadyEscaped ?? htmlspecialchars(preg_replace('/\.pdf$/i', '', $rawName), ENT_QUOTES, 'UTF-8'); + $id = (int)$item['id']; + + // Dateigröße ermitteln (optional) + $sizeStr = ''; + $sizeBytes = ''; + if (!empty($item['path']) && is_file((string)$item['path'])) { + $bytes = @filesize((string)$item['path']); // @ unterdrückt Warnungen bei Zugriffsproblemen + if ($bytes !== false) { + $sizeBytes = (string)(int)$bytes; + $sizeStr = self::formatFileSize((int)$bytes); + } + } + + $html = '
  • ' + . '📄 ' . $display + . ($sizeStr !== '' ? ' (' . $sizeStr . ')' : '') + . '' + . '
  • '; + + return $html; + } + + /** Dateien zu gegebenen IDs einsammeln (nur is_folder = 0) */ + private static function collectFilesByIds(array $items, array $ids): array + { + if (empty($ids)) { + return []; + } + $ids = array_map('intval', $ids); + + // Flat-Index aller Rows + $idx = []; + foreach ($items as $group) { + foreach ($group as $row) { + $idx[(int)$row['id']] = $row; + } + } + + $out = []; + foreach ($ids as $id) { + if (isset($idx[$id]) && empty($idx[$id]['is_folder'])) { + $out[] = $idx[$id]; + } + } + return $out; + } + private static function countFilesRecursive(array $items, int $parentId): int { $count = 0; @@ -93,7 +174,7 @@ class TreeHelper return 0; } foreach ($items[$parentId] as $item) { - if ((bool) $item['is_folder']) { + if (!empty($item['is_folder'])) { $count += self::countFilesRecursive($items, (int)$item['id']); } else { $count++; diff --git a/com_eis/administrator/src/View/Config/HtmlView.php b/com_eis/administrator/src/View/Config/HtmlView.php index b0f1f90..4e77a89 100644 --- a/com_eis/administrator/src/View/Config/HtmlView.php +++ b/com_eis/administrator/src/View/Config/HtmlView.php @@ -4,29 +4,20 @@ namespace EIS\Component\EIS\Administrator\View\Config; \defined('_JEXEC') or die; use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView; -use Joomla\CMS\Factory; +use EIS\Component\EIS\Administrator\Helper\SettingsHelper; class HtmlView extends BaseHtmlView { - protected $form; - protected $item; + protected $pdfPath = ''; public function display($tpl = null): void { - $db = Factory::getDbo(); - $query = $db->getQuery(true) - ->select('*') - ->from($db->quoteName('#__eis_settings')) - ->setLimit(1); - - $db->setQuery($query); - $this->item = $db->loadAssoc(); - + $this->pdfPath = SettingsHelper::getSetting('document_root', '/var/www/pdf'); parent::display($tpl); } - public function getItem() + public function getPdfPath(): string { - return $this->item; + return (string)$this->pdfPath; } } diff --git a/com_eis/administrator/src/View/Main/HtmlView.php b/com_eis/administrator/src/View/Main/HtmlView.php index d1eb580..74c5486 100644 --- a/com_eis/administrator/src/View/Main/HtmlView.php +++ b/com_eis/administrator/src/View/Main/HtmlView.php @@ -1,20 +1,41 @@ treeHtml = TreeHelper::renderTree($items); + $app = Factory::getApplication(); + // Daten für den Baum holen + $items = TreeHelper::getItems(); + + // Neu hinzugekommene IDs aus dem letzten Scan (können leer sein) + $newIds = (array) $app->getUserState('com_eis.new_ids', []); + + // Baum rendern (virtueller Ordner „Neue Dokumente“ + normaler Baum) + $this->treeHtml = TreeHelper::renderTreeWithNew($items, $newIds); + + // Template rendern parent::display($tpl); + + // Optional: nur einmal anzeigen -> State leeren + $app->setUserState('com_eis.new_ids', []); + } + + /** Ermöglicht im Template: $this->treeHtml */ + public function getTreeHtml(): string + { + return (string) $this->treeHtml; } } diff --git a/com_eis/administrator/tmpl/.DS_Store b/com_eis/administrator/tmpl/.DS_Store index be3cf99baa4c80250afba314ecc457fb1743d6bc..cad045a904ac559d6af53d08bb93ed9381a59bb1 100644 GIT binary patch delta 22 dcmZoMXffEJ#l*z1cCrrBJSLfp&1aY_L;+662Co1B delta 22 ecmZoMXffEJ#l*z2d$JDGJSOS$o6j&=hynmns0SYa diff --git a/com_eis/administrator/tmpl/config/default.php b/com_eis/administrator/tmpl/config/default.php index 7c485e0..7c48678 100644 --- a/com_eis/administrator/tmpl/config/default.php +++ b/com_eis/administrator/tmpl/config/default.php @@ -1,38 +1,72 @@ -getItem(); -$pdfPath = $item['pdf_path'] ?? ''; +// Wert aus der View (HtmlView::getPdfPath()), Fallback leer +$pdfPath = method_exists($this, 'getPdfPath') ? (string) $this->getPdfPath() : ''; ?> +

    + +

    -

    +
    +
    +
    + - -
    -
    - +
    + +
    + +

    + +

    +
    +
    -
    - -
    - -
    -
    +
    +
    -
    -
    +
    + +
    -
    - -
    - - +
    + + diff --git a/com_eis/administrator/tmpl/main/default.php b/com_eis/administrator/tmpl/main/default.php index 7ecccf5..e2c1adf 100644 --- a/com_eis/administrator/tmpl/main/default.php +++ b/com_eis/administrator/tmpl/main/default.php @@ -4,114 +4,58 @@ use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Router\Route; use Joomla\CMS\Language\Text; + +$hasTree = !empty($this->treeHtml); ?> + -
    -
    -
    - - -
    - -
    - -
    + +
    + +
    ·
    +
    +
    +

    -treeHtml); ?> -

    - +

    - - -

    +

    @@ -119,14 +63,14 @@ use Joomla\CMS\Language\Text;
    -
    +
    treeHtml; ?>
    @@ -134,24 +78,27 @@ use Joomla\CMS\Language\Text;

    -
    + +
    -
    +
    - + +
    :
    -
    - -
    @@ -162,64 +109,76 @@ use Joomla\CMS\Language\Text;
    - \ No newline at end of file +