Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates

30.05.2017 09:55
avatar  hlm
#1 Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
hl
hlm
Mitglied

In unserem Orchideen-Forum haben wir oft Beiträge mit relativ vielen Fotos von eigenen Pflanzen und es hat mich immer irgendwie genervt, dass beim ProSilver-Template beim Anklicken eines Super!-Buttons die ganze Seite neu geladen wird und dann teilweise der Browser nicht mehr an der vorher gezeigten Stelle landet, sondern irgendwo anders.

Ich hab nun eine erste Version einer Funktion geschrieben, die diesen Seiten-Reload vermeidet und den Super!-Button selbst aktualisiert. Die Einbindung in ein ProSilver-Forum ist relativ leicht in zu machen. Falls es also jemand interessiert, diese Funktionalität auch in seinem Forum zu verwenden, kann er/sie einfach die folgenden Schritte durchgehen. Die Routinen sollten wahrscheinlich auch in den anderen Templates verwendbar sein, müssten dann aber ggf. angepasst werden.

Vorbemerkung:
Ich garantiere nicht die Fehlerfreiheit oder Lauffähigkeit mit eurem Forum bzw. Template und euren Einstellungen. Außerdem kann ich keine Haftung übernehmen, falls ihr bei der Nutzung/Übernahme der beschriebenen Funktion euer Forums-Template beschädigen solltet oder das Forum anschließend nicht mehr funktioniert. Technischen Support kann ich dafür auch nicht übernehmen! Es gilt: Ohne entsprechende Grundkenntnisse in der HTML-/Javascript- und Forumsprogrammierung solltet ihr dieser Umprogrammierung also nicht folgen!

Wichtig:
Zum Aufbohren der Rating-Funktion benötigt man unbedingt ein eigenes Forums-Template. Wie man ein solches aus einem Standard-Template ableitet, wenn ihr noch keines habt, steht hier im Forum an anderer Stelle beschrieben!

Optional:
Die hier beschriebenen Funktionen sorgen auch dafür, dass der Super!-Button anders aussieht, wenn man ihn selbst zum Bewerten eines Beitrags angeklickt hat. Wenn ihr diese Funktion auch nutzen möchtet, müsst ihr dazu vorher noch einen passenden Super!-Button (im aktivierten Zustand, beispielsweise mit Photoshop) erstellen und in die eigenen Bilder im Admin-Bereich hochladen. Den Pfad zu diesem neuen Bild (etwa wie "//files.homepagemodules.de/b000000/a_000_00000000.png") benötigt ihr bei Schritt 3 an den entsprechend markierten Stellen (<<<<<Pfad zum Button-Bild mit gesetztem eigenen Rating>>>>>). Dazu noch den Pfad des ursprünglichen Super!-Buttons, der sich ebenfalls in der Admin-Oberfläche finden lässt, auch an entsprechend markierten Stellen (<<<<<Pfad zum Button-Bild ohne eigenes Rating>>>>>).

Möchtet ihr den Button so belassen wie er jetzt ist (ohne verändertes Aussehen, je nachdem, ob man ihn angeklickt hat oder nicht), dann könnt ihr die entsprechenden Zeilen aus Schritt 3 auch einfach rauslassen oder diese verändern und braucht dann natürlich auch keine Bildpfade.


 Antworten

 Beitrag melden
30.05.2017 09:55
avatar  hlm
#2 RE: Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
hl
hlm
Mitglied

Aber jetzt zu den nötigen Arbeiten, um den Button in euer Forum zu installieren.

Schritt 1: Sprachvariablen erstellen

Ein paar von den Texten, die der Super!-Button verwendet, stehen nicht in den Sprachvariablen. Da wir im Forum sowieso eine eigene Sprache aktiviert haben, habe ich die folgenden vier Variablen dort hinzugefügt. Die Texte sollten den in der Admin-Oberfläche beim Bewertungs-Button eingestellten Texten entsprechen.

1
2
3
4
5
6
 

{[rating_super_and]} => ", "
{[rating_super_last_and]} => " und "
{[rating_super_sing_suffix]} => " findet diesen Beitrag super!"
{[rating_super_plrl_suffix]} => " finden diesen Beitrag super!"
 
 



(Die Werte natürlich ohne die Anführungszeichen eingeben.) Wenn man keine eigene Sprache hat, kann man diese Texte auch beim folgenden Schritt 2 direkt eintragen, statt dort die zugehörigen Sprachvariablen zu benutzen. Das bleibt euch selbst überlassen.


 Antworten

 Beitrag melden
30.05.2017 09:55
avatar  hlm
#3 RE: Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
hl
hlm
Mitglied

Schritt 2: User-Interface-Texte und andere User-Werte unter Template-Entwicklung : Templates im eigenen Template "Thread - Flat" bereitstellen

Im Template "Thread - Flat" müssen die folgenden Zeilen mit Javascript irgendwo oben eingefügt werden. Ich würde empfehlen, das ganz weit oben bei der Funktion chkQuickFormular() unterzubringen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 

<script type="text/javascript">
 
