Hilfe - Suche - Mitglieder - Kalender
Vollansicht: Add Headerelement v01.00.00
Forum Sefrengo.org > Downloads > Archiv > Plugins
duffy
Basierend auf der case Study jQuery hier ein Plugin mit der dort entwickelten Funktionalität. Dieses läuft sowohl auf php4 als auch auf php5.

Plugin-Name:
---------------------------------------------------------------------------
Add Headerelement

Version:
---------------------------------------------------------------------------
01.01.00

Status:
---------------------------------------------------------------------------
stable (getested mit php4 undf php5)


Bechreibung:
---------------------------------------------------------------------------
Das Plugin bietet die Möglichkeit dem <head> Elemente wie javascript Dateien,
css Dateien oder - Definitionen hinzuzufuegen (anzuhaengen).


Features:
---------------------------------------------------------------------------
- bietet Modulen die Moeglichkeit an den vorhandenen <head> Elemente anzuhängen


Autor(en):
---------------------------------------------------------------------------
dduffy


Lizenz:
---------------------------------------------------------------------------
GPL

Benötigte Sefrengo Version:
---------------------------------------------------------------------------
>= 01.04.00 (frühere Versionen nicht getestet)


Installation:
---------------------------------------------------------------------------
Wechseln Sie in Ihrer Sefrengo Version in den Bereich "Administration->
Plugins". Wechseln Sie dort in den Bereich "Plugin importieren"). Am
unteren Ende des Bereichs befindet sich ein Uploadfeld. Wählen Sie hier die
gewünschte "*.cmsplugin"- Datei aus. Mit einem Klick auf das Diskettensymbol
wird das Plugin in das CMS importiert. Das Plugin ist nun innerhalb des CMS
nutzbar.


Update/ Migration:
---------------------------------------------------------------------------
Kein Update vorhanden, da initiale Version


Dokumentation:

---------------------------------------------------------------------------
Innerhalb eines Moduls kann so ein Element zum <head> hinzugefügt werden:

require_once($cfg_cms['cms_path']."plugins/headerelement/class.headerelement.php");
$he =& SF_Headerelement::getInstance();
$he->addHeaderItem("<!-- meine Angaben hier einfuegen-->", 1);

Die Zahl hinter dem eigentlichen Element gibt dabei die Sortierung an.

CODE
Changelog legend:
# -> Bug Fix
+ -> Addition
^ -> Change
- -> Removed
! -> Note

Current versionnumber is 01.01.00 - released 13.03.2008
------------------------------------------------------------------------------------------------
+ Not doubled Entries possible

Current versionnumber is 01.00.02 - released 09.03.2008
------------------------------------------------------------------------------------------------
+ Update Meta
^ Install Meta

Current versionnumber is 01.00.01 - released 07.03.2008
------------------------------------------------------------------------------------------------
# Fixed installation / Deinstallation

Current versionnumber is 01.00.00 - released 06.03.2008
------------------------------------------------------------------------------------------------
! initial version


Klicken um den Anhang anzusehen
smail
Hi,
wollte mir das grad mal ansehen, aber irgendwie scheint das Zip-Archiv nicht in Ordnung zu sein... unsure.gif

Gruß
Jan
duffy
ZITAT(smail @ Fri. 7. March 2008, 01:02) *
Hi,
wollte mir das grad mal ansehen, aber irgendwie scheint das Zip-Archiv nicht in Ordnung zu sein... unsure.gif

Gruß
Jan


Edit: War noch ein Fehler beim Deinstallieren, ist behoben und der Upload ersetzt.
gunwalt
Vielen Dank.
ZITAT(duffy @ Fri. 7. March 2008, 00:11) *
Innerhalb eines Moduls kann so ein Element zum <head> hinzugefügt werden:

$he =& SF_Headerelement::getInstance();
$he->addHeaderItem("<!-- meine Angaben hier einfuegen-->", 1);

Die Zahl hinter dem eigentlichen Element gibt dabei die Sortierung an.

Kannst Du hier mal ein Beispiel geben. Ich habe gerade versucht aus dem Fontsize Modul das Javascript extern auszulagern, kriege das aber nicht hin.
duffy
ZITAT(gunwalt @ Fri. 7. March 2008, 10:20) *
Kannst Du hier mal ein Beispiel geben. Ich habe gerade versucht aus dem Fontsize Modul das Javascript extern auszulagern, kriege das aber nicht hin.


Mir ist grad noch aufgefallen, dass natürlich noch eine Datei includiert werden muss, sorry. Korrekt wäre es so:

CODE
require_once($cfg_cms['cms_path']."plugins/headerelement/class.headerelement.php");
$he =& SF_Headerelement::getInstance();
$he->addHeaderItem("<!-- meine Angaben hier einfuegen-->", 1);

