Skip to content

Commit 67733ea

Browse files
committed
added media sort
1 parent be9e329 commit 67733ea

6 files changed

Lines changed: 267 additions & 3 deletions

File tree

boot.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717
use FriendsOfRedaxo\QuickNavigation\Button\ArticleNavigationButton;
1818
use FriendsOfRedaxo\QuickNavigation\Button\CategoryButton;
1919
use FriendsOfRedaxo\QuickNavigation\Button\FavoriteButton;
20+
use FriendsOfRedaxo\QuickNavigation\Button\MediaSortButton;
2021
use FriendsOfRedaxo\QuickNavigation\Button\WatsonButton;
2122
use FriendsOfRedaxo\QuickNavigation\Button\YformButton;
2223
use FriendsOfRedaxo\QuickNavigation\Linkmap\QuickNavigationLinkMap;
24+
use FriendsOfRedaxo\QuickNavigation\Media\MediaSorter;
2325
use FriendsOfRedaxo\QuickNavigation\Media\QuickNavigationMedia;
2426
use FriendsOfRedaxo\QuickNavigation\Minibar\ArticleHistoryElement;
2527
use rex;
@@ -29,6 +31,7 @@
2931
use rex_be_controller;
3032
use rex_clang;
3133
use rex_extension;
34+
use rex_extension_point;
3235
use rex_minibar;
3336
use rex_perm;
3437
use rex_url;
@@ -56,7 +59,7 @@
5659
rex_perm::register('quick_navigation[history]');
5760
rex_perm::register('quick_navigation[all_changes]');
5861

59-
rex_extension::register('PAGE_TITLE', static function ($ep) {
62+
rex_extension::register('PAGE_TITLE', static function (\rex_extension_point $ep) {
6063
if (rex_be_controller::getCurrentPageObject()->isPopup()) {
6164
return $ep->getSubject();
6265
}
@@ -78,6 +81,9 @@
7881
});
7982
rex_extension::register('PAGE_TITLE_SHOWN', QuickNavigationLinkMap::LinkMapNavigation(...));
8083
rex_extension::register('MEDIA_LIST_TOOLBAR', QuickNavigationMedia::MediaHistory(...));
84+
85+
// Registriere den Extension Point für die Mediensortierung
86+
rex_extension::register('MEDIA_LIST_QUERY', [QuickNavigationMedia::class, 'ModifyMediaListQuery']);
8187
}
8288
}
8389

