<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>apfel-z feed: Apfel Z - Web Development</title>
		<link>http://www.apfel-z.net/</link>
		<description>Alle neuen Apfel Z - Web Development-tangierenden Artikel von apfel-z.net</description>
		<lastBuildDate>Fri, 1 May 5:12:03 CET</lastBuildDate>
		<language>de-DE</language>
        <copyright>Copyright 2026 apfel-z.net</copyright>
<item>
	<title>
		<![CDATA[Website-Zertifikat auf Ablauf prÃ¼fen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Website_Zertifikat_auf_Ablauf_pr_fen/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[Da letsencrypt demnÃ¤chst keine Warnungen mehr per E-Mail versendet, dass ein ausgestelltes Zertifikat demnÃ¤chst ablÃ¤uft, muss ich meine Seiten nun halt selbst prÃ¼fen.
DafÃ¼r habe ich mich hiervonÂ inspirieren lassen. Allerdings funktioniert das Skript auf dem Mac nicht, da auf dem Mac der date-Kommandozeilenbefehl leider etwas anders ist. Und ganz so komplex wie in meiner Inspirationsquelle brauche ich es auch wieder nicht...

]]></description>
</item>
<item>
	<title>
		<![CDATA[mediawiki: Einen Artikel via API mit PHP abrufen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/mediawiki_Von_einem_entfernten_PHP_Skript_aus_per_API_Artikel_abrufen/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[Was habe ich mir Ã¼ber die API der mediawiki schon den Kopf zerbrochen und geflucht...
Im aktuellen Fall will ich einige Artikel meines Wikis in einem anderen System anzeigen, ohne dass jeder Benutzer des anderen Systems einen Wiki-Zugang benÃ¶tigt. (Und natÃ¼rlich soll die Wiki auch nicht Ã¶ffentlich sein)<br/>So lassen sich prima in der Wiki Arbeitsanweisungen pflegen, die dann im Arbeitssystem der Benutzer angezeigt werden kÃ¶nnen.
Bis ich aber mal dahinter kam, wie ich das, was auf https://www.mediawiki.org/wiki/API:Parsing_wikitext steht, letztendlich produktiv nutzen kann...

]]></description>
</item>
<item>
	<title>
		<![CDATA[SQL-EintrÃ¤ge mit Update durchnummerieren]]>
	</title>
	<link>http://www.apfel-z.net/artikel/SQL_Eintr_ge_mit_Update_durchnummerieren/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA["BefÃ¼llt die Datenbank erst mit EintrÃ¤gen, wenn ihr euch sicher seid, dass ihr alles genau so haben und nichts mehr Ã¤ndern wollt" hatte ich gesagt. Aber ne...wir wollen jetzt sofort dutzende EintrÃ¤ge reinhauen und nachher zum Entschluss kommen, dass die beim speichern vergebenen Ticketnummern doch irgendwie blÃ¶d sind.
Wie nummeriere ich alle vorhandenen EintrÃ¤ge nochmals neu durch, ohne auf die ID oder Ã¤hnliches zurÃ¼ckzugreifen?<br/>Die Leute wollen in einem Feld eine Ticketnummer haben, die mit "R_2024_" anfÃ¤ngt und dann eine fortlaufende Zahl hintendran hat. 3stellig mit fÃ¼hrenden Nullen.<br>
R_2024_001<br />
R_2024_002<br />
...

Das geht mit folgendem SQL-Befehl (die erste Zahl ist hierbei eine 1):

SET @row := 0; <br />
update `positionen` <br />
&nbsp; set ticketnr = concat&#40;'R_2024_', LPAD&#40;@row:=@row+1, 3, '0'&#41;&#41; <br />
&nbsp; WHERE typ = 1
]]></description>
</item>
<item>
	<title>
		<![CDATA[Autologin in Wiki]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Autologin_in_Wiki/</link>
	<pubDate><![CDATA[So CET]]></pubDate>
	<description><![CDATA[Ich hatte fÃ¼r einen Verein ein Mediawiki aufgesetzt und ein Verwaltungstool fÃ¼r diverse TÃ¤tigkeiten erstellt.<br/>Da es den meisten Mitgliedern schon schwer fÃ¤llt, sich Passwort und URL des Verwaltungstools zu merken, wollte ich von dort aus zur Wiki verlinken und den Benutzer auch gleich einloggen, denn ohne Login kann man in jener Wiki keine Artikel lesen.
Das Ganze ist gar nicht so einfach, obwohl es eine API fÃ¼r LoginsÂ gibt. Jene ist allerdings mit solchen Fallstricken verbunden, dass man sie an sich gar nicht verwenden kann.<br/>Jedenfalls fand ich nirgends ein funktionierendes Praxis-Beispiel hierfÃ¼r.
Im Folgenden mein Workaround, um von Seite A mit einem Klick auf Button/Link XY zur Wiki zu gelangen und dort automatisch eingeloggt zu werden.

]]></description>
</item>
<item>
	<title>
		<![CDATA[PH-803W per PHP abfragen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/PH_803W_per_PHP_abfragen/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[PH-803W ist wohl ein WasserqualitÃ¤ts-Sensor, den ein Freund von mir in Verwendung hat und in seine IP Symcon-Heimautomation einbinden mÃ¶chte.
Allerdings hat der Sensor keine offene API, sondern sendet seine Werte an eine Handyapp.<br/>FÃ¼r den IOBroker hatte jemand eine LÃ¶sung auf GitHub verÃ¶ffentlicht und hier fand' ich noch ein python-Skript, um an die Werte zu kommen.
Allerdings wÃ¤re fÃ¼r IP Symcon ein PHP-Skript notwendig, also musste ich ran.<br/>Zum GlÃ¼ck hatte der Entwickler der IOBroker-LÃ¶sung auch noch eine gute Dokumentation beigelegt, welche HEX-Werte zu senden sind und wie die Antworten zu interpretieren sind, so dass die Sache kein groÃes Problem war.

]]></description>
</item>
<item>
	<title>
		<![CDATA[mysql: Datumsintervall generieren]]>
	</title>
	<link>http://www.apfel-z.net/artikel/mysql_Datumsintervall_generieren/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Absolutes Randgruppenthema und ein exotisches noch dazu, aber da ich mir fÃ¼r die LÃ¶sung eines Problemes stundenlang die Finger wundgegoogelt hatte, hier mal ein Treffer mehr fÃ¼r die Google-Suche.
Was war das Problem?
Ich habe ein Tabelle mit Bestellungen verschiedener Shops, wie etwa vereinfacht jene hier
id shop datum<br />
&nbsp;1 &nbsp; &nbsp;1 2022-12-01<br />
&nbsp;2 &nbsp; &nbsp;1 2022-12-01<br />
&nbsp;3 &nbsp; &nbsp;1 2022-12-02<br />
&nbsp;4 &nbsp; &nbsp;2 2022-12-02<br />
&nbsp;5 &nbsp; &nbsp;2 2022-12-02

Nun will ich je Shop und je Tag (und auch je Woche, je Monat, je Jahr) wissen, wie viele Bestellungen fÃ¼r Shop 1 und Shop 2 jeweils eingegangen sind. Das ganze auch grafisch in einem Diagramm darstellen.
Man mÃ¶chte meinen, mit einem COUNT() und GROUP BY sei dies ja ganz einfach. Allerdings bekomme ich kein Ergebnis fÃ¼r die Tage/Wochen/Monate/Jahre, wo es bei einem Shop keine Bestellung gab.
SELECT COUNT&#40;id&#41; AS anzahl, shop, datum <br />
&nbsp; FROM bestellungen <br />
&nbsp; WHERE datum &gt;= '2022-12-01' AND datum &lt;= '2022-12-02' <br />
&nbsp; GROUP BY shop, datum

anzahl shop datum<br />
&nbsp; &nbsp; &nbsp;3 &nbsp; &nbsp;1 &nbsp;2022-12-01<br />
&nbsp; &nbsp; &nbsp;1 &nbsp; &nbsp;1 &nbsp;2022-12-02<br />
&nbsp; &nbsp; &nbsp;2 &nbsp; &nbsp;2 &nbsp;2022-12-02

Ich vermisse das Ergebnis "Shop 2 am 1.12.2022 Anzahl: 0"

]]></description>
</item>
<item>
	<title>
		<![CDATA[.htaccess-Refresher]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_htaccess_Refresher/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[Ich habe ein paar Websites (wie z.B. auch in so gut wie allen FÃ¤llen den phpMyadmin) per .htaccess abgesichert, so dass man nur von bestimmten IP-Adressen aus darauf zugreifen kann.
Beispiel:
order deny,allow<br />
deny from all<br />
Allow from 198.141.12.11<br />
Allow from 198.141.12.12

Das funktioniert fÃ¼r den Zugriff vom Firmennetzwerk aus recht gut, von zu Hause aus allerdings nur fÃ¼r einen Tag, da sich bei mir zu Hause die IP tÃ¤glich Ã¤ndert und ich somit immer erst die .htaccess-Datei Ã¤ndern muss, um zugreifen zu kÃ¶nnen.
Deshalb habe ich mir ein Skript geschrieben, welches in sÃ¤mtlichen .htaccess-Dateien meine IP-Adresse aktualisiert.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Google Analytics im Jahr 2022 verwenden]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Google_Analytics_im_Jahr_2022_verwenden/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[Man dÃ¼rfte meinen, dass so gut wie jede Website heutzutage Google Analytics nutzt. Trotzdem habe ich nirgends eine vollstÃ¤ndige Anleitung gefunden, wie man im Jahre 2022 Google Analytics zu einer Website hinzufÃ¼gt. Denn einerseits sieht Google Analytics jedes Mal, wenn ich es benÃ¶tige (was ehrlich gesagt sehr selten ist), anders aus und andererseits muss man in Europa ja auch noch viel mehr drumherumbasteln, um nicht irgendwann Post vom Anwalt zu bekommen.
Ich mÃ¶chte in diesem Zuge darauf hinweisen, dass apfel-z kein Google Analytics verwendet. Mir ist es relativ wurscht, wie viele andere Leute mit welchem Browser von wo aus wie lange auf meinen Wissensspeicher zugreifen.
Achtung: Ich lege nicht meine Hand dafÃ¼r ins Feuer, dass die ganze Sache auch wirklich 100% gesetzeskonform ist und einem nicht trotzdem jemand an den Karren fahren kann.<br/>Ich sage immer wieder: Um heutzutage Websites zu erstellen, mÃ¼sste man eigentlich nicht Programmierer/Designer, sondern Advokat sein.
AuÃerdem kann alles im Folgenden Beschriebenen zu dem Zeitpunkt, wo dieser Artikel gelesen wird, schon wieder anders aussehen und funktionieren. Google ist nicht gerade durch seine Konsistenz bekannt.

]]></description>
</item>
<item>
	<title>
		<![CDATA[MediaWiki-Erweiterung: CSS- und JavaScript-Dateien einbinden]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Mediawiki_Extension_jscssfiles/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[NatÃ¼rlich gibt es die common.css und die common.js, um eignen CSS- respektive JavaScript-Code in die Wiki zu integrieren.
Allerdings bekam ich mit wachsender Anzahl von Modifikationen und wachsender Anzahl von Wikis Probleme, die beiden common.*-Seiten aller Wikis zu pflegen.
Sei es ein Verbund von drei Wikis, die auf einem Server installiert sind, um die Infos verschiedener Unter-Unternehmen abzugrenzen oder ein Verbund von 10 Wikis, die auf einem anderen Server installiert sind, (Tendenz steigend), um verschiedene Kundengruppen mit verschiedenen Informationen zu versorgen.<br/>Sollen alle Wikis gleich aussehen und dann mal eine Farbe geÃ¤ndert werden, ist man eine Weile beschÃ¤ftigt.
Deshalb habe ich mir Gedanken gemacht, wie ich den Code, der bei allen Wikis gleich ist, in eine separate Datei auslagere, auf die alle Wikis zugreifen kÃ¶nnen.<br/>Weiteres Benefit: Den Code in der Textdatei zu Ã¤ndern ist fÃ¼r mich schneller erledigt, als erst in der Wiki zur common.*-Seite zu gelangen und dort den Text zu bearbeiten.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Oracle SQL fÃ¼r PHP einrichten]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Oracle_SQl_f_r_PHP_einrichten/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[Von einem Ubuntu-Webserver aus muss ich in PHP-Skripten auf eine Oracle SQL Datenbank zugreifen kÃ¶nnen (die auf einem anderen Server lÃ¤uft).
Obwohl es doch einige HÃ¼rden zu Ã¼berwinden gab, war ich positiv Ã¼berrascht, dass ich schnell ans Ziel kam.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Mediawiki: Alle Seiten als PDF]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Mediawiki_Alle_Seiten_als_PDF/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[Neulich wurde ich gefragt, wie man alle Artikel eines mediawikis in ein PDF packen kÃ¶nnte.<br/>Ãber Sinn und Zweck kann man streiten, da sich die Sache aber schnell als schwieriger herausstellte, als ich anfangs annahm, war mein Ehrgeiz geweckt.
Bei mediawiki.org sind zwar mehrere Extensions gelistet, die zum PDF-Export dienen, allerdings galt fÃ¼r alle: Entweder sie funktionieren mit der aktuellen Version 1.37 nicht oder die Installation ist derart komplex mit zig AbhÃ¤ngigkeiten und zu installierenden Serverkomponenten, dass ich darauf erst gar keine Lust hatte (wieso npm installieren, um ein PDF zu erstellen? Geht's noch?)...denn wer weiÃ, ob die Extension nach der umfangreichen Installation Ã¼berhaupt funktioniert.
Am Ende hatte ich ein kleines PHP-Skript geschrieben, welches auf die mediawiki-API zurÃ¼ckgreift.<br/>Einzige AbhÃ¤ngigkeiten: htmldoc auf dem Server installieren (dafÃ¼r ist ein Kommandozeilenzugriff erforderlich) und einen Bot-Zugang in der Wiki erstellen.

]]></description>
</item>
<item>
	<title>
		<![CDATA[CleverReach API via PHP]]>
	</title>
	<link>http://www.apfel-z.net/artikel/CleverReach_API_via_PHP/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA[Neulich musste ich per PHP mit der CleverReach API sprechen.
Der API-Explorer ist cool, aber die Doku hat bei mir fÃ¼r die einen oder anderen Anfangsschwierigkeiten gesorgt.
Den fertigen PHP REST Client, den man auf der Doku-Seite herunterladen kann, brachte ich nicht zum Funktionieren. Irgendwie bin ich immer zu blÃ¶d, irgendetwas Fertiges zu verwenden, wenn es nicht komplett dokumentiert wurde.
Naja, habe ich meine CleverReach-REST-PHP-Class halt selbst geschrieben...

]]></description>
</item>
<item>
	<title>
		<![CDATA[CURL/PHP und das verfallene Let's Encrypt Zertifikat]]>
	</title>
	<link>http://www.apfel-z.net/artikel/CURL_PHP_und_das_verfallene_Let_s_Encryp_Zertifikat/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA[Ich fÃ¼hlte mich fÃ¼r den 30. September 2021 gut gewappnet. Alles getestet, mein Server kommt mit dem ab jenem Tag abgelaufenen DST Root CA X3-Zertifikat von Let's Encrypt zurecht und spielt das neue ISRG Root X1 aus.
Allerdings musste ich just an dem Tag feststellen: Ich kann mit curl bzw. dessen Pendant innerhalb von PHP nichts mehr herunterladen. Certificate error
Ich sage nur immer wieder: ScheiÃ Zertifikate!

]]></description>
</item>
<item>
	<title>
		<![CDATA[Shopify und seine APIs]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Shopify_Private_App_erstellen/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[Vielleicht bin ich zu dumm dazu, aber nun stehe ich schon das zweite Mal vor dem Problem, wie ich von extern die Daten von Shopify abzapfen kann, bzw bei einer Bestellung im Shop die Daten der Bestellung (Produkte, Kunde) an eine externe Datenbank weiterleiten kann.
Ich bin zwar mal Ã¼ber "Shopify Flow" gestolpert, aber dies gibt es wohl nur in Verbindung mit "Shopify Plus". Ansonsten mÃ¼sste es irgendwie eine MÃ¶glichkeit mit Hilfe der "Apps" geben (heutzutage sind drei Zeilen Code ja eine Ãhpp)
Mal schnell zusammengefasst, was Shopify alles an Schnittstellen bietet: Ãffentliche Apps (das, was man so in Shopifys "App Store" findet) Benutzerdefinierte Apps (Da bin ich noch nicht so wirklich hinter Sinn, Zweck und HowTo gekommen) Private Apps (damit kann man schÃ¶n was fÃ¼r sich selbst basteln, darauf gehe ich noch ein) App-EntwÃ¼rfe (keine Ahnung. Gibt's halt...steht in der Doku) Webhooks (was ich suche, aber in den Dokus schwer zu finden: Shopify sendet aktiv bei bestimmten Ereignissen Daten an ein externes Skript)
Ãber Payments-API, Partner-API, Messaging-API, Storefront-API, AJAX-API, Liquid & Co will ich gar nicht erst reden...
Im Folgenden will ich mal schauen, was man mit ner "Privaten App" (ich nenne lieber "Simplen API-Zugriff") und den Webhooks so anstellen kann.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Shopify: Bei bestimmten Produkten, ein weiteres Produkt in den Warenkorb legen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Shopify_Bei_bestimmten_Produkten_ein_weiteres_Produkt_in_den_Warenkorb_legen/</link>
	<pubDate><![CDATA[Sa CET]]></pubDate>
	<description><![CDATA[Ein Kunde betreibt einen Shop, in welchem er seine Pasta und noch andere italienische Produkte vertreibt. Nachdem bisher nur Trockenpasta verkauft wurde, sollte nun auch noch frische Pasta verkauft werden. Allerdings ist der Versand von frischer Pasta teurer, da Isolationsmaterial und KÃ¼hlmittel beigelegt werden mÃ¼ssen.
Keine groÃe Sache, dachte ich mir. Verschiedene Versandtarife fÃ¼r verschiedene Produkte ist ja etwas, was alle mÃ¶glichen Shops benÃ¶tigen, also deckt das der verwendete Shopify-Shop sicher mit seinen Versandtarif-Einstellungen ab.<br/>Die Einrichtung sah auch vielversprechend aus: Versandtarif hinzufÃ¼gen, Produkte auswÃ¤hlen, die den teureren Versand erfordern (kleines Ãrgernis, dass sich keine Gruppen/Kategorien auswÃ¤hlen lassen, sondern nur einzelne Produkte), speichern.<br/>Test: Produkt in den Warenkorb, Versandkosten passen, top!
Die Freude war allerdings von kurzer Dauer: Legt man ein weiteres Produkt in den Warenkorb, welches nicht in diesem Versandtarif enthalten ist, werden beim Checkout die normale VersandgebÃ¼hr plus die erhÃ¶hte VersandgebÃ¼hr berechnet.
Da im Internet keine LÃ¶sung mit Bordmitteln zu finden ist, scheint es fÃ¼r diesen vermeintlich oft vorkommenden Fall wirklich von Shopify keine LÃ¶sung zu geben.<br/>Diese Problemstellung ist nur mit zusÃ¤tzlichen kostenpflichtigen "Apps" oder Eingriff in den Template-Code beizukommen.
NatÃ¼rlich kommt in meinem Fall nur Letzteres in Betracht... ;-) 

]]></description>
</item>
<item>
	<title>
		<![CDATA[Fritz!Box API TR-064 via PHP]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Fritz_Box_API_TR_064_via_PHP/</link>
	<pubDate><![CDATA[So CET]]></pubDate>
	<description><![CDATA[Da mir die tÃ¤gliche Info-Mail, die man sich von einer Fritz!Box zusenden lassen kann, zu unpraktisch war, hatte ich erst mit dem Gedanken gespielt, diese von einem Server auswerten und umschreiben zu lassen, bin dann aber auf die TR-064-Schnittstelle gestoÃen, die neuere Modelle bieten (welche nicht mehr via Telnet ansprechbar sind).
Im Folgenden ein Ansatz, per PHP auf Daten der Fritz!Box zugreifen zu kÃ¶nnen.<br/>Ein anderer Ansatz, sich die Daten des Web-UIs abzugreifen, ist in diesem Artikel zu finden. Die beiden AnsÃ¤tze ergÃ¤nzen sich teilwese, weil ich Ã¼ber diese TR-064 leider nicht an alle gewÃ¼nschte Daten rankomme.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Von PHP auf einem Ubuntu-Server auf eine MSSQL-Datenbank zugreifen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Von_PHP_auf_einem_Ubuntu_Server_auf_eine_MSSQL_Datenbank_zugreifen/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[Aus der Kategorie "warum einfach, wenn's auch kompliziert geht" hatte ich versucht, irgendwie via ODBC von einem Ubuntu-Server auf eine MS-SQL-Datenbank zuzugreifen. Was man dazu im Internet an (verschiedenen!) Anleitungen findet, ist faszinierend.
Nach etwas Trial und ziemlich viel Error musste ich festellen, dass es auch ganz einfach geht und es kein ODBC benÃ¶tigt, wenn ich von PHP aus auf eine MS-SQL-Datenbank zugreifen mÃ¶chte.

]]></description>
</item>
<item>
	<title>
		<![CDATA[ZIP-Datei mit PHP erstellen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/ZIP_Datei_mit_PHP_erstellen/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[ZIP-Dateien lassen sich direkt mit PHP-Bordmitteln erstellen. 
Im Folgenden ein paar Zeilen fÃ¼r "mein digitales GedÃ¤chtnis"...

]]></description>
</item>
<item>
	<title>
		<![CDATA[Bild auf Website beschneiden]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Bild_auf_Website_beschneiden/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[Meine Intention: Auf einer Website soll man ein hochgeladenes Bild wie rechts abgebildet auf Wunsch beschneiden kÃ¶nnen. Das Resultat landet wieder als (neue) Bilddatei auf dem Webserver.
Die JavaScript-Funktionen, um den Beschneidungsbereich im Browser auswÃ¤hlen zu kÃ¶nnen, liefert hierbei die Bibliothek cropper.<br/>Das beschnittene Bild wird dann im Hintergrund mit Hilfe von PHP erstellt (cropper bietet hier zwar eine direkte LÃ¶sung, allerdings muss der eingesetzte Browser hierfÃ¼r HTMLCanvasElement.toBlob verstehen und das sind mir fÃ¼r meinen Geschmack zu wenige Browser, die das kÃ¶nnen).

]]></description>
</item>
<item>
	<title>
		<![CDATA[Graue Haare mit PHPs imagecopyresampled]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Graue_Haare_mit_PHPs_imagecopyresampled/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[Meine Intention: Auf einer Website soll man ein hochgeladenes Bild wie rechts abgebildet auf Wunsch beschneiden kÃ¶nnen. Das Resultat landet wieder als Bilddatei auf dem Webserver.
Die zwei Grundpfeiler der ganzen Geschichte sind zum einen die JavaScript-Bibliothek cropper und zum anderen der Befehl  imagecopyresampled der PHP-GD-Bibliothek.
Die PHP-API-Dokumentation ist fÃ¼r mich eigentlich das Top-Beispiel, wie eine Dokumentation aussehen mÃ¼sste. Allerdings sind bei mir wohl durch die Beschreibung des Befehles  imagecopyresampled ein mehr an grauen Haaren hinzugekommen. Da waren auch die zahlreichen Codeschnipsel im unteren Teil der Seite keine Hilfe, bei denen immer gleich noch skaliert wurde.

]]></description>
</item>
<item>
	<title>
		<![CDATA[jQuery FileUpload]]>
	</title>
	<link>http://www.apfel-z.net/artikel/jQuery_FileUpload/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA[Das jQuery FileUpload-Plugin ist eine feine Sache, welches ich inzwischen fast immer verwende, wenn ich auf einer Website eine Upload-MÃ¶glichkeit hinzufÃ¼gen muss.<br/>Mit jQuery FileUpload sind Uploads groÃer und vieler Dateien keine groÃe Sache. Das Plugin hat nur ein Manko: Zur Dokumentation lÃ¤sst sich sagen "Ja, ist vorhanden". Aber gerade wegen der vielen Optionen und MÃ¶glichkeiten ist sie leider nicht so Ã¼bersichtlich, wie ein php.net oder api.jquery.com<br/>So beschÃ¤ftige ich mich immer wieder Stunden damit, eine LÃ¶sung zu finden, nur weil bei einer neuen Implementierung eine Kleinigkeit anders sein soll.
Ich will im Folgenden mal meine Best Practices mit dem jQuery FileUpload-Plugin unter dem Gesichtspunkt "Verwendung mit PHP" zusammenfassen.

]]></description>
</item>
<item>
	<title>
		<![CDATA[.htaccess: Seite von externem Zugriff schÃ¼tzen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_htaccess_Seite_von_externem_Zugriff_sch_tzen/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Ich sperre schon lange einige meiner privaten und beruflichen Seiten mit Hilfe einer .htaccess-Datei.<br/>Dazu wird &ndash; wie den meisten bekannt sein sollte &ndash; eine Textdatei mit dem Namen .htaccess in das Webserver-Verzeichnis, fÃ¼r welches (und dessen Unterverzeichnisse) die BeschrÃ¤nkung gelten soll.

Zugriff von auÃen sperren 
Manches Private sollte eher privat bleiben.<br/>Auf einem Webserver, auf den man auch vom Internet aus Zugriff hat, soll  die eine oder andere Unterseite nur aus dem internen Netzwerk aufrufbar sein.<br/>Die .htaccess-Datei dafÃ¼r sieht in etwa so aus:
order deny,allow<br />
deny from all<br />
allow from 172.17.0.0/255.255.0.0

Hiermit haben nur Benutzer aus dem internen Netzwerk Zugriff, die eine 172.17.*.*er-IP-Adresse haben.

Erweiterte Schwierigkeiten durch Proxy 
Dies hatte in der Firma einige Weile funktioniert, bis irgendwas an Proxy/Firewall umgestellt wurde.<br/>Seitdem haben Zugriffe von auÃerhalb des Unternehmens-Netzwerkes eine IP, die so aussieht, als ob sie von innerhalb des Netzwerkes kommen wÃ¼rde (z.B. 172.17.60.10, was oben genannte Regel durchlÃ¤sst).
Um herauszufinden, an Hand von was man Zugriffe von auÃerhalb und Zugriffe von innerhalb des Intranets unterscheiden kann, habe ich mir ausspucken lassen, was die $_SERVER-Variable in einem php-Testskript so alles beinhaltet, wenn man von auÃen zugreift. Gemeinsamer Nenner war HTTP_VIA, in welchem die IP 192.168.248.5 stand, wenn der Zugriff von auÃen erfolgte (und ansonsten leer war).<br/>Somit konnte ich mein Problem nun mit einer RewriteRule in der .htaccess-Datei lÃ¶sen.

]]></description>
</item>
<item>
	<title>
		<![CDATA[phpMyAdmin: Ansicht editieren]]>
	</title>
	<link>http://www.apfel-z.net/artikel/phpMyAdmin_Ansicht_editieren/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Ein praktisches Feature von phpMyAdmin ist die MÃ¶glichkeit, "Ansichten" ("Views") zu generieren.<br/>Eine Ansicht ist nichts anderes, als eine "Gespeicherte SQL-Abfrage". FÃ¼hrt man eine bestimmte Anfrage hÃ¤ufiger durch, so speichert man diese am besten als Ansicht und hat diese dann wie auch die eigentlichen Tabellen Datenbank-Baum griffbereit (im Beispiel rechts die Ansicht "falsche auÃen-sensorwerte").
MÃ¶chte man an so eine Ansicht allerdings einmal Ã¤ndern, gestaltet sich das nicht so einfach, wie die Ansicht ursprÃ¼nglich erstellt wurde.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Meine JavaScript-AJAX-Funktion]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Meine_JavaScript_AJAX_Funktion/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[WÃ¤hrend eine statische HTML-Site angezeigt wird per JavaScript im Hintergrund Abfragen machen &ndash; die MÃ¶glichkeit bietet JavaScript schon seit Jahren.<br/>Allerdings werden immer zahlreiche Zeilen Code nÃ¶tig, den XMLHttpRequest() einzurichten und die Antwort entgegenzunehmen.
Ich selbst kopiere mir meine dafÃ¼r verwendete Funktion immer wieder aus einem anderen Projekt raus und will es nun lieber mal hier in meiner Sammlung hilfreicher Web-Tipps posten.

]]></description>
</item>
<item>
	<title>
		<![CDATA[FPDF: Wie platziere ich Text?]]>
	</title>
	<link>http://www.apfel-z.net/artikel/FPDF_Wie_platziere_ich_Text/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA[All paar Monate greife ich mal wieder auf FPDF zurÃ¼ck und stolpere immer wieder Ã¼ber die etwas gewÃ¶hnungsbedÃ¼rftigen Funktionen der Text-Platzierung.
In welcher Einheit sind die Einheiten? Welche zig Parameter muss ich der Methode Ã¼bergeben und wie erstelle ich mehrzeiligen Text?

]]></description>
</item>
<item>
	<title>
		<![CDATA[FPDF: PDF in PHP erstellen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/FPDF_PDF_in_PHP_erstellen/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[Bis vor kurzem ging ich noch davon aus, dass es nicht all zu einfach wÃ¤re, mit PHP ein PDF zu erstellen. Da lag ich falsch: Mit FPDF existiert schon seit 2001 eine Klasse, um PDFs zu erstellen.
So steht der PDF-Erstellung auf der Website &ndash; sei es zur automatischen Erstellung der Rechnung oder Personalisieren von Druckdaten &ndash; nichts mehr im Wege.
Im Folgenden ein paar Kniffe fÃ¼r FPDF.

]]></description>
</item>
<item>
	<title>
		<![CDATA[FPDF: Erstelltes PDF automatisch bei Anzeige ausdrucken lassen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/FPDF_Erstelltes_PDF_automatisch_bei_Anzeige_ausdrucken_lassen/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[FPDF ist eine PHP-Library, mit Hilfe derer man relativ einfach direkt aus PHP heraus PDFs erstellen kann und definitiv einen Blick wert.
Im Rahmen eines Projektes wollte ich den Benutzern einen Klick sparen und direkt beim Anzeigen des gerade erstellten PDFs den Druck-Dialog des Systems Ã¶ffnen lassen.
Die Jungs von FPDF haben eine interessante Erweiterung, die das Einbinden von JavaScript in das PDF erlaubt und den Druckdialog dann per (ins PDF eingebettete) JavaScript aufruft.<br/>Aber eigentlich bietet das PDF-Format auch nativ die MÃ¶glichkeit, das Anzeige-Programm zum direkten Ausdruck zu drÃ¤ngen.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Strato: Datenbankverwaltung und phpMyAdmin]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Strato_Datenbankverwaltung_und_phpMyAdmin/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Ich hoste meine Websites bei Strato und empfehle Strato auch jedem, der sich fÃ¼r eigene Domains und/oder Webspace interessiert.<br/>Inzwischen verwalte ich fÃ¼r mehrere Leute Websites, die jeweils bei Strato liegen. Was mich aber immer wieder nervt: Der Datenbankzugriff (wenn man mal kurz per phpMyAdmin nen Blick reinwerfen will):<br/>Auf die Strato-Homepage gehen, von dÃ¤mlichem Werbe-Stimmungsbild begrÃ¼Ãt werden, auf Login klicken, einloggen, zur Datenbankverwaltung (immerhin inzwischen zwei Klicks nÃ¤her), nochmals auf "Verwaltung" klicken, dann ist man endlich im phpMyAdmin. Und macht man dort ein paar Minuten nichts, beginnt dieses Prozedere mehr oder weniger von vorne.
Eigentlich wollte ich separate phpMyAdmins bei mir lokal hosten, um auf die jeweiligen Datenbanken zugreifen zu kÃ¶nnen, aber wie es scheint, kommt man nicht auf die Datenbank, wenn von auÃerhalb eines Strato-Servers zugreift (ich konnte auch keine Sicherheits-Einstellung finden, die das mÃ¶glich macht). Sicherheitstechnisch ja eigentlich nicht Ã¼bel.
Dann halt so: phpMyAdmin fÃ¼r jeden Strato-Account im jeweiligen Webspace installieren.

]]></description>
</item>
<item>
	<title>
		<![CDATA[TextWrangler/BBEdit: TextFilter]]>
	</title>
	<link>http://www.apfel-z.net/artikel/TextWrangler_BBEdit_TextFilter/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Was des Maurers Kelle, des Malers Pinsel und des Mechanikers SchraubenschlÃ¼ssel ist bei mir (neben InDesign und Photoshop) TextWrangler.<br/>Mit keinem anderen Programm habe ich schon so viele Stunden verbracht. SÃ¤mtliche Websites und Skripte werden von mir in TextWrangler getippt.
Was hatte ich schon andere Texteditoren getestet &ndash; nur um sicher zu gehen, dass ich doch nichts besseres verpasse &ndash; keiner war so flexibel wie TextWrangler. Besonders wichtig ist es fÃ¼r mich, Dateien direkt via FTP zu Ã¶ffnen und bearbeiten (ohne Umwege wie eine Verzeichnis-Synchronisation oder temporÃ¤rer Datei-MÃ¼ll) und ein schlankes Programm zu haben (krasse Gegenbeispiele: Atom oder Brackets).<br/>Meiner Ansicht nach kÃ¶nnte es nur ein Programm mit TextWrangler aufnehmen: BBEdit (natÃ¼rlich)!
Sowohl TextWrangler wie auch BBEdit haben eine praktische Funktion namens "Text Filters" (MenÃ¼ Window > Palettes > Text Filters): Mit Hilfe von Bash/Perl/Python/Ruby-Skripten lÃ¤sst sich der Text des aktiven Fensters oder der Auswahl manipulieren.
Ein paar meiner eigenen Text Filter mÃ¶chte ich an dieser Stelle verÃ¶ffentlichen.

]]></description>
</item>
<item>
	<title>
		<![CDATA[MediaWiki-Erweiterung: Andere Wikis durchsuchen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/MediaWiki_Erweiterung/</link>
	<pubDate><![CDATA[Mo CET]]></pubDate>
	<description><![CDATA[Wahrscheinlich bin ich es gleich von Anfang an falsch angegangen und es gÃ¤be eine grundsÃ¤tzlich bessere LÃ¶sung, aber es ist wie es ist: In unserem Unternehmen haben wir inzwischen 4 separate MediaWiki-Wikis fÃ¼r unterschiedliche Bereiche, in denen es eigentlich um absolut unterschiedliche Themen geht.
Bei vier Wikis und zahlreichen Artikeln sind Themen-Ãberschneidungen dann allerdings doch nicht mehr ganz so ausgeschlossen und wir stehen kurz davor, dass man eine Information sowohl in Wiki A wie auch in Wiki D finden kÃ¶nnte.<br/>Diese doppelte Suche will ich den Usern ersparen und habe deshalb eine Erweiterung geschrieben, mit Hilfe derer die Wiki-Suchfunktion aufgebohrt wird: Es wird nicht nur in der Wiki selbst nach passenden Artikeln gesucht, sondern auch in weiteren Wikis.

]]></description>
</item>
<item>
	<title>
		<![CDATA[Input-Autocomplete mit (etwas zu viel) FlexibilitÃ¤t]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Input_Autocomplete_mit_zu_viel_Flexibilit_t/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[FÃ¼r eine Website wollte ich ein Autocomplete-Inputfeld Ã¡ la jQuery UI, allerdings mit noch ein paar erweiterten Eigenschaften, an denen ich mir einige Zeit lang die ZÃ¤hne ausgebissen hatte.

Bei Eingabe einiger Zeichen sollte per AJAX eine Abfrage an den Webserver gestartet werden, das JSON-Ergebnis (wie auch im jQuery-UI-Beispiel) als AufklappmenÃ¼ dargestellt werden. Die fertige LÃ¶sung war fÃ¼r mich schon deshalb nicht ausreichend, da mein JSON-Ergebnis noch weitere Werte, als einfach nur Name und ID zurÃ¼cklieferte, welche ich bei Auswahl im UI dann in weitere Formular-Felder schreiben wollte.<br/>Falls sich das keiner vorstellen kann: Rechts ein kleines Diagramm dazu.
Probleme hatte ich allerdings dadurch, dass......ich bei der AJAX-Abfrage noch die Werte einiger anderen Formular-Felder mitgeben muss (und mir anfangs immer die Standard-Werte mitgegeben wurde, die das Formular zu dem Zeitpunkt hatte, als ich mein Autocomplete-Plugin initialisiert hatte)...die Autocomplete-Felder flexibel zur Laufzeit entfernt und hinzugefÃ¼gt werden kÃ¶nnen
Wer sich dafÃ¼r interessiert: Im Folgenden die LÃ¶sungsansÃ¤tze.

]]></description>
</item>
<item>
	<title>
		<![CDATA[PHP: Magic Quotes de-aktivieren]]>
	</title>
	<link>http://www.apfel-z.net/artikel/PHP_Magic_Quotes_de_aktivieren/</link>
	<pubDate><![CDATA[Do CET]]></pubDate>
	<description><![CDATA[Durch die Magic Quotes-Funktion werden automatisch alle HTTP-Daten (POST, GET und COOKIEs) escaped. "hallo" wird zum Beispiel als \"hallo\" gespeichert.<br/>Diese Funktion ist Ã¼berholt und wird in PHP 6 nicht mehr vorhanden sein.
Bisher hatte es mich nicht arg interessiert, ob Magic Quotes aktiv oder nicht aktiv sind. Es kam allerdings eine Zeit, in der ich unser unternehmensinternes Wiki von 1.19 auf 1.25 updaten wollte und auf einmal stÃ¶rte sich MediaWiki Ã¼ber die Magic Quotes.<br/>Dummerweise lÃ¤uft auf dem Webserver noch anderes Zeugs. Ein globales de-aktivieren der Magic Quotes fÃ¼hrt dazu, dass andere (aaaaalte!) Systeme nicht mehr so ganz korrekt ihren Dienst verrichten.
Google hatte schnell eine LÃ¶sung: Magic Quotes via .htaccess de-aktivieren.<br/>Funktionierte in diesem Falle leider nicht. Egal, welchen Tipp ich verwendet hatte.
Die LÃ¶sung war allerdings ziemlich banal. Da man manchmal an die banalsten Dinge nicht denkt, verhelfe ich hier vielleicht jemand anderem zu einem Google-Treffer mit Aha-Effekt:
Die .htaccess wurde in meinem Fall Ã¼berhaupt nicht interpretiert, da dies in der Apache-Konfiguration de-aktiviert war (handelte sich in dem Fall um einen Windows-Server mit XAMPP, auf den ich nicht so ganz den Einfluss habe...da hatte ich erst alles mÃ¶gliche andere im Verdacht).

]]></description>
</item>
<item>
	<title>
		<![CDATA[Von PHP aus einen Termin in einen Exchange-Kalender eintragen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Von_PHP_aus_einen_Termin_in_einen_Exchange_Kalender_eintragen/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Die Situation: Kunden melden sich auf der Firmen-Homepage mit einem Wunsch-Termin an.<br/>Das ganze hatte ich recht schÃ¶n auf einer Intranet-Seite in einem Kalender dargestellt, bei dem man dann nur auf den entsprechenden Termin klicken muss, um direkt zum Kassensystem zu gelangen, wo die Kundendaten dann gleich eingetragen werden.
Der Wunsch: Die GeschÃ¤ftsleitung fÃ¼hrt nebenbei noch einen speziellen Outlook-Kalender nur fÃ¼r diese Kunden-Termine und da sollen alle Termine auch nochmals drinnen stehen. Ich bin ja schon heilfroh, dass nicht noch &ndash; wie sonst auch an allen Ecken und Enden &ndash; einen Excel-Export einrichten muss.
Stunden hatte ich verbracht, eine MÃ¶glichkeit zu finden, von einem PHP-Skript aus einen Kalendereintrag einzufÃ¼gen. Verschiedene vorgefertigte PHP-Klassen hatte ich getestet. Alles erfolglos.<br/>Dabei geht das alles mit wenigen Zeilen Code, sofern die CURL-PHP-Erweiterung auf dem Webserver installiert ist.<br>
]]></description>
</item>
<item>
	<title>
		<![CDATA[Strato und der HTTP-Fehlercode 503]]>
	</title>
	<link>http://www.apfel-z.net/artikel/Strato_und_der_HTTP_Fehlercode_503/</link>
	<pubDate><![CDATA[Sa CET]]></pubDate>
	<description><![CDATA[Neulich hatte ich an einem CMS mit dem jQuery-FileUpload-manager einen Fehler beheben wollen, war aber nach ein paar Tests mit einem ganz anderen Problem konfrontiert: 
Uploads funktionieren auf einmal Ã¼berhaupt nicht mehr und vom Server kam nur noch der HTTP-Statuscode 503 zurÃ¼ck.
Service Temporarily Unavailable<br />
The server is temporarily unable to service your request due to<br />
maintenance downtime or capacity problems. Please try again later.

Naja, kann ja sein, dass Strato mal zwischendurch eine Wartung macht, aber ging dann doch recht lange und seltsamerweise funktionierte die restliche Seite problemlos.
Im Endeffekt fand' ich heraus, dass es sich um den Versuch Stratos handelte, Spam aus GÃ¤stebÃ¼chern fern zu halten. In diesem Fall handelte es sich zwar weder um ein GÃ¤stebuch, noch um Spam, doch zum GlÃ¼ck lies sich dieser etwas zu gut gemeinte Fehlversuch Stratos, etwas Gutes zu tun, deaktivieren.

Man loggt sich dazu in Strato's Kundencenter ein und deaktiviert unter Sicherheit > ServerSideSecurity den Filter (...der "im Gegensatz zu vielen anderen Systemen dazu'lernt'''...jaja...).
]]></description>
</item>
<item>
	<title>
		<![CDATA[HTML-E-Mail per PHP versenden]]>
	</title>
	<link>http://www.apfel-z.net/artikel/HTML_E_Mail_per_PHP_versenden/</link>
	<pubDate><![CDATA[Mi CET]]></pubDate>
	<description><![CDATA[Ich bin mir sicher, dass ich da schon einmal drÃ¼ber gestolpert bin, aber eben musste ich schon wieder lange suchen, bis ich des RÃ¤tsels LÃ¶sung gefunden hatte.
Normalerweise verwende ich beim Versenden von E-Mails via PHP immer folgenden Header:
&nbsp;$headers &nbsp;= 'From: xxx@xxx.org\n\r' .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'MIME-Version: 1.0' . &quot;\n\r&quot; . <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'Content-type: text/html; charset=iso-8859-1' . &quot;\n\r&quot; .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;X-Mailer: PHP&quot;;


Beim Klonen eines Skriptes von einem Server auf einen anderen endete die Geschichte aber mit einer ziemlich unschÃ¶nen E-Mail, wie sie rechts dargestellt ist.
Der \n\r-Linebreak stellte sich in diesem Fall als Verursacher heraus:<br/>Was der eine Server als Linebreak haben wollte, waren fÃ¼r den anderen zwei Linebreaks und durch die Leerzeile im Header dachte das Mail-Programm, dass hier der eigentliche Inhalt der E-Mail beginnt.
&nbsp;Nur mit einem Newline funktionierte es dann:&nbsp;$headers &nbsp;= 'From: xxx@xxx.org\n' .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'MIME-Version: 1.0' . &quot;\n&quot; . <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'Content-type: text/html; charset=iso-8859-1' . &quot;\n&quot; .<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot;X-Mailer: PHP&quot;;

Wer dank Google auf diesen Artikel gestoÃen ist und sich eher fÃ¼r den gesamten PHP-Code interessiert, um eine E-Mail zu versenden, dem kann auch noch geholfen werden:<br/>(Entweder \n oder \n\r als Zeilenumbruch verwenden)

]]></description>
</item>
<item>
	<title>
		<![CDATA[[jQuery] Dateien per Drag&Drop vom Desktop in das Browser-Fenster ziehen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Dateien_per_Drag_Drop_vom_Desktop_in_das_Browser_Fenster_ziehen/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[Jahrelang unvorstellbar: Dateien vom Desktop in das Browserfenster ziehen...natÃ¼rlich wird das betreffende Dokument dann im Browser geladen!
Dank JavaScript und HTML5 kÃ¶nnen nun allerdings Dateien per Drag & Drop auf bestimmte Objekte innerhalb einer Website gezogen und dann z.B. hochgeladen werden.

]]></description>
</item>
<item>
	<title>
		<![CDATA[[jQuery] Event-Handler fÃ¼r Objekte, die zur Laufzeit erst erstellt werden (Live)]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Event_Handler_f_r_Objekte_die_zur_Laufzeit_erst_erstellt_werden_Live/</link>
	<pubDate><![CDATA[Di CET]]></pubDate>
	<description><![CDATA[Es ist mir schon ab und an passiert:<br/>Ich hÃ¤nge einen Event an eine Gruppe von Objekten an &ndash; zum Beispiel an alle divs der Klasse .klickbar.
WÃ¤hrend der Laufzeit der Seite kommen allerdings neue divs der Klasse .klickbar hinzu und klickt man diese an, wird kein Event ausgelÃ¶st.<br/>Ist jedem, der jQuery hÃ¤ufig verwendet, natÃ¼rlich klar, aber da ich persÃ¶nlich dieser Problematik nicht tÃ¤glich entgegen stehe, vergesse ich immer wieder, wie das nochmals genau war...

]]></description>
</item>
<item>
	<title>
		<![CDATA[JavaScript: Erweiterte Array-Funktionen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/JavaScript_Erweiterte_Array_Funktionen/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Die eine oder andere Funktion fehlte mir im Umgang mit JavaScript-Arrays.
Ich lasse euch gerne an meinen eigenen Funktionen teilhaben.

Elemente aus Array entfernen 
Array arr.remove&#40;elementIndex_von, elementIndex_bis&#41;; oder Array arr.remove&#40;elementIndex&#41;;
// [1,2,3,4].remove(1);   =&gt; [1,3,4]
Ein oder mehrere Elemente aus einem Array entfernen ist normalerweise nicht in einer Codezeile gemacht.
Hiermit schon.
Array.prototype.remove = function&#40;from, to&#41; &#123;<br />
Â Â var rest = this.slice&#40;&#40;to || from&#41; + 1 || this.length&#41;;<br />
Â Â this.length = from <br />
Â Â return this.push.apply&#40;this, rest&#41;;<br />
Â Â &#125; 
<br>
Befindet sich ein Element in einem Array? Boolean arr.inArray&#40;element&#41;;
// [1,2,3].inArray(3) =&gt; true 
Array.prototype.inArray = function&#40;item&#41; &#123;<br />
Â Â for &#40;sIndex in this&#41; &#123;<br />
Â Â  Â if &#40;this&#91;sIndex&#93;.toString&#40;&#41; == item&#41; return true;<br />
Â Â  Â &#125;<br />
Â Â return false;<br />
Â Â &#125; 
<br>
Wenn wir schon dabei sind: Element hinzufÃ¼gen Void arr.add&#40;element&#41;;
// [1,2,3,4].add(5); =&gt; [1,2,3,4,5]
Array.prototype.add = function&#40;item&#41; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; this&#91;this.length&#93; = item;<br />
Â Â &#125; 
<br>
Doppelte Werte entfernen Array arr.unique&#40;&#41;;
// [1,2,3,4,4].unique() =&gt; [1,2,3,4]

Array.prototype.unique = function&#40;&#41; &#123;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var o = &#123;&#125;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; var tmp = &#91;&#93;;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for&#40;var i = 0 ; i &lt; this.length; i++&#41; o&#91;this&#91;i&#93;&#93; = true;<br />
&nbsp; &nbsp; &nbsp; &nbsp; for&#40;var i in o&#41; tmp&#91;tmp.length&#93; = i;<br />
&nbsp; &nbsp; &nbsp; &nbsp; return tmp;<br />
Â Â &#125; 
]]></description>
</item>
<item>
	<title>
		<![CDATA[Serialize als JSON oder GET-String]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Serialize_als_JSON_oder_GET_String/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Dank jQuery kann man ein ausgefÃ¼lltes Formularfeld direkt als Array oder GET-String in ein Objekt speichern.
Was mir fehlte war die MÃ¶glichkeit, aus einem ausgefÃ¼llten html-Formular direkt ein JSON-Objekt zu machen.
Im Folgenden das Plugin dazu, sowieso ein weiteres Plugin, um aus einem JSON-Objekt ein GET-String zu erstellen.
&#40;function&#40; $ &#41;&#123;<br />
Â Â  $.fn.serializeJSON=function&#40;&#41; &#123;<br />
Â Â  Â Â  var json = &#123;&#125;;<br />
Â Â  Â Â  jQuery.map&#40;$&#40;this&#41;.serializeArray&#40;&#41;, function&#40;n, i&#41;&#123;<br />
Â Â  Â Â  Â Â  json&#91;n&#91;'name'&#93;&#93; = n&#91;'value'&#93;;<br />
Â Â  Â Â  Â Â  &#125;&#41;;<br />
Â Â  Â Â  return json;<br />
Â Â  Â Â  &#125;;<br />
Â Â  &#125;&#41;&#40; jQuery &#41;; 

&#40;function&#40; $ &#41;&#123;<br />
Â Â  $.fn.serializeGET=function&#40;&#41; &#123;<br />
Â Â  Â Â  var getStr = &quot;&quot;;<br />
Â Â  Â Â  jQuery.map&#40;$&#40;this&#41;&#91;0&#93;, function&#40;n, i&#41;&#123; getStr += &quot;&amp;&quot;+i+&quot;=&quot;+n; &#125;&#41;;<br />
Â Â  Â Â  return getStr.substr&#40;1&#41;;<br />
Â Â  Â Â  &#125;;<br />
Â Â  &#125;&#41;&#40; jQuery &#41;; 

Anwendung:
var json = $&#40;formular&#41;.serializeJSON&#40;&#41;;
und
var string = $&#40;json&#41;.serializeGET&#40;&#41;;
Â 
]]></description>
</item>
<item>
	<title>
		<![CDATA[Input-Felder auf korrektes Zeit/Datums-Format prÃ¼fen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Input_Felder_auf_korrektes_Zeit_Datums_Format_pr_fen/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Gerade bei Datums- und Zeit-Formaten hat jeder Seitenbesucher sein eigene Methode, die Eingaben zu formatieren -Â sei es 1.12.2013 0800 oder 01.12.13 08.00
Folgende Plugins prÃ¼fen die Eingabe jeweils eines Input-Textfeldes, Ã¤ndern die Formatierung, sobald der Cursor das Feld verlÃ¤sst oder bringen eine Fehlermeldung, wenn das Format Ã¼berhaupt nicht erkannt wurde.Das Plugin kann auch verwendet werden, um Datumseingaben einfacher zu machen.
Gibt man zum Beispiel im Input-Feld nur eine "12" ein, wird automatisch der aktuelle Monat und das aktuelle Jahr angefÃ¼gt.
&#40;function&#40; $ &#41;&#123;<br />
Â Â  $.fn.datefield=function&#40;&#41; &#123;<br />
Â Â  Â  Â  Â $&#40;this&#41;.bind&#40;'focus', function&#40;&#41; &#123;var id = $&#40;this&#41;.attr&#40;&quot;id&quot;&#41;; window.setTimeout&#40;&quot;document.getElementById('&quot;+id+&quot;').select();&quot;, 200&#41;;&#125;&#41;;<br />
Â Â  Â  Â  $&#40;this&#41;.bind&#40;'blur', function&#40;&#41; &#123;<br />
Â Â  Â  Â  Â  Â if &#40;$&#40;this&#41;.val&#40;&#41; == &quot;&quot;&#41; return null;<br />
Â Â  Â  Â  Â  Â var jetzt = new Date&#40;&#41;;<br />
Â Â  Â  Â  Â  var monat = jetzt.getMonth&#40;&#41;+1;<br />
Â Â  Â  Â  Â  var jahr Â = jetzt.getFullYear&#40;&#41;;<br />
Â Â  Â  Â  Â  if &#40;m = /^(d{2})D?(d{2})$/.exec&#40;$&#40;this&#41;.val&#40;&#41;&#41;&#41; Â  Â  Â  Â  Â  Â  Â  $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;.&quot;+m&#91;2&#93;+&quot;.&quot;+jahr&#41;;<br />
Â Â  Â  Â  Â  else if &#40;m = /^(d{2})D?(d{2})D?(d{2})$/.exec&#40;$&#40;this&#41;.val&#40;&#41;&#41;&#41; Â  $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;.&quot;+m&#91;2&#93;+&quot;.20&quot;+m&#91;3&#93;&#41;;<br />
Â Â  Â  Â  Â  else if &#40;m = /^(d{2})D?(d{2})D?(d{4})$/.exec&#40;$&#40;this&#41;.val&#40;&#41;&#41;&#41; Â  $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;.&quot;+m&#91;2&#93;+&quot;.&quot;+m&#91;3&#93;&#41;;<br />
Â Â  Â  Â  Â  else if &#40;m = /^(d{1,2})$/.exec&#40;$&#40;this&#41;.val&#40;&#41;&#41;&#41; Â  Â  Â  Â  Â  Â  Â  Â  Â $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;.&quot;+&#40;&#40;monat <br />
Â Â  Â  Â  Â  if &#40;m = /^(d{2}).(d{2}).(d{4})$/.exec&#40;$&#40;this&#41;.val&#40;&#41;&#41;&#41; &#123;<br />
Â Â  Â  Â  Â  Â  Â var gew_datum = new Date&#40;m&#91;3&#93;, m&#91;2&#93;-1, m&#91;1&#93;&#41;;<br />
Â Â  Â  Â  Â  Â  Â if &#40;gew_datum.getMonth&#40;&#41;+1 != m&#91;2&#93; || gew_datum.getDate&#40;&#41; != m&#91;1&#93; || gew_datum.getFullYear&#40;&#41; != m&#91;3&#93;&#41; &#123;<br />
Â Â  Â  Â  Â  Â  Â  Â  alert&#40;$&#40;this&#41;.val&#40;&#41;+&quot; ist kein gu00fcltiges Datum.&quot;&#41;; $&#40;this&#41;.val&#40;&quot;&quot;&#41;; $&#40;this&#41;.select&#40;&#41;; return false;<br />
Â Â  Â  Â  Â  Â  Â  Â  &#125;<br />
Â Â  Â  Â  Â  &#125; else &#123;<br />
Â Â  Â  Â  Â  Â  Â alert&#40;$&#40;this&#41;.val&#40;&#41;+&quot; ist kein gu00fcltiges Datum.&quot;&#41;; $&#40;this&#41;.val&#40;&quot;&quot;&#41;; $&#40;this&#41;.select&#40;&#41;; return false;<br />
Â Â  Â  Â  Â  Â  Â &#125;<br />
Â Â  Â  Â  Â  Â &#125;&#41;;<br />
Â Â  Â  Â &#125;;<br />
Â Â  &#125;&#41;&#40; jQuery &#41;; 

Â Â Â &#40;function&#40; $ &#41;&#123;<br />
Â Â  $.fn.timefield=function&#40;&#41; &#123;<br />
Â Â  Â  Â  $&#40;this&#41;.bind&#40;'focus', function&#40;&#41; &#123;var id = $&#40;this&#41;.attr&#40;&quot;id&quot;&#41;; window.setTimeout&#40;&quot;document.getElementById('&quot;+id+&quot;').select();&quot;, 200&#41;;&#125;&#41;;<br />
Â Â  Â  Â  $&#40;this&#41;.bind&#40;'blur', function&#40;&#41; &#123;<br />
Â Â  Â  Â  Â  Â if &#40;$&#40;this&#41;.val&#40;&#41; == &quot;&quot;&#41; return null;<br />
Â Â  Â  Â  Â  Â if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{2})(d{2})$/&#41;&#41; $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;:&quot;+m&#91;2&#93;&#41;;<br />
Â Â  Â  Â  Â  Â else if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{1})(d{2})$/&#41;&#41; $&#40;this&#41;.val&#40;&quot;0&quot;+m&#91;1&#93;+&quot;:&quot;+m&#91;2&#93;&#41;;<br />
Â Â  Â  Â  Â  Â else if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{2}).?(d{2})$/&#41;&#41; $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;:&quot;+m&#91;2&#93;&#41;;<br />
Â Â  Â  Â  Â  Â else if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{1}).?(d{2})$/&#41;&#41; $&#40;this&#41;.val&#40;&quot;0&quot;+m&#91;1&#93;+&quot;:&quot;+m&#91;2&#93;&#41;;<br />
Â Â  Â  Â  Â  Â else if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{2})(.0)?$/&#41;&#41; $&#40;this&#41;.val&#40;m&#91;1&#93;+&quot;:00&quot;&#41;;<br />
Â Â  Â  Â  Â  Â else if &#40;m = $&#40;this&#41;.val&#40;&#41;.match&#40;/^(d{1})(.0)?$/&#41;&#41; $&#40;this&#41;.val&#40;&quot;0&quot;+m&#91;1&#93;+&quot;:00&quot;&#41;;<br />
Â Â  Â  Â  Â  Â else &#123;alert&#40;$&#40;this&#41;.val&#40;&#41;+&quot; ist keine gu00fcltige Zeitangabe.&quot;&#41;; $&#40;this&#41;.val&#40;&quot;&quot;&#41;; $&#40;this&#41;.select&#40;&#41;; return false;&#125;<br />
Â Â  Â  Â  Â  Â return true;<br />
Â Â  Â  Â  Â  Â &#125;&#41;;<br />
Â Â  Â  Â &#125;;<br />
Â Â  &#125;&#41;&#40; jQuery &#41;; 
<br>
Â VoraussetzungDas Input-Feld muss eine eindeutige ID haben.
Â Verwendung
$&#40;textInput&#41;.datefield&#40;&#41;;oder
$&#40;textInput&#41;.timefield&#40;&#41;;
]]></description>
</item>
<item>
	<title>
		<![CDATA[Dropdown-MenÃ¼ analog zu den jQuery-UI-Buttons]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Dropdown_Men_analog_zu_den_jQuery_UI_Buttons/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[jQuery UI ist zwar sehr schick und bietet einen groÃen Funktionsumfang, allerdings fehlte mir die MÃ¶glichkeit eines Dropdown-MenÃ¼s.
FÃ¼r die Verwendung des folgenden Dropdowns ist jQuery UI erforderlich.
&#40;function&#40; $ &#41;&#123;<br />
Â Â  $.fn.dropdown=function&#40;attr&#41; &#123;<br />
Â Â  Â  Â  Â $&#40;this&#41;.first&#40;&#41;.button&#40;&#123;icons: &#123;primary: attr.icon, secondary: &quot;ui-icon-triangle-1-s&quot;&#125;, text: true &#125;&#41;.click&#40;function&#40;&#41; &#123;<br />
Â Â  Â  Â  Â  Â  &#125;&#41;;<br />
Â Â  Â  Â var menu = document.createElement&#40;&quot;div&quot;&#41;;<br />
Â Â  Â  Â menu.className = &quot;jDropdown&quot;;<br />
Â Â  Â  Â if &#40;attr.width != null&#41; menu.style.width = attr.width;<br />
Â Â  Â  Â $.each&#40;attr.list, function&#40;label, f&#41; &#123;<br />
Â Â  Â  Â  Â  if &#40;f == null&#41; &#123;<br />
Â Â  Â  Â  Â  Â  Â var menu_item = document.createElement&#40;&quot;hr&quot;&#41;;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu&#41;.append&#40;$&#40;menu_item&#41;&#41;;<br />
Â Â  Â  Â  Â  &#125; else &#123;<br />
Â Â  Â  Â  Â  Â  Â var menu_item = document.createElement&#40;&quot;div&quot;&#41;;<br />
Â Â  Â  Â  Â  Â  Â menu_item.className = &quot;item&quot;;<br />
Â Â  Â  Â  Â  Â  Â menu_item.innerHTML = label;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu_item&#41;.bind&#40;&quot;click&quot;, f&#41;;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu_item&#41;.bind&#40;&quot;mouseover&quot;, function&#40;&#41; &#123;$&#40;this&#41;.attr&#40;&quot;class&quot;, &quot;item_hover&quot;&#41;;&#125;&#41;;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu_item&#41;.bind&#40;&quot;mouseout&quot;, function&#40;&#41; &#123;$&#40;this&#41;.attr&#40;&quot;class&quot;, &quot;item&quot;&#41;;&#125;&#41;;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu&#41;.append&#40;$&#40;menu_item&#41;&#41;;<br />
Â Â  Â  Â  Â  Â  Â &#125;<br />
Â Â  Â  Â  Â  &#125;&#41;;<br />
Â Â  Â  Â $&#40;this&#41;.after&#40;$&#40;menu&#41;&#41;;<br />
Â Â  Â  Â $&#40;this&#41;.bind&#40;&quot;click&quot;, function&#40;e&#41; &#123;Â <br />
Â Â  Â  Â  Â  if &#40;$&#40;menu&#41;.css&#40;&quot;display&quot;&#41; != &quot;block&quot;&#41; &#123;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu&#41;.css&#40;&quot;display&quot;, &quot;block&quot;&#41;;<br />
Â Â  Â  Â  Â  Â  Â var ausrichtung = &#40;&#40;$&#40;this&#41;.position&#40;&#41;.left + $&#40;menu&#41;.width&#40;&#41;&#41; &gt;= $&#40;window&#41;.width&#40;&#41;-50&#41; ? &quot;right&quot; : &quot;left&quot;;<br />
Â Â  Â  Â  Â  Â  Â $&#40;menu&#41;.position&#40;&#123;&quot;my&quot;: ausrichtung+&quot; top&quot;, &quot;at&quot;: ausrichtung+&quot; bottom&quot;, &quot;of&quot;: $&#40;this&#41;&#125;&#41;;<br />
Â Â  Â  Â  Â  Â  Â e.cancelBubble=true;<br />
Â Â  Â  Â  Â  Â  Â return false;<br />
Â Â  Â  Â  Â  Â  Â &#125;<br />
Â Â  Â  Â  Â  else $&#40;menu&#41;.css&#40;&quot;display&quot;, &quot;none&quot;&#41;;<br />
Â Â  Â  Â  Â  &#125;&#41;;<br />
Â Â  Â  Â $&#40;this&#41;.bind&#40;&quot;close&quot;, function&#40;e&#41; &#123; $&#40;menu&#41;.css&#40;&quot;display&quot;, &quot;none&quot;&#41;; &#125;&#41;;<br />
Â Â  Â  Â $&#40;document&#41;.bind&#40;&quot;click&quot;, function&#40;&#41; &#123; $&#40;menu&#41;.css&#40;&quot;display&quot;, &quot;none&quot;&#41;; &#125;&#41;;<br />
Â Â  Â  Â &#125;;<br />
Â Â  &#125;&#41;&#40; jQuery &#41;; 

Anwendung
$&#40;&quot;&quot;&#41;.dropdown&#40;&#123;<br />
Â Â icon: iconClassname, #jQueryUI-Icon-Klassenname<br />
Â Â width: breite, #Dropdown-Breite &#40;Optional&#41;<br />
Â Â list:&#123;menuLabel: function,...,dummyLabel: null&#40;=Seperator&#41;,...&#125; Â #Liste der MenÃ¼eintrÃ¤ge<br />
Â Â &#125;&#41;; 

Â Beispiel
$&#40;&quot;#aktionsMenu&quot;&#41;.dropdown&#40;&#123;icon: &quot;ui-icon-wrench&quot;, width: &quot;18em&quot;, list: &#123;<br />
Â Â &quot;Erster Eintrag&quot;: function&#40;&#41; &#123; console.log&#40;&quot;Erster Eintrag gewaehlt&quot;&#41;; &#125;,<br />
Â Â &quot;Zweiter Eintrag&quot;: function&#40;&#41; &#123; console.log&#40;&quot;Zweiter Eintrag gewaehlt&quot;&#41;; &#125;,<br />
Â Â &quot;sdfjlkj&quot;: null, // Trenn-Balken. Label Spiel keine Rolle, muss aber einmalig sein<br />
Â Â &quot;Dritter Eintrag&quot;: function&#40;&#41; &#123; console.log&#40;&quot;Dritter Eintrag gewaehlt&quot;&#41;; &#125;<br />
Â Â &#125;&#41;; 
]]></description>
</item>
<item>
	<title>
		<![CDATA[[jQuery] Inhalt in DOM-Objekt laden]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Inhalt_in_DOM_Objekt_laden/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Zwar gibt es mit $&#40;selector&#41;.load eine MÃ¶glichkeit, Inhalte via Ajax in ein DOM-Element zu laden, mir war diese MÃ¶glichkeit aber zu unflexibel, da es den aktuellen Inhalt des Elements Ã¼berschreibt und ich den neuen Inhalt vor oder hinter den bestehenden Inhalt hinzufÃ¼gen mÃ¶chte.
Die folgenden Funktionen kÃ¶nnen zum Beispiel auch verwendet werden, um sehr einfach via AJAX neue Zeilen in Tabellen hinzuzufÃ¼gen:
$&#40;&quot;table&quot;&#41;.loadAtEnd&#40;&quot;http://www.apfelz.net/ajax/rowloader.php&quot;, &#123;'rowid': 2&#125;&#41;;


]]></description>
</item>
<item>
	<title>
		<![CDATA[[jQuery] Zu beliebigem Element scrollen]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Zu_beliebigem_Element_scrollen/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[Ab und an will man dem Seitenbesucher das Scrollen abnehmen...
&#40;function&#40;$&#41;&#123;<br />
Â Â  $.fn.scrollTo = function&#40;target, options, callback&#41; &#123;<br />
Â Â  Â  Â if &#40;typeof options == 'function' &amp;&amp; arguments.length == 2&#41; &#123; callback = options; options = target; &#125;<br />
Â Â  Â  Â var settings = $.extend&#40;&#123;<br />
Â Â  Â  Â  Â  scrollTarget Â  : target,<br />
Â Â  Â  Â  Â  offsetTop Â  Â  Â : 50,<br />
Â Â  Â  Â  Â  duration Â  Â  Â : 500,<br />
Â Â  Â  Â  Â  easing Â  Â  Â  Â  : 'swing'<br />
Â Â  Â  Â  Â  &#125;, options&#41;;<br />
Â Â  Â  Â return this.each&#40;function&#40;&#41;&#123;<br />
Â Â  Â  Â  Â  var scrollPane = $&#40;this&#41;;<br />
Â Â  Â  Â  Â  var scrollTarget = &#40;typeof settings.scrollTarget == &quot;number&quot;&#41; ? settings.scrollTarget : $&#40;settings.scrollTarget&#41;;<br />
Â Â  Â  Â  Â  var scrollY = &#40;typeof scrollTarget == &quot;number&quot;&#41; ? scrollTarget : scrollTarget.offset&#40;&#41;.top + scrollPane.scrollTop&#40;&#41; - parseInt&#40;settings.offsetTop&#41;;<br />
Â Â  Â  Â  Â  scrollPane.animate&#40;&#123;scrollTop : scrollY &#125;, parseInt&#40;settings.duration&#41;, settings.easing, function&#40;&#41;&#123;<br />
Â Â  Â  Â  Â  if &#40;typeof callback == 'function'&#41; &#123; callback.call&#40;this&#41;; &#125;<br />
Â Â  Â  Â  Â  &#125;&#41;;<br />
Â Â  Â  Â &#125;&#41;;<br />
Â Â  &#125;;<br />
&#125;&#41;&#40; jQuery &#41;; 
<br>
Anwendung $&#40;'body'&#41;.scrollTo&#40;'#target', &#123;optionen&#125;, callback&#41;;

Bildschirm zu einem bestimmten Element scrollen
$&#40;'#content'&#41;.scrollTo&#40;500, &#123;optionen&#125;, callback&#41;;

Ein bestimmtes scroll-bares Element (z.B. iframe) um eine bestimmte Anzahl Pixel scrollen

Optionen 
offsetTop<br/>Versatz (px)
duration<br/>Animations-Dauer (ms)
easing<br/>jQuery-Animationseffekt (z.B. 'swing')
]]></description>
</item>
<item>
	<title>
		<![CDATA[[jQuery] Minimalistischer ColorPicker]]>
	</title>
	<link>http://www.apfel-z.net/artikel/_jQuery_Minimalistischer_ColorPicker/</link>
	<pubDate><![CDATA[Fr CET]]></pubDate>
	<description><![CDATA[FÃ¼r ein Projekt brauchte ich einen kleinen FarbwÃ¤hler, fand' aber keinen passenden, also musste ich das Rad mehr oder weniger neu erfinden.
Die ergoogelten jQuery-ColorPicker waren entweder nicht jQuery genug (keine MÃ¶glichkeit, nach der Farbwahl auf das Objekt zuzugreifen, das angeklickt wurde), lieÃen sich nicht in einen jQuery-UI-Dialog einbinden oder waren einfach um ein paar Funktionen zu reich (FarbwÃ¤hler als voller Photoshop-Dialog).
Hier meine jQuery-Erweiterung jColorpickerÂ mit 15 vorgegebenen Farbfeldern.

]]></description>
</item>
	</channel>
</rss>
