Content Plugin führt zu leerem Frontend

Fragen zum Entwickeln eigener Addons?

Moderator: General Support Moderators

Forum rules
Forumregeln
Locked
alex_the_coder
Joomla! Apprentice
Joomla! Apprentice
Posts: 5
Joined: Fri Mar 05, 2010 12:58 pm

Content Plugin führt zu leerem Frontend

Post by alex_the_coder » Fri Mar 05, 2010 1:38 pm

Hallo liebe Forenmitglieder!

Ich habe ein Problem mit einem selbst geschriebenen Content – Plugin an dem ich mir echt die Zähne ausbeiße. :-(

Mein Plugin hat folgende einfache Aufgabe: Es durchsucht einen Beitrag nach einem Tag „{ldap_staff_table}“ und ersetzt diesen Tag durch eine Tabelle mit Informationen über unsere Mitarbeiter. Name, Telefon- und Raumnummer und E-Mail-Adresse werden in dieser Tabelle dargestellt. Die Daten für diese Tabelle bezieht das Plugin von einen LDAP-Server.

Ist das Plugin aktiv und klicke ich im Frontend auf einen Beitrag der das Tag enthält, führt das zu einer weißen b.z.w. leeren Seite. Auch der Quellcode ist leer, wenn ich ihn im Browser anzeigen lasse.

Im Joomla!-Backend ist der Punkt „System debuggen“ auf „ja“ und „Fehler berichten“ auf „Maximum“ eingestellt. PHP ist so konfiguriert, dass Fehler geloggt werden. Doch in der Error-Log (in meinem Falle /var/log/apache2/error.log) tut sich nichts. :-/

Selbstverständlich habe ich schon Google gequält, doch nichts gefunden. :-(

Bevor ich meinen gesamten Code poste, hier mal meinen kurzen Testcode, der aber zum selben Ergebnis führt:

Code: Select all

<?php

// no direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.plugin.plugin' );

class plgContentLDAP_Staff_Table extends JPlugin {

	public function onPrepareContent(&$row, &$params, $page=0)
	{
		//Get the plugin parameters.
		$plugin = &JPluginHelper::getPlugin('content', 'ldap_staff_table');
		$plgParams = new JParameter($plugin->params);
		unset($plugin);

		//Replace "{ldap_staff_table}" by staff table.
		if (JString::strpos($row->text, "{ldap_staff_table}", 0)) {
			//$html = $this->genTable($plgParams);
			//$row->text = str_replace("{ldap_staff_table}", $html, $row->text);

			//Testcode
			for ($i=0; $i<2000; $i++)
				$row->text .= "<span style=\"color:green\";>Der Inhalt wurde ersetzt.</span><br />";
		}

		return true;
	}

...
Normaler Weise ruft die Funktion genTable das LDAP-Directory ab und erzeugt den HTML-Code mit der Tabelle. Die Funktion muss aber nicht aufgerufen werden um den Fehler zu erzeugen. Der Testcode tut's auch.

Hochkommas statt Anführungszeichen führen zum selben Ergebnis:

Code: Select all

//Testcode
for ($i=0; $i<2000; $i++)
	$row->text .= "<span style='color:green';>Der Inhalt wurde ersetzt.</span><br />";
Lasse ich sämtliche Hochkommas und Anführungszeichen weg, funktioniert mein Code problemlos. Oo Dann kann ich auch die Schleifendurchläufe drastisch erhöhen und es geht immer noch.

Er mag also die Hochkommas und Anführungszeichen nicht, aber was stört ihn daran?

Vielleicht sehe ich den Wald für lauter Bäumen nicht.

Zum System:
Debian Lenny 5
PHP 5.2.6-1+lenny4
Apache 2.2.9-10+lenny6

Übrigens habe ich das Plugin mal auf einem etwas anderen System, mit den selben Ergebnis getestet.

Anderes System:
Open SUSE Linux 10.3
PHP 5.2.11
Apache 2.2.4

Ich weiß echt nicht mehr weiter. :-(
Wäre cool, wenn mir hier jemand helfen könnte.

Vielen Dank!

alex_the_coder
Joomla! Apprentice
Joomla! Apprentice
Posts: 5
Joined: Fri Mar 05, 2010 12:58 pm

Re: Content Plugin führt zu leerem Frontend

Post by alex_the_coder » Fri Mar 05, 2010 2:06 pm

Habe gerade etwas sehr interessantes herausgefunden.

Die folgenden Codes funktionieren, auch wenn sie erst mal keinen Sinn ergeben.

Code: Select all

for ($i=0; $i<4000; $i++)
	$row->text .= "<span sinnlos=\"color:green;\">Der Inhalt wurde ersetzt.</span><br />";

Code: Select all

for ($i=0; $i<4000; $i++)
	$row->text .= "<span class=\"color:green;\">Der Inhalt wurde ersetzt.</span><br />";

Code: Select all

for ($i=0; $i<4000; $i++)
	$row->text .= "<span style \"color:green;\">Der Inhalt wurde ersetzt.</span><br />";
Irgendwer hat also was gegen die Eigenschaft "style" im span-Tag, wenn ich ihr den Wert in Anführungszeichen b.z.w. Hochkommans mitgebe.

:geek:

User avatar
StephanK
Joomla! Explorer
Joomla! Explorer
Posts: 292
Joined: Fri Aug 19, 2005 2:10 pm
Location: Germany - Eppelheim
Contact:

Re: Content Plugin führt zu leerem Frontend

Post by StephanK » Mon Mar 08, 2010 10:39 pm

Hi,

nur mal schnell überflogen...könnte es sein das du das Semikolon falsch gesetzt hast?

Code: Select all

"<span style=\"color:green\";>
anstatt

Code: Select all

"<span style=\"color:green;\">

alex_the_coder
Joomla! Apprentice
Joomla! Apprentice
Posts: 5
Joined: Fri Mar 05, 2010 12:58 pm

Re: Content Plugin führt zu leerem Frontend

Post by alex_the_coder » Tue Mar 09, 2010 1:43 pm

Hallo StephanK, danke für deine Antwort.

Ich habe inzwischen eine Lösung oder eigentlich einen Weg gefunden, dass Problem zu umgehen.

Das Semikolon spielt keine Rolle, es gehört nur zur CSS-Anweisung innerhalb der style-Eigenschaft. Verursacher des Problems war das "System - SEF" Plugin, welches innerhalb eines Artikels sämtliche URLs bei aktivierter Suchmaschinen-Optimierung umwandelt.

Aber was hat das an der style-Eigenschaft zu suchen? Ganz einfach: Dort kann man Backgroundimages angeben und auch deren URLs müssen angepasst werden. :geek:

Im Code des SEF Plugins (plugins/system/sef.php) steht ca. ab Zeile 85 folgendes:

Code: Select all

// Background image
$regex = '#style\s*=\s*[\'\"](.*):\s*url\s*\([\'\"]?(?!/|'.$protocols.'|\#)([^\)\'\"]+)[\'\"]?\)#m';
$buffer  = preg_replace($regex, 'style="$1: url(\''. $base .'$2$3\')', $buffer);
Nach dem Aufruf von preg_replace ist $buffer plötzlich leer. :-\

Anscheinend sind über 4000 Treffer zu viel für preg_replace. :eek:

Hab ich da etwa ein PHP-Bug gefunden? :laugh:

Ich löse das Problem in dem ich zur Großschreibung wechsle:

Code: Select all

//Testcode
for ($i=0; $i<2000; $i++)
   $row->text .= "<span STYLE=\"color:green;\">Der Inhalt wurde ersetzt.</span><br />";
So wird preg_replace nicht mehr darauf angewandt, der Browser interpretiert es aber weiterhin. 8)

Grüße
Alex

User avatar
StephanK
Joomla! Explorer
Joomla! Explorer
Posts: 292
Joined: Fri Aug 19, 2005 2:10 pm
Location: Germany - Eppelheim
Contact:

Re: Content Plugin führt zu leerem Frontend

Post by StephanK » Tue Mar 09, 2010 10:23 pm

Hi Alex,

dein Problem wurde sogar bereits im Bug Tracker von Joomla 1.5 am 25.04.2009 beschrieben. Eine Lösung wird wohl aber erst mit 1.6 zu erwarten sein (wenn mein Englisch mich da nicht im Stich lässt) ;)

Schau mal hier: http://joomlacode.org/gf/project/joomla ... m_id=16132

Das das Semikolon eigentlich zur CSS-Anweisung gehört war mir schon klar, so wie du es jedoch im ersten Teil geschrieben hattest, gehörte es aber eben nicht mehr dazu. Deshalb war eben meine Vermutung das Joomla da irgendwo stolpert.
Da du ja aber bereits eine "Lösung" gefunden hast, ist es ja ohnehin jetzt Wurscht ;)

Gruß
Stephan

User avatar
dietmarh
Joomla! Guru
Joomla! Guru
Posts: 703
Joined: Sun Dec 16, 2007 2:24 pm

Re: Content Plugin führt zu leerem Frontend

Post by dietmarh » Wed Mar 10, 2010 2:18 am

StephanK wrote:Das das Semikolon eigentlich zur CSS-Anweisung gehört war mir schon klar,
Kleine OT-Anmerkung am Rande: Das ; bedeutet nicht "Hier endet eine Wertzuweisung zu einer Eigenschaft", sondern "Nach dem ; folgt eine weitere Eigenschaft". Wenn keine weitere Eigenschaft folgt, darf es also problemlos fehlen. Theoretisch müßte das Rendering der Seiten sogar einen winzigen Tick schneller werden, weil der Browser beim Parsen des CSS gar nicht erst nach der nächsten Eigenschaft sucht, um dann festzustellen, daß doch keine kommt, sondern nur eine }.

