1212use rex_sql ;
1313use rex_string ;
1414use rex_url ;
15+ use rex_addon ;
16+ use rex_request ;
17+ use rex_response ;
1518
1619class QuickNavigationMedia
1720{
@@ -24,8 +27,57 @@ public static function MediaHistory(rex_extension_point $ep): ?string
2427 $ subject = $ ep ->getSubject ();
2528 $ drophistory = self ::GenerateMediaHistoryList ();
2629 $ custom_media_buttons = rex_extension::registerPoint (new rex_extension_point ('QUICK_NAVI_CUSTOM_MEDIA ' , '' ));
27- $ button = $ custom_media_buttons . '<div class="input-group-btn quickmedia clearfix"> ' . $ drophistory . '</div><select name="rex_file_category" ' ;
28- return str_replace ('<select name="rex_file_category" ' , $ button , $ subject );
30+
31+ // Sortier-Button erzeugen mit drei Zuständen: date -> filename -> title -> date
32+ $ sortMode = rex_request::cookie ('media_sort_mode ' , 'string ' , 'date ' );
33+
34+ // Icon und Titel basierend auf dem aktuellen Status setzen
35+ switch ($ sortMode ) {
36+ case 'filename ' :
37+ $ icon = 'fa-sort-alpha-asc ' ;
38+ $ title = rex_i18n::msg ('quick_navigation_media_sort_title ' );
39+ $ nextMode = 'title ' ;
40+ break ;
41+ case 'title ' :
42+ $ icon = 'fa-font ' ;
43+ $ title = rex_i18n::msg ('quick_navigation_media_sort_date ' );
44+ $ nextMode = 'date ' ;
45+ break ;
46+ case 'date ' :
47+ default :
48+ $ icon = 'fa-sort-numeric-desc ' ;
49+ $ title = rex_i18n::msg ('quick_navigation_media_sort_alpha ' );
50+ $ nextMode = 'filename ' ;
51+ break ;
52+ }
53+
54+ $ sortButton = '<div class="btn-group">
55+ <a class="btn btn-default" id="qn-mediasort-toggle" title=" ' . $ title . '">
56+ <i class="fa ' . $ icon . '"></i>
57+ </a>
58+ </div>
59+ <script>
60+ document.addEventListener("DOMContentLoaded", function() {
61+ var sortButton = document.getElementById("qn-mediasort-toggle");
62+ if (sortButton) {
63+ sortButton.addEventListener("click", function() {
64+ // Nächsten Sortiermodus setzen
65+ document.cookie = "media_sort_mode= ' . $ nextMode . '; path=/";
66+
67+ // Seite neu laden
68+ window.location.reload();
69+ });
70+ }
71+ });
72+ </script> ' ;
73+
74+ // History-Button und Sort-Button zusammen hinzufügen
75+ $ buttons = $ custom_media_buttons . $ sortButton . '<div class="input-group-btn quickmedia clearfix"> ' . $ drophistory . '</div> ' ;
76+
77+ // Buttons vor der Kategorieauswahl einfügen
78+ $ result = str_replace ('<select name="rex_file_category" ' , $ buttons . '<select name="rex_file_category" ' , $ subject );
79+
80+ return $ result ;
2981 }
3082
3183 return null ;
@@ -117,4 +169,100 @@ protected static function GenerateFileNavigation(int $file_id, string $opener):
117169
118170 return $ quick_file_nav ;
119171 }
172+
173+ /**
174+ * Generiert den Sortier-Button für den Medienpool
175+ * Diese Methode wird nicht mehr verwendet, da der Button direkt in MediaHistory generiert wird
176+ */
177+ public static function GenerateMediaSortButton (): string
178+ {
179+ // Konfigurationsprüfung entfernt, da Button immer angezeigt werden soll
180+
181+ // Aktuellen Sortierstatus aus dem Cookie oder Session auslesen
182+ $ sortMode = rex_request::cookie ('media_sort_alphabetical ' , 'string ' , 'false ' );
183+
184+ // Icon und Titel basierend auf dem aktuellen Status setzen
185+ $ icon = $ sortMode === 'true ' ? 'fa-sort-alpha-asc ' : 'fa-sort-numeric-desc ' ;
186+ $ title = $ sortMode === 'true ' ? rex_i18n::msg ('quick_navigation_media_sort_date ' ) : rex_i18n::msg ('quick_navigation_media_sort_alpha ' );
187+
188+ return '<div class="btn-group">
189+ <a class="btn btn-default" id="qn-mediasort-toggle" title=" ' . $ title . '">
190+ <i class="fa ' . $ icon . '"></i>
191+ </a>
192+ </div>
193+ <script>
194+ document.addEventListener("DOMContentLoaded", function() {
195+ var sortButton = document.getElementById("qn-mediasort-toggle");
196+ if (sortButton) {
197+ sortButton.addEventListener("click", function() {
198+ // Cookie umschalten
199+ var currentSort = getCookie("media_sort_alphabetical") === "true";
200+ document.cookie = "media_sort_alphabetical=" + (!currentSort) + "; path=/";
201+
202+ // Seite neu laden
203+ window.location.reload();
204+ });
205+ }
206+
207+ function getCookie(name) {
208+ var value = "; " + document.cookie;
209+ var parts = value.split("; " + name + "=");
210+ if (parts.length === 2) return parts.pop().split(";").shift();
211+ return "false";
212+ }
213+ });
214+ </script> ' ;
215+ }
216+
217+ /**
218+ * Verändert die Sortierung der Medienliste je nach Einstellung im Cookie
219+ *
220+ * @param rex_extension_point<string> $ep
221+ */
222+ public static function ModifyMediaListQuery (rex_extension_point $ ep ): string
223+ {
224+ // Aktuellen Sortierstatus aus dem Cookie auslesen
225+ $ sortMode = rex_request::cookie ('media_sort_mode ' , 'string ' , 'date ' );
226+
227+ $ subject = $ ep ->getSubject ();
228+
229+ // Debug-Information ausgeben
230+ error_log ('Original SQL: ' . $ subject );
231+
232+ // Je nach Sortiermodus die SQL-Abfrage anpassen
233+ if (strpos ($ subject , 'ORDER BY ' ) !== false ) {
234+ switch ($ sortMode ) {
235+ case 'filename ' :
236+ // Nach Dateinamen sortieren (A-Z)
237+ $ subject = preg_replace ('/ORDER BY\s+[^,\s]+(\s+(?:ASC|DESC))?/i ' , 'ORDER BY m.filename ASC ' , $ subject );
238+ break ;
239+ case 'title ' :
240+ // Nach Titel sortieren (A-Z)
241+ $ subject = preg_replace ('/ORDER BY\s+[^,\s]+(\s+(?:ASC|DESC))?/i ' , 'ORDER BY m.title ASC ' , $ subject );
242+ break ;
243+ case 'date ' :
244+ default :
245+ // Standardsortierung beibehalten (nach Datum, neueste zuerst)
246+ // Hier müssen wir nichts ändern, da dies bereits die Standardsortierung ist
247+ break ;
248+ }
249+ } else {
250+ // Falls kein ORDER BY vorhanden ist, fügen wir es hinzu
251+ switch ($ sortMode ) {
252+ case 'filename ' :
253+ $ subject .= ' ORDER BY m.filename ASC ' ;
254+ break ;
255+ case 'title ' :
256+ $ subject .= ' ORDER BY m.title ASC ' ;
257+ break ;
258+ case 'date ' :
259+ default :
260+ $ subject .= ' ORDER BY m.updatedate DESC ' ;
261+ break ;
262+ }
263+ }
264+
265+ error_log ('Modified SQL: ' . $ subject );
266+ return $ subject ;
267+ }
120268}
0 commit comments