<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>zeroseven labs &#187; PHP</title>
	<atom:link href="http://labs.zeroseven.de/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://labs.zeroseven.de</link>
	<description></description>
	<lastBuildDate>Wed, 28 Jul 2010 07:43:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>JavaScript-Fehler bei TMENU_LAYERS</title>
		<link>http://labs.zeroseven.de/development/typo3/javascript-fehler-bei-tmenu_layers/</link>
		<comments>http://labs.zeroseven.de/development/typo3/javascript-fehler-bei-tmenu_layers/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 08:59:07 +0000</pubDate>
		<dc:creator>albrechtk</dc:creator>
				<category><![CDATA[TYPO3]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[TMENU_LAYERS]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=840</guid>
		<description><![CDATA[Bei der Entwicklung eines neuen Projekts in TYPO3, verwendeten wir für ein Layer-Menü die fertige Komponente TMENU_LAYERS. In willkürlichen Intervallen tauchten JavaScript-Fehler auf und die Navigation konnte nicht benutzt werden. Im Internet Explorer tauchte ein Alert-Fenster mit der Meldung &#8220;Stack overflow&#8221; auf, während der Firefox zwar nicht mit einer penetranten Meldung nervte, aber dennoch einen [...]]]></description>
			<content:encoded><![CDATA[<p>Bei der Entwicklung eines neuen Projekts in TYPO3, verwendeten wir für ein Layer-Menü die fertige Komponente TMENU_LAYERS. In willkürlichen Intervallen tauchten JavaScript-Fehler auf und die Navigation konnte nicht benutzt werden. Im Internet Explorer tauchte ein Alert-Fenster mit der Meldung &#8220;Stack overflow&#8221; auf, während der Firefox zwar nicht mit einer penetranten Meldung nervte, aber dennoch einen Fehler &#8220;too much recursion&#8221; in die Fehlerkonsole schrieb.</p>
<p><span id="more-840"></span></p>
<p><a rel="lightbox[recursion]" href="http://labs.zeroseven.de/wp-content/uploads/2009/04/recursion-ie.png"><img class="alignnone size-full wp-image-841" style="vertical-align: top; border: 1px solid #656565;" src="http://labs.zeroseven.de/wp-content/uploads/2009/04/recursion-ie.png" alt="Stack overflow" width="203" height="119" /></a> <a rel="lightbox[recursion]" href="http://labs.zeroseven.de/wp-content/uploads/2009/04/recursion-firefox.png"><img class="alignnone size-thumbnail wp-image-842" style="vertical-align: top; border: 1px solid #656565;" src="http://labs.zeroseven.de/wp-content/uploads/2009/04/recursion-firefox-150x150.png" alt="too much recursion" width="150" height="150" /></a></p>
<p>Wie bereits erwähnt, tauchte der Fehler völlig unregelmäßig auf und ließ sich nicht reproduzieren. In so einem Fall ist eine Fehlersuche nahezu unmöglich, da man den Code von Grund auf analysieren und überarbeiten müsste. Auch eine Suche über Google zu diesem Problem ergab keine hilfreichen Ergebnisse.</p>
<p>Nach mehreren gescheiterten Ansätzen, das Problem in der JavaScript-Datei zu suchen und zu beheben, stolperte ich auf die Vergabe der IDs, mit denen JavaScript die HTML-Objekte ansprechen und ein- und ausblenden kann. Diese Vergabe findet in der Datei <code>tmenu_layers.php.inc</code> statt und sieht (vereinfacht) so aus:</p>
<pre>$this-&gt;WMid = substr(md5(microtime()),0,6);</pre>
<p>Das bedeutet, dass für jedes Element eine ID aus der Micro-Time generiert wird und von dem Hash lediglich die ersten 6 Stellen als ID benutzt werden. Ich weiß nicht genau, ob es an der Kürze des Hashes oder an den Millisekunden als Grundlage lag, aber diese Vorgehensweise zur ID-Generierung erzeugte Kollisionen und vergab die IDs hin und wieder an mehrere HTML-Elemente gleichzeitig.</p>
<p>Um diese Kollisionen zu verhindern, änderte ich die ID-Vergabe um und nahm die PHP-Funktion <code>uniqid()</code> als Grundlage. Diese Funktion basiert zwar auch auf der aktuellen Micro-Time, lässt sich aber mit einen Parameter dazu bringen, die Rückgabe zusätzlich mit einem Zufallswert zu erweitern. Da dieser Zufallswert mit einem <code>.</code> angehängt wird, dies aber einen JavaScript-Fehler verursachen würde, habe ich anschließend noch alle Punkte aus der Rückgabe entfernt.</p>
<p>Die neue ID-Vergabe in der Datei <code>tmenu_layers.php.inc</code> sieht jetzt (vereinfacht) so aus:</p>
<pre>$this-&gt;WMid = str_replace('.','',uniqid('',true));</pre>
<p>Seit dieser Änderung ist der JavaScript-Fehler nicht mehr aufgetaucht. Ich gehe also davon aus, dass es die korrekte Lösung war.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/typo3/javascript-fehler-bei-tmenu_layers/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PDF in PHP mit Seitenzahl generieren</title>
		<link>http://labs.zeroseven.de/development/pdf-in-php-mit-seitenzahl-generieren/</link>
		<comments>http://labs.zeroseven.de/development/pdf-in-php-mit-seitenzahl-generieren/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 11:06:16 +0000</pubDate>
		<dc:creator>albrechtk</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[FPDF]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=713</guid>
		<description><![CDATA[Um mit PHP automatisiert PDF-Dokumente erstellen zu können, bietet sich die kostenlose PHP-Klasse &#8220;FPDF&#8221; an. Diese Klasse erkennt automatisch, wann die aktuelle Seite voll ist und erzeugt dann selbstständig eine weitere Seite. Man braucht sich also vorher keine Gedanken über die Seitenanzahl machen. Jedoch ist es hilfreich, nach dem erzeugen des Dokuments, einen schnellen Überblick [...]]]></description>
			<content:encoded><![CDATA[<p>Um mit PHP automatisiert PDF-Dokumente erstellen zu können, bietet sich die kostenlose PHP-Klasse &#8220;<a href="http://www.fpdf.org/">FPDF</a>&#8221; an. Diese Klasse erkennt automatisch, wann die aktuelle Seite voll ist und erzeugt dann selbstständig eine weitere Seite. Man braucht sich also vorher keine Gedanken über die Seitenanzahl machen. Jedoch ist es hilfreich, nach dem erzeugen des Dokuments, einen schnellen Überblick zu haben, wie viele Seiten die Datei enthält und auf welcher Seit man sich befindet. Auch das ist mit FPDF kein Problem.</p>
<p><span id="more-713"></span></p>
<p><strong>Funktion beim Seitenwechsel automatisch aufrufen</strong></p>
<p>Wenn von FPDF eine neue Seite erzeugt oder das Dokument geschlossen wird, wird automatisch die Funktion <code>Footer()</code> aufgerufen. Diese Funktion ist erstmal leer, da FPDF aber schön objektorientiert funktioniert, ist es kein Problem diese Funktion zu überschreiben und den eigenen Bedürfnissen anzupassen.</p>
<p>Anstatt FPDF direkt zu instanziieren, arbeiten wir also mit einer Unterklasse, die wir an unsere Bedürfnisse anpassen können.</p>
<pre>&lt;?php
// so wuerden wir eine Instanz von FPDF erzeugen
// $pdf = new FPDF();

// wir erzeugen aber eine eigene Klasse ...
class MyFPDF extends FPDF {

	function Footer() {
		// ... some stuff to do ...
	}
}

// ... um diese dann zu verwenden
$pdf = new MyFPDF();

?&gt;</pre>
<p>In dieser <code>Footer()</code>-Funktion können wir Text auf das PDF-Dokument schreiben.</p>
<pre>function Footer() {
	$this-&gt;SetFont('Arial', 'B', 8);
	$this-&gt;Cell(0,10,'Seite A von B',0,0,'C');
}</pre>
<p><strong>Dynamische Seitenzahl</strong></p>
<p>Die aktuelle Seitenzahl kann mit der Funktion <code>PageNo()</code> ausgelesen werden und für die Anzahl der Gesamtseiten verwenden wir den Platzhalter <code>{nb}</code> &#8211; dazu später mehr.</p>
<pre>function Footer() {
	$this-&gt;SetFont('Arial', 'B', 8);
	$this-&gt;Cell(0,10,'Seite '.$this-&gt;PageNo().' von {nb}',0,0,'C');
}</pre>
<p><strong>Position der Anzeige</strong></p>
<p>Als nächsten Schritt Positionieren wir die Anzeige auf der Seite dort, wo wir sie erwarten. Nämlich unten. Allerdings müssen wir dazu den Margin-Bereich auf 0 setzen, da wir mit FPDF eigentlich nicht außerhalb dieses Bereichs schreiben dürfen. Die fertige <code>Footer()</code>-Funktion sieht dann wie folgt aus:</p>
<pre>function Footer() {
	$this-&gt;SetAutoPageBreak(true, 0); // set bottom margin to 0 mm
	$this-&gt;SetXY(10,277); // set position
	$this-&gt;SetFont('Arial', 'B', 7.98);
	$this-&gt;Cell(0,10,'Seite '.$this-&gt;PageNo().' von {nb}',0,0,'C');
	$this-&gt;SetAutoPageBreak(true, 20); // set bottom margin to 20 mm
}</pre>
<p>Zunächst wir der Margin-Bereich auf 0 gesetzt. Dann die Position für das Textfeld bestimmt, anschließend die Schriftart, -schnitt und -größe. Daraufhin wird das Textfeld mit Inhalt und einigen weiteren Parametern erzeugt. Und zum Schluss wird der Margin-Bereich wieder zurück gesetzt.</p>
<p><em><strong>Update</strong></em></p>
<p><em>Die Manipulation mit dem Margin-Bereich ist nicht nötig, wenn die Aktion in der Funktion Footer() erfolgt. Von dieser Funktion aus kann auch unterhalb des Bottom-Margins geschrieben werden.</em></p>
<p><strong>Gesamt-Anzahl der Seiten anzeigen</strong></p>
<p>Bis jetzt steht in der Ausgabe noch immer der Platzhalter <code>{nb}</code> anstatt der Gesamtzahl der Seiten. Um diesen Alias zu ersetzen muss die Funktion <code>AliasNbPages([string alias])</code> aufgerufen werden. Über den optionalen Parameter kann dabei der Name des Platzhalters definiert werden. Bleibt der Parameter leer, wird automatisch <code>{nb}</code> verwendet.</p>
<p>Hier also der Komplette Code:</p>
<pre>&lt;?php
// wir erzeugen eine eigene Klasse ...
class MyFPDF extends FPDF {

	function Footer() {
		$this-&gt;SetAutoPageBreak(true, 0); // set bottom margin to 0 mm
		$this-&gt;SetXY(10,277); // set position
		$this-&gt;SetFont('Arial', 'B', 7.98);
		$this-&gt;Cell(0,10,'Seite '.$this-&gt;PageNo().' von {nb}',0,0,'C');
		$this-&gt;SetAutoPageBreak(true, 20); // set bottom margin to 20 mm
	}
}

// ... um diese dann zu verwenden
$pdf = new MyFPDF();
$pdf-&gt;AliasNbPages();

?&gt;</pre>
<p>Weitere Informationen zu FPDF und den jeweiligen Funktionen gibt es auf der offiziellen Webseite: <a href="http://www.fpdf.org/">www.fpdf.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/development/pdf-in-php-mit-seitenzahl-generieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snapshots aus Flash</title>
		<link>http://labs.zeroseven.de/design/snapshots-aus-flash/</link>
		<comments>http://labs.zeroseven.de/design/snapshots-aus-flash/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 10:46:34 +0000</pubDate>
		<dc:creator>alexanders</dc:creator>
				<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[DESIGN]]></category>
		<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JPG]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PNG]]></category>
		<category><![CDATA[save]]></category>
		<category><![CDATA[Screenshot]]></category>

		<guid isPermaLink="false">http://labs.zeroseven.de/?p=611</guid>
		<description><![CDATA[Wie schon in einem früheren Blogbeitrag beschrieben, lassen sich Screenshots mit der Hilfe der Bitmap- und BitmapData-Klassen bewerkstelligen. Darauf aufbauend lassen sich diese Bilder auch weiter benutzen. Das heißt, die Bilder als PNG oder JPG in einen Browser laden, zum download bereit stellen oder wieder in Flash laden.

Zunächst werden die Bilddaten in ein BitmapData-Object gezeichnet, [...]]]></description>
			<content:encoded><![CDATA[<p>Wie schon in einem <a href="http://labs.zeroseven.de/2008/09/video-snapshot-in-flash/">früheren Blogbeitrag</a> beschrieben, lassen sich Screenshots mit der Hilfe der Bitmap- und BitmapData-Klassen bewerkstelligen. Darauf aufbauend lassen sich diese Bilder auch weiter benutzen. Das heißt, die Bilder als PNG oder JPG in einen Browser laden, zum download bereit stellen oder wieder in Flash laden.</p>
<p><span id="more-611"></span></p>
<p>Zunächst werden die Bilddaten in ein BitmapData-Object gezeichnet, welches den Abmessungen des Screenshots entspricht. Adobe hat mit seinen Klassen JPGEncoder und PNGEncoder zwei Klassen bereitgestellt, welche die Umrechnung in die jeweiligen Formate erledigt.  Dazu übergibt man der encode()-Methode der jeweiligen Klasse das erstellte BitmapData-Objekt als Parameter und bekommt als Rückgabewert einen ByteArray.</p>
<p>Der nächste Schritt, um den ByteArray zu einem Bild zu wandeln, ist die Kodierung des ByteArrays als String, um diesen an PHP  als POST-Daten senden zu können. Mit Hilfe der Klasse Base64 as dem Package com.dynamicflash.util wird der erstellte ByteArray in einen solchen String gewandelt. Das ganze geschieht mit der encodeByteArray-Methode, welche als Parameter eben diesen ByteArray bekommt und den dazu passenden String zurück liefert.</p>
<p>Als letzten Schritt dieser Prozedur wird nun der erstellte Bilddaten-String mittels PHP gesichert. Dazu wird ein neuer URLRequest erstellt welcher als method POST bekommt. Des weiteren ist eine URLVariable nötig, welche das Format (JPG, PNG), die Action (Load, Save, open in Browser), den Dateinamen sowie den Bilddaten-String enthält. Diese wird dem URLRequest zugewiesen. Sollte das Bild wieder in Flash geladen werden, ist hier ein Loader nötig, andernfalls reicht ein einfaches navigateToURL(urlRequest, &#8216;_blank&#8217;) um das Bild zu sichern oder in einen Browser zu laden.</p>
<p>Mit dieser Möglichkeit kann man direkt verschiedene Ansichten, Videos oder Animationen aus Flash heraus sichern. Einfache Grafikprogramme auf Flashbasis wären so möglich, aber auch Spiele in denen der User zu jedem beliebigen Zeitpunkt einen Screenshot der Szene machen kann. Auch kann das Bild wiederum über z.B. eine Matrix transformiert oder darauf verschiedenste Filter angewendet werden.</p>
]]></content:encoded>
			<wfw:commentRss>http://labs.zeroseven.de/design/snapshots-aus-flash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
