Insite-Editing: valides XHTML erzeugen

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Insite-Editing: valides XHTML erzeugen

Beitrag von Dodger77 » Mo 19. Dez 2005, 21:58

Da mich die Schwierigkeiten was valides XHTML angeht in Verbindung mit dem Insite-Editing und mehreren CMS_HTML-Containern (oder auch CMS_HTMLHEAD) ziemlich nerven, habe ich mal versucht, den klassischen Problemen beizukommen. Als Ansatz habe ich eine den Contenido Extension Chainer benutzt, weil ich nichts an Contenido selbst ändern wollte und der Inhalt aller o.g. CMS-Typen ja bei jedem Klick auf "Save" oder auch "Text HTML" neu gespeichert wird.

Die neue Chain packt man in die Datei "include.chain.content.html2xhtml.php" im Verzeichnis "contenido/plugins/chains/includes/" mit folgendem Inhalt (zuletzt geändert 30.01.2007 15:53):

Code: Alles auswählen

<?php

function cecContentHtml2Xhtml ($idartlang, $int2, $int3, $string)
{	
global $cfg;


  /* Cache the XHTML setting for performance reasons */
	if (!is_array($cfg) || !array_key_exists("generate_xhtml", $cfg))
	{
	
	if (function_exists("getEffectiveSetting"))
		{
			$cfg["generate_xhtml"] = getEffectiveSetting("generator", "xhtml", false);
		} else {
			$cfg["generate_xhtml"] = false;	
		}
	}

	if ($cfg["generate_xhtml"] === "false")
	{
		$cfg["generate_xhtml"] = false;
	}

  if ($cfg["generate_xhtml"] == true) 
  {
	  $string = preg_replace ("/(<\/?)(\w+)([^>]*>)/me"
						   ,"'\\1'.strtolower('\\2').cecContentHtmlAttr2Xhtml('\\3')"
						   ,$string
						   );

	  $string = preg_replace ("/(<)(area|base|basefont|br|col|frame|hr|img|input|isindex|link|meta|param)([^>]*?)((?<!\/)>)/m"
						   ,"\\1\\2\\3 />"
						   ,$string
						   );
  }
	return $string;
}

function cecContentHtmlAttr2Xhtml ($string)
{
	$string = stripslashes ($string);

	$string = stripslashes (preg_replace ("/(\w+)(\=)([\"|\'])([^\"']+)([\"|\'])(\s)/me"
										 ,'strtolower("\1")."=\"\4\" "'
										 ,$string
										 ));

	$string = stripslashes (preg_replace ("/([\s]([\w]+)[\s]+)(?!\=[\"\'])(?=[\/]?[>]|[\w\s]+[\=])/me"
										 ,' '.strtolower('\\2').'="'.strtolower('\\2').'"'
										 ,$string
										 ));
	$string = stripslashes (preg_replace ("/([\s]([\w]+)[\s]+)(?!\=[\"\'])(?=[\/]?[>]|[\w\s]+[\=])/me"
										 ,' '.strtolower('\\2').'="'.strtolower('\\2').'"'
										 ,$string
										 ));

	return $string;
}

?>
Die Chain muss weiterhin eingebunden werden in der Datei "config.plugin.php" im selben Verzeichnis durch:

Code: Alles auswählen

cInclude("plugins", "chains/includes/include.chain.content.html2xhtml.php");
$_cecRegistry->addChainFunction("Contenido.Content.SaveContentEntry", "cecContentHtml2Xhtml");
Vielleicht hat mal jemand Zeit, das zu testen. Bei meinen Tests macht das zwar keine Probleme mehr, aber ich würde noch vom Einsatz in Live-Systemen abraten.

Zurzeit werden:
  • Tags und Attribute in Kleinschreibung umgewandelt,
  • einzelstehende Tags (br,hr,base,img,input,meta,link) von "<br>" in "<br />" umgewandelt und
  • Attribute ohne Wert (z.B. "selected") in die korrekte Schreibweise (selected="selected") überführt
