richtlinien für plugins ?

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Mi 31. Dez 2003, 12:23

keine Ahnung, ich hab's nicht verbrochen.

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Mi 31. Dez 2003, 12:56

Neue Info:

Wenn du Plugins entwickelst, solltest du ID's über 10000 verwenden (bei areas, actions, files, frame_files, nav_sub und nav_main).

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 31. Dez 2003, 13:28

timo hat geschrieben:Neue Info:

Wenn du Plugins entwickelst, solltest du ID's über 10000 verwenden (bei areas, actions, files, frame_files, nav_sub und nav_main).
ähm wieso ? nimmt die update routine dann rücksicht darauf ? bei einem drop table ?
möcht ich eigentlich nicht machen... ich schreib mir zwar einen installer der bei einem update automatisch erkennt ob die einträge für das plugin noch vorhanden sind und wenn nicht, diese mit neu vergebener nextid neu einträgt...
ist die sauberste lösung... (jetzt in bezug auf con_sequence)
bei einem update wird die tabelle con_plugins ja nicht überschrieben und somit ist das meine stütze ob das plugin installiert sein sollte oder nicht...
für einen deinstall hab ich mir eigentlich gedacht das die inserts die erzeugt werden automatisch ein gegenstück zum entfernen mitgenerieren und diese entweder in eine tabelle oder textdatei schreiben... (und bei einem deinstall einfach aufzurufen und die dateien am server komplett zu entfernen....

bis jetzt muss ich sagen bin ich hoch zufrieden mit der plugin schnittstelle ;-)
geiles teil... (wenn man weiss wie's funktioniert)

mein hauptinteresse liegt ja auch darin das es in weiterer folge weitere plugins gibt die dann zur verfügung stehen...
ich hab eigentlich nur vor ein hello world example zu liefern...

wie lange ich für den de/installer brauch weiss ich noch nicht... vielleicht ist er ja dann ebenso mit fertig...

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mi 31. Dez 2003, 13:43

noch ein kleiner nachtrag bevor die silvester feierlichkeiten los gehen...

das $cfgPath['xmlroot'] müsste nur ergänzt werden wenn das xml file so aussieht wie ich es zusammengestellt habe...
in $cfgPath['xmlroot'] ist nämlich nur der erste pfad definiert language/
wenn man diese $cfgPath ergänzung wegläßt muss der eintrag
bei selben xml file wie folgt lauten:
XXX/xml/language.xml;language/navigation/extra/helloworld

anstelle von language könnte man auch plugin oder was weiss ich verwenden (ist beim debuggen wahrscheinlich klarer ersichtlich...) der eintrag im xml file language muss dann auch dem entsprechend angepasst werden... (aber da bin ich mir noch nicht sicher ob es wirklich funktioniert)

ach ja in den bestehenden xml files ist vermulich ein fehler am ende der dateien vorhanden ...
dort steht

Code: Alles auswählen

    <content/>
    <errors/>
</language>
das content und errors hat meiner meinung dort nichts verloren (tag wird geschlossen ohne geöffnet zu werden ?)

ach ja den plugin installer werd ich dann vermutlich auch als plugin konzipieren...

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Mi 31. Dez 2003, 14:20

emergence hat geschrieben: ähm wieso ? nimmt die update routine dann rücksicht darauf ? bei einem drop table ?
Ja. Drop table gibts ja nicht im Installer, und das DELETE-Statement wurde angepasst.
wie lange ich für den de/installer brauch weiss ich noch nicht... vielleicht ist er ja dann ebenso mit fertig...
Da machst du dir doppelte Arbeit, von unserer Seite gibts auf jeden Fall so ein Teil...nur wann, ist die Frage.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 2. Jan 2004, 10:59

nun ja eine version eines plugins hab ich soweit fertig...
es handelt sich um den event kalender jax der hier irgendwo schon als direkte implementierung online gestellt wurde...

hier der link dazu
http://dayside.net/calendar.zip
mit verzeichnisstruktur in contenido/plugins/ extrahieren...
im ordner contenido/plugins/calendar/ findet sich dann die datei
install.sql - in dieser werden die tabellen con_calendar und con_events angelegt und die restlichen einträge für die contenido menüführung vorgenommen...

damit wäre die installation des plugins abgeschlossen...

die tabellen könnte man im frontend mittels $cfg[tab][calendar] und $cfg[tab][events] ansteuern...

ebenfalls enthalten ein kleines .po file um i18n translations vorzunehmen...
die syntax für die i18n wäre jedoch i18n("New event","calendar")

ich bin mir jetzt nicht ganz sicher aber an sich müsste das plugin schon ab version 4.4.2 laufen , mit dem aktuellen cvs snpashot gehts ziemlich sicher...

css einbindung files wurden abgesplittet und befinden sich ebenfalls im plugin ordner css/

dieses file ist wohlgemerkt nur als demonstration bzw lernbeispiel gedacht...

ich hab mir die arbeit nicht mehr angetan alle weiteren files zu includen und entsprechend anzupassen...
verfügbare globale variablen findet man in plugins/calendar/includes/config.plugin.php
Zuletzt geändert von emergence am Fr 2. Jan 2004, 14:18, insgesamt 1-mal geändert.

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 2. Jan 2004, 11:56

hab mir das jetzt mit den berechtigungsvergabe bei plugins angesehen...
so wie das definiert ist kann es leider nicht funktionieren...

beginnend mit grouprights_area.inc.php

findet sich die zeile
$main=$plugxml->valueOf("language/main");

das problem dabei ist $plugxml sollte auch definiert werden...
zB mittels (vor der schleife foreach)

$plugxml = new XML_Doc;

wie auch immer die eigentliche funktion die den definitierten bereich gar nicht auslesen könnte sieht so aus:

Code: Alles auswählen

                        if(strstr($value2['location'],$con_cfg['PathPlugins'])) {

                            $plugxml->load($value2['location'].'lang_de.xml');
                            $main=$plugxml->valueOf("language/main");
                        }else{
                            $main = $xml->valueOf($cfgPath['xmlroot'] . $value2["location"]);
                        }
meine version die funktioniert sieht so aus...

Code: Alles auswählen

                        if(strstr($value2['location'], ';')) {

                            $locs = explode(";", $value2['location']);

                            $file    			= trim($locs[0]);
                            $value2['location'] = trim($locs[1]);
                            $plugxml->load($cfg["path"]["plugins"].$file);

                            $main=$plugxml->valueOf("language/main");
                        }else{
                            $main = $xml->valueOf($cfgPath['xmlroot'] . $value2["location"]);
                        }
der vorteil für mich ist ich kann im plugin xml file die überkategorie definieren zb mit

Code: Alles auswählen

...
<language>
    <navigation>
        <main>Kalender</main>
        <extra>...
dabei wird dann als überkategorie Kalendar angezeigt...

ob das jetzt wirklich so gewünscht ist wie ich es modifiziert habe ist jetzt ne andere sache ;-)

