Fragen zur Kapselung

16.06.2017 09:38
avatar  Mike48
#1
avatar
User

Fragen zur Dokumentation der Xobor Plugin API, Kapitel Tipps & Tricks - 1. 1 Kapselung

Ich habe in Plugins die Kapselung wie in der API-Docu verwendet. Da wird vorgeschlagen, eine Variable mit dem Namen des Plugin zu erstellen um Verwechsungen mit variablen aus anderen Scripten zu vermeiden.

Frage 1: Wie legt man eine Kapselung über mehrere Plugin-Elemente an?

Ich habe an den Variablennamen in jedem Element um eine zusätzliche Bezeichnung erweitert. Wenn man diese Variablen in anderen Elementen anspricht, muss man den kompletten Variablennamen verwenden und nicht nur zB. self.varname
Beim anlegen einer Pluginkopie werden die Variablennamen der Kapselung natürlich nicht auf die neue Plugin_ID automatisch angepasst.

Frage 2: Wie kann man das bewerkstelligen, dass die Variable automatisch die Plugin_ID bekommt?

Es ist aufwendig in allen Pluginelementen diese Variablennamen nachträglich anzupassen. Eine Besondere Herausforderung an die Admins die ein privates Plugin bekommen und wegen Mangels an Pluginspeicherplätzen eine Kopie anlegen müssen.


 Antworten

 Beitrag melden
25.06.2017 10:52
avatar  Mike48
#2
avatar
User

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
 
// da die ID unserer Plugins "testplugin" ist, nennen wir die Variable dementpsrechend
var plugin_testplugin = new function() {
// eine Referenz auf sich selbst!
var self = this;
// so definiert man eine Variable!
self.version = '1.000 rc0';
// Auch Objects usw. sind kein Problem!
self.config = {
color: 'orange',
fontSize: 16,
fontWeight: 'bold'
};
// Es ist gut wenn man ein wenig Struktur in seinen Code bringt!
// Also sortieren wir allgemeine Funktionen die wir benötigen hier ein
self.helperFunctions = {
sayHello: function(name) {
if (typeof name === 'undefined' || !name) {
name = 'Gast';
}
var text = 'Hello '+name;
alert(text);
self.helperFunctions.printToDoc(text);
},
printToDoc: function(string) {
if ($('#testplugin').length) {
$('#testplugin').html(string);
} else {
$('body').prepend('<div id="testplugin" style="color:'+self.config.color+'; font-size:'+self.config.fontSize+'px; font-weight:'+self.config.fontWeight+';">'+string+'</div>');
}
}
};

// eine initialfunction
// in dieser initialfunction kommt der ausführende Code
// mit dem Document ready state stellen wir sicher, dass die Seite komplett
// geladen ist
self.run = function() {
$('document').ready(function(){
self.helperFunctions.sayHello(prompt('Wie lautet dein Name?'));
});
};

}

// jetzt müssen wir unser Programm nur noch ausführen!
plugin_testplugin.run();
 



1
2
3
4
5
6
7
8
9
10
11
12
 
