Skip to content

Commit 40fce6a

Browse files
authored
Merge pull request #188 from FriendsOfREDAXO/media_sort
added media sorter
2 parents be9e329 + bca6033 commit 40fce6a

8 files changed

Lines changed: 274 additions & 10 deletions

File tree

.php-cs-fixer.cache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"php":"8.3.20","version":"3.64.0:v3.64.0#58dd9c931c785a79739310aef5178928305ffa67","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_parentheses":true,"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"attribute_placement":"ignore","on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"lib\/QuickNavigation\/Utility\/BuildNavigationArray.php":"d2a23cc394de4fd4e83bb34da8b3c0bc","lib\/QuickNavigation\/Media\/QuickNavigationMedia.php":"cb133a466b0024e0d2682de04cefdf0c","lib\/QuickNavigation\/LinkMap\/QuickNavigationLinkMap.php":"3060d0975067e724f1dd427eadb02d47","lib\/QuickNavigation\/rex_api_quicknavigation_render.php":"bf8a3f8aa45712984014768a68ba441f","lib\/QuickNavigation\/Minibar\/ArticleHistoryElement.php":"fa606bdfb8e44afdcd46695f36b5d327","lib\/QuickNavigation\/QuickNavigationApi.php":"4eabc25eae94790b9095085102dc278a","lib\/QuickNavigation\/Button\/ButtonInterface.php":"943bf3db82d39b6854401e16fe7e36b6","lib\/QuickNavigation\/Button\/ArticleNavigationButton.php":"0036d750da4417a5cf81bda896b01de7","lib\/QuickNavigation\/Button\/ButtonRegistry.php":"0ecf7951feeb0b3524fa1b8c92ac6288","lib\/QuickNavigation\/Button\/ArticleHistoryButton.php":"b60589453343c834038edfd26f3c7220","lib\/QuickNavigation\/Button\/CategoryButton.php":"fa0637c3410b461739392b4f4aa50c9d","lib\/QuickNavigation\/Button\/FavoriteButton.php":"382a3446b216ca0aaef31fa2f21e82d4","lib\/QuickNavigation\/Button\/WatsonButton.php":"ef0d3641591e83b6e7dfec54008e36a8","lib\/QuickNavigation\/Button\/YformButton.php":"0f33ef81e17add648d4bf64770faf19e","lib\/QuickNavigation\/QuickNavigation.php":"e7879d206a5a091437921d1570285cd9","lib\/QuickNavigation\/ApiFunction\/MenuRender.php":"fa555351a229780f110eba970ed42a59","fragments\/QuickNavigation\/MinibarList.php":"6c40eb3f991f48d730f45b8d222914b1","fragments\/QuickNavigation\/Dropdown.php":"7cc52d767a1b8fa704e4d89c9a3e48a7","fragments\/QuickNavigation\/NoResult.php":"9b879a1abf902a8aa81cb9e6ce5d921a","fragments\/QuickNavigation\/List.php":"e90ddecd29ce153eec1083841a3088e2","pages\/config.php":"dbdfa612c57ba9c8a2818118317d92db","pages\/index.php":"daf2b1a819e7a27391553c599d053802","update.php":"77c556570fd24e393bfa5653a276578f","boot.php":"0c2623ef04ca59e9779af0fcabdc361a"}}
1+
{"php":"8.3.20","version":"3.64.0:v3.64.0#58dd9c931c785a79739310aef5178928305ffa67","indent":" ","lineEnding":"\n","rules":{"binary_operator_spaces":{"default":"at_least_single_space"},"blank_line_after_opening_tag":true,"blank_line_between_import_groups":true,"blank_lines_before_namespace":true,"braces_position":{"allow_single_line_empty_anonymous_classes":true},"class_definition":{"inline_constructor_arguments":false,"space_before_parenthesis":true},"compact_nullable_type_declaration":true,"declare_equal_normalize":true,"lowercase_cast":true,"lowercase_static_reference":true,"new_with_parentheses":true,"no_blank_lines_after_class_opening":true,"no_extra_blank_lines":{"tokens":["use"]},"no_leading_import_slash":true,"no_whitespace_in_blank_line":true,"ordered_class_elements":{"order":["use_trait"]},"ordered_imports":{"imports_order":["class","function","const"],"sort_algorithm":"none"},"return_type_declaration":true,"short_scalar_cast":true,"single_import_per_statement":{"group_to_single_imports":false},"single_space_around_construct":{"constructs_followed_by_a_single_space":["abstract","as","case","catch","class","const_import","do","else","elseif","final","finally","for","foreach","function","function_import","if","insteadof","interface","namespace","new","private","protected","public","static","switch","trait","try","use","use_lambda","while"],"constructs_preceded_by_a_single_space":["as","else","elseif","use_lambda"]},"single_trait_insert_per_statement":true,"ternary_operator_spaces":true,"unary_operator_spaces":{"only_dec_inc":true},"visibility_required":true,"blank_line_after_namespace":true,"constant_case":true,"control_structure_braces":true,"control_structure_continuation_position":true,"elseif":true,"function_declaration":true,"indentation_type":true,"line_ending":true,"lowercase_keywords":true,"method_argument_space":{"attribute_placement":"ignore","on_multiline":"ensure_fully_multiline"},"no_break_comment":true,"no_closing_tag":true,"no_multiple_statements_per_line":true,"no_space_around_double_colon":true,"no_spaces_after_function_name":true,"no_trailing_whitespace":true,"no_trailing_whitespace_in_comment":true,"single_blank_line_at_eof":true,"single_class_element_per_statement":{"elements":["property"]},"single_line_after_imports":true,"spaces_inside_parentheses":true,"statement_indentation":true,"switch_case_semicolon_to_colon":true,"switch_case_space":true,"encoding":true,"full_opening_tag":true},"hashes":{"lib\/QuickNavigation\/Utility\/BuildNavigationArray.php":"d2a23cc394de4fd4e83bb34da8b3c0bc","lib\/QuickNavigation\/Media\/QuickNavigationMedia.php":"53ed78c69f00c24375da79a9725e837c","lib\/QuickNavigation\/LinkMap\/QuickNavigationLinkMap.php":"3060d0975067e724f1dd427eadb02d47","lib\/QuickNavigation\/rex_api_quicknavigation_render.php":"bf8a3f8aa45712984014768a68ba441f","lib\/QuickNavigation\/Minibar\/ArticleHistoryElement.php":"fa606bdfb8e44afdcd46695f36b5d327","lib\/QuickNavigation\/QuickNavigationApi.php":"4eabc25eae94790b9095085102dc278a","lib\/QuickNavigation\/Button\/ButtonInterface.php":"943bf3db82d39b6854401e16fe7e36b6","lib\/QuickNavigation\/Button\/ArticleNavigationButton.php":"0036d750da4417a5cf81bda896b01de7","lib\/QuickNavigation\/Button\/ButtonRegistry.php":"0ecf7951feeb0b3524fa1b8c92ac6288","lib\/QuickNavigation\/Button\/ArticleHistoryButton.php":"b60589453343c834038edfd26f3c7220","lib\/QuickNavigation\/Button\/CategoryButton.php":"fa0637c3410b461739392b4f4aa50c9d","lib\/QuickNavigation\/Button\/FavoriteButton.php":"382a3446b216ca0aaef31fa2f21e82d4","lib\/QuickNavigation\/Button\/WatsonButton.php":"ef0d3641591e83b6e7dfec54008e36a8","lib\/QuickNavigation\/Button\/YformButton.php":"0f33ef81e17add648d4bf64770faf19e","lib\/QuickNavigation\/QuickNavigation.php":"e7879d206a5a091437921d1570285cd9","lib\/QuickNavigation\/ApiFunction\/MenuRender.php":"fa555351a229780f110eba970ed42a59","fragments\/QuickNavigation\/MinibarList.php":"6c40eb3f991f48d730f45b8d222914b1","fragments\/QuickNavigation\/Dropdown.php":"7cc52d767a1b8fa704e4d89c9a3e48a7","fragments\/QuickNavigation\/NoResult.php":"9b879a1abf902a8aa81cb9e6ce5d921a","fragments\/QuickNavigation\/List.php":"e90ddecd29ce153eec1083841a3088e2","pages\/config.php":"9f7cf272364c09f38e33d861d33e9727","pages\/index.php":"daf2b1a819e7a27391553c599d053802","update.php":"77c556570fd24e393bfa5653a276578f","boot.php":"0d9560c256e3636dccd102fc6a2b2ab1","lib\/QuickNavigation\/Button\/MediaSortButton.php":"11b7ff2c4b53cddada3229d898b9ed95","lib\/QuickNavigation\/Media\/MediaSorter.php":"427ad7f2ac3595cae5dca56ef85da78e"}}

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+
}

0 commit comments

Comments
 (0)