das selbe gilt vermutlich auch für die rights_area.inc.php

nachtrag:
in rights_area.inc.php sieht die zeile etwas anders aus, stimmt meiner meinung nach aber auch nicht hundertprozentig... mit obriger version ist die kategorie ebenfalls via xml file korrekt anzeigbar...

llconsult
Beiträge: 12
Registriert: Mo 19. Apr 2004, 14:17
Wohnort: Köln
Kontaktdaten:

Beispiel funktioniert nicht

Beitrag von llconsult » Do 29. Apr 2004, 13:42

Hallo,

ich habe das Besipiel nachvollzogen und nur zum Laufen gebracht durch den Eintrag
$cfg['plugins']['calendar']="plugins/calendar/"; in der config.php.

Nun habe ich versucht ein eigenes Plugin zu implementieren und mich dabei an dem Bsp. orientiert.

1. Verzeichnisse unter Plugins anlgelegt.
2. config.plugin.php plugins includes anlegen
3. xml file für Menü angelegt
4. Daten in con_files, con_area und con_files_frames angelegt.

Ziel: Die aufgerufene Php.Datei soll erstmal nur einen string im Frame 4 mit echo ausgeben!l

Ergebnis: Menü wird korrekt angezeigt. Beim Klick auf das Menü bleibt die Ausgabe aus. das error-log ist leer.

