Zum Inhalt springen

[RealTime Serverzeit] Wie binde ich dieses PHP Script ein!?

Erstellt am 13. Februar 2004 · 12 Antworten · letzte Antwort am 8. Oktober 2007

Tags: Frage

sw-student ·

Morgen zusammen,

hab mal wieder ein Freitag-Morgen-Problem. Beiße mir nun schon seit 2 Tagen an einem "Realtime Serverzeit" Skript die Zähne aus. o.O Das Problem ist, dass es aus einer Kombination von JavaScript und PHP besteht und ich nicht genau weiß, wie man den header und body part ins Typo übertragen kann. -->Hier<-- das funktionierende Script.

Habe das Skript schon X-Mal umgebaut. Mal den header per TypoScript (page.headerDate = FILE oder per page.headerData = PHP_SCRIPT), mal direkt ins Html Template eingefügt, mal die inc_servertime.php auseinandergenommen und direkt eingefügt. Einfach alle möglichen Kombinationen durchprobiert.

Vielleicht findet ja jemand gefallen an dem Skript und hängt sich hier mit rein. Ist echt mal ne Herausforderung ... für mich zumindest #giggle#

Gruß
ein ganz verzweifelter sw-student

Hier noch die beiden Files:

[main.php] (Template Datei)

<!-- ###DOKUMENT###-->
<head>
<?php
include 'inc_servertime.php';
$st = new servertime;
$st->InstallClockHead();
?>
</head>
<body> 
<br><br><br><br><br><br><br><br>
 <table border="1" width="600" cellspacing="0" cellpadding="0" height="32">
  <tr>
    <td width="100" rowspan="3">###LOGO###</td>
    <td width="500" valign="bottom" align="right" nowrap>
	<?php
		$st->InstallClock();
		$st->InstallClockBody();
	?>
    </td>
    <td width="100" rowspan="3">###LOGO2###</td>
    <tr>
    <td align="right">
	<select class="selecta" name="location" size="1" onchange="updateclock(this);"> 
		<option value="0" selected>Deutschland</option> 
		<option value="1">Südafrika</option>
		<option value="-7">Mexiko</option>
		<option value="0">Polen</option>
		<option value="-4">Uruquay</option>
		<option value="6">Thailand</option> 
		</select>
    </td>
    </tr>
    <tr>
    <td></td>
    </tr>
  </tr>
</table>
</body>
</html>
<!-- ###DOKUMENT###-->

[inc_servertime.php]

<?php

class servertime
{

  var $divid = 'Pendule'; // default id name
  var $divstyle = 'position:absolute;'; // default for NS 4.7
  var $divtag = 'div'; // other possibility: 'span'
  var $divclass = ''; // default empty

  var $title = ''; // default clock title
  
  #
  # Internal use only: $ok_head and $ok_clock
  #
  var $ok_head  = false; // InstallClockBody() and InstallClock() will check for this.
  var $ok_clock = false; // InstallClockBody() will check for this, too.
  var $bodyonload = false; // If <body onload="clock()"> is used, set it to true, please