var plugin_testplugin = new function() {
// eine Referenz auf sich selbst!
var self = this;
// so definiert man eine Variable!
self.version = '1.000 rc0';
// Auch Objects usw. sind kein Problem!
self.config = {
color: 'orange',
fontSize: 16,
fontWeight: 'bold'
};
 
 

Kann man das in allen Elementen eines Plugin gleich machen, die Plugin_ID für die "Var plugin_id=function" zu nehmen, wenn man darauf achtet dass es keine doppelten Variablennamen im gesamten Plugin gibt? Ist es dann auch möglich mit sel.variable im ganzen Plugin auf alle variablen zuzugreifen egal in welchem Element sie deklariert wurde.

Es wäre schön wenn man hier im Forum Pluginsystem auch mal eine Antwort bekommt sonst lohnt sich die Schreiberei hier nicht


 Antworten

 Beitrag melden
26.06.2017 12:25
avatar  Ingmar
#3
avatar
Technik

Zitat
Es wäre schön wenn man hier im Forum Pluginsystem auch mal eine Antwort bekommt sonst lohnt sich die Schreiberei hier nicht



Sorry, hast ja recht
Das Problem bei solchen Fragen ist, dass wir ja auch nicht gerade täglich neue Plugins schreiben und daher selbst erstmal testen müssen, bevor wir dir hier antworten können. Wenn dazu gerade keine Zeit ist bleibt die Frage unbeantwortet. Ich werde versuchen das in Zukunft mit einem "kann ich mir gerade nicht anschauen, du bekommst deine Antwort später" zu kommentieren!

Zu deinen Fragen:

Zitat
Frage 1: Wie legt man eine Kapselung über mehrere Plugin-Elemente an?


Das ist ja quasi auch die Frage im zweiten Beitrag...

Es werden immer nur die Plugin-Elemente geladen, die auf der aktuellen Seite benötigt werden. Legst du also eine Variable im Plugin Element an, welches nur im Kalender geladen wird, steht die Variable nur dort zur Verfügung.

Es gibt daher zwei Lösungsansätze:
1) Entweder du legst eine eigene .js-Datei mit Variablen-Definitionen und ggf. globalen Funktionen für dein Plugin an, die du dann in den benötigten Elementen einfach per Script-Tag einbindest.

2) Oder du definierst deine Variablen in einem Element, welches auf jeder Seite sowiso geladen wird, wie z.B. "obere Leiste". Dann stehen die dort definiereten Variablen in allen nachfolgenden Elementen zur Verfügung.

Zitat
Frage 2: Wie kann man das bewerkstelligen, dass die Variable automatisch die Plugin_ID bekommt?


Eine automatische Vergabe, die dann insbesondere auch beim Anlegen einer Plugin-Kopie noch klappt gibt es glaube ich nicht.

Was du machen kannst, ist z.B. eine Konfig-Variable z.B. "namespace" anzulegen. Dann kannst du z.B. mit

1
2
3
 
var plugin_{{plugin_testplugin_config_namespace}} = new function() { 
...
}
 



deine Kapselung starten und musst dann im Falle eine Plugin-Kopie nur den namespace ändern um einen Namenskonflikt zu vermeiden.

Ich hoffe das hilft,


 Antworten

 Beitrag melden
26.06.2017 18:02
avatar  Mike48
#4
avatar
User

Zitat von Ingmar im Beitrag #3
Es werden immer nur die Plugin-Elemente geladen, die auf der aktuellen Seite benötigt werden. Legst du also eine Variable im Plugin Element an, welches nur im Kalender geladen wird, steht die Variable nur dort zur Verfügung.


Ich habe öffters mehrere Elemente die gleichzeitig geladen werden.
Zum Beispiel Obere und/oder Untere Leiste und noch ein besonderes Element wie Galerie, Kalender usw.
So wird zum Kalender auch die Obere und/oder Untere Leiste geladen.

Bei der Kapselung sind ja nicht nur die Variablen sonder auch die Funktionen in der Variablen mit der Plugin_ID enthalten. Kann man diese "Kapsel_variable" die man zB. in der Oberen leiste deklariert in Elementen die nach der Deklaration der Variablen geladen werden irgenwie erweitern, um dann in dem Element auch mit sel.xyz darauf zuzugreifen?


 Antworten

 Beitrag melden
27.06.2017 10:36
avatar  Ingmar
#5
avatar
Technik

Zitat von Mike48 im Beitrag #4
Kann man diese "Kapsel_variable" die man zB. in der Oberen leiste deklariert in Elementen die nach der Deklaration der Variablen geladen werden irgenwie erweitern, um dann in dem Element auch mit sel.xyz darauf zuzugreifen


Probier es mal so,das müsste eigentlich gehen:

1
 
plugin_testplugin.xyz = new function() {}
 


 Antworten

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