Was habe ich vergessen?
Müssen templates angelegt werden und wenn ja wie sind diese aufgebaut und wie werden diese eingebunden ??
Thomas Lucas
LL Consult

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 29. Apr 2004, 14:33

ad. ersten punkt... hab ich leider vergessen hineinzuschreiben...
in der 4.4.x serie ist dies notwendig was du gemacht hast...
im CVS_HEAD nicht...

damit dies ident mit dem CVS_HEAD funktioniert muss am
am ende der datei includes/cfg_language_de.inc.php folgendes eingefügt werden...

Code: Alles auswählen

/* Include the plugin configuration */
$handle = opendir($cfg['path']['contenido'] . $cfg["path"]['plugins'] );

while ($plugin = readdir($handle))
{
	$configfile = $cfg['path']['contenido'] . $cfg["path"]['plugins'] . $plugin . "/includes/config.plugin.php";
	$localedir = $cfg['path']['contenido'] . $cfg["path"]['plugins'] . $plugin . "/locale/";

	if (@file_exists($localedir) && $plugin != "..")
	{
		i18nRegisterDomain($plugin, $localedir);
	}
	if (@file_exists($configfile))
	{
		include($configfile);
	}
}
zu deinem zweiten punkt:
ich tippe darauf das eine zuordnung in con_frame_files nicht korrekt ist...
genaueres könnte ich dir sagen wenn du mir das ganze zippst und den link dazu gibst...

ich muss in nächster zeit wieder mal das bespiel am server aktualisieren...
*** make your own tools (wishlist :: thx)

llconsult
Beiträge: 12
Registriert: Mo 19. Apr 2004, 14:17
Wohnort: Köln
Kontaktdaten:

Beitrag von llconsult » Do 29. Apr 2004, 14:53

Erstmal vielen Dank für die schnelle Antwort,

ich habe alle Dateien hier abgelegt:
http://www.ll-consult.de/download/Zitat_plugin.zip

Worum handelt es sich bei der CVS_HEAD ?
Thomas Lucas
LL Consult

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 30. Apr 2004, 06:32

llconsult hat geschrieben:ich habe alle Dateien hier abgelegt:
http://www.ll-consult.de/download/Zitat_plugin.zip
mit etwas glück schaffe ich es heute noch mir das anzusehen...
llconsult hat geschrieben:Worum handelt es sich bei der CVS_HEAD ?
der aktuelle stand der contenido 4.5.x serie.
zu finden unter http://www.contenido.de/snapshots/
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 30. Apr 2004, 07:49

okay ich hab das hello_world example am server hinterlegt
http://dayside.net/hello_world.zip

also - 4.4.x
damit die plugin einbindung automatisch funktioniert muss
am ende der datei includes/cfg_language_de.inc.php folgendes eingefügt werden...

Code: Alles auswählen

/* Include the plugin configuration */
$handle = opendir($cfg['path']['contenido'] . $cfg["path"]['plugins'] );

while ($plugin = readdir($handle))
{
	$configfile = $cfg['path']['contenido'] . $cfg["path"]['plugins'] . $plugin . "/includes/config.plugin.php";
	$localedir = $cfg['path']['contenido'] . $cfg["path"]['plugins'] . $plugin . "/locale/";

	if (@file_exists($localedir) && $plugin != "..")
	{
		i18nRegisterDomain($plugin, $localedir);
	}
	if (@file_exists($configfile))
	{
		include($configfile);
	}
}
damit stehen alle werte die in der plugin.config.php definiert wurden, in contenido backend zur verfügung !! wenn man das im frontend ebenfalls mit einbinden möchte sollte man im modul selbst am beginn folgendes ergänzen (zumindestens machs ich so):

Code: Alles auswählen

/* Include the plugin configuration */
$handle = opendir($cfg['path']['contenido'] . $cfg["path"]['plugins'] );