Anregungen?
Zuletzt geändert von Dodger77 am Mi 21. Feb 2007, 08:39, insgesamt 6-mal geändert.

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

Beitrag von emergence » Di 20. Dez 2005, 12:32

Code: Alles auswählen

global $cfg, $client, $lang, $cfgClient;
tuts in dem fall nicht ?
*** make your own tools (wishlist :: thx)

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Di 20. Dez 2005, 12:59

emergence hat geschrieben:

Code: Alles auswählen

global $cfg, $client, $lang, $cfgClient;
tuts in dem fall nicht ?
Nein, das habe ich schon getestet (in beiden Dateien). "$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.

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

Beitrag von emergence » Di 20. Dez 2005, 13:06

ähm das verwundert mich schon etwas
besonders aufgrund dessen wo die funktion dann eigentlich aufgerufen wird...
functions.con.php -> function conSaveContentEntry
wird folgendes zu beginn auch angefordert...

Code: Alles auswählen

    global $db, $auth, $cfg, $cfgClient, $client, $lang, $_cecRegistry;
und da gehts ?
*** make your own tools (wishlist :: thx)

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Di 20. Dez 2005, 14:25

emergence hat geschrieben:ähm das verwundert mich schon etwas
OK, das habe ich mir nochmal angeschaut. An "$client" kommt man natürlich doch heran. Das habe ich nun soweit oben überarbeitet.

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Mi 21. Dez 2005, 23:21

Und $lang, $cfgClient geht nicht?

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Do 22. Dez 2005, 09:32

HerrB hat geschrieben:Und $lang, $cfgClient geht nicht?
Schon, aber bringen tun die mir nicht viel.
Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung. Aber ich denke, der eine DB-Query mehr beim Speichern eines Content-Elements wird wohl ok sein.
Jetzt versuche ich halt Bugs in den regulären Ausdrücken zu finden, die dem Interesse, das XHTML valide zu bekommen, nicht so ganz dienlich sind. :wink:

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Do 22. Dez 2005, 11:29

Dodger77 hat geschrieben:"$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.
Dodger77 hat geschrieben:Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung
Hä?

[Edit: HerrB] Ich versuche gerade, rauszubekommen, ob das ein Bug ist oder nicht. Es wäre schon schön, wenn Du da noch ein wenig ausführlicher im testen und berichten sein könntest... :wink:

Gruß
HerrB
Zuletzt geändert von HerrB am Do 22. Dez 2005, 16:46, insgesamt 1-mal geändert.
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

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

Beitrag von emergence » Do 22. Dez 2005, 13:53

ähm wer ist wir ?

was anderes
$cfg['generate_xhtml'] wird ja an sich aus den eigenschaften gelesen und erst dann gesetzt... zumindestens hab ich das irgendwo mal gesehen... (glaube somit nicht das dass ein bug ist)

es müsste an sich aber auch funktionieren wenn du

Code: Alles auswählen

$cfg['generate_xhtml'] = getEffectiveSetting('generator', 'xhtml', false);
verwendest...
*** make your own tools (wishlist :: thx)

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Do 22. Dez 2005, 15:55

emergence hat geschrieben:es müsste an sich aber auch funktionieren wenn du

Code: Alles auswählen

$cfg['generate_xhtml'] = getEffectiveSetting('generator', 'xhtml', false);
verwendest...
Ja, im Prinzip habe ich das jetzt so gemacht (s.o.). Abgeschaut habe ich mir den Code aus der "class.htmlelements.php".

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Do 22. Dez 2005, 16:17

HerrB hat geschrieben:
Dodger77 hat geschrieben:"$cfg" steht übrigens zur Verfügung, aber alles, was ich verwerten könnte, fehlt.
Dodger77 hat geschrieben:Ich hätte ja gern Zugriff auf "$cfg['generate_xhtml']" gehabt, aber das steht nicht zur Verfügung
Hä?