var ratingText = {
'userName': "{{user_name}}",
'userId': {{user_id}},
'userProfile': "{{link_myprofile}}",
'and': "{[rating_super_and]}",
'lastAnd': "{[rating_super_last_and]}",
'singSuffix': "{[rating_super_sing_suffix]}",
'plrlSuffix': "{[rating_super_plrl_suffix]}",
'remove': "{[rating_remove]}",
'alreadyRated': "{[ratings_already_rated]}",
'ownContent': "{[ratings_own_content]}"
};
 
</script>
 
 



Die Befehle sorgen einfach nur dafür, dass der neuen Rating-Funktion alle nötigen Werte wie z.B. UI-Texte in ein Javascript-Array eingefügt werden und damit später von der neuen Rating-Funktion genutzt werden können. Achtung: Wenn man Schritt 1 nicht macht, muss man die dort vorhandenen Texte hier im Array direkt eintragen!


 Antworten

 Beitrag melden
30.05.2017 09:56
avatar  hlm
#4 RE: Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
hl
hlm
Mitglied

Schritt 3: Neue Rating-Funktion unter Layout : Kopf- & Fußzeile : Fußzeile eintragen

Die eigentliche neue Rating-Funktion habe ich zunächst in der ersten Version nicht direkt ins Template verankert, sondern in die Fußzeile im Admin-Bereich geschrieben. Hier lässt sie sich schneller anpassen und korrigieren, was mir für die Anfangszeit noch sehr wichtig ist. Ich möchte das aber irgendwann später noch verändern und die neue Funktion direkt im zugehörigen Template einbauen, damit der Code auch wirklich nur auf Thread-Seiten geladen werden muss und nicht auch überall dort, wo er gar nicht benutzt wird.

Den folgenden Code also einfach in der Admin-Oberfläche unter Layout : Kopf- & Fußzeile im Feld "Fußzeile" direkt einkopieren, wenn es leer ist, bzw. korrekt hinzufügen, wenn dort schon was eingetragen ist. Ich habe mich bemüht, alles verständlich zu kommentieren, damit man die Vorgehensweise der Funktion möglichst gut nachvollziehen kann.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
 

<script type="text/javascript">
 
// Xobor-Funktion xRatingAction() durch eigene Routine überschreiben, die für die
// Reaktion die Seite nicht neu lädt
// Achtung: - Ist nur für die Super!-Funktion geschrieben und funktioniert wahrscheinlich
// nicht ohne Anpassung für andere Bewertungsvarianten
// - Benötigt Array ratingText mit den UI-Texten (im Template "Thread - Flat" setzen)
 
xRatingAction = function( id, action )
{
// Wenn Beitrag oder das zugehörige Rating-Element nicht gefunden werden kann, Rating abbrechen
 
var posting = $('#p' + $('#' + id + '_cid').text());
var ratingElement = posting.find('div.postratings');
if (0 == posting.length || 0 == ratingElement.length)
{
console.log('Error: Rating for #' + id + ' not available. Element not found.');
return false;
}
 
// Werte für Rating-Handler ermitteln
 
var actionData = {
'action': action ? action : 'giveRating',
'r_type': $('#' + id + '_rtype').text(),
'c_type': $('#' + id + '_ctype').text(),
'c_id': $('#' + id + '_cid').text(),
'i_id': $('#' + id + '_iid').text(),
're': 1,
'xor_id': 0 < $('#'+id+'_xor_id').length ? $('#'+id+'_xor_id').text() : 0
};
 
// Rating per Ajax an Handler absenden und Routinen für Rückmeldungen bereitstellen
 
$.post(ratingHandler, actionData, null, 'json')
.done(
function( data, textStatus, jqXHR )
{
// Done => Erfolg, Rating konnte gesetzt oder entfernt werden
 
// Betroffenen Super!-Button finden (wird nur benötigt, wenn das Bild passend zum
// Status "Ich habe/Ich habe nicht geklickt" geändert werden soll)
 
var ratingButton = ratingElement.find('div.ratingbutton').first();
 
// Alle User-Namen, die bislang eine Bewertung abgegeben hatten, klonen
// und dann die Texte hinter dem Rating-Button vollständig löschen
 
var ratings = ratingElement.find('div.xratings > span > span.ratinguser').clone();
ratingElement.find('div.xratings > span').remove();
 
// Aktion: Das eigene Rating wurde entfernt
 
if ('clearRating' == action)
{
// Neue Javascript-Aktion und Bild ohne eigenes Rating einsetzen
// Soll das Bild nicht angepasst werden, reicht die folgende Zeile aus:
//
// ratingButton.attr('onclick', 'xRatingAction("' + id + '", "giveRating")');
 
ratingButton.attr('onclick', 'xRatingAction("' + id + '", "giveRating")').find('img').first().attr('src', '<<<<<Pfad zum Button-Bild ohne eigenes Rating>>>>>');
 
// Aus den User-Namen den eigenen entfernen
 
ratings = ratings.not('.u' + ratingText.userId);
}
 
// Aktion: Das eigene Rating wurde gesetzt
 
else if ('giveRating' == action)
{
// Eigener Content kann nicht bewertet werden
 
if (0 == data.success && 'own content' == data.errormsg)
{
alert(ratingText.ownContent);
return false;
}
 
// Neue Javascript-Aktion und Bild mit gesetztem eigenen Rating einsetzen
// Soll das Bild nicht angepasst werden, reicht die folgende Zeile aus:
//
// ratingButton.attr('onclick', 'xRatingAction("' + id + '", "clearRating")');
 
ratingButton.attr('onclick', 'xRatingAction("' + id + '", "clearRating")').find('img').first().attr('src', '<<<<<Pfad zum Button-Bild mit gesetztem eigenen Rating>>>>>');
 
// Den eigenen User-Namen in die Liste der bisherigen Rating-User einfügen
 
newRating = $('<span class="ratinguser u' + ratingText.userId + '"><a href="' + ratingText.userProfile + '" title="' + ratingText.userName + '">' + ratingText.userName + '</a></span>');
if (0 == ratings.length)
{
ratings = newRating;
}
else
{
ratings.push(newRating);
}
}
 
// Aktualisierten Text "XXX, YYY und ZZZ finden diesen Beitrag super! Eigene Bewertung entfernen." erstellen und hinter dem Button ausgeben
 
if (0 < ratings.length)
{
var newText = '<span class="refreshed">';
ratings.each(
function(index, item) {
newText += $('<div>').append(item).html();
if (1 < ratings.length)
{
if (index < ratings.length-2)
{
newText += ratingText.and;
}
else if (index < ratings.length-1)
{
newText += ratingText.lastAnd;
}
}
}
);
newText += 1 == ratings.length ? ratingText.singSuffix : ratingText.plrlSuffix;
newText += 'clearRating' == action ? '' : '<span class="rating_remove" onclick="xRatingAction(\"' + id + '\", \"clearRating\");"><a href="javascript:void();"> ' + ratingText.remove + '</a></span>';
newText += '</span>';
ratingElement.find('div.xratings').append(newText);
}
}
)
.fail(
function( jqXHR, textStatus, errorThrown )
{
// Fail => Fehler, Rating konnte nicht gesetzt oder entfernt werden
 
console.log('Error: Rating action "' + action + '" for #' + id + 'failed with message "' + errorThrown + '".');
}
);
}
 
