From fc1de065c919234bd6d5255a7f793e34ea56a6bf Mon Sep 17 00:00:00 2001 From: Thomas Spohr Date: Wed, 20 Aug 2025 14:08:20 +0200 Subject: [PATCH] Mit Formular --- .DS_Store | Bin 8196 -> 10244 bytes mod_pdf_tree/.DS_Store | Bin 6148 -> 6148 bytes mod_pdf_tree/Archiv.zip | Bin 5110 -> 6770 bytes mod_pdf_tree/helper.php | 121 +++++++++-------- mod_pdf_tree/tmpl/default.php | 239 ++++++++++++++++++++++++---------- 5 files changed, 240 insertions(+), 120 deletions(-) diff --git a/.DS_Store b/.DS_Store index b1a77228aba5228dd79e7c7f0c5c283071eb83e6..d20a3d2f1155e6f9f7495dc8d35df230560ffefd 100644 GIT binary patch literal 10244 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 R2LJ~ETmk?902lxO003)T{>uOW delta 3083 zcmV+m4D|EzH1;PAP)h>@6aWYS2mqm85|IrrfB*NQXaxA8X#e-3Xth_(Zrer>zUwI_ zs$i0~WI1Wt1hT38_$P7F{Mtc_I)<4W&Bn@|&yvILKHlYt` zoKeyGtp)h&udbRWtir=IRzTvI!tQ9Lj88DX>)^n>1I%>QV3EF)rMoAdGtV~(`o zb%OWm_vN2(y~Ld4w; z=|X4hfj`8m7FtP=WO#byXtmCzt!WRPqI@s%QCDH=O&?ZOb(q{s zW8HInaK~vHdzR+NK|Dt0rdm%OLEdTTfi5CTr0&6mGutb5RO8nHmKhBgiGwK-(yiWiVfX3b=*6pNhr0(T@YUg7@Ah1`(dnIqa{<&k z2HRR8>(#>F53Jhll$Qe+F=vP9`xe=Lb;6 zqw~Kf7_6_qf5gIO93CCO^!ziQD3~IsAryqq+hvMsT~}4i%Br$?H#N0{R%V2k)XEsq z29d_pZ;x}OQr^Z%#7Hm39vS=XXCmaN95IGrjd8TK0VfedD82XF8|~rOzrJkswa6hX zRr$}SkAGl`U!TvJfA0EQGQmkYboFIXUKhbe0uN;y3TH8rkI{$|j`L(mRBWaysBcct zk|_0KR*m5q&=~iKT4BVDpI}XxMPo1+xsHj;I&Lv{(o8oUKS&cj9#<5RCw`c|<9cwd zmw#4R=$p7$lr@ygA;Ma*4A#KqH21Jqp-$Q>R+QPo!6xGTf6MtNEc6JYWfzg>5kb_w z$N7lWqvj1)g;;;qsAgA^eV_+QG+db;NRv#RxxqNW%`SXlwxa?pv|O&v-z4JiJu zrq};#Jevy~2AziM8jex)P|_yBMmYA+geYa^x2*tsqQQEgl@(>C#Wkp^M+Z!c^xF?? zdWIre%lymKw{#g-^$qH!LX?%Z1ssf zFTDRoPx)U|U%DYIj(1Cz&w^jBH~Mn3wYb;(dj5G@fBlpw1}IKT{CdG=JJv%1Hyqo7 zCCWQ7qh@~D!4CrDTiAA*Ce%099^7~Ez4rCd35ub&Q5%()+Jq`0*l1k;uDI@$%9pM> zjm^fouy*yqU6s<<{V&9?t<}iCwd@*>WvlL<0kiJcbgr)h?gpY92A9fzt?QX&k53hq z7n|*TWU@_@H54%P;rhm{?{D3_e*4DFB`M{3GNxi=)s&3=3SSp)*e|;W_ZQ}9UDwUq zKivB9s)`I#7p_|^PySoW)qT-kY*_h^7v(n#E7 {f2&V*7_GvO9u!aYBX3r1^@u& z5VMX4Ap!#n_@a{v4IGos36uk`@}je43Zeo73;3dw3Jrk+`dt!}jtw<`$@ZdX%l4vZ z$@ZdX#a7#H+eQ$5*H>)p79@j^lIvJ#bTfQWkrXjfph3{LV#OVb3$J#Wf*F1P*j3tayc_+=IqQ_PR_G5BMcHQf%)E_zs~=dUwHvhnlKJyaz5+z zCb_v6FzZDbOG2Xo!aGfWvkWx(*du6`XM*03NFrb}#sw<)Qij~XDlZqq+)!=oqb1Eo z#{YlF(HFkX=+2Xywxa! z)8UW}T_%m^D78I$*dIFyw5_Y82sRm&497qSn&r^pGF&KQ)XGxoHsxX8cu}B*?E2`k z!5WuIzmkyNpDzn4-ITuy8pCc!(-U?RXNP!yt4Qi>+`sKQ3t)Cgbrc?A>a=326`^l4 z)s?RQk1N+%{~cAI4^s6!a7tVY@OLOfa}aj0-HEzIkX`u(pRlhB5LrP(>uX48A&kE> z_LbZ{)@z52xkT8PZ*N{(LvL(L$C6XPqZHcH2SF3ivTB$5Q>sbz!q?H~SOdOMRE^|b zd!@m?NZHjW*D<;}GExo6K^uW*1ip^h3>s`vRHxKm zP)i30r(' . (int) $fileCount . ')'; - - // Kindknoten - $html .= self::renderTree($items, $item['id']); - $html .= ''; - } else { - $link = Route::_('index.php?option=com_eis&task=download.download&id=' . $fileId); - - // Tooltip + (neu) inline-Anzeige der Dateigröße, falls der Pfad existiert - $tooltip = ''; - $sizeStr = ''; - if (!empty($item['path']) && is_file($item['path'])) { - $size = @filesize($item['path']); - if ($size !== false) { - $formatted = self::formatFileSize((int) $size); - $tooltip = ' title="Größe: ' . $formatted . '"'; - // Sichtbar neben dem Dateinamen anzeigen - //$sizeStr = ' (' . $formatted . ')'; - } - } - - $html .= '
  • '; - //$html .= '📄 ' . $displayName . '' . $sizeStr; - $html .= '📄 ' . $displayName . ''; - $html .= '
  • '; + public static function renderTree(array $items, ?int $parentId = null): string + { + if (!isset($items[$parentId])) { + return ''; } - } - $html .= ''; - return $html; -} + $html = '
      '; + + foreach ($items[$parentId] as $item) { + $isFolder = (bool) $item['is_folder']; + $rawName = $item['title'] ?: $item['name']; + $fileId = (int) $item['id']; + + // Dateiendung .pdf entfernen und escapen + $displayName = preg_replace('/\.pdf$/i', '', (string) $rawName); + $displayName = htmlspecialchars($displayName, ENT_QUOTES, 'UTF-8'); + + if ($isFolder) { + $fileCount = self::countFilesRecursive($items, $item['id']); + + // Ordner-
    • inkl. Data-Attribute + große Tap-Ziele (toggle + folder-label) + $html .= '
    • '; + $html .= ' '; + $html .= '📁 ' . $displayName . ' (' . (int) $fileCount . ')'; + + // Kindknoten + $html .= self::renderTree($items, $item['id']); + $html .= '
    • '; + } else { + $link = Route::_('index.php?option=com_eis&task=download.download&id=' . $fileId); + + // Tooltip + (optional) inline-Anzeige der Dateigröße + $tooltip = ''; + $sizeStr = ''; + if (!empty($item['path']) && is_file($item['path'])) { + $size = @filesize($item['path']); + if ($size !== false) { + $formatted = self::formatFileSize((int) $size); + $tooltip = ' title="Größe: ' . $formatted . '"'; + // Wenn du die Größe auch sichtbar möchtest, Zeile darunter einkommentieren: + // $sizeStr = ' (' . $formatted . ')'; + } + } + + // Datei-
    • inkl. Data-Attribute + data-filename am Link (für Preview-Anzeige) + $html .= '
    • '; + $html .= '📄 ' + . $displayName . '' . $sizeStr; + $html .= '
    • '; + } + } + + $html .= '
    '; + return $html; + } /** * Zählt alle PDF-Dateien unterhalb eines Ordners rekursiv @@ -108,7 +121,7 @@ class ModEisAnzeigeHelper foreach ($items[$parentId] as $item) { if ((bool) $item['is_folder']) { - $count += self::countFilesRecursive($items, $item['id']); + $count += self::countFilesRecursive($items, (int) $item['id']); } else { $count++; } @@ -118,7 +131,7 @@ class ModEisAnzeigeHelper } /** - * Formatierte Dateigröße für Tooltip + * Formatierte Dateigröße für Tooltip / Anzeige */ private static function formatFileSize(int $bytes): string { diff --git a/mod_pdf_tree/tmpl/default.php b/mod_pdf_tree/tmpl/default.php index 444a9e7..91c4fc5 100644 --- a/mod_pdf_tree/tmpl/default.php +++ b/mod_pdf_tree/tmpl/default.php @@ -1,83 +1,141 @@
    - - + +
    @@ -85,49 +143,98 @@
    -
    + +
    + + +