<?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>/home/antu &#187; Programmierung</title>
	<atom:link href="http://www.antusblog.de/category/programmierung/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.antusblog.de</link>
	<description>Linux, Programmierung und andere Dinge die mich interessieren</description>
	<lastBuildDate>Mon, 26 Oct 2009 06:00:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Der Trinitäts-Operator</title>
		<link>http://www.antusblog.de/2009/10/19/der-trinitats-operator/</link>
		<comments>http://www.antusblog.de/2009/10/19/der-trinitats-operator/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 11:08:37 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Dreifach konditionaler Operator]]></category>
		<category><![CDATA[Fragezeichenoperator]]></category>
		<category><![CDATA[Ternary-Operator]]></category>
		<category><![CDATA[Trinitäts-Operator]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=2087</guid>
		<description><![CDATA[Der Trinitäts-Operator kann verwendet werden, um Zuweisungen/Funktionsaufrufe in Verbindung mit einer Bedingung bzw. Abfrage stark zu verkürzen. Richtig eingesetzt erhöht er die Lesbarkeit des Quelltextes und vermindert die Schreibarbeit. In diesem Artikel wird erklärt, wie der Trinitäts-Operator (engl. Ternary Operator, auch Fragezeichenoperator oder dreifach konditionaler Operator genannt) funktioniert, und wie man ihn richtig anwendet. Funktionsweise [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/?p=2087"><img class="alignright size-full wp-image-2100" title="Der Trinitaets Operator" src="http://www.antusblog.de/wp-content/uploads/2009/10/Der.Trinitaets-Operator.png" alt="Der Trinitaets Operator" width="150" height="150" /></a>Der Trinitäts-Operator kann verwendet werden, um Zuweisungen/Funktionsaufrufe in Verbindung mit einer Bedingung bzw. Abfrage stark zu verkürzen. Richtig eingesetzt erhöht er die Lesbarkeit des Quelltextes und vermindert die Schreibarbeit.</p>
<p>In diesem Artikel wird erklärt, wie der Trinitäts-Operator (engl. Ternary Operator, auch Fragezeichenoperator oder dreifach konditionaler Operator genannt) funktioniert, und wie man ihn richtig anwendet.</p>
<p><span id="more-2087"></span></p>
<h2>Funktionsweise</h2>
<p>Der Trinitäts-Operator stellt im Grunde eine Fallunterscheidung in Verbindung mit einer Zuweisung oder einem Funktionsaufruf dar. Man möchte einer Variablen entweder Wert 1, oder Wert 2 zuweisen, abhängig von einer Bedingung. Oder: Man möchte, abhängig von einer Bedingung entweder Funktion X oder Funktion Y aufrufen. Dadurch, dass man sich das <code>if/else</code> sparen kann, und den Variablennamen nur einmal schreiben muss, wird das ganze nicht nur kürzer, sondern auch übersichtlicher.</p>
<h3>Abfrage/Zuweisung mit if</h3>
<p>Würde man eine solche Zuweisung mit einer normalen <code>if/else</code>-Abfrage realisieren, bräuchte man 5 Zeilen. Das sähe wie folgt aus:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">if (&lt;Bedingung&gt;) {
    &lt;Variable&gt; = &lt;Wert 1&gt;;
} else {
    &lt;Variable&gt; = &lt;Wert 2&gt;;
}</pre></div></div>

<h3>Abfrage/Zuweisung mit if (verkürzt)</h3>
<p>Eine solche <code>if</code>-Abfrage lässt sich natürlich noch verkürzen. Die geschweiften Klammern können weggelassen werden, und man kann alles in eine Zeile quetschen.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">if (&lt;Bedingung&gt;) &lt;Variable&gt; = &lt;Wert 1&gt;; else &lt;Variable&gt; = &lt;Wert 2&gt;;</pre></div></div>

<h3>Abfrage/Zuweisung mit dem Trinitäts-Operator.</h3>
<p>Mit dem Trinitäts-Operator wird die Zuweisung dann noch kürzer, und wenn man den Trinitäts-Operator kennt, ist auch sofort ersichtlich, was diese Zeile tut.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">&lt;Variable&gt; = (&lt;Bedingung&gt;) ? &lt;Wert 1&gt; : &lt;Wert 2&gt;;</pre></div></div>

<h3>Beispiel</h3>
<p>Und noch ein Beispiel, mit richtigen Werten.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Normale Form</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$antwort1</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">42</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$antwort2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1337</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Verkürzte Form</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$antwort1</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">42</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$antwort2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1337</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">else</span> <span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Trinitäts-Operator</span>
&nbsp;
<span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$antwort1</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">42</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$antwort2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1337</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></div></div>

<p>Man schreibt also zuerst die Bedingung (in Klammern), dann ein Fragezeichen und den Wert den die Variable annehmen soll, wenn die Bedingung wahr ist, dann einen Doppelpunkt, und den Wert für den Fall das die Bedingung unwahr ist.</p>
<h2>Noch kürzer</h2>
<p>Seit PHP 5.3 gibt es noch eine weitere Form des Trinitäts-Operators, mit der sich manche Zuweisungen noch weiter verkürzen lassen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>Variable<span style="color: #339933;">&gt;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&lt;</span>Variable<span style="color: #339933;">/</span>Bedingung<span style="color: #339933;">&gt;</span> ?<span style="color: #339933;">:</span> <span style="color: #339933;">&lt;</span>Wert<span style="color: #339933;">&gt;;</span></pre></div></div>

<p>Dabei wird <Variable/Bedingung> ausgewertet ob die Bedingung wahr ist, bzw. die Variable den booleschen Wert <code>true</code> hat (oder dazu umgewandelt werden kann). Ist das der Fall, bekommt die Variable den Wert der Bedingung zugewiesen, ansonsten den anderen Wert.</p>
<p>Hier noch ein Beispiel, welches das ganze vielleicht etwas besser verdeutlicht: </p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span> ?<span style="color: #339933;">:</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span></pre></div></div>

<p>Wenn <code>$_GET['id']</code> gesetzt, und ungleich <code>0</code> ist, nimmt <code>$id</code> den Wert von <code>$_GET['id']</code> an. Ansonsten bekommt <code>$id</code> den Wert <code>0</code>. Das <code>@</code> steht da, damit PHP nicht über eine undeklarierte Variable meckert, falls <code>$_GET['id']</code> nicht gesetzt ist.</p>
<h2>Funktionen aufrufen</h2>
<p>Der Trinitäts-Operator kann auch in Verbindung mit Funktionsaufrufen verwendet werden. Dabei ist es auch möglich mehrere Funktionen aufzurufen. Von letzterem rate ich allerdings ab, in den meisten Fällen wird das schnell unübersichtlich. Wie es funktioniert erkläre ich allerdings trotzdem: Um mehrere Funktionen im Trinitäts-Operator zu verwenden, müssen diese mittels <code>AND</code> verbunden werden, eine Trennung mittels Semikolon oder <code>&#038;&#038;</code> funktioniert nicht.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$allesrichtig</span> ? <span style="color: #b1b100;">print</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Alle Fragen wurden richtig beantwortet, super!&quot;</span><span style="color: #009900;">&#41;</span> AND
                <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Das Quiz ist zu Ende.&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #990000;">die</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Leider falsch!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Es ist übrigens auch möglich, den Trinitätsoperator innerhalb von Zeichenketten zu verwenden:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Bitte '</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$siezen</span> ? <span style="color: #0000ff;">'klicken Sie '</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">'klicke '</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'hier, '</span>
<span style="color: #339933;">.</span> <span style="color: #0000ff;">'um zur vorherigen Seite zurückzukehren'</span><span style="color: #339933;">;</span></pre></div></div>

<h2>So nicht!</h2>
<p>Der Trinitäts-Operator kann zwar verschachtelt werden, davon rate ich aber ab. Solche Zuweisungen werden schnell sehr unübersichtlich.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Unübersichtlich:</span>
<span style="color: #000088;">$allesrichtig</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$antwort1</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">42</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$antwort2</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1337</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$antwort3</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$antwort4</span><span style="color: #009900;">&#41;</span> ?
                <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span> <span style="color: #339933;">===</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> ? <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Beispiel-Datei</h2>
<p>Eine Beispieldatei, mit allen möglichen Formen der Verwendung des Trinitäts-Operators habe ich auch noch erstellt: <a href="/demos/11-der-trinitaets-operator/Beispiel.phps">Beispiel.phps</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/10/19/der-trinitats-operator/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Farbauswahl-Dialog mit ColorPicker</title>
		<link>http://www.antusblog.de/2009/09/27/farbauswahl-dialog-mit-colorpicker/</link>
		<comments>http://www.antusblog.de/2009/09/27/farbauswahl-dialog-mit-colorpicker/#comments</comments>
		<pubDate>Sun, 27 Sep 2009 16:59:33 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[ColorPicker]]></category>
		<category><![CDATA[Dialog]]></category>
		<category><![CDATA[Farbauswahl]]></category>
		<category><![CDATA[Farben]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1993</guid>
		<description><![CDATA[ColorPicker ist eine jQuery-Klasse, mit der ein Farbauswahl-Dialog erstellt werden kann, der dem Benutzer die Eingabe/Auswahl von Farben erleichtert. Der Dialog ist ähnlich aufgebaut wie der vieler Bildbearbeitungsprogramme, und hat einen ähnlichen Funktionsumfang.  Die Klasse steht unter der MIT- und der GPL-Lizenz. Colorpicker in Aktion (Demo) Webseite vom Colorpicker-Skript Benutzung Zuerst werden jQuery und die [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/09/jQuery.Color.Picker.png"><img class="aligncenter size-full wp-image-1994" title="jQuery ColorPicker" src="http://www.antusblog.de/wp-content/uploads/2009/09/jQuery.Color.Picker.png" alt="jQuery ColorPicker" width="500" height="200" /></a>ColorPicker ist eine jQuery-Klasse, mit der ein Farbauswahl-Dialog erstellt werden kann, der dem Benutzer die Eingabe/Auswahl von Farben erleichtert. Der Dialog ist ähnlich aufgebaut wie der vieler Bildbearbeitungsprogramme, und hat einen ähnlichen Funktionsumfang.  Die Klasse steht unter der MIT- und der GPL-Lizenz.</p>
<p style="padding-left: 30px;"><a href="/demos/9-farbauswahl-dialog-mit-colorpicker/colorpicker.xhtml">Colorpicker in Aktion (Demo)</a><br />
<a href="http://www.eyecon.ro/colorpicker/">Webseite vom Colorpicker-Skript</a></p>
<p><span id="more-1993"></span></p>
<h2>Benutzung</h2>
<p>Zuerst werden <code>jQuery</code> und die <code>colorpicker.js</code> eingebunden.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;js/jquery.js&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script src<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;js/colorpicker.js&quot;</span> type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Anschließend können HTML-Elemente mit dem Aufruf der ColorPicker-Funktion erweitert werden. Die Funktion akzeptiert einige Parameter, die aber alle optional sind. Ruft man die Funktion ohne Parameter auf, öffnet sich der Dialog beim Anklicken des Elements.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#element'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ColorPicker</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Möchte man eine Farbauswahl direkt auf der Seite anzeigen, verwendet man die <code>flat</code>-Option.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#farbauswahl'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ColorPicker</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    flat<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
    color <span style="color: #339933;">:</span> <span style="color: #3366CC;">'#123456'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Mit der <code>color</code>-Option lässt sich außerdem eine Farbe vorgeben.</p>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/09/Input.und.Color.Picker.png"><img class="aligncenter size-full wp-image-2010" title="Input.und.Color.Picker" src="http://www.antusblog.de/wp-content/uploads/2009/09/Input.und.Color.Picker.png" alt="Input.und.Color.Picker" width="370" height="220" /></a></p>
<p>Meistens möchte man die ausgewählte Farbe aber auch noch irgendwie weiterverarbeiten, beispielsweise in ein Formularfeld eintragen. Dazu eignen sich die Optionen <code>onSubmit</code> und <code>onChange</code>, die beim Abspeichern der Farbe (onSubmit) bzw. beim Verändern der Farbe (onChange) aufgerufen werden.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">ColorPicker</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    onSubmit <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>hsb<span style="color: #339933;">,</span> hex<span style="color: #339933;">,</span> rgb<span style="color: #339933;">,</span> element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// hsb = HSB-Farbraum als Objekt ({ 'h' : 100, 'b' : 200, 's' : 300})</span>
        <span style="color: #006600; font-style: italic;">// hex = Hexadezimale Schreibweise (#123456)</span>
        <span style="color: #006600; font-style: italic;">// rgb = RGB-Farbraum als Objekt ({ 'r' : 123, 'g' : 123, 'b' : 123})</span>
        <span style="color: #006600; font-style: italic;">// element = Das Element, an welches der ColorPicker angehangen wurde.</span>
        $<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">val</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#'</span> <span style="color: #339933;">+</span> hex<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Das sind die wichtigsten Optionen. Eine ausführlichere Beschreibung aller Optionen findet sich auf der Webseite von ColorPicker.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/09/27/farbauswahl-dialog-mit-colorpicker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Alternative PHP Cache</title>
		<link>http://www.antusblog.de/2009/08/12/der-alternative-php-cache/</link>
		<comments>http://www.antusblog.de/2009/08/12/der-alternative-php-cache/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 21:56:50 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Alternative PHP Cache]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[optimieren]]></category>
		<category><![CDATA[Zwischenspeicher]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1677</guid>
		<description><![CDATA[Der Alternative PHP Cache ist ein quelloffenes PHP-Modul, das die Ausführung des Quelltextes beschleunigt und eine Zwischenspeicherung von Daten ermöglicht. Der APC legt den kompilierten Code der aus einem PHP-Quelltext normalerweise beim jedem Aufruf erstellt wird in einem Zwischenspeicher ab, wodurch der zeitaufwendige Prozess des Kompilierens beim Aufrufen der Datei entfällt. Außerdem können Variablen und [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/08/APC.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/08/APC.png" alt="APC" title="APC" width="500" height="200" class="aligncenter size-full wp-image-1919" /></a><br />
Der Alternative PHP Cache ist ein quelloffenes PHP-Modul, das die Ausführung des Quelltextes beschleunigt und eine Zwischenspeicherung von Daten ermöglicht. Der APC legt den kompilierten Code der aus einem PHP-Quelltext normalerweise beim jedem Aufruf erstellt wird in einem Zwischenspeicher ab, wodurch der zeitaufwendige Prozess des Kompilierens beim Aufrufen der Datei entfällt. Außerdem können Variablen und Objekte im Zwischenspeicher gelagert werden, wodurch diese auch über mehrere Aufrufe hinweg verfügbar sind.</p>
<p><span id="more-1677"></span></p>
<h2>Geschwindigkeitsvergleich</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/APC.Artikel.von.Dominik.Deobald.png"><img class="alignright size-full wp-image-1732" title="Dominik Deobald vergleicht in seinem Artikel verschiedene Zwischenspeicher." src="http://www.antusblog.de/wp-content/uploads/2009/07/APC.Artikel.von.Dominik.Deobald.png" alt="Dominik Deobald vergleicht in seinem Artikel verschiedene Zwischenspeicher." width="150" height="150" /></a>Dominik Deobald vergleicht in seinem Artikel <a href="http://blogs.interdose.com/dominik/2008/04/11/benchmarking-php-eaccelerator-und-andere-opcode-caches/">Benchmarking PHP: eAccelerator und andere OpCode Caches</a> die Geschwindigkeit von PHP ohne Zwischenspeicher mit der Geschwindigkeit von 5 populären Zwischenspeichern. Neben APC werden auch eAccelerator, Zend und xCache getestet. Sein Fazit: Die Nutzung eines Zwischenspeichers lohnt sich, wie sehr die Geschwindigkeit sich verbessern lässt ist allerdings anwendungsabhängig. In seinen Tests schneidet der <a href="http://eaccelerator.net/">eAccelerator</a> etwas besser ab als APC.</p>
<h2>Installation von APC</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/06/APC.in.der.phpinfo.png"><img class="alignright size-thumbnail wp-image-1573" title="In der Ausgabe von phpinfo() findet sich auch ein Abschnitt über APC" src="http://www.antusblog.de/wp-content/uploads/2009/06/APC.in.der.phpinfo-150x150.png" alt="In der Ausgabe von phpinfo() findet sich auch ein Abschnitt über APC" width="150" height="150" /></a>Ab PHP 6 soll APC zu PHP standardmäßig dazugehören, zur Zeit ist es nur ein PECL-Modul, und muss erst installiert werden. Die meisten Linux-Distributionen bieten allerdings Pakete für APC an, was die Installation stark vereinfacht. Aber auch die Installation mittels PECL ist eigentlich nicht weiter schwer. Wie man den Zwischenspeicher installiert, und ihn in der <code>php.ini</code> aktiviert, erkläre ich im Artikel <a href="http://www.antusblog.de/?p=1508">Installation von APC</a>.</p>
<h2>APC richtig konfigurieren</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Konfiguration.png"><img class="alignright size-thumbnail wp-image-1579" title="Konfiguration von APC" src="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Konfiguration-150x130.png" alt="Konfiguration von APC" width="150" height="130" /></a>Die Standardkonfiguration von APC ist für die meisten Einsatzzwecke gut geeignet. Dennoch gibt es einige Optionen, die man vielleicht anpassen möchte. In meinem Artikel <a href="http://www.antusblog.de/?p=1669">Konfiguration von APC</a> erkläre ich die wichtigsten Optionen, und zeige eine Übersicht aller Einstellungsmöglichkeiten. Ich beschreibe beispielsweise wie man die Größe des Zwischenspeichers verändern kann, wie die Überwachung des Hochladevorgangs eingeschaltet wird, die Lebensdauer von Dateien im Zwischenspeicher eingestellt wird, und noch einiges mehr.</p>
<h2>Funktionen von APC</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/APC.Quelltext.png"><img class="alignright size-full wp-image-1740" title="Quelltext" src="http://www.antusblog.de/wp-content/uploads/2009/07/APC.Quelltext.png" alt="Quelltext" width="150" height="150" /></a>APC kann nicht nur die Geschwindigkeit von PHP erhöhen, indem es vorkompilierte Dateien zwischenspeichert. APC kann auch Variablen/Konstanten/Objekte im Zwischenspeicher ablegen, und diese über mehrere Aufrufe hinweg verfügbar machen. So können beispielsweise zeitaufwendige Datenbankabfragen eingespart werden. Außerdem bietet APC einige nützliche Funktionen, die einem nützliche Informationen über den Zwischenspeicher liefern, sowie die Möglichkeit geben Dateien/Variablen aus ihm zu entfernen. Welche Funktionen es gibt, und wie man sie benutzt, beschreibe ich im Artikel <a href="http://www.antusblog.de/?p=1686">Funktionen von APC</a>.</p>
<h2>APC überwachen</h2>
<div style="clear:both;"><a href="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Statistiken.png"><img class="alignright size-thumbnail wp-image-1598" title="Statistiken über die Speicherauslastung sowie die Trefferquote des Zwischenspeichers" src="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Statistiken-150x150.png" alt="Statistiken über die Speicherauslastung sowie die Trefferquote des Zwischenspeichers" width="150" height="150" /></a>Mit APC wird noch ein kleines PHP-Skript mitgeliefert, mit dem man den Zustand des Zwischenspeichers überwachen kann. Außerdem können damit im Zwischenspeicher gespeicherte Variablen und Dateien eingesehen und auch gelöscht werden. Wie dieses Skript benutzt wird, erkläre ich in meinem Artikel <a href="http://www.antusblog.de/?p=1667">APC: Status und Überwachung</a>.</div>
<div style="clear:both;">
<h2>Fortschrittsanzeige beim Hochladen von Dateien</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/08/Fortschrittsbalken.APC.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/08/Fortschrittsbalken.APC-150x150.png" alt="Ein roter Fortschrittsbalken" title="Ein roter Fortschrittsbalken" width="150" height="150" class="alignright size-thumbnail wp-image-1856" /></a>Mithilfe von APC ist es möglich Informationen über den Hochladevorgang von Dateien zu ermitteln, mit diesen Informationen lässt sich der Fortschritt anzeigen, beispielsweise in Form eines Fortschrittsbalkens. Wie das geht, beschreibe ich im Artikel <a href="http://www.antusblog.de/?p=1849">Fortschrittsanzeige beim Hochladen von Dateien</a>.</div>
<h2>Alternativen</h2>
<p>APC ist nicht der einzige Zwischenspeicher für PHP, es gibt noch einige andere. Einer davon ist <a href="http://xcache.lighttpd.net/">XCache</a>, der übrigens wie APC neben dem Zwischenspeicher für vorkompilierte Dateien noch über einen Variablen-Zwischenspeicher verfügt. Außerdem gibt es noch den <a href="http://eaccelerator.net/">eAccelerator</a>, und den <a href="http://www.zend.com/products/server/">Zend Cache</a>. Der IonCube PHP Accelerator und TurkMMCache sind ebenfalls Zwischenspeicher, diese werden allerdings schon seit längerer Zeit nicht mehr weiterentwickelt, und funktionieren nicht mehr mit neueren PHP-Versionen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/08/12/der-alternative-php-cache/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Funktionen von APC</title>
		<link>http://www.antusblog.de/2009/08/12/funktionen-von-apc/</link>
		<comments>http://www.antusblog.de/2009/08/12/funktionen-von-apc/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 21:47:24 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Alternative PHP Cache]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Funktionen]]></category>
		<category><![CDATA[Zwischenspeicher]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1686</guid>
		<description><![CDATA[APC kann nicht nur Dateien vorkompilieren und zwischenspeichern, sondern auch Variablen und Konstanten in einem Zwischenspeicher ablegen, und sie somit über mehrere Aufrufe hinweg verfügbar machen. Neben dem Auslesen, Speichern und Löschen von Variablen, Objekten und Konstanten, gibt es noch die Möglichkeit Informationen über den Zustand des Zwischenspeichers und darin gespeicherten Daten herauszufinden. Außerdem gibt [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Funktionen.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Funktionen.png" alt="Funktionen" title="Funktionen" width="500" height="200" class="aligncenter size-full wp-image-1909" /></a>APC kann nicht nur Dateien vorkompilieren und zwischenspeichern, sondern auch Variablen und Konstanten in einem Zwischenspeicher ablegen, und sie somit über mehrere Aufrufe hinweg verfügbar machen. Neben dem Auslesen, Speichern und Löschen von Variablen, Objekten und Konstanten, gibt es noch die Möglichkeit Informationen über den Zustand des Zwischenspeichers und darin gespeicherten Daten herauszufinden. Außerdem gibt es noch eine Funktion, die den Zwischenspeicher leert.</p>
<p><span id="more-1686"></span></p>
<h2>Variablen und Objekte</h2>
<p>Variablen, Objekte und Konstanten werden im sog. User Cache abgelegt, dabei muss ihnen ein einzigartiger Schlüssel zugewiesen werden. APC stellt Funktionen zum Speichern, Auslesen, Überschreiben und Löschen bereit. Bei Variablen und Objekten lässt sich eine Lebensdauer angeben, diese wird bei jedem Aufruf überprüft, wurde sie überschritten, wird die Variable aus dem Zwischenspeicher gelöscht. Hat die Lebensdauer den Wert 0 (Standard), ist sie unendlich, die Variable wird also nicht automatisch gelöscht (außer natürlich bei einem Neustart/Leeren des Zwischenspeichers).</p>
<p>Hinweis: Es ist nicht möglich, ein Feld von Objekten im Zwischenspeicher abzulegen. Das Feld wird zwar gespeichert, die darin befindlichen Objekte haben aber alle den Wert <code>NULL</code>. Es gibt allerdings einen Weg, trotzdem ein Feld von Objekten zu speichern, und zwar mit dem <code><a href="http://de3.php.net/manual/de/function.apc-store.php#73560">ArrayObject</a></code>.</p>
<h3>Speichern von Variablen/Objekten</h3>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_add(string Schlüssel, mixed Variable
             [, int Lebensdauer = 0])
bool apc_store(string Schlüssel, mixed Variable
               [, int Lebensdauer = 0])</pre></div></div>

<p>Diese Funktionen speichern eine Variable bzw. ein Objekt im Zwischenspeicher, der erste Parameter ist der Schlüssel/Name unter dem diese abgelegt wird. Der zweite Parameter ist die Variable selbst, der dritte (optional) gibt die Lebensdauer an. Die Funktion <code><a href="http://php.net/manual/de/function.apc-store.php">apc_store</a></code> überschreibt eine Variable, wenn der Schlüssel bereits vorhanden ist, <code><a href="http://php.net/manual/de/function.apc-add.php">apc_add</a></code> gibt in diesem Fall <code>false</code> zurück, ohne die Variable zu überschreiben.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// true (wenn die Variable noch nicht im Zwischenspeicher ist)</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>apc_add<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hallo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Hallo Welt'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// false, da der Schlüssel 'hallo' bereits existiert.</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>apc_add<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hallo'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">123</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hallo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Hallo Welt</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// apc_store überschreibt die Variable, wenn der Schlüssel bereits</span>
<span style="color: #666666; font-style: italic;">// existiert.</span>
apc_store<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hallo'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">456</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hallo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 456</span></pre></div></div>

<h3>Auslesen von Variablen/Objekten</h3>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">mixed apc_fetch(string Schlüssel [, bool &amp;Erfolg])
array apc_fetch(array Schlüssel [, bool &amp;Erfolg])</pre></div></div>

<p>Mit <code><a href="http://de.php.net/apc_fetch">apc_fetch</a></code> können die Daten wieder aus dem Zwischenspeicher ausgelesen werden. Der erste Parameter ist der Schlüssel, unter dem die Variable abgelegt ist. Die ausgelesenen Daten werden zurückgegeben, konnten keine Daten ausgelesen werden (z.B. weil der Schlüssel nicht existiert) wird <code>false</code> zurückgegeben.</p>
<p>Im zweiten Parameter kann eine Referenz auf eine Variable angegeben werden, die von APC bei erfolgreichem Auslesen auf <code>true</code>, ansonsten auf <code>false</code> gesetzt wird. Das ist ganz nützlich, da man ja auch Variablen vom Typ <code>boolean</code> (<code>true</code> oder <code>false</code>) im Zwischenspeicher ablegen kann, und man sonst nicht herausfinden könnte, ob der Rückgabewert <code>false</code> nun bedeutet das die Variable den Wert <code>false</code> hat, oder die Variable nicht ausgelesen werden konnte.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">apc_store<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Test'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">123</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Inhalt von 'Test': &quot;</span><span style="color: #339933;">,</span> apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 123</span>
<span style="color: #000088;">$erfolg</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Inhalt von 'ExistiertNicht': &quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ExistiertNicht'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$erfolg</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'$erfolg: '</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$erfolg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// false</span></pre></div></div>

<p>Es ist auch möglich mehrere Schlüssel auf einmal abzufragen, dazu übergibt man anstatt eines Schlüssels einfach ein Feld mit mehreren Schlüsseln.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Test'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hallo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>APC gibt dann ein Feld (Schlüssel =&gt; Wert) zurück. Wenn einer der Schlüssel ausgelesen werden konnte, gilt die Abfrage als erfolgreich, konnte kein Schlüssel ausgelesen werden, wird ein leeres Feld zurückgegeben, und <code>$Erfolg</code> ist trotzdem <code>true</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">array(2) { [&quot;Test&quot;]=&gt;  int(123)
           [&quot;hallo&quot;]=&gt;  int(456)
}</pre></div></div>

<h3>Löschen von Variablen/Objekten</h3>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_delete(string Schlüssel)</pre></div></div>

<p>Mit <code><a href="http://de3.php.net/manual/de/function.apc-delete.php">apc_delete</a></code> können Variablen/Objekte wieder aus dem Zwischenspeicher gelöscht werden.</p>
<h2>Konstanten</h2>
<p>Mit der Funktion <code><a href="http://php.net/manual/de/function.apc-define-constants.php">apc_define_constants</a></code> lässt sich ein Satz von Konstanten im Zwischenspeicher speichern. Mittels <code><a href="http://php.net/manual/de/function.apc-load-constants.php">apc_load_constants</a></code> kann dieser wieder ausgelesen werden. Jeder Satz von Konstanten bekommt einen Namen, es ist also auch möglich mehrere verschiedene Sätze von Konstanten zu speichern.</p>
<p>Das erstmalige Definieren der Konstanten, bzw. deren Eintragung im Zwischenspeicher dauert etwa doppelt so lange, als würde man <code><a href="http://php.net/define">define</a></code> verwenden, das Laden der Konstanten aus dem Zwischenspeicher ist allerdings drei mal so schnell wie <code>define</code>. Anschließend können die Konstanten verwendet werden, wie sonst auch.</p>
<h3>Definieren von Konstanten</h3>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_define_constants(string Schlüssel, array Konstanten
                          [, bool Groß- u. Kleinschreibung beachten = true])</pre></div></div>

<p>Die Funktion <code><a href="http://php.net/manual/de/function.apc-define-constants.php">apc_define_constants</a></code> erwartet zwei Parameter. Der erste ist der Name/Schlüssel unter dem der Satz von Konstanten gespeichert wird, der zweite ist ein Feld, welches die Konstanten enthält. Der dritte Parameter ist optional, und gibt an ob bei den Konstantennamen die Groß- und Kleinschreibung beachtet werden soll (also ob <code>KONSTANTE</code> und <code>Konstante</code> ein und die selbe Konstante sind (false) oder nicht (true)).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$konstanten</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ROT'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'#f00'</span><span style="color: #339933;">,</span>
                     <span style="color: #0000ff;">'GRUEN'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'#0f0'</span><span style="color: #339933;">,</span>
                     <span style="color: #0000ff;">'BLAU'</span>  <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'#00f'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
apc_define_constants<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'farben'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$konstanten</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bei Erfolg gibt die Funktion <code>true</code> zurück, ansonsten <code>false</code>.</p>
<h3>Konstanten auslesen</h3>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_load_constants(string Schlüssel
                        [, bool Groß- u. Kleinschreibung beachten = true])</pre></div></div>

<p>Mit <a href="http://php.net/manual/de/function.apc-load-constants.php"><code>apc_load_constants</code></a> können die gespeicherten Konstanten wieder ausgelesen werden, sie werden beim Auslesen automatisch definiert. Der erste Parameter gibt wieder den Schlüssel/Namen des Konstantensatzes an, der zweite, optionale Parameter, gibt an ob die Groß- und Kleinschreibung beachtet wird. Bei Erfolg wird <code>true</code>, ansonsten <code>false</code> zurückgegeben.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">apc_load_constants<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'farben'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Rot: &quot;</span><span style="color: #339933;">,</span> ROT<span style="color: #339933;">;</span></pre></div></div>

<h3>Konstanten aus dem Zwischenspeicher entfernen</h3>
<p>Um einen Satz von Konstanten wieder zu entfernen, kann die Funktion <code>apc_delete</code> verwendet werden.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">apc_delete<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'farben'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Informationen über den Zwischenspeicher</h2>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">array apc_cache_info([string Typ[, bool Limitiert]])
array apc_sma_info([bool Limitiert])</pre></div></div>

<p>Die Funktion <code><a href="http://us3.php.net/manual/en/function.apc-cache-info.php">apc_cache_info</a></code> kann verwendet werden, um Informationen über den Zwischenspeicher und darin enthaltene Dateien, Variablen, etc. zu erhalten. Der <code>Typ</code> gibt an, welche Art von Informationen zurückgegeben werden soll. Der Parameter <code>Limitiert</code> bestimmt, ob nur generelle Informationen (<code>true</code>) oder auch ein Feld mit Informationen über die einzelnen Dateien/Variablen (<code>false</code>) zurückgegeben werden soll.</p>
<p>Folgende Typen stehen zur Verfügung:</p>
<ul>
<li><a href="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_user.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_user-150x150.png" alt="Beispielausgabe von apc_cache_info(&#039;user&#039;);" title="Beispielausgabe von apc_cache_info(&#039;user&#039;);" width="150" height="150" class="alignright size-thumbnail wp-image-1755" /></a><code>"user"</code>: Informationen über den &#8220;User Cache&#8221;, also die Anzahl der gespeicherten Variablen, noch freie (verfügbare) Einträge, wie oft Variablen gespeichert wurden, wie viel Speicher die Variablen verbrauchen, etc. Ist die Ausgabe nicht limitiert, werden auch noch ausführliche Informationen über jede einzelne Variable zu dem Feld hinzugefügt.</li>
<li style="clear:both"><a href="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_filehits.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_filehits-150x150.png" alt="Beispielausgabe von apc_cache_info(&#039;user&#039;);" title="Beispielausgabe von apc_cache_info(&#039;user&#039;);" width="150" height="150" class="alignright size-thumbnail wp-image-1758" /></a><code>"filehits"</code>: Eine Liste von Dateien die für den aktuellen Aufruf aus dem Zwischenspeicher geholt wurden. (Funktioniert nur, wenn <code>--enable-apc-filehits</code> bei der Installation angegeben wurde.)</li>
<li style="clear:both"><a href="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_system.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/apc_cache_info_system-150x150.png" alt="Beispielausgabe von apc_cache_info();" title="Beispielausgabe von apc_cache_info();" width="150" height="150" class="alignright size-thumbnail wp-image-1760" /></a>Datei-Speicher: Wenn kein Typ oder ein ungültiger Typ angegeben wurde, gibt die Funktion Informationen über den Dateispeicher zurück. Zum Beispiel die Größe des Speichers, die Anzahl der Dateien, wie oft eine Datei nicht im Cache gefunden wurde, etc. Wenn die Ausgabe nicht limitiert ist, wird auch ein Feld mit Informationen über alle gespeicherten Dateien zurückgeliefert.</li>
</ul>
<p style="clear:both"><a href="http://www.antusblog.de/wp-content/uploads/2009/07/apc_sma_info.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/apc_sma_info-150x150.png" alt="Beispielausgabe von apc_sma_info();" title="Beispielausgabe von apc_sma_info();" width="150" height="150" class="alignright size-thumbnail wp-image-1767" /></a>Die Funktion <a href="http://de2.php.net/manual/en/function.apc-sma-info.php"><code>apc_sma_info</code></a> hingegen liefert Informationen über den benutzten Speicher. Sie gibt ein Feld zurück, mit Informationen darüber wie viele Segmente verwendet werden, wie groß diese sind, und wie viel Speicher insgesamt zur Verfügung steht. Ist die Ausgabe nicht limitiert, werden auch noch Informationen über die einzelnen Segmente zurückgegeben.</p>
<h2>Zwischenspeicher leeren</h2>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_clear_cache([string Typ])</pre></div></div>

<p>Um den Zwischenspeicher zu leeren, kann die Funktion <code>apc_clear_cache</code> verwendet werden. Hat der Parameter den Wert <code>user</code>, wird der Variablen/Objekte/Konstanten-Zwischenspeicher geleert, ansonsten wird der Zwischenspeicher für Dateien geleert. Gibt <code>true</code> bei Erfolg zurück, ansonsten <code>false</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">apc_clear_cache<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Datei kompilieren und zwischenspeichern</h2>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">bool apc_compile_file(string Dateiname)</pre></div></div>

<p>Mit <a href="http://de.php.net/manual/de/function.apc-compile-file.php">apc_compile_file</a> wird eine Datei kompiliert und im Zwischenspeicher gespeichert. In der Konfiguration eingestellte Filter werden dabei umgangen.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>apc_compile_file<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'datei.php'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Datei &gt;datei.php&lt; wurde im Zwischenspeicher abgelegt.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Fehler: Datei konnte nicht im Zwischenspeicher abgelegt werden.&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Die Funktion gibt bei Erfolg <code>true</code>, im Fehlerfall <code>false</code> zurück.</p>
<h2>Überprüfen ob APC verfügbar ist</h2>
<p>Wenn man überprüfen möchte, ob APC verfügbar ist, kann man mit <code>extension_loaded</code> einfach überprüfen ob die Erweiterung geladen ist. Wenn APC geladen ist, gibt die Funktion <code>true</code> zurück, ansonsten <code>false</code>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">extension_loaded</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'apc'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// true oder false</span></pre></div></div>

<p><em>Es gibt noch ein paar andere APC-Funktionen, wie beispielsweise <code>apc_inc</code>/<code>apc_dec</code>, diese sind allerdings leider (noch) nicht dokumentiert, weswegen ich diese hier nicht erklären werde. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/08/12/funktionen-von-apc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fortschrittsanzeige beim Hochladen von Dateien</title>
		<link>http://www.antusblog.de/2009/08/12/fortschrittsanzeige-beim-hochladen-von-dateien/</link>
		<comments>http://www.antusblog.de/2009/08/12/fortschrittsanzeige-beim-hochladen-von-dateien/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 21:29:20 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Alternative PHP Cache]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Dateien]]></category>
		<category><![CDATA[Fortschrittsanzeige]]></category>
		<category><![CDATA[Fortschrittsbalken]]></category>
		<category><![CDATA[hochladen]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1849</guid>
		<description><![CDATA[Das Hochladen von Dateien kann unter Umständen sehr lange, manchmal sogar Stunden dauern. Normalerweise gibt der Browser dem Benutzer aber keine Rückmeldung darüber, wie viele Daten schon hochgeladen wurden, bzw. wie lange der Vorgang noch dauern wird. Mit APC lassen sich während des Hochladevorgangs Informationen über selbigen ermitteln, und diese können benutzt werden um eine [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/08/Fortschrittsbalken.APC.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/08/Fortschrittsbalken.APC.png" alt="Ein roter Fortschrittsbalken" title="Ein roter Fortschrittsbalken" width="500" height="200" class="aligncenter size-full wp-image-1856" /></a>Das Hochladen von Dateien kann unter Umständen sehr lange, manchmal sogar Stunden dauern. Normalerweise gibt der Browser dem Benutzer aber keine Rückmeldung darüber, wie viele Daten schon hochgeladen wurden, bzw. wie lange der Vorgang noch dauern wird. Mit APC lassen sich während des Hochladevorgangs Informationen über selbigen ermitteln, und diese können benutzt werden um eine Fortschrittsanzeige für den Benutzer zu erstellen. Der Fortschritt könnte beispielsweise als Prozentwert, als Balken, oder als absoluter Wert (123/567 MiB) angezeigt werden. Eine Fortschrittsanzeige beim Hochladen steigert die Benutzerfreundlichkeit der Seite.</p>
<p>Wie man diese Funktionalität von APC benutzt, was vorausgesetzt wird, und welches Informationen APC liefern kann erkläre ich in diesem Artikel.</p>
<p><span id="more-1849"></span></p>
<h2>Voraussetzungen</h2>
<p>Um den Hochladevorgang mittels APC zu überwachen, bzw. Informationen über ihn zu erhalten, werden einige Dinge vorausgesetzt. Natürlich muss <strong>APC installiert und aktiviert</strong> sein. In der <a href="http://www.antusblog.de/?p=1669">APC-Konfiguration</a> muss die Option <strong><code>apc.rfc1867</code> auf <code>On</code></strong> stehen. Der Benutzer muss <strong>JavaScript</strong> in seinem Browser aktiviert haben, denn sonst kann der Fortschritt nicht mittels <strong>AJAX</strong> abgefragt werden. Außerdem muss das Hochlade-Formular um ein weiteres <strong><code>input</code>-Element</strong> erweitert werden. Als Ziel-Adresse für das Formular wird ein <strong><code>iframe</code></strong> verwendet.</p>
<p>Die Werte folgender beider APC-Optionen müssen bekannt sein:</p>
<ul>
<li>Der Präfix: <code>apc.rfc1867_prefix</code> (<code>upload_</code>)</li>
<li>Der Name des Formularelements: <code>apc.rfc1867_name</code> (<code>APC_UPLOAD_PROGRESS</code>)</li>
</ul>
<p>(Standardwerte in Klammern, wenn nichts an der Konfiguration geändert wurde, kann man davon ausgehen das APC diese Werte verwendet. Der Einfachheit halber verwende ich in dieser Anleitung in Beispielen immer die Standardwerte, wenn man andere Werte benutzt, müssen diese natürlich entsprechend angepasst werden.)</p>
<h2>Das Formular</h2>
<p>Das Hochlade-Formular muss etwas erweitert werden. Zuerst wird ein zusätzliches <code>input</code>-Element mit dem Namen <code>APC_UPLOAD_PROGRESS</code> erstellt, welches einen eindeutigen Wert zugewiesen bekommt. Über diesen Wert kann später der Hochladevorgang verfolgt werden, deshalb ist es auch wichtig, dass der Wert einzigartig ist, sonst funktioniert das ganze nicht mehr, wenn mehrere Benutzer gleichzeitig Dateien hochladen. Mit der PHP-Funktion <code><a href="http://de3.php.net/uniqid">uniqid()</a></code> ist das aber kein Problem, sie erstellt eindeutige IDs.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hidden&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;APC_UPLOAD_PROGRESS&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?php echo uniqid(); ?&gt;</span></span>&quot; /&gt;</pre></div></div>

<p>Wenn eine Datei hochgeladen wird, blockiert die Seite normalerweise, und der Benutzer kann nichts auf der Seite machen, bis die Datei vollständig hochgeladen wurde. Ist die Datei dann hochgeladen, bekommt der Benutzer die Ausgabe der Ziel-Seite (<code>action</code>) des Formulars zu sehen. Wenn man eine Fortschrittsanzeige erstellen möchte ist das natürlich ungünstig. Deshalb erstellt man ein <code>iframe</code>, und weist dem Formular dieses <code>iframe</code> als <code>target</code> zu. Dadurch wird die Ziel-Seite im <code>iframe</code> geladen, und die Formular-Seite blockiert nicht.</p>
<p>Das sollte man aber nur machen, wenn der Benutzer JavaScript aktiviert hat, und somit die Fortschrittsanzeige sehen kann. Deswegen wird die <code>target</code>-Eigenschaft dem Formular per JavaScript zugewiesen. Hat der Benutzer JavaScript deaktiviert, verhält sich das Formular wie jedes andere auch (ohne Fortschrittsanzeige, aber mit Blockieren), ist JavaScript aktiviert sieht der Benutzer die Fortschrittsanzeige und die Seite blockiert nicht.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">iframe</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;upload.php&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;versteckt&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;display:none;&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">iframe</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dateihochladen&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;upload.php&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>document.forms.dateihochladen.target = 'versteckt';<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>Fehlt nur noch der AJAX-Teil des ganzen. Vorher benötigt man allerdings noch eine PHP-Datei, die die Informationen über den Vorgang liefert.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Mittels <code>apc_fetch</code> werden die Informationen aus dem Zwischenspeicher ausgelesen, hierzu wird die eindeutige ID benötigt, welche man praktischerweise einfach über die URL überträgt und mittels <code>$_GET</code> abfragt. Anstatt das komplette Feld mit allen Informationen per <code>var_dump</code> auszugeben, kann man es natürlich auch per <code>json_encode</code> umwandeln (und dann gleich im JavaScript weiterverwenden), oder per PHP gleich die Fortschrittsanzeige in HTML ausgeben. Aber das ist jedem selbst überlassen.</p>
<p>Der AJAX-Teil ist auch nicht weiter schwer, man ruft einfach nach dem Absenden des Formulars in bestimmten Zeitintervallen die obige PHP-Datei ab, und verarbeitet die Informationen weiter, bzw. gibt sie aus. Komplett sieht das ganze dann so aus:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span>
<span style="color: #00bbdd;">                      &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span style="color: #000066;">dir</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ltr&quot;</span> <span style="color: #000066;">lang</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;de-DE&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Fortschrittsanzeige beim Hochladen von Dateien<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
    function aktualisiere() {
      var anfrage = null;
&nbsp;
      if (window.XMLHttpRequest) {
        anfrage = new XMLHttpRequest();
      }
      else if (window.ActiveXObject) {
        anfrage = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
      }
&nbsp;
      anfrage.onreadystatechange = function() {
       if ((anfrage.readyState == 4) <span style="color: #ddbb00;">&amp;&amp; (anfrage.status == 200)) {</span>
<span style="color: #ddbb00;">          document.getElementById('status').innerHTML = anfrage.responseText;</span>
        }
      }
&nbsp;
      anfrage.open('GET', 'status.php?id=' + 
                    document.forms.dateihochladen.APC_UPLOAD_PROGRESS.value);
      anfrage.send(null);
    }
&nbsp;
    function ladeHoch(elem) {
      elem.disabled = true;
&nbsp;
      setInterval('aktualisiere()', 1000);
    }
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stil.css&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>Dateien hochladen mit Fortschrittsanzeige<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">h1</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;inhalt&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">iframe</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;versteckt&quot;</span> <span style="color: #000066;">style</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;display:none;&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">iframe</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dateihochladen&quot;</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;upload.php&quot;</span> </span>
<span style="color: #009900;">            <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
        document.forms.dateihochladen.target = 'versteckt';
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
          <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>Datei<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">legend</span>&gt;</span>
          <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hidden&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;APC_UPLOAD_PROGRESS&quot;</span> </span>
<span style="color: #009900;">                 <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;&lt;?php echo uniqid(); ?&gt;</span></span>&quot; /&gt;
          <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
          <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Hochladen&quot;</span> </span>
<span style="color: #009900;">                 <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;ladeHoch(this);&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">fieldset</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;status&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>In der Form funktioniert das Skript bereits, es macht aber nichts anderes, als das von APC zurückgegebene Feld mit Informationen im <code>status-div</code> auszugeben. </p>
<h2>Welche Informationen bekommt man?</h2>
<p>Welche Informationen APC zurückgibt hängt davon ab, ob die Datei gerade hochgeladen wird, oder der Hochladevorgang bereits abgeschlossen ist. </p>
<p>Wird die Datei gerade hochgeladen, enthält das von APC zurückgegebene Feld folgende Informationen:</p>
<table>
<thead>
<tr>
<th>Element</th>
<th>Inhalt</th>
<th>Typ</th>
</tr>
</thead>
<tbody>
<tr>
<td>total</td>
<td>Größe der Datei in Bytes</td>
<td>int</td>
</tr>
<tr>
<td>current</td>
<td>Bereits hochgeladene Bytes</td>
<td>int</td>
</tr>
<tr>
<td>filename</td>
<td>Name der Datei</td>
<td>string</td>
</tr>
<tr>
<td>name</td>
<td>Name des Formularelement (Datei-Element)</td>
<td>string</td>
</tr>
<tr>
<td>done</td>
<td>Hochladen abgeschlossen?</td>
<td>int (0/1)</td>
</tr>
<tr>
<td>start_time</td>
<td>Wann wurde der Hochladevorgang begonnen (Unix-Zeitstempel)</td>
<td>float</td>
</tr>
</tbody>
</table>
<p>Wenn der Hochladevorgang abgeschlossen wurde, kommen noch folgende Elemente hinzu:</p>
<table>
<thead>
<tr>
<th>Element</th>
<th>Inhalt</th>
<th>Typ</th>
</tr>
</thead>
<tbody>
<tr>
<td>rate</td>
<td>Wie viele Bytes pro Sekunde übertragen wurden</td>
<td>float</td>
</tr>
<tr>
<td>temp_filename</td>
<td>Der temporäre Dateiname</td>
<td>string</td>
</tr>
<tr>
<td>cancel_upload</td>
<td>0 Wenn die Datei erfolgreich hochgeladen wurde, sonst >0 (Fehlercode)</td>
<td>int</td>
</tr>
</tbody>
</table>
<h2>Mehrere Dateien hochladen?</h2>
<p>Es ist auch möglich den Hochladevorgang von mehreren Dateien zu überwachen, man kann aber erst nach dem Hochladen feststellen, wie groß jede einzelne Datei war/ist, da APC die Dateigrößen zusammenrechnet. Braucht man diese Information unbedingt, kann man mehrere Formulare mit je einer Datei, und unterschiedlichen APC_UPLOAD_PROGRESS-IDs erstellen.</p>
<h2>Wie erstelle ich denn jetzt einen Fortschrittsbalken?</h2>
<p>Wie man Fortschrittsbalken erstellt, habe ich in <a href="http://www.antusblog.de/2009/07/27/fortschrittsbalken-mit-cssjavascript/">diesem Artikel</a> beschrieben. Man könnte obiges Skript wie folgt modifizieren um einen Fortschrittsbalken zu implementieren (ich verwende in diesem Beispiel die dwProgressBar):<br />
<strong>status.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">echo</span> <span style="color: #990000;">json_encode</span><span style="color: #009900;">&#40;</span>apc_fetch<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'upload_'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>hochladen.php</strong></p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- [...] --&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mootools-1.2.3-core-yc.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dwprogressbar.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
			function aktualisiere() {
				var anfrage = null;
&nbsp;
				if (window.XMLHttpRequest) {
					anfrage = new XMLHttpRequest();
				}
				else if (window.ActiveXObject) {
					anfrage = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
				}
&nbsp;
				anfrage.onreadystatechange = function() {
					if ((anfrage.readyState == 4) <span style="color: #ddbb00;">&amp;&amp; (anfrage.status == 200)) {</span>
<span style="color: #ddbb00;">						var ergebnis = eval('(' + anfrage.responseText + ')');</span>
						if (ergebnis.done == 1) {
							if (ergebnis.cancel_upload == 0) {
								document.getElementById('status').innerHTML = 'Hochgeladen!';
							}
							else {
								document.getElementById('status').innerHTML = 'Fehler/Abgebrochen.';
							}
						}
						else {
							//document.getElementById('status').innerHTML = Math.round((ergebnis.current * 100) / ergebnis.total) + '%';
							document.fsb.set(Math.round((ergebnis.current * 100) / ergebnis.total));
						}
					}
				}
&nbsp;
				anfrage.open('GET', 'status.php?id=' + document.forms.dateihochladen.APC_UPLOAD_PROGRESS.value);
				anfrage.send(null);
			}
&nbsp;
			function ladeHoch(elem) {
				elem.disabled = true;
&nbsp;
				document.fsb = new dwProgressBar({
					container: $('status'),
					startPercentage: 0,
					speed: 1000,
					boxID: 'rahmen',
					percentageID: 'balken',
					step: 10,
					allowMore:0,
					displayID: 'text',
					displayText: true
				});
&nbsp;
				setInterval('aktualisiere()', 1000);
			}
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
		<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span>&gt;</span>
			#rahmen {
				background:url('gfx/normal.png') right center no-repeat; width:300px; height:30px;
				display:inline-block;
			}
			#balken {
				background:url('gfx/farbig.png') left center no-repeat; height:30px;
			}
			#text {
				font-size:16px;
				line-height:20px;
				vertical-align:top;
				padding-left:10px;
				display:inline-block;
			}
		<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- [...] --&gt;</span></pre></div></div>

<p><em>Ich hoffe ich konnte euch einen kleinen Einblick in das Thema Fortschrittsanzeige beim Hochladen von Dateien geben. Anhand dieses Artikels (und der vorangehenden zum Thema APC/Dateien hochladen) sollte es möglich sein, ein individuelles Formular zum Hochladen von Dateien, mit Fortschrittsbalken, etc. zu erstellen. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/08/12/fortschrittsanzeige-beim-hochladen-von-dateien/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Konfiguration von APC</title>
		<link>http://www.antusblog.de/2009/08/12/konfiguration-von-apc/</link>
		<comments>http://www.antusblog.de/2009/08/12/konfiguration-von-apc/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 21:14:13 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Alternative PHP Cache]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Konfiguration]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1669</guid>
		<description><![CDATA[Die Standardkonfiguration von APC ist für die meisten Systeme gut geeignet. Möchte man dennoch etwas an der Konfiguration ändern, muss man die im folgenden beschriebenen Optionen einfach in eine PHP-Konfigurationsdatei (beispielsweise php.ini oder apc.ini) eintragen. Die drei wichtigsten Einstellungen sind wohl die Größe des Zwischenspeichers, die Überwachung des Hochladevorgangs von Dateien, und ob APC bei [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Konfiguration.png"><img class="aligncenter size-full wp-image-1579" title="Konfiguration von APC" src="http://www.antusblog.de/wp-content/uploads/2009/06/APC.Konfiguration.png" alt="Konfiguration von APC" width="500" height="130" /></a>Die Standardkonfiguration von APC ist für die meisten Systeme gut geeignet. Möchte man dennoch etwas an der Konfiguration ändern, muss man die im folgenden beschriebenen Optionen einfach in eine PHP-Konfigurationsdatei (beispielsweise <code>php.ini</code> oder <code>apc.ini</code>) eintragen.</p>
<p>Die drei wichtigsten Einstellungen sind wohl die Größe des Zwischenspeichers, die Überwachung des Hochladevorgangs von Dateien, und ob APC bei jeder Anfrage überprüfen soll, ob eine Datei modifiziert wurde.</p>
<p><span id="more-1669"></span></p>
<h3>Die Größe des Zwischenspeichers</h3>
<p>Die Größe des Zwischenspeichers lässt sich über die Konfigurationsoptionen <code>apc.shm_size</code> und <code>apc.shm_segments</code> einstellen. Erstere legt fest wie groß ein gemeinsames Speichersegment (Shared Memory) sein darf, letztere legt fest aus wie vielen solchen Segmenten der Zwischenspeicher besteht. Bei manchen Betriebssystemen können solche Speichersegmente nur wenige Megabytes groß sein, weswegen entweder mehrere Segmente verwendet werden müssen, oder die Betriebssystemkonfiguration angepasst werden muss. Linux hat standardmäßig eine maximale Segmentgröße von 32 MiB, BSD von 4 MiB.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">; 2 Segmente von je 30 MiB = 60 MiB
apc.shm_size = 30
apc.shm_segments = 2</pre></div></div>

<h3>Hochladen von Dateien</h3>
<p>Ist <code>apc.rfc1867</code> eingeschaltet (<code>On</code>), legt APC beim Hochladen von Dateien einen Eintrag im Zwischenspeicher ab, der Informationen über den Hochladevorgang enthält. Mit diesen Daten lässt sich beispielsweise eine Fortschrittsanzeige realisieren. Damit APC einen solchen Eintrag erstellt, muss das Formular allerdings ein Feld mit einem bestimmten Namen, standardmäßig <code>APC_UPLOAD_PROGRESS</code>, haben. APC erstellt dann einen Eintrag im Zwischenspeicher mit dem Namen <code>upload_&lt;Schlüssel&gt;</code> wobei der Schlüssel dem Wert der <code>value</code>-Eigenschaft des Formularfeldes entspricht.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">; Es sollen Informationen über den Hochladevorgang gespeichert werden.
apc.rfc1867 = On
; Benutze upload_ als Präfix für den Eintrag im Zwischenspeicher.
apc.rfc1867_prefix = upload_
; Name des versteckten Formularelementes, welches diese Funktionalität aktiviert.
apc.rfc1867_name APC_UPLOAD_PROGRESS
; Wie oft sollen die Informationen aktualisiert werden?
; 0 = So oft wie möglich. (Kann den Hochladevorgang verlangsamen)
; % = % der Dateigröße (z.B. 2% = alle 2% wird aktualisiert)
; &lt;Zahl&gt;&lt; ,k,m,g&gt; Nach  Bytes, Kilobytes, Megabytes oder Gigabytes.
apc.rfc1867 = 50k</pre></div></div>

<p>Mehr Informationen zu dieser Funktion finden sich im Artikel <a href="http://www.antusblog.de/?p=1849">Fortschrittsanzeige beim Hochladen von Dateien</a>. </p>
<h3>Wurde die Datei modifiziert?</h3>
<p>Die Option <code>apc.stat</code> gibt an, ob bei jedem Aufruf überprüft werden soll, ob die Datei im Zwischenspeicher auch der Datei auf der Festplatte entspricht. Ist diese Option abgeschaltet (<code>Off</code>), wird keine Überprüfung durchgeführt, was zwar die Geschwindigkeit merklich verbessert, es aber auch nötig macht den Zwischenspeicher neu aufzubauen, damit die Änderungen am Quelltext einer Datei wirksam werden.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">apc.stat = On</pre></div></div>

<p>Auch wenn diese Option abgeschaltet ist, werden mit relativem Pfad <a href="http://www.antusblog.de/2009/05/30/dateien-einbinden-inkludieren-2/">inkludierte Dateien</a> beim Inkludieren vorher überprüft. Bei absoluten Pfaden (also solchen die mit einem / beginnen), ist das nicht der Fall.</p>
<h4>Viele gleichzeitige Zugriffe</h4>
<p>Beim Starten von stark ausgelasteten Servern bzw. wenn viele Dateien modifiziert wurden, kann es passieren, dass mehrere Prozesse versuchen die gleiche Datei für den Zwischenspeicher zu kompilieren. Mittels <code>apc.write_lock</code> wird festgelegt, dass in diesem Fall nur ein Prozess die Datei zwischenspeichert, während die anderen Prozesse die noch nicht-zwischengespeicherte Datei einfach nur ausliefern. Ist die Option abgeschaltet, müssten die anderen Prozesse auf den ersten warten.</p>
<h4>Überschreiben von Dateien</h4>
<p>Wenn man eine Datei überschreibt, kann es passieren, das genau in dem Moment ein Zugriff auf diese Datei erfolgt. In dem Fall würde der Benutzer wahrscheinlich eine fehlerhafte Seite sehen (zum Teil die neue Datei, zum Teil noch die alte). Die Option <code>apc.file_update_protection</code> schützt davor, das eine erst zum Teil auf die Festplatte geschriebene Datei zwischengespeichert wird. Der Benutzer der in dem ungünstigen Moment auf die Datei zugreift bekommt zwar trotzdem eine fehlerhafte Seite ausgeliefert, aber die fehlerhafte Seite landet nicht im Zwischenspeicher.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">; Um in den Zwischenspeicher zu kommen muss eine Datei min. 2 Sekunden alt sein.
apc.file_update_protection = 2</pre></div></div>

<p>Auf Systemen mit hoher Festplattenauslastung ist es sinnvoll diesen Wert noch etwas zu erhöhen. Wenn man sich sicher ist, das Dateien immer <a href="http://de.wikipedia.org/wiki/Atomar#Informatik">atomar</a> überschrieben werden, kann dieser Wert auf 0 gesenkt werden. (Beispielsweise wenn man die neue Datei erst in eine temporäre Datei schreibt und sie dann umbenennt.)</p>
<h3>Lebenszeit von Dateien</h3>
<p>Da die Größe des Zwischenspeichers begrenzt ist, könnte es unter Umständen passieren, dass dieser voll wird und kein Platz mehr für neue Dateien/Variablen ist. APC bietet allerdings die Möglichkeit Dateien oder Variablen auf die eine bestimmte Zeit lang nicht mehr zugegriffen wurde, aus dem Zwischenspeicher zu nehmen, um wieder Platz zu schaffen. Diese Funktion wird durch die Optionen <code>apc.ttl</code> (für Dateien) und <code>apc.user_ttl</code> (für Variablen) beeinflusst, welche festlegen, wie lange eine Datei/Variable nicht mehr aufgerufen werden darf bevor sie entfernt wird. Ist dieser Wert 0, ist die Funktion abgeschaltet. In diesem Fall wird der Zwischenspeicher komplett geleert, wenn er voll ist.</p>
<p>Außerdem gibt es noch <code>apc.gc_ttl</code>, wodurch bestimmt wird, wie oft APC den Zwischenspeicher auf veraltete Dateien überprüft, bzw. diese löscht.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">apc.ttl = 0
apc_user_ttl = 0
apc.gc_ttl = 3600</pre></div></div>

<h3>Filtern von Dateien</h3>
<p>Standardmäßig speichert APC alle aufgerufenen PHP-Dateien im Zwischenspeicher. Mithilfe von Filtern kann man aber einstellen, das nur bestimmte Dateien zwischengespeichert werden, bzw. bestimmte Dateien nicht in den Zwischenspeicher kommen. Dazu wird die Option <code>apc.filters</code> verwendet, diese erwartet eine durch Komma getrennte Liste von regulären Ausdrücken. Ein + oder ein &#8211; vor jedem Ausdruck legt fest ob auf den Ausdruck passende Dateien zwischengespeichert werden (+) oder nicht gespeichert werden (-). Wird das Plus/Minus weggelassen, wird Minus angenommen.</p>
<p>Die Option <code>apc.cache_by_default</code> gibt an ob APC standardmäßig alle PHP-Dateien zwischenspeichert, oder keine. Mit <code>apc.max_file_size</code> können außerdem Dateien ab einer bestimmten Größe vom Zwischenspeicher ausgeschlossen werden.</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">; Alle Dateien zwischenspeichern
apc.cache_by_default = 1
; Ausser: Dateien in /nicht_zwischenspeichern/ und
; die Datei mit dem Namen blablabla.php
apc.filters = &quot;/nicht_zwischenspeichern/.*,blablabla\.php&quot;
; Keine Datei groesser als 1 MB
apc.max_file_size = 1M</pre></div></div>

<p>Hinweis: Beim Inkludieren von Dateien wird dieser Filter auf den Dateinamen der in der include-Anweisung steht angewendet, nicht auf den absoluten Pfad der Datei.</p>
<h3>Tabelle: Alle Optionen</h3>
<p>In dieser Übersicht stehen noch mal alle Optionen, mit den Standardwerten und einer sehr kurzen Beschreibung. Eine ausführlichere Beschreibung der Optionen findet sich im <a href="http://de.php.net/manual/de/apc.configuration.php">PHP-Handbuch</a>. Wenn bei Zeitangaben keine Einheit dabei steht, sind Sekunden gemeint.</p>
<table>
<thead>
<tr>
<th>Option</th>
<th>Standardwert</th>
<th>Beschreibung</th>
</tr>
</thead>
<tbody>
<tr>
<td>apc.enabled</td>
<td>1</td>
<td>APC aktivieren (1) bzw. deaktivieren (0).</td>
</tr>
<tr>
<td>apc.enable_cli</td>
<td>0</td>
<td>Schaltet APC auch für die Kommandozeile an. (Eigentlich nur für Testzwecke sinnvoll.)</td>
</tr>
<tr>
<td>apc.shm_size</td>
<td>30</td>
<td>Größe eines Speichersegmentes in MiB.</td>
</tr>
<tr>
<td>apc.shm_segments</td>
<td>1</td>
<td>Anzahl von Speichersegmenten für den Zwischenspeicher (Segmente * Segmentgröße = Größe des Zwischenspeichers)</td>
</tr>
<tr>
<td>apc.num_files_hint</td>
<td>1000</td>
<td>Hinweis für APC, wie viele Dateien ungefähr im Zwischenspeicher gelagert werden. Wenn man sich nicht sicher ist, kann man hier auch 0 eintragen.</td>
</tr>
<tr>
<td>apc.user_entries_hint</td>
<td>4096</td>
<td>Hinweis, wie viele Variablen im Zwischenspeicher gespeichert werden. Auch hier kann 0 eingetragen werden, wenn man sich nicht sicher ist.</td>
</tr>
<tr>
<td>apc.ttl</td>
<td>0</td>
<td>Wie lange eine Datei nicht mehr aufgerufen werden darf bevor sie aus dem Zwischenspeicher entfernt wird. (0 = Funktion deaktiviert)</td>
</tr>
<tr>
<td>apc.user_ttl</td>
<td>0</td>
<td>Wie &lt;apc.ttl&gt;, nur für Variablen.</td>
</tr>
<tr>
<td>apc.gc_ttl</td>
<td>3600</td>
<td>Gibt an, in welchen Zeitabständen veraltete Dateien aus dem Zwischenspeicher entfernt werden.</td>
</tr>
<tr>
<td>apc.cache_by_default</td>
<td>1</td>
<td>Standardmäßig alle/keine Datei zwischenspeichern.</td>
</tr>
<tr>
<td>apc.filters</td>
<td>&#8220;&#8221;</td>
<td>Filter (welche Datei zwischengespeichert wird/welche nicht.)</td>
</tr>
<tr>
<td>apc.max_file_size</td>
<td>1M</td>
<td>Max. Dateigröße. Größere Dateien kommen nicht in den Zwischenspeicher.</td>
</tr>
<tr>
<td>apc.stat</td>
<td>1</td>
<td>Bei jedem Aufruf überprüfen ob die Datei im Zwischenspeicher auch der auf der Festplatte entspricht.</td>
</tr>
<tr>
<td>apc.write_lock</td>
<td>1</td>
<td>Bei mehreren gleichzeitigen Zugriffen auf eine nicht-zwischengespeicherte Datei: Ein Prozess kompiliert, die anderen liefern die Datei so aus anstatt darauf zu warten, das der erste Prozess fertig wird.</td>
</tr>
<tr>
<td>apc.stat_ctime</td>
<td>0</td>
<td>Normalerweise wird nur überprüft, wann die Datei zuletzt verändert wurde, ist diese Option eingeschaltet wird auch überprüft wann die Datei erstellt wurde. (Behebt einige Probleme mit svn/rsync.)</td>
</tr>
<tr>
<td>apc.file_update_protection</td>
<td>2</td>
<td>Dateien erst ab einem Alter von X Sekunden zwischenspeichern.</td>
</tr>
<tr>
<td>apc.rfc1867</td>
<td>0</td>
<td>Hochladevorgang von Dateien überwachen.</td>
</tr>
<tr>
<td>apc.rfc1867_prefix</td>
<td>upload_</td>
<td>Präfix für den Eintrag im Zwischenspeicher.</td>
</tr>
<tr>
<td>apc.rfc1867_name</td>
<td>APC_UPLOAD_PROGRESS</td>
<td>Name des versteckten Formularelements.</td>
</tr>
<tr>
<td>apc.rfc1867_freq</td>
<td>0</td>
<td>Frequenz der Aktualisierungen.</td>
</tr>
<tr>
<td>apc.include_once_override</td>
<td>0</td>
<td>include_once- und require_once-Anweisungen optimieren.</td>
</tr>
<tr>
<td>apc.report_autofilter</td>
<td>0</td>
<td>Aufgrund von Problemen mit früher/später Bindung nicht-zwischengespeicherte Dateien protokollieren.</td>
</tr>
<tr>
<td>apc.mmap_file_mask</td>
<td>NULL</td>
<td>Die Dateimaske für <code>mktemp</code>, anhand der entschieden wird, ob das Speicherabbild Shared Memory- oder dateisystemgestützt ist.</td>
</tr>
<tr>
<td>apc.localcache</td>
<td>0</td>
<td>Aktiviert einen Sperr-freien &#8220;shadow-cache&#8221; (Prozess-lokal). Dadurch wird das Warten auf die <a href="http://de.wikipedia.org/wiki/Lock">Sperre</a> beim Schreiben in den Zwischenspeicher vermindert.</td>
</tr>
<tr>
<td>apc.localcache.size</td>
<td>512</td>
<td>Größe des &#8220;shadow-cache&#8221;, es wird empfohlen hier die Hälfte von <em>apc.num_files_hint</em> zu verwenden.</td>
</tr>
<tr>
<td>apc.coredump_unmap</td>
<td>0</td>
<td>APC versucht bei einem fatalen Fehler zu verhindern, das der Zwischenspeicher mit im <a href="http://de.wikipedia.org/wiki/Dump">Speicherauszug</a> (der für Zwecke der Fehlerdiagnose erstellt wird) landet. Bei einem großen Zwischenspeicher kann ein fataler Fehler sonst die Systemstabilität beeinträchtigen. Diese Funktion ist allerdings auch nicht ganz ungefährlich, da sie im Falle eines fatalen Fehlers zu undefiniertem Verhalten führen kann.</td>
</tr>
</tbody>
</table>
<p>Einige Optionen sind veraltet, und sollten nicht mehr verwendet werden.</p>
<ul>
<li>apc.optimization</li>
<li>apc.slam_defense <em>(anstatt dessen sollte apc.write_lock verwendet werden.)</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/08/12/konfiguration-von-apc/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Installation von APC</title>
		<link>http://www.antusblog.de/2009/08/12/installation-von-apc/</link>
		<comments>http://www.antusblog.de/2009/08/12/installation-von-apc/#comments</comments>
		<pubDate>Wed, 12 Aug 2009 20:45:59 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Alternative PHP Cache]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Installation]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PEAR]]></category>
		<category><![CDATA[Zwischenspeicher]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1508</guid>
		<description><![CDATA[APC ist eine PECL-Erweiterung, die nicht zum Installationsumfang von PHP 5 gehört. Ab PHP 6 soll APC standardmäßig in PHP enthalten sein. Ob APC bereits installiert ist, kann man in der Ausgabe von phpinfo() sehen. Es gibt zwei Möglichkeiten APC zu installieren: Entweder man installiert es über die Paketverwaltung der verwendeten Linux-Distribution, was die Vorteile [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/06/APC.in.der.phpinfo.png"><img class="aligncenter size-full wp-image-1573" title="In der Ausgabe von phpinfo() findet sich auch ein Abschnitt über APC" src="http://www.antusblog.de/wp-content/uploads/2009/06/APC.in.der.phpinfo.png" alt="In der Ausgabe von phpinfo() findet sich auch ein Abschnitt über APC" width="430" height="200" /></a></p>
<p>APC ist eine PECL-Erweiterung, die nicht zum Installationsumfang von PHP 5 gehört. Ab PHP 6 soll APC standardmäßig in PHP enthalten sein. Ob APC bereits installiert ist, kann man in der Ausgabe von <code>phpinfo()</code> sehen. </p>
<p><span id="more-1508"></span></p>
<p>Es gibt zwei Möglichkeiten APC zu installieren: Entweder man installiert es über die Paketverwaltung der verwendeten Linux-Distribution, was die Vorteile hat, das man sich über die Abhängigkeiten keine Gedanken machen muss, und das es von der Paketverwaltung (meistens) schon automatisch aktiviert wird. Die andere Möglichkeit ist die Installation mittels PECL.</p>
<h2>Installation über die Paketverwaltung</h2>
<p>Viele Distributionen bieten bereits Pakete für APC an, ist das bei der verwendeten Distribution nicht der Fall, muss es über PECL installiert werden. Bei Debian heißt das Paket <code>php-apc</code>, bei Gentoo <code>pecl-apc</code>, bei anderen Distributionen wahrscheinlich ähnlich. Hier hilft einem die Suchfunktion der entsprechenden Paketverwaltung.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Debian</span>
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> php-apc
<span style="color: #666666; font-style: italic;"># Gentoo</span>
emerge pecl-apc</pre></div></div>

<p>Die meisten Paketverwalter aktivieren APC automatisch (tragen die Erweiterung in eine PHP-Konfigurationsdatei ein), es sollte also nur noch ein Neustart des Webservers nötig sein (siehe weiter unten).</p>
<h2>Installation mit PECL</h2>
<p>Wenn alle für die Installation benötigten Programme/Abhängigkeiten installiert sind, kann APC mittels folgendem Befehl installiert werden:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">pecl <span style="color: #c20cb9; font-weight: bold;">install</span> apc</pre></div></div>

<p>Zur Installation werden die Entwicklerpakete von PHP und dem Webserver (Apache) vorausgesetzt, außerdem werden ein Compiler (<code>gcc</code>), sowie div. andere Entwicklerpakete wie beispielsweise make benötigt. Wenn etwas fehlt, wird PECL einen bei der Installation darauf hinweisen, das entsprechende Programm/Paket kann man dann einfach über die Paketverwaltung installieren.</p>
<p>Mehr Informationen über die Installation von PHP-Erweiterungen mittels PECL finden sich in der <a href="http://de3.php.net/manual/de/install.pecl.php">PHP-Dokumentation</a>.</p>
<p>Nach der erfolgreichen Installation muss APC noch in einer Konfigurationsdatei von PHP (es kann mehrere geben) eingetragen und der Webserver neugestartet werden.</p>
<h2>APC-Modul laden</h2>
<p>Nachdem APC installiert wurde, muss noch dafür gesorgt werden, das PHP das Modul auch lädt. Dazu muss in einer Konfigurationsdatei, die PHP beim Start auswertet (z.B. der <code>php.ini</code>) ein Eintrag gemacht werden. Wenn APC über die Paketverwaltung installiert wurde, ist solch ein Eintrag wahrscheinlich sogar schon vorhanden. Dies kann man überprüfen indem man den Webserver neustartet und sich die Ausgabe von <code>phpinfo()</code> ansieht. Ansonsten muss man ihn selbst hinzufügen.</p>
<h3>Wo befindet sich die PHP-Konfigurationsdatei?</h3>
<p>Um herauszufinden, wo sich die Konfigurationsdatei von PHP befindet, legt man einfach eine PHP-Datei mit folgendem Inhalt an:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #990000;">phpinfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Wenn man diese Datei nun im Browser aufruft, erhält man eine Übersicht der PHP-Konfiguration. Am Anfang unter dem Eintrag <strong>Loaded Configuration File </strong>steht, wo sich die Konfigurationsdatei von PHP befindet. Unter <strong>additional .ini files parsed</strong> finden sich weitere Konfigurationsdateien die von PHP ausgewertet werden, ist hier schon eine <code>apc.ini</code> dabei, hat die Paketverwaltung APC wohl schon aktiviert.</p>
<p>Wichtig: Auf einem produktiven System sollte man die Datei in der <a href="http://de2.php.net/manual/de/function.phpinfo.php"><code>phpinfo()</code></a> aufgerufen wird wieder löschen oder zumindest für normale Benutzer unzugänglich machen, nachdem man die benötigten Informationen hat.  Sonst könnte jeder der den Namen der Datei kennt, herausfinden wie der Server konfiguriert ist.</p>
<h3>Eintrag in der Konfigurationsdatei</h3>
<p>Ist noch kein Eintrag für APC vorhanden, muss er hinzugefügt werden. Dazu schreibt man folgendes in die Konfigurationsdatei:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">extension=apc.so</pre></div></div>

<p>Nach einem Neustart des Webservers sollte APC dann automatisch geladen werden. Das kann ebenfalls in der Ausgabe von <code>phpinfo()</code> überprüft werden, dort müsste irgendwo ein Eintrag mit der Überschrift <em>apc</em> angezeigt werden.</p>
<h2>Webserver neustarten</h3>
<p>Damit eine geänderte PHP-Konfiguration wirksam wird, muss der Webserver angewiesen werden, diese neu einzulesen. Dazu ist ein Neustart des Webservers erforderlich. Beim Apache kann einer der folgenden beiden Befehle dazu verwendet werden.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">apache2ctl graceful
<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 graceful</pre></div></div>

<h2>Nach der Installation</h2>
<p>Die Standardkonfiguration ist für die meisten Anwender gut geeignet, einige Optionen wie beispielsweise die Größe des Zwischenspeichers kann man aber noch anpassen. Welche Konfigurationsmöglichkeiten es gibt, wird im Artikel <a href="http://www.antusblog.de/?p=1669">Konfiguration von APC</a> beschreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/08/12/installation-von-apc/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fortschrittsbalken mit CSS/JavaScript</title>
		<link>http://www.antusblog.de/2009/07/27/fortschrittsbalken-mit-cssjavascript/</link>
		<comments>http://www.antusblog.de/2009/07/27/fortschrittsbalken-mit-cssjavascript/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 20:48:28 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[Java Script]]></category>
		<category><![CDATA[dwProgressBar]]></category>
		<category><![CDATA[Fortschrittsanzeige]]></category>
		<category><![CDATA[Fortschrittsbalken]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery UI]]></category>
		<category><![CDATA[jsProgressBarHandler]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1798</guid>
		<description><![CDATA[Fortschrittsbalken werden vor allem bei Webanwendungen gebraucht, die mit dem Benutzer interagieren, beispielsweise beim Hochladen von Dateien oder um den Fortschritt in einem Formular anzuzeigen. Aber auch bei anderen Webanwendungen können Fortschrittsbalken sinnvoll sein, beispielsweise um den aktuellen Stand eines noch nicht fertiggestellten Projektes anzuzeigen oder den noch verfügbaren Speicherplatz, o.Ä. In dieser Anleitung erkläre [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/jQueryUI-FSB.png"><img class="aligncenter size-full wp-image-1799" title="Fortschrittsbalken" src="http://www.antusblog.de/wp-content/uploads/2009/07/jQueryUI-FSB.png" alt="Fortschrittsbalken" width="500" height="150" /></a>Fortschrittsbalken werden vor allem bei Webanwendungen gebraucht, die mit dem Benutzer interagieren, beispielsweise beim Hochladen von Dateien oder um den Fortschritt in einem Formular anzuzeigen. Aber auch bei anderen Webanwendungen können Fortschrittsbalken sinnvoll sein, beispielsweise um den aktuellen Stand eines noch nicht fertiggestellten Projektes anzuzeigen oder den noch verfügbaren Speicherplatz, o.Ä.</p>
<p>In dieser Anleitung erkläre ich wie man einfache Fortschrittsbalken mit CSS erstellen kann, und stelle 4 JavaScript-Skripte vor mit denen sich &#8220;bewegliche&#8221; Fortschrittsbalken erstellen lassen.</p>
<p><span id="more-1798"></span></p>
<h2>Einfache Fortschrittsbalken</h2>
<p>Fortschrittsbalken mittels CSS zu erstellen ist nicht weiter schwer, man braucht im Grunde nur zwei Elemente, die übereinander gelegt werden.</p>
<h3>Ohne Bilder</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Einfacher.Fortschrittsbalken.ohne.Bilder.png"><img class="aligncenter size-full wp-image-1802" title="Einfacher Fortschrittsbalken ohne Bilder" src="http://www.antusblog.de/wp-content/uploads/2009/07/Einfacher.Fortschrittsbalken.ohne.Bilder.png" alt="Einfacher Fortschrittsbalken ohne Bilder" width="300" height="100" /></a>Man erstellt ein Element, gibt ihm eine Hintergrundfarbe und weist ihm eine Breite/Höhe zu. In diesem Element erstellt man nun ein zweites Element, dem man ebenfalls eine Hintergrundfarbe (möglichst eine andere, als die vom ersten Element) und die gleiche Höhe wie dem ersten Element zu. Die Breite des zweiten Elements gibt dann an, welchen Wert der Fortschrittsbalken anzeigen soll.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span>&gt;</span>
  div.fsb {
    border:1px solid #000;
    background-color:white;
    width:200px;
    height:28px;
    padding:1px;
  }
&nbsp;
  div.fortschritt {
    background-color:#000;
    height:28px;
    width:50%; /* Fortschritt */
  }
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- [...] --&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fortschritt&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<p>In Aktion sieht das dann so aus: <a href="/demos/8-fortschrittsbalken/cssbalken/ohnebilder.html">Demo</a>.</p>
<h3>Mit Bildern</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Einfacher.Fortschrittsbalken.mit.Bildern.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Einfacher.Fortschrittsbalken.mit.Bildern.png" alt="Einfacher Fortschrittsbalken mit Bildern" title="Einfacher Fortschrittsbalken mit Bildern" width="350" height="125" class="aligncenter size-full wp-image-1805" /></a>Möchte man den Fortschrittsbalken etwas schöner gestalten, kann man natürlich auch Bilder verwenden, die Methode funktioniert eigentlich genau so. Der einzige Unterschied ist, das anstatt von Hintergrundfarben Bilder verwendet werden.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div<span style="color: #6666ff;">.fsb</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'normal.png'</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span> <span style="color: #000000; font-weight: bold;">left</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">300px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">30px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
div<span style="color: #6666ff;">.fortschritt</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'farbig.png'</span><span style="color: #00AA00;">&#41;</span> <span style="color: #993333;">no-repeat</span> <span style="color: #000000; font-weight: bold;">left</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">30px</span><span style="color: #00AA00;">;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">50%</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>In Aktion sieht das dann so aus: <a href="/demos/8-fortschrittsbalken/cssbalken/mitbildern.html">Demo</a>.</p>
<h2>JavaScript-Fortschrittsbalken</h2>
<p>Mit JavaScript kann man den Fortschrittsbalken auch Leben einhauchen, bzw. den angezeigten Wert verändern. Ein einfaches JS-Skript, welches die Breite des inneren Elements ändert ist schnell geschrieben. Im folgenden stelle ich allerdings 4 Skripte/Klassen vor, die noch etwas mehr können als nur das. Das erste Skript basiert auf jQuery/jQuery UI, das zweite benötigt nur jQuery, das dritte ist für Prototype und das vierte verwendet mootools.</p>
<p>Ich habe für jedes Skript eine Demo erstellt: <a href="/demos/8-fortschrittsbalken/jsbalken/fortschrittsbalken.html">Fortschrittsbalken-Demo</a></p>
<h3>jQueryUI &#8211; ProgressBar</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.jQueryUI.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.jQueryUI.png" alt="Fortschrittsbalken mit jQuery UI" title="Fortschrittsbalken mit jQuery UI" width="500" height="100" class="aligncenter size-full wp-image-1811" /></a>Die JS-Bibliothek <a href="http://jqueryui.com/">jQuery UI</a> stellt diverse Werkzeuge und Benutzeroberflächen-Elemente bereit. Unter anderem bietet sie auch eine Klasse zur Erstellung von Fortschrittsbalken. Praktischerweise kann man auf der Download-Seite von jQuery UI direkt die Elemente angeben, die man benötigt, so braucht man nicht die ganze Bibliothek runterzuladen/einzubinden (wenn man nur den Fortschrittsbalken braucht), und spart so einiges an Speicherplatz/Datentransfer. Die Bibliothek basiert auf <a href="http://jquery.com/">jQuery</a>, dieses muss also auch eingebunden werden.</p>
<p>Eine Besonderheit von jQuery UI: Das Aussehen der Benutzeroberfläche (und somit des Fortschrittsbalkens) wird durch Themen festgelegt. Auf der Webseite von jQuery UI findet sich (unter Gallery) bereits eine kleine Auswahl von fertigen Themen, natürlich ist es auch möglich eigene Themen zu erstellen. Das Thema wird über eine css-Datei definiert, diese muss ebenfalls in die Seite eingebunden werden.</p>
<h4>Einbinden</h4>
<p>Benötigt werden: jQuery, jQuery UI (Progressbar), und ein jQuery UI Thema.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">link</span> <span style="color: #000066;">rel</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;stylesheet&quot;</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-ui/css/ui-lightness/jquery-ui-1.7.2.custom.css&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-ui/js/jquery-1.3.2.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-ui/js/jquery-ui-1.7.2.custom.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>(Die Pfade müssen eventuell angepasst werden.)</p>
<h4>HTML</h4>
<p>Man erstellt einfach ein div-Element, den Rest erledigt das Skript. Dem Element kann man noch eine ID geben, das macht es leichter es anzusprechen.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<h4>Fortschrittsbalken erstellen</h4>
<p>Um den Balken zu erstellen, selektiert man das Ziel-Element mit der <code>$()</code>-Funktion, und ruft die Methode <code>progressbar()</code> auf. Mittels dem Parameter <code>value</code> kann man den Ausgangswert des Fortschrittsbalkens angeben. Außerdem kann man, wenn man möchte, mit dem Parameter <code>change</code> auch gleich eine Funktion festlegen, welche aufgerufen wird, wenn der Wert sich ändert. Beide Parameter sind optional.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressbar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        value<span style="color: #339933;">:</span><span style="color: #CC0000;">50</span><span style="color: #339933;">,</span>
        change<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
            <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressbar</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'option'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'value'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'%'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h4>Methoden und Ereignisse</h4>
<p>Die Klasse bietet Methoden zum Abfragen und Ändern des angezeigten Werts, sowie ein Ereignis welches ausgelöst wird, wenn der Wert sich ändert.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Wert aendern</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressbar</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'option'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'value'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Wert abfragen</span>
<span style="color: #003366; font-weight: bold;">var</span> wert <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressbar</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'option'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'value'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Weitere Informationen zu der Klasse und ihren Methoden finden sich in der <a href="http://jqueryui.com/demos/progressbar/">offiziellen Dokumentation</a>.</p>
<h3>jQuery &#8211; ProgressBar</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.jQueryProgressBar.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.jQueryProgressBar.png" alt="Fortschrittsbalken mit jQuery Progress Bar" title="Fortschrittsbalken mit jQuery Progress Bar" width="500" height="100" class="aligncenter size-full wp-image-1821" /></a>Das Skript <a href="http://t.wits.sg/2008/06/20/jquery-progress-bar-11/">jQuery Progress Bar</a> basiert auf jQuery und bietet einige nützliche Funktionen, die die jQuery UI-Variante nicht hat. Es ist möglich verschiedene Bilder zur Anzeige des Fortschritts zu verwenden, so kann man beispielsweise für die ersten 10-20% einen roten Hintergrund, für die nächsten 10-20% dann einen orangen, dann einen gelben und zum Schluss einen grünen Hintergrund verwenden. Es lässt sich auch festlegen ob neben dem Balken auch der Fortschritt noch einmal als Prozentzahl angezeigt werden soll, und auch eine Anzeige des genauen Wertes (123/465) ist möglich. Außerdem ist die Bewegung des Fortschrittsbalkens animiert, es lässt sich sogar die Geschwindigkeit der Animation festlegen. </p>
<h4>Einbinden</h4>
<p>Benötigt werden jQuery und das Skript selbst.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery-ui/js/jquery-1.3.2.min.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery.progressbar/js/jquery.progressbar.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<h4>HTML</h4>
<p>Auch bei diesem Skript wird nur ein <code>div</code>-Element benötigt, den Rest erstellt das Skript selbst.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<h4>Fortschrittsbalken erstellen</h4>
<p>Erstellt wird der Fortschrittsbalken mittels der Funktion <code>progressBar()</code>. Dabei gibt es einige Parameter, mittels derer das Aussehen und Verhalten des Fortschrittsbalkens beeinflusst werden können:</p>
<ul>
<li><code>steps</code> und <code>step_duration</code>: Geben an, wie viele Schritte beim Ändern des Anzeigewertes gegangen werden sollen, und wie lange ein Schritt dauert. (Standard: <code>20</code>/<code>20</code>)</li>
<li><code>max</code>: Der max. Wert, bis zu dem der Fortschrittsbalken geht. (Standard: <code>100</code>)</li>
<li><code>showText</code> und <code>textFormat</code>: Ob neben dem Balken noch der Fortschritt in Textform angezeigt werden soll, und ob dieser als Prozentzahl (<code>'percentage'</code> = 50%) oder als Anteil (<code>'fraction'</code> = 50/100) angezeigt werden soll. (Standard: <code>true</code>, <code>'percentage'</code>)</li>
<li><code>width</code> und <code>height</code>: Breite und Höhe des Fortschrittsbalkens bzw. der verwendeten Bilder.</li>
<li><code>callback</code>: Legt eine Funktion fest, welche aufgerufen wird, wenn sich der Balken bewegt. Die Funktion bekommt ein Argument mitgeliefert, welches das <code>config</code>-Feld, erweitert um die Werte <code>increment</code> (um wie viele Pixel hat sich der Balken bewegt), <code>running_value</code> (aktueller Wert) sowie <code>value</code> (Ziel-Wert).</li>
<li><code>boxImage</code>: Pfad zum Bild welches den Balken umschließt.</li>
<li><code>barImage</code>: Pfad zum inneren Bild des Balkens. Hier kann auch ein Feld übergeben werden, falls verschiedene Bilder verwendet werden sollen (siehe Beispiel).</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressBar</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">20</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>
        boxImage<span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery.progressbar/images/progressbar.gif'</span><span style="color: #339933;">,</span>
        barImage<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #CC0000;">0</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery.progressbar/images/progressbg_red.gif'</span><span style="color: #339933;">,</span>
            <span style="color: #CC0000;">30</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery.progressbar/images/progressbg_orange.gif'</span><span style="color: #339933;">,</span>
            <span style="color: #CC0000;">50</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery.progressbar/images/progressbg_yellow.gif'</span><span style="color: #339933;">,</span>
            <span style="color: #CC0000;">70</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'jquery.progressbar/images/progressbg_green.gif'</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h4>Methoden und Ereignisse</h4>
<p>Die Klasse bietet ein Ereignis (<code>callback</code>) und keine Methode. Will man den angezeigten Wert ändern, ruft man die Klasse einfach wieder wie folgt auf:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Aendere Wert auf 50%.</span>
$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#fsb'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">progressBar</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">50</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>Prototype &#8211; jsProgressBarHandler</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.Prototype.jsProgressBarHandler.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.Prototype.jsProgressBarHandler.png" alt="Fortschrittsbalken mit Prototype jsProgressBarHandler" title="Fortschrittsbalken mit Prototype jsProgressBarHandler" width="500" height="100" class="aligncenter size-full wp-image-1828" /></a>Die <a href="http://www.bram.us/projects/js_bramus/jsprogressbarhandler/">jsProgressBarHandler</a>-Klasse basiert auf <a href="http://www.prototypejs.org/">Prototype</a> und steht unter der <a href="http://creativecommons.org/licenses/by-sa/2.5/">Creative Commons Attribution-Share Alike 2.5</a> Lizenz. Das tolle an dieser Klasse ist: Sie kann auch automatisch Fortschrittsbalken erstellen, alle <code>span</code>-Elemente mit der CSS-Klasse <code>progressBar</code>, die einen Prozentwert enthalten, werden automatisch zu Fortschrittsbalken umgewandelt. Der herkömmliche Weg über JavaScript funktioniert natürlich auch.</p>
<h4>Einbinden der Klasse</h4>
<p>Neben der Klasse selbst, muss auch die JavaScript-Bibliothek Prototype eingebunden werden.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/prototype/prototype.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;js/bramus/jsProgressBarHandler.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<h4>HTML</h4>
<p>Die Klasse wandelt alle span-Elemente mit der CSS-Klasse <code>progressBar</code> automatisch in Fortschrittsbalken um.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">span</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;progressBar&quot;</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;</span>50%<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">span</span>&gt;</span></pre></div></div>

<p>Möchte man den Balken selbst mittels JavaScript erstellen, benötigt man ein <code>div</code>-Element mit einer ID.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;</span>[Lade Fortschrittsbalken]<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<h4>Fortschrittsbalken erstellen</h4>
<p>Um den Balken selbst mittels JavaScript zu erstellen, muss man nur ein Objekt der Klasse <code>JS_BRAMUS.jsProgressBar</code> erstellen.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> fsb <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> JS_BRAMUS.<span style="color: #660066;">jsProgressBar</span><span style="color: #009900;">&#40;</span>
    <span style="color: #3366CC;">'fsb'</span><span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">// ID des div-Elements</span>
    <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span> <span style="color: #006600; font-style: italic;">// Ausgangswert (Prozent)</span>
    <span style="color: #009900;">&#123;</span>
        showText <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        animate <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        barImage <span style="color: #339933;">:</span> <span style="color: #3366CC;">'jsprogressbarhandler/images/bramus/percentImage_back1.png'</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der dritte Parameter kann zur Konfiguration verwendet werden, und ist optional. Folgende Optionen gibt es:</p>
<ul>
<li><code>animate</code>: Ob der Fortschrittsbalken animiert sein soll. (Standard: ja)</li>
<li><code>showText</code>: Ob der Wert neben dem Balken angezeigt werden soll (Standard: ja)</li>
<li><code>width</code>: Breite des Balkens. Nicht vergessen: Das Bild muss ebenfalls angepasst werden. (Standard: 120)</li>
<li><code>boxImage</code>: Das Bild um den Balken.</li>
<li><code>barImage</code>: Der Hintergrund des Balkens. Hier kann auch ein Feld mit mehreren Bildern angegeben werden, dann ändert sich der Hintergrund, wenn der Balken weiter fortschreitet.</li>
<li><code>height</code>: Die Höhe des Balkens. (Standard: 12)</li>
<li><code>onTick</code>: Funktion die bei jeder Änderung am Wert des Balkens aufgerufen wird.</li>
</ul>
<p>Die Standardwerte sind am Anfang der <code>jsProgressBarHandler.js</code> definiert. Dort findet sich auch die Variable <code>autoHook</code>, diese kann man auf <code>false</code> setzen, wenn man nicht möchte, das alle <code>span.progressBar</code>-Elemente automatisch umgewandelt werden. Die Pfade zu den Bildern bzw. die Breite/Höhe will/muss man wahrscheinlich eh ändern.</p>
<h4>Methoden und Ereignisse</h4>
<p>Die Klasse hat zwei Funktionen und ein Ereignis, welches bei jeder Änderung am Wert aufgerufen wird (<code>onTick</code>). Mit der Funktion <code>getPercentage()</code> kann der aktuelle Wert abgefragt werden, mit <code>setPercentage()</code> kann der Wert verändert werden. Letztere Funktion akzeptiert zwei Parameter, der erste gibt den neuen Wert an, der zweite gibt an ob der Balken direkt zum neuen Wert gehen soll. Wenn man den Wert ändert, während der Balken sich noch bewegt, macht er normalerweise zuerst seine Bewegung zu Ende, bevor er zum neuen Wert geht, ist der zweite Parameter true, verwirft er alle anderen Bewegungen und bewegt sich direkt zum neuen Wert.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Wert abfragen</span>
<span style="color: #003366; font-weight: bold;">var</span> aktuellerWert <span style="color: #339933;">=</span> fsb.<span style="color: #660066;">getPercentage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Wert aendern</span>
fsb.<span style="color: #660066;">setPercentage</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h3>mootools &#8211; dwProgressBar</h3>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.mootools.dwProgressBar.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/Fortschrittsbalken.mit.mootools.dwProgressBar.png" alt="Fortschrittsbalken mit mootools - dwProgressBar" title="Fortschrittsbalken mit mootools - dwProgressBar" width="500" height="100" class="aligncenter size-full wp-image-1833" /></a>Die <code><a href="http://davidwalsh.name/dwprogressbar-2-stepping-events-mootools-progress-bar">dwProgressBar</a></code>-Klasse verfolgt einen etwas anderen Ansatz, als die vorigen beiden Klassen. Mit der Klasse können Fortschrittsbalken erstellt, und der angezeigte Wert geändert werden. Um die Animation kümmert sich die Klasse. Ansonsten können (müssen) die Fortschrittsbalken komplett selbst mittels CSS gestaltet werden. </p>
<h4>Einbinden der Klasse</h4>
<p>Die JavaScript-Bibliothek <a href="http://mootools.net/">mootools</a> wird vorausgesetzt. Außerdem muss natürlich die Klasse selbst eingebunden werden.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mootools-1.2.3-core-yc.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;dwprogressbar.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<h4>HTML und CSS</h4>
<p>Es wird nur ein div-Element benötigt.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;fsb&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span></pre></div></div>

<p>Die Gestaltung des Fortschrittsbalkens übernimmt die Klasse nicht, das muss man selber machen. Es gibt drei Elemente, die gestaltet werden können: Der Rahmen, der Balken, und der Text (optional). Beim Erstellen des Fortschrittsbalkens kann angegeben werden, welche ID die Elemente bekommen sollen, über die ID können die Elemente dann mittels CSS gestaltet werden. </p>
<h5>Ohne Bilder</h5>
<p>Die CSS-Selektoren für einen Fortschrittsbalken ohne Bilder (aber mit Text) könnten z.B. so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#rahmen</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span> <span style="color: #993333;">solid</span> <span style="color: #cc00cc;">#8C2229</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">200px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #933;">1px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span>inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#balken</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#8C2229</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#text</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">16px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">line-height</span><span style="color: #00AA00;">:</span><span style="color: #933;">20px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span>inline-<span style="color: #993333;">block</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<h5>Mit Bildern</h5>
<p>Wenn man den Fortschrittsbalken mit Bildern gestalten möchte, kann man folgende CSS-Selektoren verwenden. Die Höhen- und Breitenangaben müssen natürlich angepasst werden.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#rahmen</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'rahmen.png'</span><span style="color: #00AA00;">&#41;</span> <span style="color: #000000; font-weight: bold;">right</span> <span style="color: #993333;">center</span> <span style="color: #993333;">no-repeat</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span><span style="color: #933;">300px</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">30px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
<span style="color: #cc00cc;">#balken</span> <span style="color: #00AA00;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'balken.png'</span><span style="color: #00AA00;">&#41;</span> <span style="color: #000000; font-weight: bold;">left</span> <span style="color: #993333;">center</span> <span style="color: #993333;">no-repeat</span><span style="color: #00AA00;">;</span>
	<span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span><span style="color: #933;">30px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<h4>Den Fortschrittsbalken erstellen</h4>
<p>Zum Erstellen des Fortschrittsbalkens wird einfach ein neues <code>dwProgressBar</code>-Objekt erstellt.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'domready'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> fsb <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> dwProgressBar<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">// Das Element, in dem der Fortschrittsbalken angezeigt wird</span>
        container<span style="color: #339933;">:</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fortschrittsbalken'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Startwert (Prozent)</span>
        startPercentage<span style="color: #339933;">:</span> <span style="color: #CC0000;">50</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Geschwindigkeit/Dauer der Animation (in Millisekunden)</span>
        speed<span style="color: #339933;">:</span> <span style="color: #CC0000;">1000</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Die ID des Rahmens</span>
        boxID<span style="color: #339933;">:</span> <span style="color: #3366CC;">'rahmen'</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Die ID des Balkens</span>
        percentageID<span style="color: #339933;">:</span> <span style="color: #3366CC;">'balken'</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Wieviel Prozent pro Schritt (dwProgressBar.step() geht</span>
        <span style="color: #006600; font-style: italic;">// immer einen Schritt weiter, in diesem Beispiel also 10%.</span>
        step<span style="color: #339933;">:</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Erlaube Werte jenseits 100%</span>
        allowMore<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Prozentwert als Text anzeigen?</span>
        displayText<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// ID für das Textelement</span>
        displayID<span style="color: #339933;">:</span> <span style="color: #3366CC;">'text'</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Ereignis, welches aufgerufen wird, wenn der Balken 100%</span>
        <span style="color: #006600; font-style: italic;">// erreicht.</span>
        onComplete<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Fertig!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        <span style="color: #006600; font-style: italic;">// Ereignis welches nach jeder abgeschlossenen Änderung am</span>
        <span style="color: #006600; font-style: italic;">// Wert aufgerufen wird. (Wenn man von 10% auf 50% geht,</span>
        <span style="color: #006600; font-style: italic;">// wird es einmal aufgerufen, nämlich wenn 50% erreicht sind.)</span>
        onChange<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Wert geändert!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Es müssen nur die Optionen <code>container</code>, <code>boxID</code> und <code>percentageID</code> angegeben werden, der Rest ist optional.</p>
<h4>Funktionen und Ereignisse</h4>
<p>Die Klasse bietet die Funktionen <code>set(neuerwert)</code> und <code>step()</code>, außerdem die Ereignisse <code>onComplete</code> und <code>onChange</code>. Die Ereignisse sind im obigen Beispielquelltext bereits erklärt.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #006600; font-style: italic;">// Wert auf 100% setzen</span>
fsb.<span style="color: #660066;">set</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">// Einen Schritt weitergehen (um options.step Prozent)</span>
fsb.<span style="color: #660066;">step</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Zum Schluss noch einmal die Demo-Seite für die JavaScript-Fortschrittsbalken: <a href="/demos/8-fortschrittsbalken/jsbalken/fortschrittsbalken.html">Fortschrittsbalken-Demo</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/07/27/fortschrittsbalken-mit-cssjavascript/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Mehrere Dateien flexibel hochladen</title>
		<link>http://www.antusblog.de/2009/07/22/mehrere-dateien-flexibel-hochladen/</link>
		<comments>http://www.antusblog.de/2009/07/22/mehrere-dateien-flexibel-hochladen/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 16:10:06 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[Dateien]]></category>
		<category><![CDATA[hochladen]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[Multiple File Upload Plugin]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1771</guid>
		<description><![CDATA[Mit einem Dateieingabe-Element kann immer nur eine Datei ausgewählt und hochgeladen werden. Will man dem Benutzer die Möglichkeit geben mehrere Dateien auf einmal hochzuladen, kann man einfach mehrere Dateieingabe-Elemente erstellen. Das hat allerdings einen Nachteil: In den meisten Fällen sind entweder zu viele, oder zu wenige Dateielemente da. Mit etwas JavaScript kann man dieses Problem [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/jquery_multiple_file_upload2.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/jquery_multiple_file_upload2.png" alt="Mehrere Dateien flexibel hochladen" title="Mehrere Dateien flexibel hochladen" width="500" height="140" class="aligncenter size-full wp-image-1773" /></a>Mit einem Dateieingabe-Element kann immer nur eine Datei ausgewählt und hochgeladen werden. Will man dem Benutzer die Möglichkeit geben mehrere Dateien auf einmal hochzuladen, kann man einfach mehrere Dateieingabe-Elemente erstellen. Das hat allerdings einen Nachteil: In den meisten Fällen sind entweder zu viele, oder zu wenige Dateielemente da. Mit etwas JavaScript kann man dieses Problem lösen: Der Benutzer entscheidet selbst, wie viele Dateien er hochladen möchte.</p>
<p>Eine Lösung wäre, dass man eine Schaltfläche erstellt, mittels derer der Benutzer weitere Eingabefelder hinzufügen kann. Neben den zusätzlichen Eingabefeldern erstellt man dann einfach noch jeweils eine Schaltfläche zum Entfernen des Eingabefeldes, falls der Benutzer es sich anders überlegt.</p>
<p>Eine andere Möglichkeit wäre, das der Benutzer nur ein Eingabefeld, und eine Liste von ausgewählten Dateien hat. Nachdem eine Datei ausgewählt wurde, wird kommt die Datei in die Liste, und das Eingabefeld ist wieder leer, für die nächste Datei. Eigentlich wird das Eingabefeld dabei durch ein neues ersetzt, und das alte unsichtbar gemacht. Für den Benutzer sieht es aber so aus, als würde er die ganze Zeit dasselbe Eingabeelement benutzen.</p>
<p><span id="more-1771"></span></p>
<h2>Weitere Eingabefelder hinzufügen</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/javascript_mfu.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/javascript_mfu.png" alt="Mehrere Dateien flexibel hochladen - mit JavaScript." title="Mehrere Dateien flexibel hochladen - mit JavaScript." width="320" height="140" class="aligncenter size-full wp-image-1784" /></a>
<p>Mittels der JavaScript-Funktion <code><a href="http://de.selfhtml.org/javascript/objekte/document.htm#create_element">document.createElement(element)</a></code> können dynamisch neue Elemente erstellt werden, diese können dann mit Funktionen wie <code><a href="http://de.selfhtml.org/javascript/objekte/node.htm#append_child">appendChild</a></code>, <code>insertBefore</code>, o.Ä. an beliebiger Stelle eingefügt werden.</p>
<p>Um eine Schaltfläche zum Hinzufügen zusätzlicher Eingabefelder zu erstellen, braucht man zuerst ein Verweis-Element, oder irgendein anderes Element, mittels dem der Benutzer das neue Eingabefeld hinzufügt. Damit das funktioniert, weist man dem <code>onlick</code>-Attribut eine Funktion zu, die ein neues Eingabefeld erstellt und im Dokument einfügt. Diese Funktion könnte zum Beispiel so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> hinzu<span style="color: #009900;">&#40;</span>element<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> neu <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'div'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    neu.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;input type=&quot;file&quot; class=&quot;datei&quot; name=&quot;datei[]&quot; /&gt;'</span><span style="color: #339933;">;</span>
    element.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">parentNode</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>neu<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Mittels <code>parentNode</code> greift man auf den Elternknoten des Elementes zu. Im Beispiel wird das neue <code>div</code>-Element welches das Eingabeelement enthält am Ende vom <code>form</code>-Element eingefügt.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei[]&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hinzu&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hinzu(this); return false;&quot;</span>&gt;</span>Datei hinzufügen<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- An dieser Stelle werden neue Eingabeelemente eingefügt, wenn auf den</span>
<span style="color: #808080; font-style: italic;">    Verweis geklickt wird. Also z.B. so: --&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei[]&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- Ende --&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p>Der Benutzer soll die hinzugefügten Eingabeelemente aber auch wieder entfernen können, dazu fügt man zu jedem Element noch eine Schaltfläche zum Entfernen hinzu. Dieser weist man eine JavaScript-Funktion zu, die das Elternelement (und somit auch alle Elemente darin) löscht. Der komplette Quelltext könnte (aufs nötigste reduziert) so aussehen:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;?xml <span style="color: #000066;">version</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1.0&quot;</span> ?&gt;</span>
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span>
<span style="color: #00bbdd;">  &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Mehrere Dateien flexibel hochladen<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
      function hinzu(element) {
        var neu = document.createElement('div');
        neu.innerHTML = '<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei[]&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span> \
          <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;weg&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;loeschen(this); return false;&quot;</span>&gt;</span>entfernen<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>';
        element.parentNode.parentNode.appendChild(neu);
      }
&nbsp;
      function loeschen(element) {
        element.parentNode.parentNode.removeChild(element.parentNode);
      }
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei[]&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">a</span> <span style="color: #000066;">href</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;#&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hinzu&quot;</span> <span style="color: #000066;">onclick</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;hinzu(this);&quot;</span>&gt;</span>Datei hinzufügen<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">a</span>&gt;</span>
      <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">div</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
  <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>Auf der Demo-Seite sieht man das Skript auch in Aktion.</p>
<p style="padding-left:30px;"><a href="/demos/7-mehrere-dateien-flexibel-hochladen/nur_js/beispiel.html">Demo</a></p>
<h2>Eingabefeld + Liste</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/jquery_multiple_file_upload2.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/jquery_multiple_file_upload2.png" alt="Mehrere Dateien flexibel hochladen" title="Mehrere Dateien flexibel hochladen" width="500" height="140" class="aligncenter size-full wp-image-1773" /></a><br />
Ein einzelnes Eingabefeld, und eine Liste ausgewählter Dateien zu erstellen ist schon etwas komplizierter. Zum Glück haben sich schon andere die Arbeit gemacht. Es gibt sowohl für mootools, als auch für jQuery entsprechende Erweiterungen.</p>
<h2>Für jQuery</h2>
<p>Für jQuery gibt es das <a href="http://www.fyneworks.com/jquery/multiple-file-upload/">jQuery Multiple File Upload Plugin</a>. Es bietet zusätzlich noch die Möglichkeit die verwendbaren Dateitypen einzuschränken und eine maximale Anzahl von Dateien anzugeben.</p>
<h3>Einbinden und Benutzen</h3>
<p>Zuerst müssen jQuery und die Erweiterung im <code>head</code>-Bereich eingebunden werden. Außerdem gibt es noch drei weitere (optionale) Erweiterungen, mit denen die Multi File Upload Erweiterung zusammenarbeiten kann: <a href="http://plugins.jquery.com/project/metadata/">MetaData</a>, <a href="http://plugins.jquery.com/project/blockUI">BlockUI</a>, und <a href="http://www.malsup.com/jquery/form/">Form</a>. Ersteres ermöglicht es das Element direkt über das <code>class</code>-Attribut des <code>input</code>-Elements zu konfigurieren, mit BlockUI werden schönere Fehlermeldungen angezeigt, und Form ermöglicht das Absenden des Formulars mittels AJAX.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- jQuery wird vorausgesetzt. --&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- Die Erweiterung selbst. --&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;jquery.MultiFile.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>Anschließend muss nur noch das <code>input</code>-Element entsprechend angepasst werden:</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">accept</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;png|gif|jpg|xcf&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multi&quot;</span> <span style="color: #000066;">maxlength</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;3&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;bild&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #808080; font-style: italic;">&lt;!-- oder --&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multi accept-png|gif|jpg|xcf max-3&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;bild&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span></pre></div></div>

<p>Die Klasse <code>multi</code> sorgt dafür, das die Erweiterung sich dem Element annimmt. Mittels <code>maxlength</code>/<code>accept</code> lassen sich noch die max. Anzahl Dateien bzw. die akzeptierten Dateitypen festlegen.</p>
<p>Alternativ ist es auch möglich das Element mittels einer JavaScript-Funktion umzuwandeln. Dabei können außerdem noch einige weitere Parameter angegeben werden.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'input.datei'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">MultiFile</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        list<span style="color: #339933;">:</span> <span style="color: #3366CC;">'#liste'</span><span style="color: #339933;">,</span>
        max<span style="color: #339933;">:</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span>
        afterFileRemove <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> v<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Datei entfernt!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        afterFileSelect <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span>e<span style="color: #339933;">,</span> v<span style="color: #339933;">,</span> m<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Datei hinzugefügt!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
        STRING<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span> file<span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;em title=&quot;Zum entfernen hier klicken&quot; <span style="color: #000099; font-weight: bold;">\</span>
                         onclick=&quot;$(this).parent().prev().click()&quot;&gt;$file&lt;/em&gt;'</span><span style="color: #339933;">,</span>
                  remove<span style="color: #339933;">:</span> <span style="color: #3366CC;">'&lt;img src=&quot;entfernen.png&quot; alt=&quot;X&quot; <span style="color: #000099; font-weight: bold;">\</span>
                           style=&quot;height:24px; width:24px; <span style="color: #000099; font-weight: bold;">\</span>
                           vertical-align:middle;border:0;&quot; /&gt;'</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>So lässt sich beispielsweise festlegen, in welchem Element die Liste der ausgewählten Dateien angezeigt wird und welche Texte für die Fehlermeldungen verwendet werden. Außerdem können Funktionen angegeben werden die beispielsweise beim Auswählen oder Entfernen einer Datei ausgeführt werden.</p>
<p>Ausführlichere Informationen und einige weitere Beispiele finden sich auf der Webseite der Erweiterung.</p>
<p style="padding-left:30px;">Webseite: <a href="http://www.fyneworks.com/jquery/multiple-file-upload/#tab-Overview">jQuery Multiple File Upload Plugin</a><br />
<a href="/demos/7-mehrere-dateien-flexibel-hochladen/jquery_multiple_file_upload_plugin/beispiel.html">Demo</a></p>
<h2>Mit mootools</h2>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/mootools_upload.png"><img src="http://www.antusblog.de/wp-content/uploads/2009/07/mootools_upload-150x150.png" alt="Mehrere Dateien flexibel hochladen mit der mootools-Erweiterung." title="Mehrere Dateien flexibel hochladen mit der mootools-Erweiterung." width="150" height="150" class="alignright size-thumbnail wp-image-1793" /></a>Für <a href="http://www.mootools.org">mootools</a> gibt es ebenfalls eine <a href="http://the-stickman.com/web-development/javascript/multiple-file-uploader-mootools-version/">Erweiterung</a>.</p>
<h3>Einbinden und Benutzen</h3>
<p>Um diese Erweiterung zu benutzen, müssen zuerst <code>mootools</code> und die Erweiterung selbst eingebunden werden.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;mootools-1.2.3-core-yc.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Stickman.MultiUpload.js&quot;</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span></pre></div></div>

<p>Das <code>input</code>-Element braucht keine bestimmte Klasse.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">id</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;formular&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span></pre></div></div>

<p>Nun muss nur noch ein <code>MultiUpload</code>-Objekt erstellt werden.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">addEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'domready'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">new</span> MultiUpload<span style="color: #009900;">&#40;</span>$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'formular'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">datei</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'[]'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der erste Parameter ist das <code>input</code>-Element, die folgenden 4 Parameter sind optional:</p>
<ul>
<li>Maximale Anzahl von Dateien (Standard: 0/unlimitiert).</li>
<li>Was an den Namen des Elements angehangen wird (Standard: _{id}).</li>
<li>Pfad anzeigen? (Standard: nein).</li>
<li>Leeres Element entfernen, bevor das Formular abgeschickt wird? (Standard: ja).</li>
</ul>
<p>Die Liste der ausgewählten Dateien lässt sich mittels CSS umgestalten.</p>
<p>Auch für diese Erweiterung habe ich wieder eine Demo-Seite eingerichtet:</p>
<p style="padding-left:30px;"><a href="/demos/7-mehrere-dateien-flexibel-hochladen/mootools_multiple_file_uploader/beispiel.html">Demo</a></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/07/22/mehrere-dateien-flexibel-hochladen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Formulare: Datei-Element umgestalten</title>
		<link>http://www.antusblog.de/2009/07/04/formulare-datei-element-umgestalten/</link>
		<comments>http://www.antusblog.de/2009/07/04/formulare-datei-element-umgestalten/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 11:23:33 +0000</pubDate>
		<dc:creator>Antu</dc:creator>
				<category><![CDATA[Java Script]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Datei]]></category>
		<category><![CDATA[Formular]]></category>
		<category><![CDATA[hochladen]]></category>
		<category><![CDATA[HTML]]></category>

		<guid isPermaLink="false">http://www.antusblog.de/?p=1687</guid>
		<description><![CDATA[Das Formularelement zum Auswählen einer Datei lässt sich nicht mittels CSS umgestalten, der Browser verwendet für dieses Element immer das Standardaussehen, so wie es vom Betriebssystem vorgegeben ist. Bei der Gestaltung von Formularen ist das natürlich ärgerlich, da das Element meistens nicht zum Aussehen der anderen Formularelemente passt. Shaun Inman beschreibt in seinem Artikel Styling [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Dateiformular.umgestalten.png"><img class="aligncenter size-full wp-image-1691" title="Ein Dateiformular, welches nicht die Standardoberfläche des Betriebssystems verwendet." src="http://www.antusblog.de/wp-content/uploads/2009/07/Dateiformular.umgestalten.png" alt="Ein Dateiformular, welches nicht die Standardoberfläche des Betriebssystems verwendet." width="500" height="150" /></a>Das Formularelement zum Auswählen einer Datei lässt sich nicht mittels CSS umgestalten, der Browser verwendet für dieses Element immer das Standardaussehen, so wie es vom Betriebssystem vorgegeben ist. Bei der Gestaltung von Formularen ist das natürlich ärgerlich, da das Element meistens nicht zum Aussehen der anderen Formularelemente passt.</p>
<p>Shaun Inman beschreibt in seinem Artikel <a href="http://www.shauninman.com/archive/2007/09/10/styling_file_inputs_with_css_and_the_dom">Styling File Inputs with CSS and the DOM</a> eine Methode diesem Element mittels Java Script und CSS trotzdem ein anderes Aussehen zu verpassen. Wie seine Methode funktioniert, und wie man sie noch verbessern/erweitern kann, erkläre ich in diesem Artikel.</p>
<p><span id="more-1687"></span></p>
<h2>Funktionsweise seiner Methode</h2>
<p>Man erstellt ein Element, welches die Schaltfläche darstellen soll. Dieses Element kann man mit CSS gestalten, ihm beispielsweise mittels der <code>background</code>-Eigenschaft ein Hintergrundbild zuweisen. Innerhalb dieses Elements befindet sich dann das <code>input</code>-Element.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;durchsuchen&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span></pre></div></div>

<p>Dieses wird allerdings mittels <code>opacity</code> zu 100% transparent gemacht, so dass man es nicht sieht. Wenn man auf die sichtbare Schaltfläche klickt (also die, die man beliebig mit CSS formatieren kann), klickt man in Wirklichkeit auf die Durchsuchen-Schaltfläche des Eingabeelementes.</p>
<p><a href="http://www.antusblog.de/wp-content/uploads/2009/07/Verstecktes.Eingabefeld.png"><img class="alignright size-full wp-image-1694" title="Verstecktes Eingabefeld" src="http://www.antusblog.de/wp-content/uploads/2009/07/Verstecktes.Eingabefeld.png" alt="Verstecktes Eingabefeld" width="150" height="150" /></a>Die Durchsuchen-Schaltfläche ist allerdings von Betriebssystem zu Betriebssystem verschieden groß. Wenn die Schaltfläche die man selbst gestaltet hat größer ist, könnte es passieren, das man darauf klickt und nichts passiert. Deswegen muss dafür gesorgt werden, das die echte Durchsuchen-Schaltfläche immer unter der Maus ist, wenn die Maus über der &#8220;gefälschten&#8221; Schaltfläche ist. Hier kommt dann Java Script ins Spiel, sobald die Maus über der Schaltfläche ist, wird das <code>input</code>-Element so bewegt, das die Durchsuchen-Schaltfläche unter der Maus ist.</p>
<p>Diese Methode hat allerdings einen Nachteil: Es ist zwar möglich, neben der Schaltfläche noch ein Eingabefeld hinzuzufügen, welches den Dateinamen/Pfad der ausgewählten Datei anzeigt, es ist aber nicht möglich dieses Eingabeelement zu verändern, bzw. anschließend den Wert des <code>input</code>-Elements anzupassen/zu verändern. Das geht bei Dateielementen aus Sicherheitsgründen nicht, denn sonst könnte ein böswilliger Programmierer ja ein verstecktes Dateielement erstellen, welches ohne das der Benutzer davon etwas mitbekommt Dateien von seinem Recher hochlädt.</p>
<p><strong>Vorteile:</strong></p>
<ul>
<li>Dateielemente können an das Aussehen der Webseite/der anderen Formularelemente angepasst werden.</li>
<li>Wenn der Browser des Benutzers kein Java Script unterstützt, sieht der Benutzer einfach das normale Dateielement.</li>
</ul>
<p><strong>Nachteile:</strong></p>
<ul>
<li>Etwas umständlich.</li>
<li>Der Benutzer kann den Pfad zur Datei nicht mehr direkt im Eingabefeld eingeben, er muss die Durchsuchen-Schaltfläche benutzen.</li>
</ul>
<p>Ich habe auch wieder eine Demo-Seite eingerichtet: <a href="/demos/6-durchsuchen-schaltflaeche/umgestalten.html">Demo</a>.</p>
<h2>Benutzung</h2>
<p>Zuerst wird das Skript im <code>head</code>-Bereich eingebunden, dann muss/will man noch die Schaltfläche mit CSS gestalten, außerdem muss das Dateielement sich innerhalb des umgestalteten Elementes befinden. Ein Aufruf von <code>SI.Files.stylizeAll()</code> wendet das Skript dann an.</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;?xml <span style="color: #000066;">version</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1.0&quot;</span> ?&gt;</span>
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span>
<span style="color: #00bbdd;">    &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">html</span> xmlns<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">meta</span> <span style="color: #000066;">http-equiv</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Content-Type&quot;</span> <span style="color: #000066;">content</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/html; charset=UTF-8&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">title</span>&gt;</span>Dateielement umgestalten<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">title</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">style</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span>&gt;</span>         
            .SI-FILES-STYLIZED label.durchsuchen {
                /* Hier kann die Schaltflaeche gestaltet werden. */
                width:140px;
                height:30px;
                background: url('durchsuchen.png') 0 0 no-repeat;
                display:inline-block;
                overflow:hidden;
                cursor:pointer;
            }
&nbsp;
            .SI-FILES-STYLIZED label.durchsuchen input.datei {
                position:relative;
                height:100%;
                width:auto;
                opacity:0;
                -moz-opacity:0;
                filter:alpha(opacity=0); 
            }
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">style</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;si.files.js&quot;</span>&gt;&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">head</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">form</span> <span style="color: #000066;">action</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;...&quot;</span> <span style="color: #000066;">enctype</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;multipart/form-data&quot;</span> <span style="color: #000066;">method</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;post&quot;</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">label</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;durchsuchen&quot;</span>&gt;</span>
                <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;file&quot;</span> <span style="color: #000066;">class</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span> <span style="color: #000066;">name</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;datei&quot;</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">label</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">input</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;submit&quot;</span> <span style="color: #000066;">value</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;Hochladen&quot;</span> <span style="color: #66cc66;">/</span>&gt;</span>
            <span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">script</span> <span style="color: #000066;">type</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;text/javascript&quot;</span>&gt;</span>
                SI.Files.stylizeAll();
            <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">script</span>&gt;</span>
        <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">form</span>&gt;</span>
    <span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">body</span>&gt;</span>
<span style="color: #009900;">&lt;<span style="color: #66cc66;">/</span><span style="color: #000000; font-weight: bold;">html</span>&gt;</span></pre></div></div>

<p>Das Skript weist dem <code>html</code>-Element die Klasse <code>SI-FILES-STYLIZED</code> zu. Der erste CSS-Selektor des Beispiels ist für die sichtbare Schaltfläche, hier kann diese umgestaltet werden. Der zweite Selektor sorgt dafür das das <code>input</code>-Element nicht sichtbar ist. Anstatt eines <code>label</code>-Elements kann natürlich auch irgendein anderes Element verwendet werden, die Klassennamen sind auch austauschbar. </p>
<h3>Internet Explorer 7</h3>
<p>Der Internet Explorer 7 macht leider ein paar Probleme, das Fenster zum Auswählen einer Datei öffnet sich, egal wo man klickt, nachdem man mit der Maus einmal über dem input-Element war. Glücklicherweise hat jemand namens jxtps eine Lösung für dieses Problem gefunden (siehe Kommentar 29 zum Artikel von Shaun Inman). Um das Problem im IE 7 zu beheben, müssen 3 Zeilen Quelltext nach Zeile 55 der si.files.js hinzugefügt werden.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>51
52
53
54
55
56
57
58
59
60
61
62
</pre></td><td class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> x <span style="color: #339933;">=</span> e.<span style="color: #660066;">pageX</span> <span style="color: #339933;">-</span> ox<span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> y <span style="color: #339933;">=</span> e.<span style="color: #660066;">pageY</span> <span style="color: #339933;">-</span> oy<span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> w <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">file</span>.<span style="color: #660066;">offsetWidth</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> h <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">file</span>.<span style="color: #660066;">offsetHeight</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">// Fix for IE7+, otherwise the control can get dragged outside despite overflow: hidden;</span>
<span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>x <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> y <span style="color: #339933;">&lt;</span> <span style="color: #CC0000;">0</span> <span style="color: #339933;">||</span> x <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">offsetWidth</span> <span style="color: #339933;">||</span> y <span style="color: #339933;">&gt;</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">offsetHeight</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
	x <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> y <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> h <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span> w <span style="color: #339933;">=</span> <span style="color: #CC0000;">30</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">file</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">top</span>	<span style="color: #339933;">=</span> y <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span>h <span style="color: #339933;">/</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span>  <span style="color: #339933;">+</span> <span style="color: #3366CC;">'px'</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">file</span>.<span style="color: #660066;">style</span>.<span style="color: #660066;">left</span>	<span style="color: #339933;">=</span> x <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span>w <span style="color: #339933;">-</span> <span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'px'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>Die ausgewählte Datei anzeigen</h3>
<p>Aus Gründen der Benutzerfreundlichkeit sollte der Benutzer den Namen der ausgewählten Datei auch sehen können. Das geht ganz einfach: Man erstellt ein Element, in welches bei jeder Veränderung am <code>input</code>-Element der Wert von selbigem kopiert wird. Das kann ein Texteingabefeld sein, oder beispielsweise ein <code>span</code>-Element, ich bevorzuge letzteres, denn da der Dateiname eh nicht manuell geändert werden kann ist ein Texteingabefeld für den Benutzer ziemlich  verwirrend.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">&lt;div id=&quot;d&quot;&gt;
&lt;!-- Hier wird das Text-Element mittels JS eingefuegt --&gt;
    &lt;label class=&quot;durchsuchen&quot; id=&quot;durchsuchen&quot;&gt;
        &lt;input type=&quot;file&quot; class=&quot;datei&quot; id=&quot;datei&quot; name=&quot;datei&quot;&gt;
    &lt;/label&gt;
&lt;/div&gt;
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    SI.<span style="color: #660066;">Files</span>.<span style="color: #660066;">stylizeAll</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>SI.<span style="color: #660066;">Files</span>.<span style="color: #660066;">able</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> anzeige <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'span'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        anzeige.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'Keine Datei ausgewählt.'</span><span style="color: #339933;">;</span>
        anzeige.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">'anzeige'</span><span style="color: #339933;">;</span>
&nbsp;
        document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'d'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">insertBefore</span><span style="color: #009900;">&#40;</span>anzeige<span style="color: #339933;">,</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'durchsuchen'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'datei'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">onchange</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> datei <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'datei'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">value</span><span style="color: #339933;">;</span>
            document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'anzeige'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span> <span style="color: #339933;">=</span> datei<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>Das Element wird per Java Script erstellt, da Benutzer ohne JavaScript sonst trotzdem neben dem Dateielement noch &#8220;Keine Datei ausgewählt&#8221; stehen hätten. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.antusblog.de/2009/07/04/formulare-datei-element-umgestalten/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