while ($plugin = readdir($handle))
{
    $configfile = $cfg['path']['contenido'] . $cfg["path"]['plugins'] . $plugin . "/includes/config.plugin.php";

    if (@file_exists($configfile))
    {
        include($configfile);
    }
}

das zipfile wird im ordner plugins/ extrahiert (mit verzeichnis struktur -> eh klar)
im ordner plugins/hello_world/ findet sich die install.sql
in dieser muss man eigentlich nur mehr "!PREFIX!" durch den tabellen prefix ersetzen. in den meisten fällen wird das "con" sein (ansonsten das was ihr bei der db installation definiert habt)
die restlichen einträge werden entsprechend vorgenommen...

wenn ihr das gemacht habt führt ihr in phpmyadmin einfach die install.sql aus.

contenido neu starten und ihr findet unter extra den menüpunkt
Hallo Welt

ich habs gerade ausprobiert und ging auf anhieb.

anmerkungen:
in den include files habe ich auf die template klasse zugegriffen um den jeweiligen text in den templates einzufügen.
es werden alle 4 frames initialisiert ! (wäre möglich wenn man nicht alle definiert das nichts angezeigt wird -> hab ich aber nicht ausprobiert)
das frame 3 verwendet ein template aus dem ordner contenido/templates/standard/ -> siehe install.sql

in include_hello_world_menu.php
habe ich am anfang auskommentiert wie einzelne frames angesprochen werden können -> siehe beispiele mit $page

darunter ist ein teil der für module die das plugin benötigen verwendet werden kann... es wird überprüft ob die variable $cfg['plugins']['hello_world'] gesetzt ist. wenn ja wüsste das modul das das plugin installiert ist.

im ordner xml befinden sich die zwei xml dateien (einmal englisch, einmal deutsch) -> im install.sql wird jedoch nur auf die deutsche version verwiesen. wenn man eine mehrsprachigkeit in diesem fall wünscht müssen anpassungen in code von contenido vorgenommen werden. -> siehe posting : Verfasst am: Di Dez 30, 2003 9:16 pm

im ordner locale findet sich die hello_world.po (nur für die sprache deutsch) das einzige mal wo ich den i18n eintrag verwende findet sich in der config.plugins.php bei $lngAct

*****

leider fehlt ein plugin installer der die area einträge entsprechend vornimmt... die area id für das hello world plugin -> 10000 (so wie timo dies angegeben hat)

ich hoffe dieses beispiel ist etwas einfacher wie das calender plugin...
*** make your own tools (wishlist :: thx)

llconsult
Beiträge: 12
Registriert: Mo 19. Apr 2004, 14:17
Wohnort: Köln
Kontaktdaten:

Fehler nach Ergänzung der cfg_language_de.inc.php

Beitrag von llconsult » Fr 30. Apr 2004, 10:59

Nach Ergänzung meldet PHP folgenden Fehler:

Code: Alles auswählen

30-Apr-2004 11:51:13] PHP Fatal error:  Call to undefined function:  i18nregisterdomain() in d:\apache group\apache\htdocs\contenido\contenido\includes\cfg_language_de.inc.php on line 394
In der functions.i18n.php kann ich die aufgerufene Funktion i18nregisterdomain() nicht finden!
Thomas Lucas
LL Consult

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Fr 30. Apr 2004, 11:22

ähm danke für den hinweis... ich glaube du bist der erste der das nachvollzieht...

in der function.i18n.php ergänzen... (ist aus dem CVS_HEAD)
die ersten 3 funktionen kommentierst du am besten aus (also i18n,i18nEmulateGettext,i18nInit) die letzte ist neu...
sonst funktioniert das i18n in den plugins nicht...

Code: Alles auswählen

/**
 * i18n($string)
 *
 * gettext wrapper (for future extensions). Usage:
 * i18n("Your text which has to be translated");
 *
 * @param $string string The string to translate
 * @param $domain string The domain to look up
 * @return string  Returns the translation
 */