lang/de_de.lang

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,8 @@ quick_navigation_favorite_article_add = Artikel hinzufügen in:
2323
quick_navigation_favorite_category_add = Kategorie hinzufügen in:
2424
quick_navigation_yform = YForm
2525
quick_navigation_yform_add = Datensatz hinzufügen in:
26+
27+
# Medienpool-Sortierung (nur die Beschriftungen für den Button beibehalten)
28+
quick_navigation_media_sort_alpha = Nach Dateinamen sortieren (A-Z)
29+
quick_navigation_media_sort_date = Nach Datum sortieren (neueste zuerst)
30+
quick_navigation_media_sort_title = Nach Titel sortieren (A-Z)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace FriendsOfRedaxo\QuickNavigation\Button;
4+
5+
use rex;
6+
use rex_addon;
7+
use rex_i18n;
8+
use rex_request;
9+
10+
class MediaSortButton implements ButtonInterface
11+
{
12+
public function get(): string
13+
{
14+
// Prüfen, ob der Benutzer die Berechtigung hat und ob die Funktion aktiviert ist
15+
$user = rex::getUser()->getId();
16+
$package = rex_addon::get('quick_navigation');
17+
18+
if (!rex::getUser() || $package->getConfig('quick_navigation_mediasort' . $user) !== '1') {
19+
return '';
20+
}
21+
22+
// Aktuellen Sortierstatus aus dem Cookie oder Session auslesen
23+
$sortMode = rex_request::cookie('media_sort_alphabetical', 'string', 'false');
24+
25+
// Icon und Titel basierend auf dem aktuellen Status setzen
26+
$icon = $sortMode === 'true' ? 'fa-sort-alpha-asc' : 'fa-sort-numeric-desc';
27+
$title = $sortMode === 'true' ? rex_i18n::msg('quick_navigation_media_sort_date') : rex_i18n::msg('quick_navigation_media_sort_alpha');
28+
29+
return '<div class="btn-group">
30+
<a class="btn btn-default" id="qn-mediasort-toggle" title="' . $title . '">
31+
<i class="fa ' . $icon . '"></i>
32+
</a>
33+
</div>
34+
<script>
35+
document.addEventListener("DOMContentLoaded", function() {
36+
var sortButton = document.getElementById("qn-mediasort-toggle");
37+
if (sortButton) {
38+
sortButton.addEventListener("click", function() {
39+
// Cookie umschalten
40+
var currentSort = getCookie("media_sort_alphabetical") === "true";
41+
document.cookie = "media_sort_alphabetical=" + (!currentSort) + "; path=/";
42+
43+
// Seite neu laden
44+
window.location.reload();
45+
});
46+
}
47+
48+
function getCookie(name) {
49+
var value = "; " + document.cookie;
50+
var parts = value.split("; " + name + "=");
51+
if (parts.length === 2) return parts.pop().split(";").shift();
52+
return "false";
53+
}
54+
});
55+
</script>';
56+
}
57+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace FriendsOfRedaxo\QuickNavigation\Media;
4+
5+
use rex;
6+
use rex_addon;
7+
use rex_extension_point;
8+
use rex_request;
9+
10+
class MediaSorter
11+
{
12+
/**
13+
* Verändert die Sortierung der Medienliste je nach Einstellung im Cookie
14+
*
15+
* @param rex_extension_point $ep
16+
* @return string
17+
*/
18+
public static function modifyMediaListQuery(rex_extension_point $ep): string
19+
{
20+
// Nur ausführen, wenn der Benutzer die Berechtigung hat und die Funktion aktiviert ist
21+
$user = rex::getUser()->getId();
22+
$package = rex_addon::get('quick_navigation');
23+
24+
if (!rex::getUser() || $package->getConfig('quick_navigation_mediasort' . $user) !== '1') {
25+
return $ep->getSubject();
26+
}
27+
28+
// Aktuellen Sortierstatus aus dem Cookie auslesen
29+
$sortMode = rex_request::cookie('media_sort_alphabetical', 'string', 'false');
30+
31+
// Wenn alphabetische Sortierung gewünscht ist
32+
if ($sortMode === 'true') {
33+
$subject = $ep->getSubject();
34+
35+
// Ab REDAXO 5.13.3 ist das korrekte Feld 'f.filename'
36+
$subject = str_replace("f.updatedate", "f.filename, f.updatedate", $subject);
37+
$subject = str_replace("desc", "asc", $subject);
38+
39+
return $subject;
40+
}
41+
42+
// Ansonsten die Standardsortierung beibehalten
43+
return $ep->getSubject();
44+
}
45+
}

lib/QuickNavigation/Media/QuickNavigationMedia.php

Lines changed: 150 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
use rex_sql;
1313
use rex_string;
1414
use rex_url;
15+
use rex_addon;
16+
use rex_request;
17+
use rex_response;
1518

1619
class 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
}

pages/config.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
['quick_navigation_favs' . $user, 'array[int]'],
2424
['quick_navigation_ignoreoffline' . $user, 'int'],
2525
['quick_navigation_artdirections' . $user, 'int'],
26+
// Medienpool-Sortier-Button-Option entfernt
2627
]));
2728
echo rex_view::success($package->i18n('quick_navigation_config_saved'));
2829
}
@@ -72,6 +73,8 @@
7273
$fragment->setVar('elements', $formElements, false);
7374
$content .= $fragment->parse('core/form/checkbox.php');
7475

76+
// Medienpool-Sortier-Button-Option entfernt
77+
7578
// Save-Button
7679
$formElements = [];
7780
$n = [];

0 commit comments

Comments
 (0)