Nein, im CSS selbst kann ich mir auch nicht angewöhnen, das ; bei der letzten Eigenschaft wegzulassen. Bei Inline Styles mache ich es aber.
Dietmar

Deutsches Joomla-Forum für Fortgeschrittene: http://forum.joomla-nafu.de

User avatar
StephanK
Joomla! Explorer
Joomla! Explorer
Posts: 292
Joined: Fri Aug 19, 2005 2:10 pm
Location: Germany - Eppelheim
Contact:

Re: Content Plugin führt zu leerem Frontend

Post by StephanK » Wed Mar 10, 2010 8:22 am

Und wider was gelernt.. Danke Dietmar.

alex_the_coder
Joomla! Apprentice
Joomla! Apprentice
Posts: 5
Joined: Fri Mar 05, 2010 12:58 pm

Re: Content Plugin führt zu leerem Frontend

Post by alex_the_coder » Thu Mar 11, 2010 8:28 am

Ok, danke Stephan. Wundert mich, dass ich das mit dem Bug-Report auf joomlacode.org nicht gefunden habe. Welche Schlagwörter hast du denn verwendet? :-[

Ich konnte diesen Fehler auch ohne Joomla reproduzieren.

Folgender Code gibt 10000 mal eine Zeile aus. Eigentlich in roter Schriftfarbe, preg_replace ändert die Anweisung aber so ab, dass die Zeilen in grün erscheinen. Nach preg_replace wird aber plötzlich nur noch eine Zeile ausgegeben.

Code: Select all

<?php
    $html="";

    $text="<span style=\"color: red;\">Curo obnubilo jus roto sis pulmo sollers. Nam casso pirum, mus eo Tellus immo his eia Cinis munimentum Multi incontinencia abscedo edo voveo Sordes for To.<br /></span>";

    for ($i=0; $i<10000; $i++) $html .= $text;

    $regex = '#style\s*=\s*[\'\"](.*)color\s*:\s*(.*)[\'\"]#m';
    $html = preg_replace($regex, 'style="color: green;\"', $html);

    echo $html;
?>
Aber auch das lässt sich umgehen, in dem man einen Zeilenumbruch an die Zeile anfügt:

Code: Select all

$text="<span style=\"color: red;\">Curo obnubilo jus roto sis pulmo sollers. Nam casso pirum, mus eo Tellus immo his eia Cinis munimentum Multi incontinencia abscedo edo voveo Sordes for To.<br /></span>\n";
Für mich eher ein PHP- als ein Joomla-Bug. Vielleicht wird ja in der Version 1.6 von Joomla ein Workaround dafür geschaffen.

Für mich hat sich die Sache damit erledigt.

Vielen Dank nochmal für eure Hilfe! 8)

Greez
Alex


Locked

Return to “Entwicklerforum”