// Achtung: Die folgende Funktion nur dann übernehmen, wenn man die Optik des Super!-Buttons je nach Zustand verändern möchte.
 
$(function ()
{
// Nach dem Laden der Seite einen Tweak für die Thread-Liste durchführen:
// Wenn man einen Beitrag bewertet hat, erscheint ein veränderter Super!-Button und der Link des Buttons
// wird so verändert, dass erneutes Klicken darauf die eigenen Bewertung wieder entfernt
 
// Alle Ratings aus der Seite heraussuchen, die einen "Eigene Bewertung entfernen"-Link enthalten,
// die also vom aktuellen User selbst bewertet wurden. Nur diese müssen angepasst werden.
 
ratingBoxes = $('div.postratings').filter(function(index) { return 1 === $('div.xratings > span > span.rating_remove', this).length; });
if (0 < ratingBoxes.length)
{
ratingBoxes.each(
function(index, item)
{
item = $(item);
 
// Link zum Entfernen der Bewertung ermitteln
 
removeLink = item.find('div.xratings > span > span.rating_remove').attr('onclick');
 
// Entfernen-Link und neues Bild in den Rating-Button einfügen
 
if ('undefined' != typeof removeLink)
{
item.find('div.xratings > div.ratingbutton').first().attr('onclick', removeLink).find('img').first().attr({ src: '<<<<<Pfad zum Button-Bild mit gesetztem eigenen Rating>>>>>', title: 'Eigene Bewertung entfernen', alt: 'Sie finden diesen Beitrag super!' });
}
}
);
}
 
}
);
 
</script>
 
 



Es müssen ggf. wie gesagt die Pfade zu euren Super!-Button-Bildern hier noch eingefügt werden.


 Antworten

 Beitrag melden
30.05.2017 09:56
avatar  hlm
#5 RE: Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
hl
hlm
Mitglied

Abschließender Hinweis: Die Routine funktioniert derzeit nur richtig, wenn ihr User-Avatare nicht mit bei den Bewertungen anzeigen lasst (so ist unser Forum eingerichtet).

Viel Spaß mit dem neuen Super!-Button!

Lg von Holger


 Antworten

 Beitrag melden
12.06.2017 10:01
avatar  ( gelöscht )
#6 RE: Tweak: Super!-Button aktualisiert sich ohne Seiten-Reload in Desktop-Templates
Gast
( gelöscht )

Ich hätte mal eine Frage dazu.
Wenn ich den Thread richtig gelesen habe, muss man also zunächst einen "neuen" Bewertungsbutton per Templateeingriff erzeugen ?
Geht das denn nicht unter Verwendung der Bewertungsbutton, die aus der Administration→Extras→Bedanken&Bewerten kommen ?

MfG


 Antworten

 Beitrag melden
Bereits Mitglied?
Jetzt anmelden!
Mitglied werden?
Jetzt registrieren!