function i18n ($string, $domain = "contenido")
{
	global $cfg, $i18nLanguage;
	
	if ($i18nLanguage == "he_SS")
	{
		return i18nEmulateGettext($string, $domain);
	}
	
	if (function_exists("dgettext"))
	{
		if ($domain != "contenido")
		{
			$translation = dgettext($domain, $string);
			return ($translation);
		} else {
			return gettext($string);
		}
	}
	
	return i18nEmulateGettext($string, $domain);
	
	
}

/**
 * i18nEmulateGettext()
 *
 * Emulates GNU gettext
 *
 * @param $string string The string to translate
 * @param $domain string The domain to look up
 * @return string  Returns the translation
 */
function i18nEmulateGettext ($string, $domain = "contenido")
{
	global $cfg, $i18nLanguage, $transFile, $i18nDomains;

	/* Bad thing, gettext is not available. Let's emulate it */
	if (!file_exists($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"))
	{
		return $string;
	}
	
	if (!isset($transFile[$domain]))
	{
		$transFile[$domain] = implode('',file($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"));
	}
	
	$stringStart = strpos($transFile[$domain],'"'.$string.'"');

	if ($stringStart === false)
	{
		return $string;
	}
	
	
	$searchStart = $stringStart + strlen($string);
	$msgstrStart = strpos($transFile[$domain], 'msgstr', $searchStart);
	
	
	
	$messageStart = strpos($transFile[$domain], '"', $msgstrStart);
	$maxMsgEnd = strpos($transFile[$domain], "\n", $messageStart);

	$tempMessage = substr($transFile[$domain], $messageStart+1, $maxMsgEnd- $messageStart+1);
	

	$startSearch = 0;
	$endOfMessage = 0;
	while ($pos = strpos($tempMessage,'"',$startSearch+1))
	{
		if ($pos === false)
		{
			return "Error in i18nEmulateGettext";
		}
		if (substr($tempMessage, $pos-1,1) != '\\')
		{
			$endOfMessage = $pos;
		}
		
		$startSearch = $pos;
	}
	
	$tempMessage = substr($tempMessage,0,$endOfMessage);
	$tempMessage = str_replace('\\"','"',$tempMessage);
	
	return ($tempMessage); 
	 
}

/**
 * i18nInit()
 *
 * Initializes the i18n stuff.
 *
 * @param $localePath string Path to the locales
 * @param $langCode string Language code to set
 * @return string  Returns the translation
 */
function i18nInit ($localePath, $langCode)
{
	global $i18nLanguage;
	global $i18nDomains;
	
	if (function_exists("bindtextdomain"))
	{
    	/* Bind the domain "contenido" to our locale path */
    	bindtextdomain("contenido", $localePath);
    	
    	/* Set the default text domain to "contenido" */
    	textdomain("contenido");
    	
    	/* Half brute-force to set the locale. */
    	if (!ini_get("safe_mode"))
    	{
    		putenv("LANG=$langCode");
    	} 
    	setlocale(LC_ALL, $langCode);
	}
	
	$i18nDomains["contenido"] = $localePath;
	
	$i18nLanguage = $langCode;
}

/**
 * i18nRegisterDomain()
 *
 * Registers a new i18n domain.
 *
 * @param $localePath string Path to the locales
 * @param $domain string Domain to bind to
 * @return string  Returns the translation
 */
function i18nRegisterDomain ($domain, $localePath)
{
	global $i18nDomains;
	
	if (function_exists("bindtextdomain"))
	{
    	/* Bind the domain "contenido" to our locale path */
    	bindtextdomain($domain, $localePath);
	}

	$i18nDomains[$domain] = $localePath;
}
*** make your own tools (wishlist :: thx)

llconsult
Beiträge: 12
Registriert: Mo 19. Apr 2004, 14:17
Wohnort: Köln
Kontaktdaten:

Vielen Dank!

Beitrag von llconsult » Fr 30. Apr 2004, 15:36

:lol:
Es läuft !!!
Jetzt habe ich das Ganze verstanden: Vielen Dank!
Thomas Lucas
LL Consult

Gesperrt