<?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>Kau-Boys blog &#187; Tutorial</title>
	<atom:link href="http://kau-boys.de/tag/tutorial/feed" rel="self" type="application/rss+xml" />
	<link>http://kau-boys.de</link>
	<description>Webdevelopment and more</description>
	<lastBuildDate>Fri, 16 Mar 2012 19:15:48 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Ordnerstruktur eines SVN-Repositories richtig aufsetzen</title>
		<link>http://kau-boys.de/1296/webserver/ordnerstruktur-eines-svn-repositories-richtig-aufsetzen?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ordnerstruktur-eines-svn-repositories-richtig-aufsetzen</link>
		<comments>http://kau-boys.de/1296/webserver/ordnerstruktur-eines-svn-repositories-richtig-aufsetzen#comments</comments>
		<pubDate>Sat, 04 Jun 2011 20:11:01 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1296</guid>
		<description><![CDATA[In meinem letzten Artikel Subversion mit WebDAV auf einem Ubuntu Server installieren habe ich euch ja gezeigt, wie man den Server für die Subversion Repositories aufsetzt. Nun geht es aber darum, wie man die Ordnerstruktur eines Projekts gestalten sollte. Wenn man hier von Anfang an auf ein paar Grundlegende Best-Practices achtet, dann erleichtert es einem [...]]]></description>
			<content:encoded><![CDATA[<p>In meinem letzten Artikel <a href="http://kau-boys.de/1271/webserver/subversion-mit-webdav-auf-einem-ubuntu-server-installieren">Subversion mit WebDAV auf einem Ubuntu Server installieren</a> habe ich euch ja gezeigt, wie man den Server für die Subversion Repositories aufsetzt. Nun geht es aber darum, wie man die Ordnerstruktur eines Projekts gestalten sollte. Wenn man hier von Anfang an auf ein paar Grundlegende Best-Practices achtet, dann erleichtert es einem später enorm die Arbeit mit dem Repository.</p>
<h2>Die Grundlegenge Ordnerstruktur</h2>
<p>Es gibt keine fest vorgegebene Struktur für ein Repository. Es hat sich aber eine Struktur herausgebildet, die von den meisten Projekten, die Subversion einsetzen benutzt wird. Diese wird auch in der <a href="http://svnbook.red-bean.com/">SVN-Referenz</a> (<a href="http://svnbook.red-bean.com/nightly/de/">deutsche Übersetzung</a>) beschrieben. Dazu werden im Hauptverzeichnis folgende drei Ordner erstellt:</p>
<p><span id="more-1296"></span></p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
/
	trunk/
	branches/
	tags/
</pre>
<p>Solltet ihr mehrere Projekte in einem Repository verwalten, dann macht es Sinn für jeder eine solche Ordnerstruktur anzulegen:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
/
	projekt1/
		trunk/
		branches/
		tags/
	projekt2/
		trunk/
		branches/
		tags/
</pre>
<h2>Neues Repository mit dieser Ordnerstruktur erzeugen</h2>
<p>Am besten erzeugen wir also gleich zu Beginn eines neuen Projekts eine solche Struktur. Gehen wir einfach mal von einem einfachen Repository mit nur einem Projekt aus. Ich möchte euch kurz die notwendigen Befehle aufzeigen um ein Repository für nur ein Projekt mit einer solchen Ordnerstruktur zu erzeugen.</p>
<p>Zuerst einmal erstellen wir in einem beliebigen Ordner ein neues Repository um dieses anschließend verwenden zu können:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svnadmin create /var/svn/public/myproject
</pre>
<p>Um nun die notwendigen Verzeichnisse zu erzeugen gibt es zwei Möglichkeiten:</p>
<ol>
<li>Auschecken des Repositories, erzeugen der Ordner und commit der Ordnerstruktur</li>
<li>Direktes erzeugen der Ordner im Repository</li>
</ol>
<p>Die erste Variante bietet sich an, wenn man gleich mehrere Projekte mit der Ordnerstruktur erzeugen möchte. Ich zeige euch hier kurz, welche Befehle dabei in Unix-Systemen notwendig wären:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
cd ~
mkdir project
cd project/
svn checkout http://kau-boys.de/svn/myproject
cd myproject/
mkdir trunk tags branches
</pre>
<p>Jetzt müssen wir die Ordner zum Hinzufügen in das Repository markieren mit dem Befehl <code>svn add</code>:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svn add trunk tags branches

A         trunk
A         tags
A         branches
</pre>
<p>Jetzt können wir diese Ordnerstruktur in das Repository commiten:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svn commit -m &quot;Import der initialen Ordnerstruktur&quot;

Adding         branches
Adding         tags
Adding         trunk

Committed revision 1.
</pre>
<p>Die andere Möglichkeit ist wesentlich einfacher und erfordert nur einen einzigen Befehl. Dieser erzeugt die Ordnerstruktur direkt im Repository. Auch hier wäre es möglich die Ordner gleich für mehrere Projekte anzulegen (was ihr am besten mit mehreren Befehlen macht):</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svn mkdir -m &quot;Import der initialen Ordnerstruktur&quot; \
	file:///var/svn/myproject/trunk \
	file:///var/svn/myproject/tags \
	file:///var/svn/myproject/branches

Committed revision 1.
</pre>
<p>Wie ihr seht ist diese Variante sehr viel einfacher. Gerade für den Administrator eines Repositories ist er praktischer. Man könnte den z.B. den gesamten Prozess zur Erzeugung eines Repositories und der Ordnerstruktur in einem Skript zusammenfassen, dass alle notwendigen Befehle automatisch hintereinander ausführt.</p>
<h2>Das richtige Verzeichnis auschecken</h2>
<p>Ganz wichtig ist es nun aber, dass ihr auch das richtige Verzeichnis benutzt um euer Projekt zu starten. Solltet ihr die Ordnerstruktur wie in der ersten Variante erzeugt haben, wechselt in eure Working Copy und benutzt dort den Befehl <code>svn switch</code> um auf das <i>trunk</i> Verzeichnis zu wechseln:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
cd ~/myproject
svn switch http://kau-boys.de/svn/myproject/trunk

D    trunk
D    branches
D    tags
</pre>
<p>Wie ihr sehen könnt, wurden die Ordner gelöscht, da ihr euch nun &#8220;im Ordner trunk&#8221; befindet. In diesem könnt ihr nun eure Dateien des Projekts commiten.</p>
<p>Wenn ihr die Ordnerstruktur wie in Variante 2 erzeugt habt, dann müsst ihr lediglich das richtige Verzeichnis auschecken. Gebt also direkt den <i>trunk</i> Ordner bei auschecken an:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
cd ~
svn checkout http://kau-boys.de/svn/myproject/trunk myproject

Checked out revision 1.
</pre>
<p>Damit der Ordner aber dabei nicht <i>trunk</i> heißt geben wir beim <i>checkout</i> Befehl gleich den Namen des Ordners an, den unser Projekt nachher haben soll, also in diesem Fall <i>myproject</i>.</p>
<h2>Fazit</h2>
<p>Ihr habt nun also gesehen, wie man eine gute Ordnerstruktur für Subversion-Projekte anlegt. Falls ihr euch aber fragt, wieso das so wichtig ist, dann seht euch mal <a href="http://svnbook.red-bean.com/en/1.1/ch04.html">Kapitel 4 der SVN-Referenz</a> (<a href="http://svnbook.red-bean.com/nightly/de/svn.branchmerge.html">deutsche Übersetzung</a>) an. Ich mal bei einem Projekt zwar einen Ordner <i>trunk</i> erzeugt aber diesen als Root-Verzeichnis meines Repositories benutzt. Als ich dann (ca. 10000 Commits später) dann doch mal branches einsetzen wollte, bekam ich natürlich Probleme, da ich dann erst die Unterverzeichnisse erzeugt habe und alle anderen Order und Dateien per <code>svn move</code> in den Ordner <i>trunk</i> verschieben musste. Dabei bleibt zwar die History aller Dateien erhalten, aber jeder Benutzer musste den Pfad zum Repository aktualisieren und dann in den neuen <i>trunk</i> Ordner wechseln.</p>
<p>Wenn ihr euch also schon immer zu Beginn eines neuen Projekts die Ordner erzeugt spart ihr euch nachher viel Arbeit. Selbst wenn ihr denkt, niemals so komplex zu werden, dann seht mal in der SVN-Referenz unter dem Stichpunkt Feature-Release nach. So etwas könnte auch euch mal passieren. Also spart nicht an dem einen Befehl und den drei Ordnern <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1296/webserver/ordnerstruktur-eines-svn-repositories-richtig-aufsetzen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversion mit WebDAV auf einem Ubuntu Server installieren</title>
		<link>http://kau-boys.de/1271/webserver/subversion-mit-webdav-auf-einem-ubuntu-server-installieren?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=subversion-mit-webdav-auf-einem-ubuntu-server-installieren</link>
		<comments>http://kau-boys.de/1271/webserver/subversion-mit-webdav-auf-einem-ubuntu-server-installieren#comments</comments>
		<pubDate>Sun, 22 May 2011 12:34:49 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webserver]]></category>
		<category><![CDATA[Administration]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=1271</guid>
		<description><![CDATA[Heute ist Tag 1 mit meinem neuen Server und natürlich ist noch nicht alles wieder so, wie es vorher war. Für einige kleine Projekte benötige ich ein SVN-Repository und da ich einen eigenen Server habe lohnt es sich ja auch diesen dafür zu verwenden. Da einige Projekte eventuell auch für die Allgemeinheit verfügbar sein sollen, [...]]]></description>
			<content:encoded><![CDATA[<p>Heute ist Tag 1 mit meinem neuen Server und natürlich ist noch nicht alles wieder so, wie es vorher war. Für einige kleine Projekte benötige ich ein SVN-Repository und da ich einen eigenen Server habe lohnt es sich ja auch diesen dafür zu verwenden. Da einige Projekte eventuell auch für die Allgemeinheit verfügbar sein sollen, möchte ich diesmal gleich den Zugriff per DAV ermöglichen, damit nicht immer ein Benutzer angelegt oder ein zentrales Passwort veröffentlicht werden muss. Da die letze Einrichtung auch bei mir schon wieder etwas her ist habe ich bei <a href="http://www.howtogeek.com">How-To Geek</a> den Artikel <a href="http://www.howtogeek.com/howto/ubuntu/install-subversion-with-web-access-on-ubuntu/">Install Subversion with Web Access on Ubuntu</a> gefunden. Hier nun meine Zusammenfassung zum Umsetzen auf einem Server mit Ubuntu 10.04 LTS (sollte aber auch auf anderen Linux Distributionen ähnlich funktionieren, abgesehen von den Speicherpfaden und der Art der Installation).</p>
<h2>Installieren von Subversion</h2>
<p><span id="more-1271"></span></p>
<p>Die Installationshilfen von Ubuntu machen einem diesen Schritt ja sehr einfach. Zuerst einmal müssen bei meinem frisch installierten Server die Paketquellen aktualisiert werden. Das macht man mit folgendem Befehl (solltet ihr nicht als &#8220;root&#8221; angemeldet sein, müsst ihr eventuell noch &#8220;sudo &#8221; vor diesen und weiter Befehl setzen):</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
apt-get update
</pre>
<p>Anschließend können wir Subversion und die Erweiterung für den Apache-Server installieren, was mit folgendem Befehl passiert:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
apt-get install subversion libapache2-svn
</pre>
<p>Wenn alles geklappt hat ist Subversion auch schon installiert. Um es zu testen könnt ihr den &#8220;svn&#8221; Befehl auf der Konsole testen und dabei auch gleich feststellen, ob das WebDAV Modul verfügbar ist:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svn --version
</pre>
<h2>WebDAV Ordner einrichten</h2>
<p>Zuerst einmal legen wir ein Verzeichnis an, in dem später all unsere SVN-Repositories abgelegt werden:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir /var/svn
</pre>
<p>Anschließend erstellen wir einen weiteren Unterordner für alle SVN-Repositories, die wir später per WebDAV freigeben möchten:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
mkdir /var/svn/public
</pre>
<h2>Erzeugen des ersten öffentlichen Repository</h2>
<p>So, nun sind wir bereit unser erstes Repository zu erzeugen und dieses anschließend freigeben zu können. Zuerst einmal müssen wir das SVN-Repository selbst erzeugen. Dies geschieht mit dem Befehl <a href="http://svnbook.red-bean.com/nightly/de/svn.ref.svnadmin.html">svnadmin</a>, genauer gesagt mit dem Unterbefehl <a href="http://svnbook.red-bean.com/nightly/de/svn.reposadmin.create.html#svn.reposadmin.basics.creating">svnadmin create</a>:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
svnadmin create /var/svn/public/myproject
</pre>
<p>Der Befehl erzeugt keine Ausgabe, lass euch also nicht irritieren, wenn da nicht viel passiert. Um zu kontrollieren, ob das Erstellen des SVN-Repositories geklappt hat, seht euch einfach mal den Inhalt des Ordners an:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
cd /var/svn/public/myproject
ls -l

total 24
drwxr-xr-x 2 root root 4096 2011-05-22 13:21 conf
drwxr-sr-x 6 root root 4096 2011-05-22 13:21 db
-r--r--r-- 1 root root    2 2011-05-22 13:21 format
drwxr-xr-x 2 root root 4096 2011-05-22 13:21 hooks
drwxr-xr-x 2 root root 4096 2011-05-22 13:21 locks
-rw-r--r-- 1 root root  229 2011-05-22 13:21 README.txt
</pre>
<h2>Repository über WebDAV freigeben</h2>
<p>Nun müssen wir die Konfiguration des WebDAV Moduls anpassen, damit das Repository von außen verfügbar ist. Dazu öffnen wir die Konfigurationsdatei:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
vi /etc/apache2/mods-enabled/dav_svn.conf
</pre>
<p>Hier müsst ihr in ein paar Zeilen die anführenden Kommentarzeichen entfernen. Eure Konfiguration sollte dann mindestens folgende Zeilen (unkommentiert) enthalten:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
&lt;Location /svn&gt;
  DAV svn
  SVNParentPath /var/svn/public
  AuthType Basic
  AuthName &quot;Subversion Repository&quot;
  AuthUserFile /etc/apache2/dav_svn.passwd
  &lt;LimitExcept GET PROPFIND OPTIONS REPORT&gt;
    Require valid-user
  &lt;/LimitExcept&gt;
&lt;/Location&gt;
</pre>
<p>Nachdem ihr die Konfiguration gespeichert habt können wir den Zugang für euer öffentliches Repository machen. Wir verwenden hier allerdings eine Benutzer-Autorisierung, damit wir den Schreibzugriff auf das Repository einschränken können. Zum Erstellen eines Benutzers wird folgender Befehl verwendet. Gebt dort anschließend zweimal das neue Passwort des Nutzers ein:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
htpasswd -cm /etc/apache2/dav_svn.passwd public

New password:
Re-type new password:
Adding password for user public
</pre>
<p>Damit die Benutzer auch in das Verzeichnis schreiben können, muss es noch auf den Apache-Benutzer übertragen werden, da wir es ja als root erzeugt haben. Das geschieht mit folgendem Befehl:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
chown -R www-data /var/svn/public/
</pre>
<p>Das war es im Grunde auch schon. Was jetzt noch fehlt ist ein Neustart des Apache-Servers, damit die neue Konfiguration auch geladen wird:</p>
<pre class="brush: bash; gutter: false; title: ; notranslate">
/etc/init.d/apache2 restart
</pre>
<h2>Testen des öffentlichen Repositories</h2>
<p>Jetzt könnt ihr das neue öffentliche Repository testen. Navigiert dazu einfach in eurem Browser auf eine eurer Domains und dort in den Unterordner <code>/svn/myproject</code>. Ihr solltet dann in etwa folgendes sehen:</p>
<p style="text-align: center">
<img src="http://kau-boys.de/wp-content/uploads/2011/05/SVN-Repository-WebDAV.png" alt="SVN-Repository-WebDAV" title="SVN-Repository-WebDAV" style="width: 506px; height: 301px;" />
</p>
<p>Das war es auch schon. Jetzt habt ihr euern eigenen Subversion Server und könnt dort nach Belieben öffentliche Projekte verwalten. Solltet ihr aber mal ein nicht öffentliches Projekt haben, könnte ihr dieses weiterhin über das <code>svn+ssh:</code> Protokoll betreiben. Dazu müsst ihr es einfach nur direkt im <code>/var/svn</code> Ordner ablegen und dann per SSH für bestimmt Benutzer erreichbar machen. Falls Interesse besteht werde ich das in einem separaten Artikel nochmal kurz erklären.</p>
<p>Fragen und Anmerkungen sind wie immer gerne gesehen!</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/1271/webserver/subversion-mit-webdav-auf-einem-ubuntu-server-installieren/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WordPress Wartungsmodus mit eigenem Inhalt verschönern</title>
		<link>http://kau-boys.de/998/wordpress/wordpress-wartungmodus-mit-eigenem-inhalt-verschoenern?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=wordpress-wartungmodus-mit-eigenem-inhalt-verschoenern</link>
		<comments>http://kau-boys.de/998/wordpress/wordpress-wartungmodus-mit-eigenem-inhalt-verschoenern#comments</comments>
		<pubDate>Thu, 05 Aug 2010 22:09:33 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=998</guid>
		<description><![CDATA[Viele von euch, die während eines Updates ihren eigenen Blog angesehen haben, werden wohl den neuen Wartungsmodus von WordPress bemerkt haben. Was früher nur mit Plugins möglich war, ist jetzt seit WordPress 3.0 eine Standardfunktion. Wartungsmodus vorher Während des Updates eurer WordPress Installation, eines Themes oder Plugins, bzw. bei der Installation neuer Themes oder Plugins [...]]]></description>
			<content:encoded><![CDATA[<p>Viele von euch, die während eines Updates ihren eigenen Blog angesehen haben, werden wohl den neuen Wartungsmodus von WordPress bemerkt haben. Was früher nur mit Plugins möglich war, ist jetzt seit WordPress 3.0 eine Standardfunktion.</p>
<h2>Wartungsmodus vorher</h2>
<p>Während des Updates eurer WordPress Installation, eines Themes oder Plugins, bzw. bei der Installation neuer Themes oder Plugins wird WordPress automatisch in einen Wartungsmodus versetzt, damit keine Schäden an eurem Blog auftreten. Dabei wir eurem Benutzer aber eine sehr unschöne Nachricht angezeigt, die wie folgt aussieht:</p>
<p><span id="more-998"></span></p>
<p style="text-align: center;">
<a href="http://kau-boys.de/wp-content/uploads/2010/08/Wartung-Standard-Nachricht.png" class="thickbox"><img src="http://kau-boys.de/wp-content/uploads/2010/08/Wartung-Standard-Nachricht-klein.png" alt="Wartung Standard Nachricht" title="Wartung Standard Nachricht" style="width: 506px; height: 257px;"  /></a>
</p>
<p>Ich habe hier den deutschen Text als Screenshot, aber bei meinem zweisprachigen Blog erscheint immer der englische Text, egal welche Sprache der Nutzer verwendet. Aber abgesehen davon ist die Nachricht mit besonders hübsch.</p>
<h2>Testen und kontrollieren des Wartungsmodus</h2>
<p>Gesteuert wird der Wartungsmodus übrigens über eine Datei mit dem Namen <code>.maintenance</code> die von WordPress bei der Installation mit folgendem Inhalt im ROOT-Verzeichnis eures Blogs abgelegt wird:</p>
<pre class="brush: php; gutter: false; title: ; notranslate">
&lt;?php $upgrading = 1281043765; ?&gt;
</pre>
<p>Der Timestamp hier gibt an, wann das Update gestartet wurde. Solltet ihr euren Wartungsmodus einmal testen wollen, könnt ihr einfach eine entsprechende Datei erzeugen und den Timestamp auf den aktuellen Wert setzen. Dazu einfach anstelle einer Zahl die Funktion time() verwenden, es sei denn, eure innere Uhr kennt immer den aktuellen Timestamp <img src='http://kau-boys.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Denkt aber daran sie später wieder zu löschen. Ihr solltet auch nach jedem Update kontrollieren, ob euer Blog wieder funktioniert. Wie ich heute auf dem <a href="http://www.perun.net/2010/07/31/wordpress-automatisches-update-mit-automatischen-wartungsmodus/">Blog von perun.net</a> nachlesen konnte, ist es schon einigen Blogbesitzern passiert, dass die Datei nach dem Update nicht gelöscht wurde. Das kann schnell mal passieren, wenn man z.B. den Tab mit dem Update aus Versehen löscht. Glücklicherweise wird aber nach 10 Minuten der Blog wieder angezeigt, da WordPress dann davon ausgeht, dass das Löschen der Datei gescheitert ist.</p>
<h2>Verschönern des Wartungsmodus</h2>
<p>Jetzt aber zum eigentlich interessanten Teil des Artikels. Nachdem ich die Standardmeldung im Quellcode von WordPress ausgemacht hatte, fand ich in dem Kommentar der Funktion auch einen Hinweis darauf, wie man die Anzeige mit sehr einfachen Mitteln verschönern kann. Dazu ist es lediglich notwendig eine Datei mit dem Namen <code>maintenance.php</code> im Ordner <code>wp-content</code> abzulegen. Da man hier auch eine PHP Datei verwenden kann sind, der eigenen Kreativität keine Grenzen gesetzt.</p>
<p>Das Anlegen meiner Seite habe ich wie folgt vorgenommen. Zuerst habe ich eine gewöhnliche WordPress Seite erstellt und mit einem netten Text und einen Comic von <a href="http://xkcd.com">xkcd.com</a> gefüllt. Diese Seite habe ich dann kurz freigegeben und nach dem Abmelden vom Admin-Bereich gespeichert, damit auch alle Inhalte zu sehen sind, die ein angemeldeter Besucher nicht sieht. Von dieser Seite habe ich dann den Quellcode gespeichert.</p>
<p>Den Quellcode könnte man nun einfach in die <code>maintenance.php</code> Datei einfügen und im <code>wp-content</code> Ordner ablegen. Da mein Blog aber zweisprachig ist, habe ich zwei HTML-Dateien mit den Namen <code>maintenance-de.htm</code> und  <code>maintenance-en.htm</code> und diese beiden im gleichen Ordner abgelegt. Innerhalb der <code>maintenance.php</code> lese ich dann die Sprache des Benutzers aus, und gebe den Inhalt der entsprechenden Datei aus. Wer mal sehen möchte, wie meine Wartungsseite aussieht kann das gerne hier tun: <a href="http://kau-boys.de/wp-content/maintenance.php">http://kau-boys.de/wp-content/maintenance.php</a>.</p>
<h2>Fazit</h2>
<p>Der neue Wartungsmodus ist wirklich eine tolle Sache und kann mit sehr wenig Aufwand auch an die eigenen Bedürfnisse angepasst werden. Wer eine statische Kopie einer WordPress Seite verwendet, sollte seine Wartungsseite aber von Zeit zu Zeit aktualisieren, damit sie immer dem aktuellen Layout entspricht.</p>
<p>Ich hoffe, dass der Tipp auch euch weiterhelfen wird und ich würde mich freuen, wenn mir der ein oder andere ebenfalls einen Link zu seiner toll gestalteten Wartungsseite als Kommentar schicken würde.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/998/wordpress/wordpress-wartungmodus-mit-eigenem-inhalt-verschoenern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous – Teil 2: Droppables</title>
		<link>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables</link>
		<comments>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables#comments</comments>
		<pubDate>Mon, 15 Mar 2010 15:29:16 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=830</guid>
		<description><![CDATA[Nachdem wir uns in Teil 1 des Tutorials mit der Draggable Klasse beschäftigt haben, wenden wir uns heute seinem Bruder der Droppables Klasse zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren. Der Quellcode für dieses Beispiel Zuerst einmal wieder [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem wir uns in <a href="http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable">Teil 1 des Tutorials</a> mit der <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Klasse</a> beschäftigt haben, wenden wir uns heute seinem Bruder der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">Droppables Klasse</a> zu. Mit ihr können wir auf ein aufgenommenes Element reagieren. Eine typische Anwendung sind Einkaufkörbe auf Online-Shops. Ich möchte daher einen einfachen Einkaufswagen demonstieren.</p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Zuerst einmal wieder der Quellcode für dieses Beispiel. Ich werde wie auch schon im ersten Teil des Tutorials die wichtigen Zeilen etwas genauer erklären. Die Zeilen 1-34 enthalten das grundlegende Gerüst der HTML-Seite sowie die Stylesheets, auf die ich nicht näher eingehen möchte:</p>
<p><span id="more-830"></span></p>
<pre class="brush: xml; title: ; notranslate">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; dir=&quot;ltr&quot; lang=&quot;de-DE&quot;&gt;
&lt;head&gt;
	&lt;head&gt;
		&lt;title&gt;Drag-and-Drop Part 2&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;prototype.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;scriptaculous.js&quot;&gt;&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
			.item {
				padding: 40px;
				border: 1px solid #000;
				cursor: move;
				display: inline-block;
				margin-right: 20px;
			}
			.blue {
				background-color: #39c;
			}
			.green {
				background-color: #292;
			}
			div#shopping_cart {
				width: 180px;
				height: 180px;
				background: #fff;
				border: 5px solid #ccc;
			}
			div#shopping_cart.hover {
				border: 5px dashed #aaa;
			}
		&lt;/style&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;h1&gt;Drag-and-Drop&lt;/h1&gt;
		&lt;div id=&quot;blue_box&quot; title=&quot;Blaue Box&quot; class=&quot;item blue&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;green_box&quot; title=&quot;Grüne Box&quot; class=&quot;item green&quot;&gt;&lt;/div&gt;
		&lt;div id=&quot;shopping_cart&quot;&gt;
			&lt;ul id=&quot;items_in_cart&quot;&gt;&lt;/ul&gt;
		&lt;/div&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
			new Draggable('blue_box', {
				revert: true
			});
			new Draggable('green_box', {
				revert: true
			});
			Droppables.add('shopping_cart', {
				onDrop: addItem,
				hoverclass: 'hover'
			});
			function addItem(dragged, dropped, event){
				var itemCount = $('items_in_cart').select('li[id=&quot;item' +
									dragged.id + '&quot;] span').first();
				if(itemCount == undefined){
					$('items_in_cart').insert({
						bottom: '&lt;li id=&quot;item' + dragged.id +
								'&quot;&gt;&lt;span&gt;1&lt;/span&gt;x ' + dragged.title + '&lt;/li&gt;'
					});
				} else {
					itemCount.update(parseInt(itemCount.innerHTML) + 1);
				}
			}
		&lt;/script&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>In den Zeilen 35-39 sind zwei einfache &#8220;Artikel&#8221; aufgeführt (in unserem Fall einfache farbige DIVs) sowie der &#8220;Warenkorb&#8221;, der eine leere unsortierte Liste enthält. In diese fügen wir dann per Drag-and-Drop die Waren ein. Sehen wir uns nun aber den interessanten Teil des Quellcodes an, das JavaScript. Die Zeilen 41-46 sollten aus dem ersten Teil des Tutorials bekannt sein. Wir erzeugen hier zwei Draggables wobei wir die Option <code>reset</code> auf <code>true</code> setzen, damit die Artikel beim &#8220;loslassen&#8221; wieder auf ihre ursrpüngliche Position zurückkehren. Nun aber zum neuen Teil der Droppables-Klasse:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
Droppables.add('shopping_cart', {
	onDrop: addItem,
	hoverclass: 'hover'
});
</pre>
<p>Wichtig ist hier, dass wir keine Instanz der Klasse durch das Schlüsselwort <code>new</code> erzeugen. Es existiert vielmehr schon eine Instanz, der wir mit der <code>add()</code> Funktion eine neue &#8220;Drop-Zone&#8221; hinzufügen. Es ist also möglich mehrere Bereiche einer Website für die Reaktion auf Draggables zu verwenden. Es wäre z.B. möglich einen &#8220;Papierkorb&#8221; einzurichten, mit dem man einenen bereits hinzugefügten Artikel wieder aus der Liste entfernen kann bzw. dessen Anzahl verringern.</p>
<p>Der add() Funktion können auch mehrere Optionen übergeben werden, welche das sind könnt ihr in der <a href="http://wiki.github.com/madrobby/scriptaculous/droppables">API zu Droppables</a> nachlesen. Ich verwende hier die <code>hoverClass</code> Option, die der &#8220;Drop-Zone&#8221; eine Klasse zu weist, wenn der Benutzer mit einem Draggable darüber steht. Zusätzliche gebe ich eine Callback-Funktion für das <code>onDrop</code> Event an. Wie ihr der Funktion <code>addItem()</code> entnehmen könnte, bekommt die <code>onDrop()</code> Funktion eine Referenz auf das aufgenommene Elemente sowie auf die &#8220;Drop-Zone&#8221; und das Event selbst übergeben. In der Funktion selbst fügen wir den Artikel an die Liste an und setzen die Anzahl auf 1, sofern er noch nicht enthalten ist. Wenn er enthalten ist erhöhen wir dir Anzahl um 1.</p>
<h2>Das Beispiel</h2>
<p>Das oben beschriebene Beispiel sieht dann wie folgt aus (es darf aber gerne unter Verwendung von Bildern anstelle von DIVs und mehr CSS noch ansprechender gestaltet werden):</p>
<div id="blue_box" title="Blaue Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #39c;"></div>
<div id="green_box" title="Grüne Box" style="padding: 40px; border: 1px solid #000; cursor: move; display: inline-block; margin-right: 20px; background-color: #292;"></div>
<div id="shopping_cart" style="width: 180px; height: 180px; background: #fff; border: 5px solid #ccc;">
<ul id="items_in_cart">
<li style="display: none;">Warenkorb</li>
</ul>
</div>
<p><script type="text/javascript" src="http://kau-boys.de/wp-content/uploads/2010/03/part2.js"></script></p>
<p>Wie ihr also sehen könnt ist es sehr einfach ein Element für die Interaktion mit Draggables zu verwenden. Was ihr dabei mit den Elementen macht ist eurer Fantasie überlassen. Die Möglichkeiten sind schier unbegrenzt. Ich möchte euch also dazu animieren einfach einmal mit der Funktion zu experimentieren.</p>
<p>Das war es dann auch schon wieder mit diesem Teil des Tutorials. Im nächsten Teil sehen wir uns einen sehr speziellen Fall von Drag-and-Drop an und zwar mit dem Sortieren von Elementen. Wie einfach so etwas möglich ist und wie leicht sich die Sortierreihenfolge auslesen lässt, das erwartet euch in Teil 3 des Tutorials. Für welche Einsatzzwecke habt ihr bisher Draggables und Droppables genutzt? Über einen Kommentar dazu würde ich mich wie immer sehr freuen.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/830/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-2-droppables/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Tutorial: Drag-and-Drop mit Scriptaculous &#8211; Teil 1: Draggable</title>
		<link>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable</link>
		<comments>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable#comments</comments>
		<pubDate>Tue, 02 Mar 2010 16:38:32 +0000</pubDate>
		<dc:creator>Bernhard</dc:creator>
				<category><![CDATA[Webentwicklung]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>
		<category><![CDATA[Tutorial]]></category>

		<guid isPermaLink="false">http://kau-boys.de/?p=785</guid>
		<description><![CDATA[Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf [...]]]></description>
			<content:encoded><![CDATA[<p>Heute möchte ich mein angekündigtes Tutorial über Drag-and-Drop starten. Das Ziel dieses Tutorials ist der Nachbau einer dynamischen Newsseite, wie ich sie in meinen Artikel <a href="http://kau-boys.de/757/webentwicklung/oeffentlich-rechtlich-und-vorbildhaft-so-muss-eine-web-2-0-zu-olympia-aussehen">Öffentlich-rechtlich und vorbildhaft – So muss eine Web 2.0 zu Olympia aussehen</a> vorgestellt habe. Da eine solche Seite mit vielen verschiedenen Techniken zusammengesetzt ist, werden wir immer kleine Teile auf dem Schritt zur fertigen Seite nachvollziehen.</p>
<p>Im ersten Teil geht es um die Grundlage einer Seite mit Drag-and-Drop. Wir verwenden für dieses Tutorial die Drag-and-Drop Funktionalität von <a href="http://script.aculo.us">Scriptaculous</a>, welches eine Erweiterung des <a href="http://www.prototypejs.org">Prototype Frameworks</a> ist. Um die hier gezeigten Funktionen selbst nachprogrammieren zu können benötigt ihr also zuerst einmal die beiden Frameworks.</p>
<p><span id="more-785"></span></p>
<h2>Der Quellcode für dieses Beispiel</h2>
<p>Beginnen wir also mit dem Beispiel. Zuerst einmal benötigen wir etwas HTML in dem wir ein Element platzieren, welches wir dann aufnehmen möchten. Für das Element nehme ich exemplarisch ein DIV, aber ihr könnt auch z.B. ein Bild verwenden:</p>
<pre class="brush: xml; title: ; notranslate">
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; dir=&amp;quot;ltr&amp;quot; lang=&amp;quot;de-DE&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;head&amp;gt;
		&amp;lt;title&amp;gt;Drag-and-Drop Teil 1&amp;lt;/title&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;prototype.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scriptaculous.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
			#draggable {
				width: 100px;
				height: 100px;
				padding: 30px;
				background-color: #39c;
				border: 1px solid #000;
				cursor: move;
			}
		&amp;lt;/style&amp;gt;
	&amp;lt;/head&amp;gt;
	&amp;lt;body&amp;gt;
		&amp;lt;h1&amp;gt;Drag-and-Drop&amp;lt;/h1&amp;gt;
		&amp;lt;div id=&amp;quot;draggable&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
		&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
			new Draggable('draggable');
		&amp;lt;/script&amp;gt;
	&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</pre>
<p>Wichtig für das Aktivieren der Draggable Funktion auf ein Element ist eine ID für das Element. Das DIV hat hier die ID &#8220;draggable&#8221;. Im Kopf werden die beiden JavaScript Dateien für Prototype und Scriptaculous eingebunden. Wichtig ist hierbei, dass zuerst Prototype eingebunden wird. Zusätzlich ist noch etwas CSS angegeben um dem DIV einen Rahmen und eine Hintergrundfarbe zu verpassen. Alles was nun notwendig ist, um das DIV aufnehmbar zu machen ist eine einzige Zeile JavaScript:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable');
</pre>
<p>Es wird hier eine neue Instanz des <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">Draggable Objekts</a> erzeugt. Dem Konstruktor wird hierbei die ID des Elements übergeben, welches aufnehmbar sein soll.</p>
<h2>Ein Beispiel gefällig</h2>
<p>Da dieser Blog auch Prototype einsetzt, sollten wir es nicht bei einem Quellcode Auszug belassen, sondern einfach mal hier ein solches DIV einfügen. Also, hier kommt es:</p>
<div id="draggable" style="width: 100px; height: 100px; padding: 30px; background-color: #39c; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable')</script></p>
<p>Dieses DIV kann nun beliebig im Sichtbaren Bereich verschoben werden. Die Klasse bietet aber auch viele Optionen, die in einem Hash an die Funktion als zweiten Parameter übergeben werden können. Wir können z.B. die Bewegung eines Elements auf die horizontale beschränken und zusätzlich das Element beim &#8220;Loslassen&#8221; des Elements wieder auf seine ursprüngliche Position zurücksetzen. Der JavaScript Befehl dazu sieht wie folgt aus:</p>
<pre class="brush: jscript; gutter: false; title: ; notranslate">
new Draggable('draggable2', {constraint: 'horizontal', revert: true});
</pre>
<p>Ich habe hier die ID um eine Zwei erweitert, damit ich auch dieses Beispiel hier vorführen kann. Wichtig ist natürlich immer, dass ihr für die verschiedenen Elemente unterschiedliche IDs verwendet und niemals eine ID in zwei Instanzen verwendet. Das DIV verhält sich dann wie folgt:</p>
<div id="draggable2" style="width: 100px; height: 100px; padding: 30px; background-color: #292; border: 1px solid #000; cursor: move;"></div>
<p><script type="text/javascript">new Draggable('draggable2', {constraint: 'horizontal', revert: true})</script></p>
<p>Da es hier in diesem Tutorial nicht darum geht alle möglichen Optionen zu erklären möchte ich euch gerne auf die <a href="http://wiki.github.com/madrobby/scriptaculous/draggable">API Referenz der Draggable Klasse</a> verweisen. Dort findet ihr eine Liste aller Optionen und einige weitere Beispiele.</p>
<p>Damit möchte ich auch schon den ersten Teil des Tutorials abschließen. Ihr solltet einfach einmal die verschiedenen Optionen ausprobieren um zu sehen, wie sich das DIV dabei verhält. Im zweiten Teil beschäftigen wir uns mit &#8220;dem Bruder&#8221; von Draggable. Dabei handelt es sich um die Droppables Klasse, die es ermöglicht ein aufgenommenes Element &#8220;einzufangen&#8221; und auf das Element zu reagieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://kau-boys.de/785/webentwicklung/tutorial-drag-and-drop-mit-scriptaculous-teil-1-draggable/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