[Edit HerrB]: Ich versuche gerade, rauszubekommen, ob das ein Bug ist oder nicht. Es wäre schon schön, wenn Du da noch ein wenig ausführlicher im testen und berichten sein könntest... :wink:
OK. Habe schon ausführlicher getestet, aber halt nicht berichtet. Zurzeit wird "$cfg['generate_xhtml']" nur in der Klasse "cHTML" (Datei "class.htmlelements.php") zugewiesen. Ich gehe davon aus, dass diese aber eben nicht vorher in den Dateien, in denen "conSaveContentEntry" aufgerufen wird (include.con_editcontent.php, include.CMS_HTML.php, ...), instantiiert wurde.
Somit gibt es "$cfg['generate_xhtml']" eben noch nicht. Vielleicht macht es Sinn (ob jetzt ein Bug oder nicht), dies schon vorher zu initialisieren.

apicalart
Beiträge: 161
Registriert: Fr 18. Mär 2005, 13:09
Wohnort: Linnich ( NRW )
Kontaktdaten:

Beitrag von apicalart » Mo 2. Jan 2006, 17:33

Wenn ich dich richtig verstanden habe, versuchst du ja hier eine Lösung für das Problem mehrere Textfelder- eins ändern verwirft xhtml in dem anderen - zu finden.

Ich habe die chain eingebunden. - aber funktionieren tuts nicht. Ich habe immer noch das gleiche Phänomen.

Contenido 4.6.4.
xhtml erzeugen ja
Mandanteneinstellungen
generator xhtml true
wysiwyg tinymce-extended-valid-elements *[*]

Firefox 1.5
Dat gijjt et doch nit wirklich, odder !

Grüsse aus dem Rheinland
http://www.eukoba.de

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Mo 2. Jan 2006, 17:47

apicalart hat geschrieben:Ich habe die chain eingebunden. - aber funktionieren tuts nicht. Ich habe immer noch das gleiche Phänomen.
Was für Typen nutzt du denn genau (z.B. CMS_HTML)? Und gibt es evtl. einen Beispiellink?

kypta
Beiträge: 295
Registriert: Di 8. Jul 2003, 13:25
Kontaktdaten:

Beitrag von kypta » Mi 4. Jan 2006, 18:20

Habe das auch eingebunden - auch bei mir tut sich nichts (neues).
Auf einer Seite habe ich vier CMS_HTML. Wie üblich (leider) werden die xhtml-Inhalte der drei nicht im Tiny-MCE editierten Container wieder ent-xhtml-isiert... was vor allem im IE gut zu sehen ist mit all seinen Tags in Grossbuchstaben.

Contenido 4.6.4
PHP 4.3.9
Apache 2.0.46 (CentOS)

Gruss
Thomas

Dodger77
Beiträge: 3626
Registriert: Di 12. Okt 2004, 20:00
Wohnort: Voerde (Niederrhein)
Kontaktdaten:

Beitrag von Dodger77 » Mi 4. Jan 2006, 19:21

Thomas hat geschrieben:Habe das auch eingebunden - auch bei mir tut sich nichts (neues).
Auf einer Seite habe ich vier CMS_HTML. Wie üblich (leider) werden die xhtml-Inhalte der drei nicht im Tiny-MCE editierten Container wieder ent-xhtml-isiert... was vor allem im IE gut zu sehen ist mit all seinen Tags in Grossbuchstaben.
Bei apicalart klappt es mittlerweile. Ändere mal bitte die Datei "config.plugin.php" zu:

Code: Alles auswählen

<?php
global $_cecRegistry, $cfg, $client;

$cfg['plugins']['frontendlogic'][] = "category";

cInclude("plugins", "chains/includes/include.chain.frontend.cat_backendaccess.php");
cInclude("plugins", "chains/includes/include.chain.frontend.cat_access.php");

$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess");
$_cecRegistry->addChainFunction("Contenido.Frontend.CategoryAccess", "cecFrontendCategoryAccess_Backend");

cInclude("plugins", "chains/includes/include.chain.content.html2xhtml.php");
$_cecRegistry->addChainFunction("Contenido.Content.SaveContentEntry", "cecContentHtml2Xhtml");

?>

Antworten