Zum Inhalt springen

Problem bei eigener Extension mit xaJax (Anfänger)

Erstellt am 16. Dezember 2006 · 4 Antworten · letzte Antwort am 25. Mai 2008

Tags: JavaScript & AJAX, Frage

canetti2 ·

Hallo alle zusammen,

in der Beilage der aktuellen T3N wird erklärt, wie man eine eigene kleine Ajax-Extension schreiben kann. Es geht darum, die aktuelle Serverzeit im Sekundentakt zu aktualisieren (ich weiß, in der Praxis würde man so eine Extension niemals einsetzen - aber darum geht es nicht!!!)

Die Extension wurde auf zwei verschiedenen Wegen realisiert. Einmal klassisch - ohne zuhilfenahme einer Ajax-Bibliothek und das andere mal mit Einbeziehung der xaJax-Bibliothek.

Die klassische Variante habe ich zum Laufen gebracht, aber die xaJax-Variante funktioniert nicht - Javascript-Fehler. Daher hoffe ich mal, dass ihr den Fehler findet.

Hier ist der Code der Mainfunktion der entsprechenden class.tx_arrajaxserverzeit_pi1.php:

<?php
var $xajax;

function main($content,$conf)	{
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
		
require_once t3lib_extMgm::extPath('xajax').'class.tx_xajax.php';
$this->xajax = t3lib_div::makeInstance('tx_xajax');
$this->xajax->registerFunction(array ('ladeUndZeigeZeit', &$this, 'ladeUndZeigeZeit'));
$this->xajax->processRequests();
//Javascript Code in den Header
$GLOBALS['TSFE']->additionalHeaderData[$this->prefixId]= $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('xajax'));
$GLOBALS['TSFE']->additionalHeaderData[$this->prefixId].= '<script type="text/javascript">		window.onload = function() {
window.setInterval("' . $this->prefixId . 'ladeUndZeigeZeit();", 1000); }
</script>';

$content .= '<div>Serverzeit: <span id="Serverzeit"></span></div>';
return $this->pi_wrapInBaseClass($content);
		
function ladeUndZeigeZeit() {
$content = date("H:i:s");
$antwort = new tx_xajax_response();
$antwort->addAssign("Serverzeit", "innerHTML", $content);
return $antwort->getXML();
 }
?>

Den Code habe ich aus dem Listing, der auch von T3N bereitgestellt wird:
https://www.yeebase.com/fileadmin/listings/t3n_listings_1325.zip

Was mich wundert, bzw. was ich nicht verstehe:
1)
Warum muss ich außerhalb der Mainfunktion noch "var = $xajax;" definieren?

2)
Wenn ich mir den Code der von Typo3 erstellten Seite ansehe, wird im Sekundentakt die Funktion tx_arrajaxserverzeit_pi1ladeUndZeigeZeit() aufgerufen (s.u.) die ich im Quellcode aber gar nicht finde!

Hier ist der entsprechende Quellcode der ausgebenen Seite:

<script type="text/javascript">
var xajaxRequestUri="http://iceberg.de/typo3/index.php?id=24&no_cache=1";
var xajaxDebug=false;
var xajaxStatusMessages=false;
var xajaxWaitCursor=true;
var xajaxDefinedGet=0;
var xajaxDefinedPost=1;
var xajaxLoaded=false;
function xajax_ladeUndZeigeZeit(){return xajax.call("ladeUndZeigeZeit", arguments, 1);}
	</script>
	<script type="text/javascript" src="typo3conf/ext/xajax/xajax_js/xajax.js"></script>
	<script type="text/javascript">
window.setTimeout(function () { if (!xajaxLoaded) { alert('Error: the xajax Javascript file could not be included. Perhaps the URL is incorrect?\nURL: typo3conf/ext/xajax/xajax_js/xajax.js'); } }, 6000);
	</script>
<script type="text/javascript">
										window.onload = function() {
											window.setInterval("tx_arrajaxserverzeit_pi1ladeUndZeigeZeit();", 1000); }
										</script>

Vielleicht sieht ein Profi auf den ersten Blick woran es liegt?

Würde mich über Hilfe sehr freuen.

Gruß an alle
canetti2

bagalude ·

Ich glaube das Problem war das keine Ausgabe erzeugt wurde. Hänge hier auch grade ein wenig und habe das Script eben leicht modifiziert probiert...