smail
Jetzt funktioniert die Zip-Datei smile.gif

Eine Anmerkung noch zur install_meta
QUELLTEXT
INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'jquery', 'core', NULL,
  'version', NULL, '01.00.00', 0, NULL, NULL, 'txt', NULL, NULL, 0);


Diese Konfiguration war eigentlich für eine Weiterentwicklung des jQuery-Plugins gedacht, bei dem sich weitere Plugins "anmelden" können sollten, wie beispielsweise
QUELLTEXT
INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'jquery', 'plugin', 'thickbox',
  'version', NULL, '01.00.00', 0, NULL, NULL, 'txt', NULL, NULL, 0);

Für Dein Plugin machen die Werte für "Core" also eher wenig Sinn.


Sinnvoller für normale, einzelne Plugins wäre z.B.
QUELLTEXT
INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'headerelement', 'version', NULL,
  NULL, NULL, '01.00.00', 0, NULL, NULL, 'txt', NULL, NULL, 0);


Ansonsten schöner Business-Case für die Verwendung des Codes aus der Case Study. smile.gif
Gruß
Jan



Gruß
Jan
amk
QUELLTEXT
Ansonsten schöner Business-Case für die Verwendung des Codes aus der Case Study. :)


ich hoffe ja das deutsch nicht nur 'ne fallstudie für dich ist, Jan! wink.gif
duffy
ZITAT(smail @ Fri. 7. March 2008, 10:49) *
[...]
Eine Anmerkung noch zur install_meta
[...]


Ah, danke für den Tipp, hier fehlt mir einfach das nötige Wissen. Die meta Daten sind überarbeitet.

Gruß,

Oliver
pawel
Wird eigentlich überprüft, ob z.B. eine JS schon von einem Modul in den Header geschrieben wurde (also wenn mehrere Module die Funktionalität nutzen)?
duffy
ZITAT(pawel @ Mon. 10. March 2008, 21:40) *
Wird eigentlich überprüft, ob z.B. eine JS schon von einem Modul in den Header geschrieben wurde (also wenn mehrere Module die Funktionalität nutzen)?


Nein wird nicht. Wäre vielleicht eine Überlegung wert, allerdings ist das Plugin ja nicht auf js Dateien beschränkt und man kann rein packen, was man will. Die einzige Überprüfung die stattfindet ist, ob der sortIndex schon drin steht.
pawel
Kann man eigentlich abfragen, ob ein bestimmtes plugin installiert ist?
duffy
ZITAT(pawel @ Wed. 12. March 2008, 10:57) *
Kann man eigentlich abfragen, ob ein bestimmtes plugin installiert ist?


Ich habe gerade ein Modul geschrieben, was pro Template ein Stylesheet einbindet, basierend auf diesem Plugin. Dabei überprüfe ich einfach ob die zu includierende Datei existiert, mit file_exists(). Eine andere Variante ist mir nicht bekannt.
Honigbiene
ZITAT(gunwalt @ Fri. 7. March 2008, 10:20) *
Vielen Dank.

Kannst Du hier mal ein Beispiel geben. Ich habe gerade versucht aus dem Fontsize Modul das Javascript extern auszulagern, kriege das aber nicht hin.


Ich hätte auch gerne ein Beispiel

Ich verstehe es auch noch nicht so ganz, wie kann ich z.B. externe Stylesheets darüber einbinden?
Beispiel
normalerweise steht <link rel="stylesheet" href="normal.css" type="text/css" media="screen" /> hardcodiert im Quelltext,
wenn ich aber nun für einen Bereich spezielle Sylesheets benötige z.B für Formulare oder Bildgalerien benötige, wie binde ich die dann die
<link rel="stylesheet" href="formular.css" type="text/css" media="screen" /> ein?
Genauso bei Java-Script, die ja oft auch nur für bestimmte Bereiche benötigt werden...

Gruß
Honigbiene
duffy
ZITAT(Honigbiene @ Wed. 12. March 2008, 18:38) *
Ich hätte auch gerne ein Beispiel


Nun denn:

Ich habe mal meinen bisherigen Stand, ein Stylesheet in ein Template einzubinden in ein Modul gepackt: TemplateCSS
Ist aber erst mal nur ne beta, da ich noch nicht fertig damit bin (es wird noch nicht ausgiebig auf Fehler kontrolliert)

In diesem Modul binde ich auf diesem Wege ein Stylesheet ein:

CODE
if(file_exists($cfg_cms['cms_path']."plugins/headerelement/class.headerelement.php")){
// include all files
require_once($cfg_cms['cms_path']."plugins/headerelement/class.headerelement.php");
// create required objects
$he =& SF_Headerelement::getInstance();
$he->addHeaderItem("<link rel=\"stylesheet\" href=\"<pfad_zum_stylesheet>\" type=\"text/css\" />", <beliebiger_sortindex>);
}
smail
ZITAT(pawel @ Wed. 12. March 2008, 10:57) *
Kann man eigentlich abfragen, ob ein bestimmtes plugin installiert ist?