  # This function is to be used in the <head> section of the page.
  function InstallClockHead( )
  {

    echo "
<script language="JavaScript" type="text/javascript">
<!--
".
	  "var zone=0;
".
         "function updateclock(z){
".
         "zone=z.options[z.selectedIndex].value;
".
	  "}
";
    
    # Here is where the server time comes into the script:
    # date() is a php function which runs on the server, giving exactly
    # the time the server has.

    $datum = date('M, d Y H:i:s', mktime( date('H'), date('i'), date('s'), date('m'), date('d'), date( 'Y' ) ) );

    echo 'var digital = new Date( "'.$datum.'");'; // <-- this is the trick!
   
    echo "

function writeLayer(layerID,txt)".
    "
{
  if(document.getElementById)
  {
".
    "    document.getElementById(layerID).innerHTML=txt;
".
    "  }
  else if(document.all)
  {
    document.all[layerID].innerHTML=txt;
".
    "  }
  else if(document.layers)
  {
".
    "    document.layers[layerID].document.open();
".
    "    document.layers[layerID].document.write(txt);
".
    "    document.layers[layerID].document.close();
  }
}
";

   echo "
//-->
</script>
";

   $this->ok_head = true; // Check later
   
  } // eof InstallClockHead();

  # This is to be used where you want the clock to appear on your page.
  function InstallClock()
  {
    # To have it work with NS 4.7 the style "position:absolute" MUST be given (knito)
    $klasse = strlen( trim( $this->divclass ) ) > 0 ? " class='$this->divclass'" : '';
    $style  = strlen( trim( $this->divstyle ) ) > 0 ? " style='$this->divstyle'" : '';
    
    echo "<$this->divtag id='$this->divid'>$this->title</$this->divtag>";
//    echo "<$this->divtag id='$this->divid'$style$klasse>$this->title</$this->divtag>";
    
    if( $this->ok_head == false )
    {
      die("Servertime: InstallClockHead() is missing");
    }
    $this->ok_clock = true;
  } // eof Clock() 

  
  # This function is to be used at the end of the <body> section of the page.
  function InstallClockBody( )
  {
    echo "
<script language='JavaScript' type='text/javascript'>
<!--
".
    "function clock()
{
".
    "  var hours = digital.getHours()+parseInt(zone);
".
    "  var minutes = digital.getMinutes();
".
    "  var seconds = digital.getSeconds();
".
    "  var ampm = '';
".
    "  var d = digital.getDate();
".
    "  var m = digital.getMonth()+1;
".
  	"  var y = digital.getFullYear();
".
	  "  var dispTime;

  digital.setSeconds( seconds+1 );

".

    "  if (minutes < 10) minutes = '0' + minutes;
".
    "  if (seconds < 10) seconds = '0' + seconds;
".
    "  if (d < 10) d = '0' + d;
".
    "  if (m < 10) m = '0' + m;

";

		$ampm=""pm" : "am"";
    
		echo "  ampm = ( hours > 11 ) ? ".$ampm.";
".
		"  hours = ( hours > 12 ) ? hours-12 : hours;
".
		"  hours = ( hours == 0 ) ? 12 : hours;".
		"  if (hours < 10) hours = '0' + hours;
";

	    echo "  dispTime = "$this->title "+d+"."+m+"."+y+" - "+hours + ":" + minutes + ":" + seconds + " " + ampm;
";

    echo 
    "  writeLayer( '$this->divid', dispTime );
".
    "  setTimeout("clock()", 1000);
}

";
    
    if( $this->bodyonload==false ) echo "  clock();
//-->
";
    
    echo "</script>
";
    
    if( $this->ok_head == false )
    {
      die("Servertime: InstallClockHead() is missing");
    }
    if( $this->ok_clock == false )
    {
      die("Servertime: InstallClock() is missing");
    }

  } // eof InstallClockBody

} // eoc ServerTime
?>
Stoneage ·

Warum benutzt du nicht USER_INT:

includeLibs.something = uploads/tf/myphpskript.php

32 = USER_INT
32.userFunc = user_myphpfunction

und dann kannst du alles in der php functin abfeiern!?

gruß,

Chi

sw-student ·

Erstemal vielen Dank für deine Antwort.

Hab jetzt mal soweit mein Template umgeschrieben:

page.includeLibs.servertime = fileadmin/data/scripts/inc_servertime.php
# DATUM
page.10.marks.DATUM = USER_INT
page.10.marks.DATUM.userFunc = // hier komme ich nicht weiter

Also, wenn ich das richtig sehe habe ich jetzt include 'inc_servertime.php' in typo umgesetzt.

<?php
include 'inc_servertime.php'; //abgehackt
$st = new servertime;
$st->InstallClockHead();
?>

...

        <?php
                $st->InstallClock();
                $st->InstallClockBody();
        ?>

Wie lasse ich jetzt die restlichen Funktionen ausführen. Vor Allem: Wie unterscheide ich zwischen header und bodytag?

page.10.marks.DATUM.userFunc = servertime -> InstallClock

so?

Danke schonmal für deine Bemühungen
Gruß [sw]

Stoneage ·

Hallo,

steht eigentlich alles in der TSREF drin. Aber folgendes:

1. alle funktionen müssen mit user_ im namen anfangen. dann kannst du mit dem obj und name der funktion diese aufrufen, also:

32 = USER_INT
32.userFunc = user_myphpfunction

2. da USER_INT wie jedes andere Obj ist, kannst du das bestimmt auch irgendwie in den Header schreiben, ich weiß aber nicht wie. In Body ist ja wohl kein Problem, oder? (einfach in den entsprechenden marker deiner seite einbinden). Aber ich glaube dieses InstallClockHead(); kannst du auch im body ausführen. Weil ist ja eigentlich egal wo das JS steht, oder?

Gruß,

Chi

sw-student ·

Hi!

Jetzt sieht's so aus:

page.includeLibs.servertime = fileadmin/data/scripts/inc_servertime.php
page.headerData.10 = USER_INT
page.headerData.10.userFunc = user_$st = new servertime;
page.headerData.11 = USER_INT
page.headerData.11.userFunc = user_$st->InstallClockHead

...

# DATUM
page.10{
               marks.DATUM = USER_INT
               marks.DATUM.1.userFunc = user_$st->InstallClock
               marks.DATUM.2.userFunc = user_$st->InstallClockBody
}

Leider regt sich immer noch nichts. Ich kapier nicht, wie ich $st erstellen lassen soll. Scheint ziemlich Bockmist zu sein, den ich im obigen Code produziert habe.

Sorry, für die blöden Fragen. Das kommt davon, wenn man nie php gelernt hat. :x

Kannst mir bitte nochmals auf die Sprünge helfen?

Gruß +sw+

Stoneage ·

Schmeiß die class definition raus, und nenn die funktion user_InstallClock und alle anderen auch.

dann schreibst du:

page.headerData.11.userFunc = user_InstallClock

das müste dann losgehen.

Grüße,

Chi

sw-student ·

Hmm, funktioniert so nüscht:

page.includeLibs.servertime = fileadmin/data/scripts/inc_servertime.php
#page.headerData.10 = USER_INT
#page.headerData.10.userFunc = user_$st = new servertime;
page.headerData.11 = USER_INT
page.headerData.11.userFunc = user_InstallClockHead

# DATUM
               marks.DATUM = USER_INT
               marks.DATUM.1.userFunc = user_InstallClock
               marks.DATUM.2.userFunc = user_InstallClockBody
class servertime {
...
}

kann ich nicht aus der PHP entfernen, da sonst ein Parse Error auftritt.

Stoneage ·

dann versuch folgendes (mit klassen habe ich dass auch nie gemacht)

nenn deine klasse user_servertime und mach so:

marks.DATUM.1.userFunc = user_servertime->user_InstallClock

wenn das nicht geht, mußt du das php skript etwas umschreiben (keine klasse also keine $this deklarationen usw., stimmt hatte ich beim erstenmal vergessen)

C.

sw-student ·

Ok, vielen Dank. Werd mich am Montag wieder intensiv dransetzten - jetzt ist erst mal Wochenende. 😉

Schönes Wochenende

Bis denn

sw-student ·

Nee ... aber wenn man morgens schon um 7 anfängt ... und zudem noch als Praktikant eingestellt ist, kann man sich sowas erlauben :p

Wie ersetz ich denn die $this? Kannst mir mal ein Beispiel für meine inc_servertime.php geben?

Stoneage ·

ganz normale variablen draus machen. $this ist immer nur ein Zeiger auf das aktuelle Objekt bei OOP. Also wenn deine Klasse zb. globale Variablen enthält (das sind die die außerhalb von allen functionen deklariert sind) kannst du mit $this->variable diese laden, speichern usw. eine instanz von einer klasse erstellst du ja mir new ().

$st ist in deinem skript eine Instanz von der Klasse servertime. deshalb must du $st->InstallClockHead(); schreiben. Durch die Vererbung weiss die Function InstallClockHead() das $this sich auf das Elternobjekt $st bezieht. Und kann die globalen Variablen richtig zuordenen.

du kannst ja einfach noch ein Objekt instantiieren und mit parallel laufen lassen. oder beliebig viele objekte. einfach

$st1 = new servertime;
$st2 = new servertime;
...
usw.

Bin aber auch nicht so fit in OOP. Das ist ein richtig mächtiges Konzept.

dk2k7 ·

Hallo sw-student,

hast Du das Script mittlerweile ans Laufen bekommen ?
Ich möchte dies auch gerne auf meine Typo3-Homepage einbauen ...

Für eine RÜckantwort wäre ich dankbar.

Gruß,
Daniel