class tx_msatestviewer_pi1 extends tslib_pibase {
	var $prefixId      = 'tx_msaactsviewer_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.tx_msatestviewer_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey        = 'msa_testviewer';	// The extension key.
	var $xajax;
  function main($content,$conf)	{
    $this->conf=$conf;
    $this->pi_setPiVarDefaults();
    $this->pi_loadLL();
    $this->pi_USER_INT_obj = 1;
    $content = '';

    #require_once(t3lib_extMgm::extPath('xajax') . 'class.tx_xajax.php');
    $this->xajax = t3lib_div::makeInstance('tx_xajax');
    $this->xajax->setWrapperPrefix($this->prefixId);
  $this->xajax->debugOn();
    $this->xajax->registerFunction(array('getResponse', &$this, 'getResponse'));

    $this->xajax->processRequests();

		$GLOBALS['TSFE']->additionalHeaderData[$this->prefixId] = $this->xajax->getJavascript(t3lib_extMgm::siteRelPath('xajax'));
		$newJs = "setInterval(\"tx_msatestviewer_pi1getResponse('msa_testviewer')\",10000);";
		$GLOBALS['TSFE']->setJS('reload',$newJs);
		/*
    $GLOBALS['TSFE']->additionalHeaderData[$this->prefixId] .= '<script type="text/javascript">
      window.onload = function() {
        window.setInterval("' . $this->prefixId . 'getResponse();", 1000);
      }</script>';
*/
    $content .= '<div>Serverzeit: <span id="Serverzeit"></span></div>';
    return $this->pi_wrapInBaseClass($content);
  }
  function getResponse() {
    $content = date("H:i:s");
    $antwort = new tx_xajax_response();
    $antwort->addAssign("Serverzeit", "innerHTML", $content);
    return $antwort->getXML();    
  }

Das einzige was ich leider bekomme ist folgende Debugausgabe:

Xajax Debug:
Calling getResponse uri=http://192.168.0.1/dev/test/
(post:xajax=getResponse&xajaxr=1210428497515&xajaxargs[]=msa_testviewer

Weiss wer wo mein Fehler liegt? Weil irgendwie hänge ich da schon eine ganze Weile dran... #angry#

bagalude ·

Ok einen Schritt weiter... 😉
Alles funktioniert soweit wunderbar sofern ich die vx_xajax_shoutbox ausstelle. Irgendwie scheinen die Beiden sich zu stören. Genauer sobald die vx_xajax_shoutbox läuft bekomme ich die Meldung das er die Funktion getData() welche ich gegen die getResponse() im Viewer ausgetauscht habe, da die Funktion der vx_xajax_shoutbox schon so heisst, nicht findet... Deaktiviere ich die vx_xajax_shoutbox läuft der Viewer auch mit getData. #paralyzed#

Das seltsame ist das an sich beide Funktionen im Header geladen werden...

	<script type="text/javascript">
/*<![CDATA[*/
var xajaxRequestUri="http://192.168.0.1/dev/test/index.php?id=43";
var xajaxDebug=false;
var xajaxStatusMessages=false;
var xajaxWaitCursor=true;
var xajaxDefinedGet=0;
var xajaxDefinedPost=1;
var xajaxLoaded=false;
function tx_vxxajaxshoutbox_pi1processFormData(){return xajax.call("processFormData", arguments, 1);}
function tx_vxxajaxshoutbox_pi1getResponse(){return xajax.call("getResponse", arguments, 1);}
/*]]>*/
	</script>

	<script type="text/javascript" src="typo3conf/ext/xajax/xajax_js/xajax.js"></script>
	<script type="text/javascript">
window.setTimeout(function () { if (!xajaxLoaded) { alert('Error: the xajax Javascript file could not be included. Perhaps the URL is incorrect?\nURL: typo3conf/ext/xajax/xajax_js/xajax.js'); } }, 6000);
	</script>

<script type="text/javascript" src="typo3conf/ext/vx_xajax_shoutbox/pi1/shoutbox.js"></script>>
	<script type="text/javascript">
/*<![CDATA[*/
var xajaxRequestUri="http://bagalude.ath.cx/dev/test/index.php?id=43";
var xajaxDebug=false;
var xajaxStatusMessages=false;
var xajaxWaitCursor=true;
var xajaxDefinedGet=0;
var xajaxDefinedPost=1;
var xajaxLoaded=false;
function tx_msatestviewer_pi1getData(){return xajax.call("getData", arguments, 1);}
/*]]>*/
	</script>
	<script type="text/javascript" src="typo3conf/ext/xajax/xajax_js/xajax.js"></script>

	<script type="text/javascript">
window.setTimeout(function () { if (!xajaxLoaded) { alert('Error: the xajax Javascript file could not be included. Perhaps the URL is incorrect?\nURL: typo3conf/ext/xajax/xajax_js/xajax.js'); } }, 6000);
	</script>

Irgendwie scheint sich
$newJs ="setInterval(\"tx_msatestviewer_pi1getData('msa_testviewer')\",10000);";
$GLOBALS['TSFE']->setJS('reload',$newJs);

und
$newJs ="setInterval(\"tx_vxxajaxshoutbox_pi1getResponse(xajax.getFormValues('ajax_shoutbox'))\",".$this->conf["refreshInterval"].");";
$GLOBALS['TSFE']->setJS('reload',$newJs);

gegenseitig zu überschreiben... #angry#

Weiss jemand wie ich dieses Problem umgehen kann?

bagalude ·

Dieses Problem habe ich inzwischen damit gelöst, daß ich den zweiten Auruf vie $GLOBALS['TSFE']->additionalHeaderData() und nicht über $GLOBALS['TSFE']->setJS() einbinde. Allerdings bin ich nicht viel weiter gekommen... 🙁

Hier geht es weiter :LINK