Grundsätzlich wäre das schon möglich, allerdings hängt das letztlich davon ab, wie sauber sich das Plugin in SF anmeldet. Du könntest z.B. in der DB nach einem entsprechenden Versionseintrag suchen. Wie gesagt, das setzt aber vorraus, dass das Plugin diesen beim Installieren setzt:

Hier mal beispielhaft ein DB-Eintrag für AddHeader Element (s.o.) (wobei ich keine Ahnung habe, ob duffy den so setzt)
QUELLTEXT
INSERT INTO {table_prefix}values VALUES ('', 0, 0, 'headerelement', 'version', NULL,
  NULL, NULL, '01.00.00', 0, NULL, NULL, 'txt', NULL, NULL, 0);


wobei die Struktur der Tabelle cms-Values folgendermaßen aussieht:

QUELLTEXT
idvalues: '' (auto increment)
idclient: 0 (Plugin wird für alle Projekte in SF installiert)
idlang: 0
group_name: pluginname
key1: version
key2: NULL
key3: NULL
key4: NULL
value: '01.00.00'
usw...


Welche Einträge jedoch wo gemacht werden, und welche Werte für die keys als Standard gelten, das ist nicht so recht festgeschrieben und eher eine lose Konvention, wenn überhaupt. Würden alle Plugins diese (oder eine andere) Konvention einhalten, könnte man so auch auf installierte Plugins abfragen.

Gruß
Jan
duffy
ZITAT(smail @ Thu. 13. March 2008, 19:34) *
(wobei ich keine Ahnung habe, ob duffy den so setzt)


Tut er :-)
smail
laugh.gif cool
duffy
ZITAT(pawel @ Mon. 10. March 2008, 21:40) *
Wird eigentlich überprüft, ob z.B. eine JS schon von einem Modul in den Header geschrieben wurde (also wenn mehrere Module die Funktionalität nutzen)?


Jetzt schon: Neue Version 1.1.0

Gruß,

Oliver
pawel
Einen Wunsch habe ich noch ;-)
Der Redakteur sollte auswählern können, ob er die Dateien wirklich einbindet.
Das Modul müßte also die Möglichkeit haben, die angebotenen Dateien per checkbox auszuwählen.(dazu müßte der Wert natürlich irgendwo gespeichert werden).

Sinn der Sache ist es, nicht mehrere Dateien (jquery oder prototype) mehrfach einzubinden, wenn sie bpws. schon im Layout stehen.
smail
ZITAT(pawel @ Sat. 29. March 2008, 12:34) *
Einen Wunsch habe ich noch ;-)
Der Redakteur sollte auswählern können, ob er die Dateien wirklich einbindet.
Das Modul müßte also die Möglichkeit haben, die angebotenen Dateien per checkbox auszuwählen.(dazu müßte der Wert natürlich irgendwo gespeichert werden).

Sinn der Sache ist es, nicht mehrere Dateien (jquery oder prototype) mehrfach einzubinden, wenn sie bpws. schon im Layout stehen.

Nun ja, ich weiß nicht, ob das die Aufgabe des Plugins ist, denn:
Dieses Plugin stellt ja grundsätzlich nur die Möglichkeit zur Verfügung, dynamisch Dateien in den Header einzufügen.
Jetzt gibt es zwei Stellen, an denen - theoretisch - Dateien hinzukommen können:
  1. andere Plugins wie z.B. eine Bildergalerie. Hier würden neben jQuery aber weitere Dateien eingebunden werden müssen (weitere js, css, etc.). Sinnvoll wäre es dann eher in diesem Plugin eine Option einzubauen, ob der Core (und weitere benötigte Dateien) eingebunden werden sollen oder nicht.
  2. dieses Plugin selbst, aber aus meiner Sicht macht das vom Konzept her eher keinen Sinn. Und nur in diesem Fall müsste die von dir gewünschte Funktion realisiert werden.

Grundsätzlich gebe ich Dir aber Recht, dass dies eine interessante Frage ist. Die Lösung dafür ist aber bei weitem nicht so trivial, wie man das vielleicht zunächst denkt. Ich habe mir dazu nämlich schon mal im Rahmen des Beispiels "jQuery-Plugin" dazu Gedanken gemacht, aber keine einfache Lösung gefunden.

Viele Grüße
Jan


duffy
ZITAT(smail @ Sat. 29. March 2008, 18:29) *
Jetzt gibt es zwei Stellen, an denen - theoretisch - Dateien hinzukommen können:


Ich würde hier noch eine dritte Variante hinzufügen, die in meinen Augen den eigentlichen Anwendungsfall des Plugins abdeckt: Ein beliebiges Modul. In meinen Augen ist das Plugin dafür gedacht, Modulen die Möglichkeit zu geben, Dateien einzubinden. Daher sehe ich auch noch nicht ganz den Sinn im Plugin Einstellungen betreffend irgendwelcher Dateien zu ermöglichen. Aber vielleicht hab ich auch den Sinn der Anfrage noch nicht verstanden!?
In meinen Augen macht es selten Sinn Dateien über ein Plugin einzubinden, da sie dann auf jeder Seite verfügbar sind, was ich vielleicht gar nicht will und die bessere Variante wäre dies im Layout oder Template festzulegen, oder?
smail
ZITAT
Ich würde hier noch eine dritte Variante hinzufügen, die in meinen Augen den eigentlichen Anwendungsfall des Plugins abdeckt: Ein beliebiges Modul. In meinen Augen ist das Plugin dafür gedacht, Modulen die Möglichkeit zu geben, Dateien einzubinden.


Da gebe ich Dir völlig recht, nur: Die Dateien, die Du einbinden möchtest, müssen ja irgendwo abgelegt werden. Und diesen Pfad musst Du bei der Einbindung im Modul kennen.
Daher bietet sich die Realisierung als Plugin fast an:
  • Plugins können beliebige Module beinhalten (die bei der Plugin-Installation automatisch mit installiert werden)
  • Resource-Dateien können im Pluginverzeichnis abgelegt werden und haben damit immer eine eindeutige URI, die vom Modul aus referenziert werden kann



ZITAT
In meinen Augen macht es selten Sinn Dateien über ein Plugin einzubinden, da sie dann auf jeder Seite verfügbar sind, was ich vielleicht gar nicht will und die bessere Variante wäre dies im Layout oder Template festzulegen, oder?

Plugins können über die Autostart-Funktionen immer auf den Header zugreifen und beliebigen Code einbinden. Dann aber wird er auf wirklich allen Seiten (oder präziser in allen Templates) eingebunden. Das ist in der Tat sinnlos.

Über die hier vorgestellte Erweiterung kann ein Modul die Einbindung anstoßen, d.h. der Code wird auch nur in den Templates eingebunden, in denen auch das beteffende Modul steckt. Bei allen anderen nicht!

Das Problem ergibt sich aus folgender Situation: Angenommen Du hast zwei verschiedene Module in einem Template, die beide auf jQuery basieren und daher jeweils jQuery einbinden möchten. Dann würde jQuery tatsächlich zweimal eingebunden. Die Frage war, wie man dies verhindern kann.

Ich hoffe, ich konnte etwas Klarheit ins Dunkel bringen.

Viele Grüße
Jan



duffy
ZITAT(smail @ Mon. 31. March 2008, 12:21) *
Das Problem ergibt sich aus folgender Situation: Angenommen Du hast zwei verschiedene Module in einem Template, die beide auf jQuery basieren und daher jeweils jQuery einbinden möchten. Dann würde jQuery tatsächlich zweimal eingebunden. Die Frage war, wie man dies verhindern kann.


Ok, das Problem sehe ich ein. Allerdings ist die Lösung wohl nicht all zu simpel wenn man sie technisch lösen will. Ein String vergleich kann helfen, muss aber nicht, wenn die Dateien über verschiedene Pfade eingebunden werden, zumal das Plugin selbst ja nur Zeichenketten entgegen nimmt und keine css/js/meta Aufrufe (dies ist bisher Aufgabe des Moduls).

Generell würde ich sagen, dass dies das Problem des Redakteurs ist und nicht vom Plugin gelöst werden sollte. Wenn man eine Lösung umsetzen möchte ist es wohl am sinnvollsten das Plugin mit Aufrufen der Marke addJS($dateiname), addCSS($dateiname), addMeta($dateiname) erweitern würde und dann entsprechend nur solche Dateien aufnimmt, die nicht schon eingebunden wurden. Das hilft natürlich dann nicht gegen solche Fälle wo man die selbe Datei in verschiedenen Verzeichnissen einbinden will.
Ich plädiere daher an die Verantwortung des Redaktuers, da man vermutlich in weiteren Überlegungen noch auf ca 235 andere Sonderfälle kommen kann, die das Plugin auch abdecken müßtel :-)
duffy
@admins: Bitte ins Archiv verschieben. Folgeversion vorhanden.
bjoern
Versschoben!

Danke für Deinen Einsatz smile.gif
Dieses ist eine vereinfachte Darstellung unseres Foreninhaltes. Um die detaillierte Vollansicht mit Formatierung und Bildern zu betrachten, bitte hier klicken.
Invision Power Board © 2001-2024 Invision Power Services, Inc.