Letzte Version
This commit is contained in:
Binary file not shown.
@@ -9,7 +9,6 @@ class ModEisAnzeigeHelper
|
||||
/**
|
||||
* Holt alle PDF-Elemente aus der Datenbank
|
||||
*/
|
||||
|
||||
public static function getItems(): array
|
||||
{
|
||||
/** @var DatabaseDriver $db */
|
||||
@@ -35,7 +34,6 @@ class ModEisAnzeigeHelper
|
||||
/**
|
||||
* Hauptfunktion zum Rendern des Baums
|
||||
*/
|
||||
|
||||
public static function renderTree(array $items, int $parentId = null): string
|
||||
{
|
||||
if (!isset($items[$parentId])) {
|
||||
@@ -47,19 +45,21 @@ class ModEisAnzeigeHelper
|
||||
foreach ($items[$parentId] as $item) {
|
||||
$isFolder = (bool) $item['is_folder'];
|
||||
$title = htmlspecialchars($item['title'] ?: $item['name']);
|
||||
// $path = htmlspecialchars($item['path'] ?? '');
|
||||
$path = htmlspecialchars(self::convertToRelativeUrl($item['path'] ?? ''));
|
||||
$path = self::convertToRelativeUrl($item['path'] ?? '');
|
||||
|
||||
// Erweiterung .pdf im Titel entfernen (nur Anzeige, nicht Link)
|
||||
$displayTitle = preg_replace('/\.pdf$/i', '', $title);
|
||||
|
||||
if ($isFolder) {
|
||||
$fileCount = self::countFilesRecursive($items, $item['id']);
|
||||
$html .= '<li class="folder">';
|
||||
$html .= '<span class="toggle">▶</span>';
|
||||
$html .= '<span class="folder-icon"></span>' . $title . ' <small>(' . $fileCount . ')</small>';
|
||||
$html .= '<span class="folder-icon">📁</span> ' . $displayTitle . ' <small>(' . $fileCount . ')</small>';
|
||||
$html .= self::renderTree($items, $item['id']);
|
||||
$html .= '</li>';
|
||||
} else {
|
||||
$html .= '<li class="file">';
|
||||
$html .= '<span class="file-icon"></span><a class="file-link" href="' . $path . '">' . $title . '</a>';
|
||||
$html .= '<span class="file-icon">📄</span><a class="file-link" href="' . htmlspecialchars($path) . '" title="' . $title . '">' . $displayTitle . '</a>';
|
||||
$html .= '</li>';
|
||||
}
|
||||
}
|
||||
@@ -68,22 +68,25 @@ class ModEisAnzeigeHelper
|
||||
return $html;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Konvertiert absoluten Serverpfad in URL
|
||||
*/
|
||||
private static function convertToRelativeUrl(string $fullPath): string
|
||||
{
|
||||
// <== HIER den absoluten Pfad zu deinem Webroot anpassen
|
||||
$webRoot = '/var/www/vhosts/ts-it24.net/stbv.ts-it24.net';
|
||||
$webBase = ''; // ggf. '/subdir' falls Joomla in Unterordner
|
||||
// Absoluter Serverpfad zum Joomla-Root
|
||||
$webRoot = '/var/www/joomla';
|
||||
$webBase = ''; // ggf. '/unterordner', wenn Joomla in Subdir
|
||||
|
||||
if (str_starts_with($fullPath, $webRoot)) {
|
||||
return $webBase . str_replace($webRoot, '', $fullPath);
|
||||
$relativePath = str_replace($webRoot, '', $fullPath);
|
||||
// Leerzeichen und Sonderzeichen escapen
|
||||
$relativePath = implode('/', array_map('rawurlencode', explode('/', $relativePath)));
|
||||
return rtrim(\JUri::root(), '/') . $webBase . $relativePath;
|
||||
}
|
||||
|
||||
return $fullPath; // Fallback: Original verwenden
|
||||
return $fullPath; // Fallback
|
||||
}
|
||||
|
||||
/**
|
||||
* Zählt alle PDF-Dateien unterhalb eines Ordners rekursiv
|
||||
*/
|
||||
@@ -96,7 +99,7 @@ class ModEisAnzeigeHelper
|
||||
}
|
||||
|
||||
foreach ($items[$parentId] as $item) {
|
||||
if ((bool)$item['is_folder']) {
|
||||
if ((bool) $item['is_folder']) {
|
||||
$count += self::countFilesRecursive($items, $item['id']);
|
||||
} else {
|
||||
$count++;
|
||||
|
||||
BIN
mod_pdf_tree/mod_eis_anzeige.zip
Normal file
BIN
mod_pdf_tree/mod_eis_anzeige.zip
Normal file
Binary file not shown.
@@ -1,8 +1,6 @@
|
||||
<?php defined('_JEXEC') or die; ?>
|
||||
|
||||
<!-- Styles für Struktur, Vorschau und Icons -->
|
||||
<style>
|
||||
/* Baum und Vorschau nebeneinander */
|
||||
.pdf-tree-wrapper {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
@@ -12,16 +10,16 @@
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 4px 10px rgba(0,0,0,0.05);
|
||||
width: 100%;
|
||||
max-width: 100%; /* Oder: max-width: 1400px; */
|
||||
}
|
||||
|
||||
/* Linke Spalte: Verzeichnisbaum */
|
||||
.pdf-tree-container {
|
||||
flex: 0 0 30%;
|
||||
height: 95vh;
|
||||
max-height: 95vh;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/* Vorschaufenster rechts */
|
||||
#pdf-preview {
|
||||
flex: 1;
|
||||
min-width: 800px;
|
||||
@@ -31,50 +29,46 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Vorschau-Inhalt (PDF) */
|
||||
#pdf-preview iframe {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Verzeichnisliste zurücksetzen */
|
||||
.pdf-tree, .pdf-tree ul {
|
||||
.pdf-tree {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.pdf-tree ul {
|
||||
list-style: none;
|
||||
margin-left: 1.5em;
|
||||
padding: 0;
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.pdf-tree li {
|
||||
margin: 0.3em 0;
|
||||
}
|
||||
|
||||
/* Ordner-Icons & Pfeile */
|
||||
.folder > .toggle {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
width: 1em;
|
||||
}
|
||||
.folder-icon::before {
|
||||
content: "📁";
|
||||
margin-right: 4px;
|
||||
display: inline-block;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
/* Datei-Icon */
|
||||
.file-icon::before {
|
||||
content: "📄";
|
||||
margin-right: 4px;
|
||||
/* Optionale visuelle Trennung bei Dateien */
|
||||
.file-link {
|
||||
text-decoration: none;
|
||||
color: #0366d6;
|
||||
}
|
||||
.file-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Standard: Unterverzeichnisse einklappen */
|
||||
.pdf-tree ul {
|
||||
display: none;
|
||||
margin-left: 1.5em;
|
||||
}
|
||||
|
||||
/* Buttons oben */
|
||||
.expand-collapse {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
@@ -83,69 +77,60 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Steuerbuttons oben -->
|
||||
<!-- Buttons: Aus-/Einklappen -->
|
||||
<div class="expand-collapse">
|
||||
<button id="expand-all">ausklappen</button>
|
||||
<button id="collapse-all">einklappen</button>
|
||||
</div>
|
||||
|
||||
<!-- PDF-Baum und Vorschau -->
|
||||
<div class="pdf-tree-wrapper">
|
||||
<!-- Links: Verzeichnisbaum -->
|
||||
<div class="pdf-tree-container">
|
||||
<?php echo ModEisAnzeigeHelper::renderTree($items); ?>
|
||||
<?= ModEisAnzeigeHelper::renderTree($items); ?>
|
||||
</div>
|
||||
|
||||
<!-- Rechts: Vorschau-Bereich -->
|
||||
<div id="pdf-preview"></div>
|
||||
</div>
|
||||
|
||||
<!-- Interaktivität: Vorschau, Toggle, Buttons -->
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const preview = document.getElementById('pdf-preview');
|
||||
if (!preview) return;
|
||||
|
||||
// (1) Verzeichnisse auf-/zuklappen per Klick
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(function(toggle) {
|
||||
toggle.addEventListener('click', function() {
|
||||
var li = this.parentNode;
|
||||
var ul = li.querySelector('ul');
|
||||
if (!ul) return;
|
||||
if (ul.style.display === 'block') {
|
||||
ul.style.display = 'none'; this.textContent = '▶';
|
||||
} else {
|
||||
ul.style.display = 'block'; this.textContent = '▼';
|
||||
// (1) Verzeichnisse toggeln
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(toggle => {
|
||||
toggle.addEventListener('click', () => {
|
||||
const ul = toggle.closest('li').querySelector('ul');
|
||||
if (ul) {
|
||||
const visible = ul.style.display === 'block';
|
||||
ul.style.display = visible ? 'none' : 'block';
|
||||
toggle.textContent = visible ? '▶' : '▼';
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// (2) Alle ausklappen
|
||||
document.getElementById('expand-all').addEventListener('click', function() {
|
||||
document.querySelectorAll('.pdf-tree ul').forEach(function(ul) {
|
||||
ul.style.display = 'block';
|
||||
});
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(function(toggle) {
|
||||
toggle.textContent = '▼';
|
||||
});
|
||||
document.getElementById('expand-all')?.addEventListener('click', () => {
|
||||
document.querySelectorAll('.pdf-tree ul').forEach(ul => ul.style.display = 'block');
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(t => t.textContent = '▼');
|
||||
});
|
||||
|
||||
// (3) Alle einklappen
|
||||
document.getElementById('collapse-all').addEventListener('click', function() {
|
||||
document.querySelectorAll('.pdf-tree ul').forEach(function(ul) {
|
||||
ul.style.display = 'none';
|
||||
});
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(function(toggle) {
|
||||
toggle.textContent = '▶';
|
||||
});
|
||||
document.getElementById('collapse-all')?.addEventListener('click', () => {
|
||||
document.querySelectorAll('.pdf-tree ul').forEach(ul => ul.style.display = 'none');
|
||||
document.querySelectorAll('.pdf-tree .toggle').forEach(t => t.textContent = '▶');
|
||||
});
|
||||
|
||||
// (4) Vorschau anzeigen beim Klick
|
||||
var preview = document.getElementById('pdf-preview');
|
||||
document.querySelectorAll('.pdf-tree .file-link').forEach(function(link) {
|
||||
link.addEventListener('click', function(e) {
|
||||
// (4) PDF-Vorschau
|
||||
document.querySelectorAll('.pdf-tree .file-link').forEach(link => {
|
||||
link.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
preview.style.display = 'block';
|
||||
preview.innerHTML = '<iframe src="' + this.href + '" loading="lazy"></iframe>';
|
||||
|
||||
preview.innerHTML = ''; // Vorherige Vorschau entfernen
|
||||
const iframe = document.createElement('iframe');
|
||||
iframe.src = link.href;
|
||||
iframe.loading = 'lazy';
|
||||
preview.appendChild(iframe);
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user