<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.opencaching.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Schwalbe</id>
	<title>Opencaching-Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.opencaching.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Schwalbe"/>
	<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php/Spezial:Beitr%C3%A4ge/Schwalbe"/>
	<updated>2026-06-06T03:05:15Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.opencaching.de/index.php?title=Entwicklung/Codedoku&amp;diff=5605</id>
		<title>Entwicklung/Codedoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php?title=Entwicklung/Codedoku&amp;diff=5605"/>
		<updated>2014-02-02T18:23:56Z</updated>

		<summary type="html">&lt;p&gt;Schwalbe: /* Grundlegende Datenbankfunktionen */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dies ist eine Materialsammlung zum [http://github.com/OpencachingDeutschland/oc-server3 Opencaching-Programmcode]. Sie soll neuen [[Entwicklung|Entwicklern]] einen Überblick über die Grundstruktur und wichtigsten Bestandteile des OC-Codes geben. Mit &amp;quot;OC-Code&amp;quot; ist alles gemeint, was sich im [[Entwicklung/Git|Git-Repository]] befindet.&lt;br /&gt;
&lt;br /&gt;
Weitere Dokumentationen gibt es auch in den Codeverzeichnissen {{Codepath|doc}} und {{Codepath|htdocs/doc}}. Die Datei {{Codepath|doc/directories.txt}} enthält eine Übersicht der Repository-Verzeichnisstruktur. &#039;&#039;(Grüne Pfad- und Dateinamen sind anklickbar.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Alle die bereits an Opencaching mitprogrammiert haben, sind eingeladen, ihr Wissen beizusteuern! Wenn du dir zusätzliche Erläuterungen wünschst, kannst du sie auf der Diskussionsseite anfragen – vielleicht findet sich jemand, der den Artikel ergänzt.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Entwicklung/Stil|Style Guidelines]]&lt;br /&gt;
&lt;br /&gt;
== Dateiformat ==&lt;br /&gt;
&lt;br /&gt;
Alle OC-Quelltextdateien haben [[wikipedia:UTF-8|UTF-8]]-Format. Im Kopf der Quelltextdateien befindet sich ein japanisches Wort (&amp;quot;Unicode Reminder&amp;quot;), mit dem geprüft werden kann ob die Zeichencodierung intakt ist. Sollte versehentlich nach ISO-8859-1 o.ä. umcodiert worden sein, erscheinen dort z.B. zwei Fragezeichen oder gar nichts.&lt;br /&gt;
&lt;br /&gt;
{{Codepath|local/tools/find_bad_encodings.php}} prüft alle Quelltexte auf fehlende oder beschädigte Unicode Reminder.&lt;br /&gt;
&lt;br /&gt;
Die Zeilenenden der Quelltexte bestehen grundsätzlich aus einem einfachen LF (line feed). Ausnahmen gibt es z.B. bei [[#Email-Templates|Email-Templates]]; hier ist CR/LF vorgeschrieben.&lt;br /&gt;
&lt;br /&gt;
== Hauptmodule ==&lt;br /&gt;
&lt;br /&gt;
Mit &amp;quot;lib1&amp;quot; und &amp;quot;lib2&amp;quot; sind im Folgenden die OC-eigenen Codebibliotheken in {{Codepath|htdocs/lib}} und {{Codepath|htdocs/lib2}} gemeint. Alle Teile des OC-Codes bauen auf einer dieser beiden Bibliotheken auf.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widelist&amp;quot;&amp;gt;&lt;br /&gt;
Der OC-Software besteht aus ...&lt;br /&gt;
* Den &#039;&#039;&#039;darstellbaren Seiten&#039;&#039;&#039; der OC-Website, z.B. Startseite (&#039;&#039;index&#039;&#039;) oder Cachelisting-Anzeige (&#039;&#039;viewcache&#039;&#039;). Diese bestehen jeweils aus einem PHP-Script im Verzeichnis {{Codepath|htdocs}} und einem [[#Templates|Template]] in {{Codepath|htdocs/templates2/ocstyle}} (lib1: {{Codepath|htdocs/lang/de/ocstyle}}). Das PHP-Script erzeugt die darzustellenden Inhalte, das Template stellt sie als HTML-Seite dar.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Kommandozeilentools&#039;&#039;&#039; für verschiedene Zwecke, z.B. Wartungstools die per Crojob oder von Hand aufgerufen werden. Sie befinden sich in an verschiedenen Stellen:&lt;br /&gt;
** {{Codepath|bin}} (Update-Scripte)&lt;br /&gt;
** {{Codepath|htdocs/util}} (lib1, Tools für Produktivbetrieb)&lt;br /&gt;
** {{Codepath|htdocs/util2}} (lib2, Tools für Produktivbetrieb)&lt;br /&gt;
** {{Codepath|local}} (spezielle Tools für lokale Verwendung)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;APIs&#039;&#039;&#039;, also Schnittstellen für Datenabruf oder -upload durch Dritte:&lt;br /&gt;
** diverse APIs in {{Codepath|htdocs/api}}&lt;br /&gt;
** die [[OKAPI]] in {{Codepath|htdocs/okapi}}, repliziert aus dem [http://code.google.com/p/opencaching-api/source/browse/trunk/#trunk%2Fokapi OKAPI-Repository]&lt;br /&gt;
** die [[XML-Schnittstelle]] in {{Codepath|htdocs/xml}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Apache-Rewrites&#039;&#039;&#039;. Dies sind Konfigurationsdateien mit dem Name &#039;&#039;.htaccess&#039;&#039;, die vom Apache-Webserver ausgelesen werden. Sie interpretieren die übergebene URL und leiten auf ein PHP-Script um. Apache-Rewrites kommen an zwei Stellen zum Einsatz:&lt;br /&gt;
** Statistikbilder: {{Codepath|htdocs/statpics/htaccess-dist|htdocs/statpics/.htaccess}}&lt;br /&gt;
** OC-Kurz-URLs, z.B. http://opencaching.de/OC1234: diese sind direkt im Produktiv-Webserver konfiguriert.&lt;br /&gt;
&lt;br /&gt;
== Bibliotheken ==&lt;br /&gt;
&lt;br /&gt;
Die einzelnen OC-Module verwenden verschiedene Code-Bibliotheken:&lt;br /&gt;
&lt;br /&gt;
=== Eigene Bibliotheken ===&lt;br /&gt;
&lt;br /&gt;
==== lib1 ====&lt;br /&gt;
Die alte selbstgeschriebene Bibliothek von OC-Codeversion 1.0, in {{Codepath|htdocs/lib}}. Sie enthält z.B. Funktionen für Datenbankzugriff, Login, Menüs, geographische Berechnungen und ein einfaches Template-System.&lt;br /&gt;
&lt;br /&gt;
lib1 ist veraltet und wird auf OC.de nur noch für das Bearbeiten von Logs und Cachebeschschreibungen, für Benachrichtigungen über beobachtete und neue Caches und für die XML-Schnittstelle verwendet. Mittelfristig soll sie ganz durch lib2 ersetzt werden. (Alle auf OC.pl-Code basierenden [[Opencaching]]-Seiten verwenden weiterhin ausschließlich die lib1).&lt;br /&gt;
&lt;br /&gt;
lib1 wird eingebunden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;require &#039;lib/common.inc.php&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== lib2 ====&lt;br /&gt;
Die Bibliothek der OC.de-Codversion 2.0 und höher in {{Codepath|htdocs/lib2}}, Nachfolger von lib1. Sie ist wesentlich umfangreicher. Der Code ist aufgeteilt in das &amp;quot;Framework&amp;quot; mit allgemeinen Dingen wie Datenbankzugriff, Authentifizierung, Lokalisierung, Templates etc. und die sogenannte &amp;quot;Business Logic&amp;quot; in {{Codepath|htdocs/lib2/logic}} mit allen Geocaching-spezifischen Klassen und Funktionen.&lt;br /&gt;
&lt;br /&gt;
lib2 wird in Bestandteile der Website eingebunden mit&lt;br /&gt;
:&amp;lt;code&amp;gt;require &#039;lib2/web.inc.php&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
und in Kommandozeilentools mit&lt;br /&gt;
:&amp;lt;code&amp;gt;require &#039;lib2/cli.inc.php&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;gemeinsamer lib1- und lib2-Code&lt;br /&gt;
Manche Bibliotheksmodule werden versionsübergreifend verwendet, z.B. für Übersetzungen und Sprachauswahl. Sie sind in {{Codepath|htdocs/lib2}} abgelegt.&lt;br /&gt;
&lt;br /&gt;
==== libse ====&lt;br /&gt;
Eine Klassenbibliothek von Opencaching.se, in {{Codepath|htdocs/libse}}. Im Zuge der Codezusammenführung von OC.de und OC.se wurde sie 2011 mit in den OC.de-Code übernommen. Sie wird für zusätzliche Wegpunkte und persönliche Notizen im Cachelisting verwendet.&lt;br /&gt;
&lt;br /&gt;
==== Autoload ====&lt;br /&gt;
Für die Klassen aller drei Bibliotheken sind Autoloader installiert. Das heißt wenn man z.B. ein Cache-Objekt benötigt, muss man dafür nicht {{Codepath2|htdocs|lib2/logic/cache.class.php}} einbinden sondern man erzeugt einfach direkt das Objekt:&lt;br /&gt;
:&amp;lt;code&amp;gt;$cache = new cache();&amp;lt;/code&amp;gt;&lt;br /&gt;
{{Codepath2|htdocs/lib2/logic|cache.class.php}} wird dann automatisch geladen.&lt;br /&gt;
&lt;br /&gt;
=== Fremdbibliotheken ===&lt;br /&gt;
&lt;br /&gt;
Die OC-Software macht ausgiebig Gebrauch von fertigen PHP- und JavaScript-Codebibliotheken. Eine vollständige Aufstellung incl. Codepfade, Bezugsquellen etc. enthält {{Codepath|doc/license.txt}}. Hier seien nur die wichtigsten davon erwähnt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widelist&amp;quot;&amp;gt;&lt;br /&gt;
* [http://www.smarty.net/ &#039;&#039;&#039;Smarty&#039;&#039;&#039;] wird als &amp;quot;Template-Engine&amp;quot; für lib2 verwendet. OC-spezifische Erweiterungen befinden sich in der Klasse &#039;&#039;OcSmarty&#039;&#039; und in {{Codepath2|htdocs|lib2/smarty/ocplugins}}. Mehr dazu im Abschnitt [[#Templates|Templates]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://htmlpurifier.org/ HTML Purifier]&#039;&#039;&#039; dient zum &amp;quot;Säubern&amp;quot; von HTML-Code, den der Benutzer z.B. in Cachebeschreibungen eingeben kann. lib1 und lib2 verwenden getrennte HTML-Purifier-Installationen. In lib2 wird er über die Klasse &#039;&#039;OcHTMLPurifier&#039;&#039; eingebunden und kann dort auch angepasst werden. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://www.tinymce.com/ TinyMCE]&#039;&#039;&#039; ist ein leistungsfähiger JavaScript-Wysiwyg-Texteditor. Er dient zum Bearbeiten von Cachebeschreibungen, Logs und Profiltexten. lib1 und lib2 verwenden beide die TinyMCE-Installation in {{Codepath|htdocs/resource2/tinymce}}. OC-spezifische Konfigurationsdaten gibt es in {{Codepath2|htdocs/resource2|tinymce/config}}. &lt;br /&gt;
&lt;br /&gt;
Von lib2-Code verwendete Bibliotheken sind in {{Codepath|htdocs/lib2}} (PHP) und {{Codepath|htdocs/resource2}} (JavaScript) angelegt. Bibliotheken für lib1 befinden sich an verschiedenen Stellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Konfigurationsdateien ==&lt;br /&gt;
&lt;br /&gt;
==== lib1-Konfiguration ====&lt;br /&gt;
&lt;br /&gt;
Die Einstellungen für lib1-Code befinden sich überwiegend in&lt;br /&gt;
:&#039;&#039;htdocs/lib/settings.inc.php&#039;&#039;&lt;br /&gt;
Diese Datei ist nur lokal vorhanden. Als Vorlage für das Aufsetzen einer neuen Produktiv-Installation gibt es die Datei {{Codepath2|htdocs/lib|settings-dist.inc.php}}, die nach &#039;&#039;settings.inc.php&#039;&#039; zu kopieren und anzupassen ist.&lt;br /&gt;
&lt;br /&gt;
Für [[Entwicklung/Entwicklersystem|Entwicklersysteme]] gibt es entsprechend die Vorlage {{Codepath2|htdocs/lib|settings-sample-dev.inc.php}}. Sie verwendet die Datei {{Codepath2|htdocs/lib|settings-dev.inc.php}}, in der die Grundeinstellungen für Entwicklersysteme zusammengefasst sind.&lt;br /&gt;
&lt;br /&gt;
Daneben gibt es noch zwei Konfigurationsdateien &#039;&#039;settings.inc.php&#039;&#039; für die Benachrichtigungs-Cronjobs, in {{Codepath|htdocs/util/notification}} und {{Codepath|htdocs/util/watchlist}}.&lt;br /&gt;
&lt;br /&gt;
Weiterhin verwendet lib1 auch Teile der lib2-Konfiguration, insbesondere {{Codepath2|htdocs/config2|locale.inc.php}}.&lt;br /&gt;
&lt;br /&gt;
==== lib2-Konfiguration ====&lt;br /&gt;
&lt;br /&gt;
Die lib2-Einstellungen befinden sich alle in {{Codepath|htdocs/config2}}. Sie werden &#039;&#039;alle&#039;&#039; in folgender Reihenfolge eingebunden, sobald man {{Codepath2|htdocs/lib2|web.inc.php}} oder {{Codepath2|htdocs/lib2|cli.inc.php}} einbindet:&lt;br /&gt;
&lt;br /&gt;
* sprachabhängige Einstellungen: {{Codepath2|htdocs/config2|locale.inc.php}}&lt;br /&gt;
* sonstige Default-Einstellungen: {{Codepath2|htdocs/config2|settings-dist.inc.php}}&lt;br /&gt;
* lokale Einstellungen: &#039;&#039;settings.inc.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Auch hier sind Vorlagen für Produktiv- ({{Codepath2|htdocs/config2|settings-sample.inc.php}}) und Entwicklersystem ({{Codepath2|htdocs/config2|settings-sample-dev.inc.php}}) vorhanden, die nach &#039;&#039;settings.inc.php&#039;&#039; zu kopieren und and die lokale Systeminstallation anzupassen sind.&lt;br /&gt;
&lt;br /&gt;
==== Der Rootpath ====&lt;br /&gt;
&lt;br /&gt;
Wenn man in PHP-Scripte mit &amp;lt;code&amp;gt;include&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt; weitere Dateien einbindet, geschieht dies relativ zum Verzeichnispfad des Hauptscripts. (Daneben kann man auch weitere Pfade festlegen, in denen PHP nach passenden Scripten sucht.)&lt;br /&gt;
&lt;br /&gt;
Wie unter [[#Hauptmodule|Hauptmodule]] erläutert, befinden sich die Module der OC-Software auf verschiedenen Verzeichnisebenen Die Startseite liegt z.B. in {{Codepath|htdocs}}, das lib2-Cronjob-Modul dagegen in {{Codepath|htdocs/util2/cron}}. Alle diese Module binden lib1- oder lib2-Bibliothekscode ein, der weitere Unterscripte einbindet. Damit das alles funktioniert, wird im OC-Code ein &#039;&#039;Basispfad&#039;&#039; für alle Includes festgelegt. Dieser heißt&lt;br /&gt;
:&amp;lt;code&amp;gt;$opt[&#039;rootpath&#039;]&amp;lt;/code&amp;gt;&lt;br /&gt;
in lib2 und&lt;br /&gt;
:&amp;lt;code&amp;gt;$rootpath&amp;lt;/code&amp;gt;&lt;br /&gt;
in lib1.&lt;br /&gt;
&lt;br /&gt;
Sofern man keine weiteren Vorkehrungen trifft, wird dieser Rootpath automatisch als Relativpfad &amp;quot;./&amp;quot; gesetzt. Scripte in Unterverzeichnissen müssen ihn dagegen selbst setzen, z.B. &amp;quot;../&amp;quot; wenn das Script eine Ebene tiefer liegt, oder absolut als &amp;lt;code&amp;gt;dirname(__FILE__).&#039;../&#039;&amp;lt;/code&amp;gt;, wenn nicht bekannt ist, aus welchem aktuellen Verzeichnis ein Kommandozeilentool aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
== Konstanten ==&lt;br /&gt;
&lt;br /&gt;
Globale Konstanten sind an folgenden Stellen definiert:&lt;br /&gt;
&lt;br /&gt;
* {{Codepath|htdocs/lib/consts.inc.php}}&lt;br /&gt;
* {{Codepath|htdocs/lib2/const.inc.php}}&lt;br /&gt;
* {{Codepath|htdocs/lib2/error.inc.php}}&lt;br /&gt;
* {{Codepath|htdocs/lib2/logic/const.inc.php}}&lt;br /&gt;
&lt;br /&gt;
Die lib2-Konstanten werden auch teilweise auch in lib1-Code verwendet.&lt;br /&gt;
&lt;br /&gt;
== Datenbank ==&lt;br /&gt;
&lt;br /&gt;
Die OC-Software ist nur für die Verwendung von MySQL ausgelegt. Zwar werden in lib2 keine MySQL-Funktionen mehr direkt aufgerufen, aber zahlreiche SQL-Statements verlassen sich auf MySQL-Syntax.&lt;br /&gt;
&lt;br /&gt;
=== Grundlegende Datenbankfunktionen ===&lt;br /&gt;
&lt;br /&gt;
Für lib2 befinden sich alle Funktionen in {{Codepath2|htdocs|lib2/db.inc.php}} und sind dort kurz dokumentiert, für lib1 in {{Codepath2|htdocs|lib/clicompatbase.inc.php}}. Datenbankverbindungen werden automatisch entsprechend den Konfigurationseinstellungen hergestellt, sobald man eine Query absetzt.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Funktionen seien hier anhand von Beispielen erläutert:&lt;br /&gt;
&lt;br /&gt;
 sql(&amp;quot;UPDATE `caches` SET `size`=&#039;&amp;amp;1&#039; WHERE `cache_id`=&#039;&amp;amp;2&#039;&amp;quot;,&lt;br /&gt;
     $newsize, $cacheid);&lt;br /&gt;
&lt;br /&gt;
Hier wird die Größe eines Caches geändert. Variablen werden als fortlaufend numerierte Platzhalter &amp;amp;1, &amp;amp;2 etc. übergeben. Die Funktion &#039;&#039;sql&#039;&#039; ruft dann intern für jede Variable &amp;lt;code&amp;gt;mysql_real_escape_string()&amp;lt;/code&amp;gt; auf, was spezielle Zeichen wie &amp;quot; codiert und gleichzeitig [[wikipedia:SQL-Injection|SQL-Injections]] verhindert.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Niemals dürfen Variablen direkt in SQL-Statements eingebaut werden!&#039;&#039;&#039; Wann immer möglich sind Platzhalter zu verwenden. Notfalls kann auch direkt mit &amp;lt;code&amp;gt;sql_escape()&amp;lt;/code&amp;gt; codiert werden, was allerdings Probleme verursacht, wenn ein &amp;quot;&amp;amp;&amp;quot; in den Daten enthalten ist: Die Funktion &amp;lt;code&amp;gt;sql()&amp;lt;/code&amp;gt; interpretiert es anschließend als Startzeichen eines Platzhalters.&lt;br /&gt;
&lt;br /&gt;
 $cachesize = sql_value(&amp;quot;&lt;br /&gt;
    SELECT `size` FROM `caches`&lt;br /&gt;
    WHERE `cache_id`=&#039;&amp;amp;1&#039;&amp;quot;,&lt;br /&gt;
    null, $cacheid);&lt;br /&gt;
&lt;br /&gt;
Hier wird die Größe eines Caches abgefragt. Falls die Cache-ID nicht gefunden wird, wird der Defaultwert &#039;&#039;null&#039;&#039; zurückgeliefert. Denke immer daran, den Defaultwert als ersten Parameter anzugeben! Ihn zu vergessen ist eine häufige Fehlerquelle.&lt;br /&gt;
&lt;br /&gt;
In der lib1 heißt die Funktion anders und kann nicht mit Platzhaltern umgehen; der entsprechende Code lautet dann:&lt;br /&gt;
&lt;br /&gt;
 $cachesize = sqlValue(&amp;quot;&lt;br /&gt;
    SELECT `size` FROM `caches`&lt;br /&gt;
    WHERE `cache_id`=&#039;&amp;quot; . sql_escape($cacheid) . &amp;quot;&#039;&amp;quot;,&lt;br /&gt;
    null);&lt;br /&gt;
&lt;br /&gt;
Das folgende Beispiel demonstriert, wie der Inhalt einer Tabelle ausgelesen wird:&lt;br /&gt;
&lt;br /&gt;
  $rs = sql(&amp;quot;&lt;br /&gt;
    SELECT `cache_id`, `name`, `type` `size` FROM `caches`&lt;br /&gt;
    WHERE `cache_id`=&#039;&amp;amp;1&#039;&amp;quot;,&lt;br /&gt;
    $cacheid);&lt;br /&gt;
  while ($r = sql_fetch_assoc($rs))&lt;br /&gt;
  {&lt;br /&gt;
    // ... Weiterverarbeitung von $r[&#039;cache_id&#039;], $r[&#039;name&#039;] etc.&lt;br /&gt;
  }&lt;br /&gt;
  sql_free_result($rs);&lt;br /&gt;
&lt;br /&gt;
=== Slave-Server ===&lt;br /&gt;
&lt;br /&gt;
Beide OC-Libraries sehen eine Lastverteilung auf einen Haupt-Datebankserver (Master) und einen oder mehrere &amp;quot;Slaves&amp;quot; vor, die replizierte Daten des Masters enthalten; siehe {{Codepath|doc/replication.txt}}. Dazu gibt es SQL-Funktionen mit dem Zusatz &amp;quot;_slave&amp;quot;, z.B. &amp;lt;code&amp;gt;sql_slave()&amp;lt;/code&amp;gt;, die von &amp;quot;datenbankintensiven&amp;quot; Programmmodulen wie z.B. der Suche ({{Codepath2|htdocs|search.php}}) anstatt der Basisfunktionen verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Wenn per &#039;&#039;settings.inc.php&#039;&#039; keine Slave-Server konfiguriert sind, laufen alle Zugriffe über den Master. Zurzeit betreibt kein Opencaching-Knoten Slave-Server; die Kapazität des Masters reicht überall aus.&lt;br /&gt;
&lt;br /&gt;
=== Temporärtabellen ===&lt;br /&gt;
&lt;br /&gt;
Da Subqueries bei MySQL recht ineffizient sind, sind manchmal temporäre Tabellen für Zwischenergebnisse nötig.&lt;br /&gt;
&lt;br /&gt;
lib2 sieht einen speziellen Mechanismus zur Verwaltung von Temporärtabellen vor. Sie werden in einer eigenen Datenbank abgelegt, für die erweiterte Zugriffsrechte (Tabellen anlegen/löschen) vergeben werden, und werden per Cronjob automatisch aufgeräumt, wenn sie nicht gleich wieder gelöscht wurden.&lt;br /&gt;
&lt;br /&gt;
Ein (nicht unbedingt sinnvolles) Beispiel für die Verwendung von lib2-Temporärtabellen. Die temporäre Tabelle heißt &amp;quot;tmp_caches&amp;quot; und wird in SQL-Statements über einen Platzhalter referenziert:&lt;br /&gt;
&lt;br /&gt;
  sql_temp_table(&#039;tmp_caches&#039;);  // Tabelle registrieren&lt;br /&gt;
  sql(&amp;quot;                          // Tabelle anlegen&lt;br /&gt;
    CREATE TEMPORARY TABLE &amp;amp;tmp_caches ENGINE=MEMORY&lt;br /&gt;
    SELECT `cache_id` FROM `caches`&lt;br /&gt;
    WHERE `user`.`user_id` = `caches`.`user_id`&lt;br /&gt;
      AND `user`.`country` = &#039;&amp;amp;1&#039;&amp;quot;,&lt;br /&gt;
    $country);&lt;br /&gt;
 &lt;br /&gt;
  $rs = sql(&amp;quot;                    // Tabelle auslesen&lt;br /&gt;
    SELECT * FROM `cache_desc`, &amp;amp;tmp_caches&lt;br /&gt;
    WHERE `cache_desc`.`cache_id` = &amp;amp;tmp_caches.`cache_id`&amp;quot;);&lt;br /&gt;
  // ... Daten weiterverarbeiten&lt;br /&gt;
  sql_free_result($rs);&lt;br /&gt;
 &lt;br /&gt;
  sql_drop_temp_table(&#039;tmp_caches&#039;);  // Tabelle löschen&lt;br /&gt;
&lt;br /&gt;
=== Datenbankstruktur; statische Daten ===&lt;br /&gt;
&lt;br /&gt;
Datenbankstruktur und -inhalte werden an folgenden Stellen unter {{Codepath|htdocs/doc/sql}} definiert:&lt;br /&gt;
&lt;br /&gt;
* Tabellen, Felder und Indizes in {{Codepath2|htdocs/doc/sql|tables}}&lt;br /&gt;
* Stored Functions, Procedures und Triger in {{Codepath2|htdocs/doc/sql|stored-proc}}&lt;br /&gt;
* statische Daten wie z.B. Menüs, Cachetypen und sprachabhängige Texte in {{Codepath2|htdocs/doc/sql|static-data/data.sql}}.&lt;br /&gt;
&lt;br /&gt;
Es gibt weitere (geographische) &amp;quot;statische Daten&amp;quot;, die aufgrund ihres Umfangs nicht im Git-Repository enthalten sind; siehe {{Codepath2|htdocs/doc/sql|static-data/static-data.txt}}. Für Entwickler steht auf Anfrage ein Datenbankdump zur Verfügung, der eine vollständig initialisierte OC-Datenbank enthält (Veröffentlichung ist geplant). Weitere Updates können dann per&lt;br /&gt;
:{{Codepath|bin/dbupdate.php}}&lt;br /&gt;
eingepflegt werden, also man muss die oben aufgelisteten Dateien nicht von Hand weiterverarbeiten.&lt;br /&gt;
&lt;br /&gt;
Siehe auch: [[Entwicklung/Datenbankversionierung|Datenbankversionierung]]&lt;br /&gt;
&lt;br /&gt;
==== OKAPI ====&lt;br /&gt;
&lt;br /&gt;
Die [[OKAPI]]-Tabellen werden zwar in der gleichen Datenbank abgelegt, sind aber unabhängig von den OC-Tabellen und daher &#039;&#039;nicht&#039;&#039; in {{Codepath|htdocs/doc/sql}} definiert. Bei [http://code.google.com/p/opencaching-api/#Installation_/_Update_Instructions Installation der OKAPI] werden sie automatisch angelegt und bei OKAPI-Updates automatisch aktualisiert. {{Codepath2|bin|dbupdate.php}} führt auch OKAPI-Updates durch, falls die OKAPI installiert ist.&lt;br /&gt;
&lt;br /&gt;
Auch der OKAPI-&#039;&#039;Code&#039;&#039; ist unabhängig vom OC-Code, d.h. sämtliche Datenbankzugriffe sind dort redundant implementiert. &#039;&#039;&#039;Bei Änderungen an Datenstrukturen oder -inhalten ist daher immer zu prüfen, ob eine Anpassung der OKAPI nötig ist!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Trigger &amp;amp; Stored Procedures ===&lt;br /&gt;
&lt;br /&gt;
Der Opencaching-Code macht reichlich Gebrauch von gespeicherten Datenbank-Funktionen und Triggern. Sie werden dazu eingesetzt, um die Konsistenz der Datenbankinhalte zu gewährleisten. Vor dem Hintergrund, dass drei unabhängige Frameworks parallel auf die Datenbank zugreifen – lib1, lib2 und OKAPI (und manchmal noch ein Administrator von Hand) – ist diese Vorgehensweise ratsam. Sie macht die OC.de-Datenbank ausgesprochen robust.&lt;br /&gt;
&lt;br /&gt;
Alle Datenbankfunktionen sind in &lt;br /&gt;
:{{Codepath|htdocs/doc/sql/stored-proc}}&lt;br /&gt;
definiert. Der aktuelle Stand befinden sich in {{Codepath2|htdocs/doc/sql/stored-proc|maintain-current.inc.php}}; für die [[Entwicklung/Datenbankversionierung|Datenbankversionierung]] können zusätzliche ältere Stände bzw. Update-Scripte existieren.&lt;br /&gt;
&lt;br /&gt;
Der Inhalt des &#039;&#039;maintain&#039;&#039;-Scripts lässt sich grob untergliedern in&lt;br /&gt;
* allgemeine Funktionen für komplexe Berechnungen, z.B. &amp;lt;code&amp;gt;DECTOWP&amp;lt;/code&amp;gt; für die Berechnung neuer OC-Wegpunkte&lt;br /&gt;
* Update-Funktionen für bestimmte Felder (&amp;lt;code&amp;gt;sp_update_*&amp;lt;/code&amp;gt;) die entweder von verschiedenen Triggern aufgerufen werden oder zur Datenbankwartung aus {{Codepath2|htdocs|dbmaint.php}} (Menü Admin|Datenbankwartung)&lt;br /&gt;
* Trigger-Prozeduren&lt;br /&gt;
&lt;br /&gt;
Eine Besonderheit sind &#039;&#039;&#039;globale Variablen&#039;&#039;&#039; die zur Parameterübergabe von PHP-Scripten an Datenbankfunktionen oder zwischen Datenbankfunktionen verwendet werden. Sie sind in {{Codepath2|htdocs/doc/sql/stored-proc|maintain-current.inc.php}} erläutert.&lt;br /&gt;
&lt;br /&gt;
=== SQL-Debugger ===&lt;br /&gt;
&lt;br /&gt;
lib1 und lib2 enthalten einen nützlichen SQL-Debugger ({{Codepath2|htdocs|lib/sqldebugger.inc.php}} bzw. {{Codepath2|htdocs|lib2/sqldebugger.class.php}}). Er zeigt für jedes ausgeführte SQL-Statment&lt;br /&gt;
&lt;br /&gt;
* das Statement selbst,&lt;br /&gt;
* ein [http://dev.mysql.com/doc/refman/5.1-olh/de/using-explain.html EXPLAIN],&lt;br /&gt;
* die ersten zurückgelieferten Datensätze, falls vorhanden,&lt;br /&gt;
* die Ausführungszeit,&lt;br /&gt;
* eventuelle MySQL-Warnungen.&lt;br /&gt;
&lt;br /&gt;
Der SQL-Debugger muss in den [[#Konfigurationsdateien|Settings]] aktiviert sein – für lib1 per &amp;lt;code&amp;gt;$sql_debug = true&amp;lt;/code&amp;gt;, in lib2 durch Setzen des Flags &amp;lt;code&amp;gt;DEBUG_SQLDEBUGGER&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;$opt[&#039;debug&#039;]&amp;lt;/code&amp;gt;. Wahlweise kann man diese Flags auch nur in einzelnen zu debuggenden PHP-Quelltexten setzen.&lt;br /&gt;
&lt;br /&gt;
Anschließend ist die zu debuggende Seite mit dem URL-Parameter &amp;lt;code&amp;gt;sqldebug=1&amp;lt;/code&amp;gt; aufzurufen.&lt;br /&gt;
&lt;br /&gt;
== Temporärdaten und Inhalte im Dateisystem ==&lt;br /&gt;
&lt;br /&gt;
Manche Dinge werden in Dateien statt in der Datenbank abgelegt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mediumlist&amp;quot;&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Hochgeladene Bilder&#039;&#039;&#039; befinden sich üblicherweise in {{Codepath|htdocs/images/uploads}} (in den Settings änderbar), die Thumbnails darunter in {{Codepath2|htdocs/images/uploads|thumbs}}. Generierte Statistikbilder werden in {{Codepath|htdocs/images/statpics}} abgelegt.&lt;br /&gt;
* Herunterzuladende, gepackte &#039;&#039;&#039;Ausgaben der [[XML-Schnittstelle]]&#039;&#039;&#039; werden in {{Codepath|htdocs/download/zip}} zwischengespeichert (ebenfalls konfigurierbar).&lt;br /&gt;
* {{Codepath|htdocs/cache2}} enthält zwischengespeicherte [[#Templates|Templates]], [[#Übersetzung|Übersetzungsdateien]] für gettext und verschiedene Temporärdaten. Ein guter Teil dieser Daten wird von {{Codepath|bin/clear-webcache.php}} neu generiert.&lt;br /&gt;
* {{Codepath|htdocs/var}} enthält zwischengespeicherte OKAPI-Daten (die OKAPI legt allerdings auch eine Menge &amp;quot;gecachete&amp;quot; in der Datenbank ab) und Fehlerprotokolle.&lt;br /&gt;
* {{Codepath|htdocs/cache}} enthält vermutlich nur noch temporäre Prozess-Synchronisationsdateien (.pid-Dateien) der lib1-cronjobs für Log- und Cache-Benachrichtigungen.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
&lt;br /&gt;
[[wikipedia:Template (Programmierung)|Templates]] dienen in Webanwendungen dazu, die Generierung von aus- und einzugebenden Daten von deren HTML-Darstellung zu trennen. HTML- und JavaScript-Code wird komplett in den Template-Dateien untergebracht, PHP-Code soweit wie irgend möglich in PHP-Scripten.&lt;br /&gt;
&lt;br /&gt;
Die Einbindung der Templates in den PHP-Programmablauf geschieht wie folgt:&lt;br /&gt;
# Festlegung, welche Templatedatei verwendet wird&lt;br /&gt;
# Zuweisung von variablen Inhalten an das Template&lt;br /&gt;
# Darstellung des Templates&lt;br /&gt;
Für alle drei Punkte gibt es entsprechende Bibliotheksfunktionen.&lt;br /&gt;
&lt;br /&gt;
=== lib1-Templates ===&lt;br /&gt;
&lt;br /&gt;
Die alte Library enthält ein selbstgemachtes, simples Templatesystem. Die Templatedateien befinden sich in {{Codepath|htdocs/lang/de/ocstyle}} und enthalten den auszugebenden HTML- und JavaScript-Code. Der Name der Template-Datei wird im PHP-Code über die globale Variable &amp;lt;code&amp;gt;$tplname&amp;lt;/code&amp;gt; festgelegt, z.B.&lt;br /&gt;
:&amp;lt;code&amp;gt;$tplname = &#039;newcache&#039;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für alle variablen Inhalte werden im Template Platzhalter wie z.B. &amp;lt;code&amp;gt;{cachename}&amp;lt;/code&amp;gt; verwendet; die PHP-Variable wird dann übergeben mit&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;tpl_set_var(&#039;cachename&#039;, $cachename);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sofern der variable Teil auch HTML-Code oder etwas zu Übersetzendes enthält, wird dies in speziellen Include-Dateien abgelegt, z.B.&lt;br /&gt;
&lt;br /&gt;
 $cachelink = &#039;&amp;lt;a href=&amp;quot;viewcache.php?cacheid={cacheid}&amp;quot;&amp;gt;{cachename}&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
 $outputformat_notexist = t(&#039;The selected output format is unknown!&#039;);&lt;br /&gt;
&lt;br /&gt;
Die Include-Datei wird im PHP-Hauptmodul eingebunden und die Variablen per &amp;lt;code&amp;gt;mb_ereg_replace&amp;lt;/code&amp;gt; ersetzt, bevor das Ganze per &amp;lt;code&amp;gt;tpl_set_var()&amp;lt;/code&amp;gt; ans Template übergeben wird.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;code&amp;gt;tpl_BuildTemplate();&amp;lt;/code&amp;gt;&lt;br /&gt;
stellt schließlich das Template dar und beendet das PHP-Script.&lt;br /&gt;
&lt;br /&gt;
Alle [[Opencaching]]-Seiten außer OC.de und OC.se/no verwenden noch das lib1-Templatesystem.&lt;br /&gt;
&lt;br /&gt;
=== lib2-Templates (Smarty) ===&lt;br /&gt;
&lt;br /&gt;
==== Grundlagen ====&lt;br /&gt;
&lt;br /&gt;
Die neue Bibliothek verwendet die leistungsfähige [[wikipedia:Smarty|Smarty]]-Engine. Smarty-Templates bestehen neben dem HTML/JavaScript-Code im Wesentlichen aus Kontrollstrukturen und Variableneinbindungen. Die Templates sind in {{Codepath|htdocs/templates2/ocstyle}} abgelegt.&lt;br /&gt;
&lt;br /&gt;
Die lib2 definiert die globale Variable&lt;br /&gt;
:&amp;lt;code&amp;gt;$tpl&amp;lt;/code&amp;gt;&lt;br /&gt;
über die alle Zugriffe auf Smarty und die Templates laufen. Am Beginn des PHP-Moduls wird jeweils das Template initialisiert:&lt;br /&gt;
&lt;br /&gt;
 $tpl-&amp;gt;name = &#039;newemail&#039;;   // Name der Template-Datei&lt;br /&gt;
 $tpl-&amp;gt;menuitem = MNU_MYPROFILE_DATA;  // Menü-ID, siehe doc/sql/static-data/data.sql&lt;br /&gt;
 $tpl-&amp;gt;caching = false;     // nicht zwischenspeichern&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;caching&#039;&#039;-Parameter legt fest, ob das Ergebnis der Templateausgabe zwischengespeichert wird; die Dauer der Zwischenspeicherung ist dann ggf. per&lt;br /&gt;
 $tpl-&amp;gt;cachling_lifetime = 1800;  // halbe Stunde Caching&lt;br /&gt;
festzulegen. Dies empfiehlt sich bei häufig aufgerufenen, rechenintensiven Seiten. Seiten mit ständig wechselndem bzw. benutzerabhängigem Inhalt dürfen &#039;&#039;&#039;nicht&#039;&#039;&#039; &amp;quot;gecacht&amp;quot; werden!&lt;br /&gt;
&lt;br /&gt;
Neben Caching der Template-&#039;&#039;Ausgaben&#039;&#039; gibt es auch eine &#039;&#039;Vorcompilierung&#039;&#039; der Templates selbst. Diese erfolgt&lt;br /&gt;
* einmalig für alle Templates per &amp;lt;code&amp;gt;bin/clear-webcache.php&amp;lt;/code&amp;gt;,&lt;br /&gt;
* automatisch, wenn ein geändertes Template abgerufen wird,&lt;br /&gt;
* jedesmal bei jedem Template-Aufruf, falls in den Settings der Debug-Schalter &amp;lt;code&amp;gt;DEBUG_TEMPLATES&amp;lt;/code&amp;gt; gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Die zwischengespeicherten Templates werden in &amp;lt;code&amp;gt;htdocs/cache2/smarty&amp;lt;/code&amp;gt; abgelegt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Auf die Initialisierung des Templates folgen Variablen-Zuweisungen (s.u.) und schließlich die Darstellung mit&lt;br /&gt;
:&amp;lt;code&amp;gt;$tpl-&amp;gt;display();&amp;lt;/code&amp;gt;&lt;br /&gt;
die das PHP-Script beendet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Smarty-Syntax&lt;br /&gt;
&lt;br /&gt;
Im Folgenden sind ein paar grundlegende Smarty-Elemente erklärt; ansonsten sei auf die [http://www.smarty.net/docsv2/de/ Smarty-Dokumentation] verwiesen und auf die vielen Bespiele in {{Codepath2|htdocs|templates2/ocstyle}}. (Achtung: Der OC-Code verwendet eine ältere Smarty-Version; nicht alles was in der Doku steht ist hier auch schon verfügbar!)&lt;br /&gt;
&lt;br /&gt;
Alle Smarty-Elemente stehen in geschweiften Klammern {}. Wenn das Template solche Klammern für andere Zwecke verwendet, z.B. für JavaScript-Kontrollstrukturen, müssen diese von der Smarty-Interpretation ausgeklammert werden:&lt;br /&gt;
&lt;br /&gt;
  {literal}&lt;br /&gt;
  function js_function()&lt;br /&gt;
  {&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
  {/literal}&lt;br /&gt;
&lt;br /&gt;
==== Variablen ====&lt;br /&gt;
&lt;br /&gt;
Variablen werden z.B. per&lt;br /&gt;
:&amp;lt;code&amp;gt;$tpl-&amp;gt;assign(&#039;cachename&#039;, $cache[&#039;name&#039;]);&amp;lt;/code&amp;gt;&lt;br /&gt;
an das Template übergeben und dort als&lt;br /&gt;
:&amp;lt;code&amp;gt;{$cachename}&amp;lt;/code&amp;gt;&lt;br /&gt;
verwendet. Es können auch Arrays übergeben werden, deren Elemente statt [] mit einem Punkt referenziert werden.&lt;br /&gt;
:&amp;lt;code&amp;gt;{$cache.name}&amp;lt;/code&amp;gt;&lt;br /&gt;
steht z.B. für &amp;lt;code&amp;gt;$caches[&#039;name&#039;]&amp;lt;/code&amp;gt;, übergeben per &amp;lt;code&amp;gt;$tpl-&amp;gt;assign(&#039;caches&#039;, ...)&amp;lt;/code&amp;gt;. Dies funktioniert auch mit numerischen Indizes – z.B. &amp;lt;code&amp;gt;{$user.0}&amp;lt;/code&amp;gt; für das erste Element eines $user-Arrays – und mit mehr als zwei Ebenen.&lt;br /&gt;
&lt;br /&gt;
Auch simple Berechnung sind möglich, z.B. &amp;lt;code&amp;gt;{$waylength*2}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich zu dem vom PHP-Code übergebenen Variablen kann man auch eigene definieren, z.B.&lt;br /&gt;
:&amp;lt;code&amp;gt;{assign var=counter value=1}&amp;lt;/code&amp;gt;&lt;br /&gt;
Mit &amp;lt;code&amp;gt;{capture}&amp;lt;/code&amp;gt; lassen sich u.U. auch komplexere Ausdrücke in einer Variable unterbringen.&lt;br /&gt;
&lt;br /&gt;
==== Kontrollstrukturen ====&lt;br /&gt;
&lt;br /&gt;
Bedingte Einbindung von Template-Komponenten ist mit &amp;lt;code&amp;gt;{if} … {elseif} … {else} … {/if}&amp;lt;/code&amp;gt;-Anweisungen möglich. Dabei können auch komplexere PHP-Ausdrucke verwendet werden, die als Boolean ausgewertet werden:&lt;br /&gt;
&lt;br /&gt;
  {if $show_statistics &amp;amp;&amp;amp; ($statdata|@count &amp;gt; 0)}&lt;br /&gt;
    ... Statistik ausgeben ...&lt;br /&gt;
  {/if}&lt;br /&gt;
&lt;br /&gt;
(@count ist eine [[#Benutzerdefinierte Erweiterungen; Übersetzungen|benutzerdefinierte Funktion]])&lt;br /&gt;
&lt;br /&gt;
Eine weiter häufig verwendete Struktur ist &amp;lt;code&amp;gt;{foreach}&amp;lt;/code&amp;gt; zum iterieren von Arrayelementen:&lt;br /&gt;
&lt;br /&gt;
  {foreach from=$caches item=cache}&lt;br /&gt;
    &amp;lt;td&amp;gt;{$cache.name|escape}&amp;lt;/td&amp;gt;&lt;br /&gt;
  {/foreach}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;|escape&amp;lt;/code&amp;gt; ist ein &#039;&#039;Modifizierer&#039;&#039;, der den Variableninhalt weiterverarbeitet. In diesem Fall werden HTML-Entitäten &amp;quot;escaped&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Mit &amp;lt;code&amp;gt;{strip}...{/strip}&amp;lt;/code&amp;gt; lassen sich alle Whitespaces (Leerzeichen, Tabs, Zeilenumbrüche) in einem Abschnitt herausfiltern, was die auszugebende Datenbank reduziert. Aber Vorsicht, falls Whitespaces als Trennzeichen in Ausgaben benötigt werden!&lt;br /&gt;
&lt;br /&gt;
==== Benutzerdefinierte Erweiterungen ====&lt;br /&gt;
&lt;br /&gt;
Smarty lässt sich um eigene&lt;br /&gt;
* Elemente (&amp;quot;Blocks&amp;quot;),&lt;br /&gt;
* Modifizierer und&lt;br /&gt;
* Funktionen&lt;br /&gt;
erweitern. Der Opencaching-Code enthält eine Reihe solcher eigener Erweiterungen in {{Codepath2|htdocs|lib2/smarty/ocplugins}}.&lt;br /&gt;
&lt;br /&gt;
Die wichtigste Erweiterung ist das &amp;lt;code&amp;gt;{t}&amp;lt;/code&amp;gt;-Element zum Übersetzen von Texten. Alle Texte in den Templates werden in Englisch geschrieben und in &amp;lt;code&amp;gt;{t} ... {/t}&amp;lt;/code&amp;gt; eingeschlossen; sie werden dadurch automatisch dem Übersetzungssystem zugeführt. Mehr dazu im Kapitel [[#Übersetzungen|Übersetzungen]].&lt;br /&gt;
&lt;br /&gt;
=== Systemtemplate und Menüsystem ===&lt;br /&gt;
&lt;br /&gt;
Was oben über einzelne Templates geschrieben wurde betrifft nur den Teil der Seite, der im &#039;&#039;Content-Container&#039;&#039; dargestellt wird – also dem Teil unterhalb und rechts des Menüsystems und oberhalb der Fußzeile. Alles &amp;quot;drumherum&amp;quot; wird vom &#039;&#039;Systemtemplate&#039;&#039; erzeugt.&lt;br /&gt;
&lt;br /&gt;
Folgende Codedateien sind daran in der lib1 beteiligt ...&lt;br /&gt;
* Systemtemplate: {{Codepath2|htdocs|lang/de/ocstyle/main.tpl.php}}&lt;br /&gt;
* Menüdefinitionen: {{Codepath2|htdocs|lang/de/ocstyle/lib/menu.php}}&lt;br /&gt;
* PHP-Framework: {{Codepath2|htdocs|lib/common.inc.php}} &amp;amp;rarr; tpl_BuildTemplate()&lt;br /&gt;
... und in der lib2:&lt;br /&gt;
* Systemtemplate: {{Codepath2|htdocs|templates2/ocstyle/sys_main.tpl}}&lt;br /&gt;
* Menüsystem: Tabelle &#039;sys_menu&#039; per {{Codepath2|htdocs|doc/sql/static-data/data.sql}}, {{Codepath2|htdocs|lib2/menu.class.php}}&lt;br /&gt;
* PHP-Framework: {{Codepath2|htdocs|lib2/OcSmarty.class.php}}&lt;br /&gt;
&lt;br /&gt;
Zusätzliche Hauptmenü-Punkte sind via [[#Konfigurationsdateien|Konfigurationsdateien]] erzeugbar.&lt;br /&gt;
&lt;br /&gt;
=== Email-Templates ===&lt;br /&gt;
&lt;br /&gt;
Auch der Inhalt (&#039;&#039;body&#039;&#039;) von Emails wird über Templates erzeugt.&lt;br /&gt;
&lt;br /&gt;
lib1-Email-Templates befinden sich in {{Codepath|htdocs/lang/de/ocstyle/email}}, {{Codepath|htdocs/util/notification}} und {{Codepath|htdocs/util/watchlist}} und werden von den entsprechenden PHP-Modulen direkt per &amp;lt;code&amp;gt;mb_ereg_replace()&amp;lt;/code&amp;gt; aufgelöst.&lt;br /&gt;
&lt;br /&gt;
lib2-Email-Templates liegen in {{Codepath|htdocs/templates2/mail}} und werden von &amp;lt;code&amp;gt;mail.class.php&amp;lt;/code&amp;gt; per Smarty verarbeitet.&lt;br /&gt;
&lt;br /&gt;
=== OKAPI ===&lt;br /&gt;
Die OKAPI hat ein eigenes Templatesystem; mehr dazu im Abschnitt [[#OKAPI|OKAPI]].&lt;br /&gt;
&lt;br /&gt;
== CSS Style Sheets ==&lt;br /&gt;
Die Style Sheets befinden sich in {{Codepath|htdocs/resource2/ocstyle/css}}.&lt;br /&gt;
&lt;br /&gt;
== Grafiken ==&lt;br /&gt;
&lt;br /&gt;
Grafiken für Icons und andere Dinge verteilen sich – soweit es keine Drittbibliotheken betrifft – über drei Verzeichnisse:&lt;br /&gt;
&lt;br /&gt;
* {{Codepath|htdocs/images}} (lib1 und lib2)&lt;br /&gt;
* {{Codepath|htdocs/lang/de/ocstyle/images}} (lib1)&lt;br /&gt;
* {{Codepath|htdocs/resource2/ocstyle/images}} (lib2)&lt;br /&gt;
&lt;br /&gt;
Hier herrscht etwas Chaos. Manches ist mehrfach vorhanden - auch innerhalb &#039;&#039;einer&#039;&#039; Library - oder inkonsistent abgelegt, die Dateitypen wechseln zwischen GIF und PNG. Glattziehen lässt sich das kaum, weil Grafiken auch gerne von anderer Stelle aus verlinkt werden, z.B. aus Cachelistings - teils sogar von anderen Plattformen aus. Schiebt man die Grafiken einfach weg oder ändert das Format, zerstört es unbemerkt Cachebeschreibungen.&lt;br /&gt;
&lt;br /&gt;
Zur Kompatibilität mit alten Cachebeschreibungen und Logs liegen in folgenden Verzeichnissen Grafiken, die anderweitig nicht mehr verwendet werden:&lt;br /&gt;
&lt;br /&gt;
* {{Codepath|htdocs/lang/de/stdstyle/images}}&lt;br /&gt;
* {{Codepath|htdocs/lib/tinymce/plugins/emotions/images}}&lt;br /&gt;
* {{Codepath|htdocs/resource2/stdstyle/images}}&lt;br /&gt;
&lt;br /&gt;
== Übersetzung ==&lt;br /&gt;
&lt;br /&gt;
Der OC-Code ist mehrsprachig und frei übersetzbar, mit Ausnahme&lt;br /&gt;
* der Benachrichtigungs-Emails, die es bislang nur in Deutsch gibt (-&amp;gt; http://redmine.opencaching.de/issues/141)&lt;br /&gt;
* des Garmin-Download-Dialogs ({{Codepath2|htdocs|garmin.php}}), dessen untere Hälfte es nur in Deutsch und Englisch gibt (siehe {{Codepath|htdocs/resource2/ocstyle/js/GarminDisplay.js}})&lt;br /&gt;
(weitere noch nicht lokalisierbare Module bitte ergänzen!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Lokalisierung je nach gewählte Sprache erfolgt grundsätzlich mit folgenden Mechanismen:&lt;br /&gt;
* In Templates über die Smarty-Tags &amp;lt;code&amp;gt;{t}English Text{/t}&amp;lt;/code&amp;gt;. Hierbei können auch Variablen eingesetzt werden, z.B.&lt;br /&gt;
*:&amp;lt;code&amp;gt;{t 1=$cachename 2=$username}The geocache %1 has been found by %2{/t}&amp;lt;/code&amp;gt;&lt;br /&gt;
* Notfalls direkt im PHP-Code durch Aufruf von &amp;lt;code&amp;gt;$translate-&amp;gt;t()&amp;lt;/code&amp;gt;, z.B.&lt;br /&gt;
*:&amp;lt;code&amp;gt;$text = $translate-&amp;gt;t(&#039;New password code&#039;, &amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;, basename(__FILE__), __LINE__)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Artikelseiten, die via {{Codepath|htdocs/articles.php}} dargestellt werden, per Ablage der Templates in Unterverzeichnissen von {{Codepath|htdocs/templates2/ocstyle/articles}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Das Übersetzungssystem arbeitet intern mit &amp;lt;code&amp;gt;gettext()&amp;lt;/code&amp;gt;. Die Strings dafür befinden sich in der Tabellen &#039;&#039;sys_trans&#039;&#039; und &#039;&#039;sys_trans_text&#039;&#039;. Man kann sie direkt via {{Codepath2|htdocs/doc/sql/static-data|data.sql}} einpflegen, oder mit dem &amp;quot;Schnellübersetzungsmodus&amp;quot; + &amp;quot;SQL-Export&amp;quot; von {{Codepath2|htdocs|translate.php}} (Menü Admin|Übersetzung). Letzteres kann allerdings jede Menge Git-Merge-Konflikte beim Zusammenführen verschiedener Branches erzeugen, daher werden OC.de-Übersetzungen derzeit nur direkt in {{Codepath2|htdocs/doc/sql/static-data|data.sql}} eingepflegt.&lt;br /&gt;
&lt;br /&gt;
Achtung: &#039;&#039;&#039;Auch für die englische Seitendarstellung läuft nochmal alles durch den Übersetzer&#039;&#039;&#039;, Artikel ausgenommen. Die englischen Originaltexte in den Templates oder im PHP-Code sind also nur eine Basis für die weitere Übersetzung. Kleinere Fehler dort müssen nicht korrigiert werden, solange die Texte verständlich sind. &#039;&#039;Wenn&#039;&#039; dort etwas korrigiert wird, muss es gleichzeitig auch in der Tabelle &#039;&#039;sys_trans&#039;&#039; in {{Codepath2|htdocs/doc/sql/static-data|data.sql}} geändert werden!&lt;br /&gt;
&lt;br /&gt;
Opencaching.de gibt es zurzeit in Deutsch, Englisch, Italienisch und Spanisch. Die Übersetzungen werden durch den von Opencaching Deutschland eingesetzten Code Maintainer organisiert.&lt;br /&gt;
&lt;br /&gt;
== Fehlerbehandlung ==&lt;br /&gt;
&lt;br /&gt;
Der OC-Code verwendet kein Exception Handling (mit Ausnahme der OKAPI). Wenn etwas fehlschlägt, wird dies durch den Rückgabewert der betreffenden Funktion signalisiert und entsprechend reagiert. Würde man den betroffenen Funktionen noch einen Namenszusatz spendieren, der die mögliche Fehlerrückgabe kennzeichnet, wäre dieses System transparenter und in sich weniger fehleranfällig als ein strukturiertes Exception Handling.&lt;br /&gt;
&lt;br /&gt;
==== fehlerhafte Benutzereingaben ====&lt;br /&gt;
Wenn es Probleme mit einer Benutzereingabe gibt, wird das betreffende Template nochmals angezeigt und an passender Stelle eine mit dem CSS-Stil &amp;lt;code&amp;gt;errormsg&amp;lt;/code&amp;gt; formatierte Meldung eingeblendet. Dies ist jeweils entsprechend zu implementieren.&lt;br /&gt;
&lt;br /&gt;
==== erkanntes Problem ====&lt;br /&gt;
Wenn anderweitig ein nicht handhhabbares Problem erkannt wird, wird das Fehlertemplate angezeigt. In &#039;&#039;&#039;lib1&#039;&#039;&#039; befindet sich dies in {{Codepath2|htdocs|lang/de/ocstyle/error.tpl.php}} und wird aufgerufen per&lt;br /&gt;
:&amp;lt;code&amp;gt;tpl_errorMsg(&#039;original_templatename&#039;, $fehlermeldung);&amp;lt;/code&amp;gt;&lt;br /&gt;
z.B.&lt;br /&gt;
 $error_desc_not_found = t(&#039;(internal error) The description is not available.&#039;);&lt;br /&gt;
 ...&lt;br /&gt;
 tpl_errorMsg(&#039;editdesc&#039;, $error_desc_not_found);&lt;br /&gt;
&lt;br /&gt;
Das &#039;&#039;&#039;lib2&#039;&#039;&#039;-Fehlertemplate befindet sich in bzw. {{Codepath2|htdocs|templates2/ocstyle/error.tpl}} und wird verwendet mit&lt;br /&gt;
:&amp;lt;code&amp;gt;$tpl-&amp;gt;error(Fehlernummer)&amp;lt;/code&amp;gt;&lt;br /&gt;
oder&lt;br /&gt;
:&amp;lt;code&amp;gt;$tpl-&amp;gt;error($fehlermeldung);&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Fehlernummern sind in {{Codepath2|htdocs|lib2/error.inc.php}} definiert.&lt;br /&gt;
&lt;br /&gt;
; SQL-Fehler&lt;br /&gt;
&lt;br /&gt;
Bei MySQL-Fehlern wird ein Fehlertemplate anzeigt und eine Admin-Email versandt, sofern in den [[#Konfigurationsdateien|Settings]] eine Mailadresse hinterlegt ist. In der lib1 ist sie in&lt;br /&gt;
:&amp;lt;code&amp;gt;$sql_errormail&amp;lt;/code&amp;gt;&lt;br /&gt;
einzutragen, in der lib2 in&lt;br /&gt;
:&amp;lt;code&amp;gt;$opt[&#039;db&#039;][&#039;error&#039;][&#039;mail&#039;]&amp;lt;/code&amp;gt;.&lt;br /&gt;
Entwicklersysteme werden so konfiguriert, dass das komplette SQL-Statement auch direkt angezeigt wird.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich kann man per &amp;lt;code&amp;gt;$sql_warntime&amp;lt;/code&amp;gt; (lib1) bzw. &amp;lt;code&amp;gt;$opt[&#039;db&#039;][&#039;warn&#039;][&#039;time&#039;]&amp;lt;/code&amp;gt; (lib2) eine Warnschwelle für zu lange SQL-Ausführungszeiten festlegen. Bei Überschreitung werden dann Admin-Mails erzeugt.&lt;br /&gt;
&lt;br /&gt;
==== unerkanntes Problem ====&lt;br /&gt;
&lt;br /&gt;
{{Codepath2|htdocs|lib2/errorhandler.inc.php}} enthält ein noch in der Testphase befindlichen Handler für PHP-Fehler, der auch in lib1 eingebunden ist. Er wird bei PHP-Fehlern aktiv, die (abhängig von der &#039;&#039;error_reporting&#039;&#039;-Einstellung in der PHP-Konfiguration) zu einem Abbruch des Scripts führen. Es wird dann eine Fehlermeldung anzeigt und ggf. eine Admin-Mail erzeugt. Es wird die gleiche Emailkonfiguration wie für bei SQL-Problemen (s.o.) verwendet.&lt;br /&gt;
&lt;br /&gt;
Dieser PHP-Errorhandler ist derzeit nur aktiviert, wenn in der Konfiguration der Debug-Modus eingeschaltet ist. Ansonsten erscheint bei Fehlern eine leere Seite.&lt;br /&gt;
&lt;br /&gt;
== OKAPI ==&lt;br /&gt;
&lt;br /&gt;
Die Opencaching-API ist ein eigenständiges PHP-Projekt, dessen Code auf verschiedenen OC-Seiten zum Einsatz kommt. Die Projekt-Homepage ist http://code.google.com/p/opencaching-api/. Beiträge, die nicht vom Code-Maintainer selbst kommen, werden üblicherweise in Branches hochgeladen und laufen dann durch ein Code Review.&lt;br /&gt;
&lt;br /&gt;
Die OKAPI wird – erfolgreich! – mit einem wesentlich höheren Anspruch an Codequalität und -Stil entwickelt als die OC-Länderseiten. Dokumentation und Codestruktur sind herausragend. Gleichzeitig steht sie bei einigen Details wie Template-Engine, Datenbank-Library und Konstanten-Definitionen hinter dem OC.de-Code zurück. Der OKAPI-Code ist nur für Webanwendungen geschrieben; Einbindung in Kommandozeilentools kann insbesondere am Exception-Handling scheitern.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der OKAPI-Code wird aus dem OKAPI-Projekt in die lokalen OC-Code-Repositories (nach {{Codepath|htdocs/okapi}}) repliziert. Bei Opencaching.pl und .nl geschieht dies automatisch über einen SVN-&amp;quot;Commit-Hook&amp;quot;, bei Opencaching.de manuell durch den Code-Maintainer nach einem Security Review.&lt;br /&gt;
&lt;br /&gt;
OKAPI-Code kann über die &amp;quot;Facade&amp;quot;-Schnittstelle in OC-Code eingebunden werden ({{Codepath2|htdocs|okapi/facade.php}}). OC.pl macht davon insbesondere bei der Karte Gebrauch, die von der OKAPI generiert wird. OC.de verwendet die Facade bislang nur (experimentell) im Update-Script {{Codepath|bin/okapi-update.php}}, das von {{Codepath2|bin|dbupdate.php}} aufgerufen wird.&lt;br /&gt;
&lt;br /&gt;
Sämtliche OKAPI-Seitenzugriffe laufen über eine Rewrite-Engine ({{Codepath2|htdocs|okapi/.htaccess}} → {{Codepath2|htdocs|okapi/controller.php}}). Man kann daher die PHP-Scripte nicht direkt über ihre URLs idenitifizieren sondern muss schonmal etwas suchen. Methoden befinden sich in {{Codepath2|htdocs|okapi/services}}, Seiten mit HTML-Output in {{Codepath2|htdocs|okapi/views}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Für die Dokumentation verwendet die OKAPI ein eigenes XML-Format, das von einem Parser aufbereitet wird.&lt;br /&gt;
&lt;br /&gt;
Templates für Methoden, die HTML- oder sonstiges XML-Output liefern, sind in .tpl.php-Dateien zusammen mit den PHP-Quelltexten abgelegt. Variablen werden per PHP-Code eingebunden, meist per &amp;quot;short open tags&amp;quot;, z.B.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;? if (($vars[&#039;my_notes&#039;] == &#039;desc:text&#039;) &amp;amp;&amp;amp; ($c[&#039;my_notes&#039;] != null)) { /* Does user want us to include personal notes? */ ?&amp;gt;&lt;br /&gt;
   &amp;amp;lt;p&amp;amp;gt;&amp;amp;lt;b&amp;amp;gt;&amp;lt;?= _(&amp;quot;Personal notes&amp;quot;) ?&amp;gt;:&amp;amp;lt;/b&amp;amp;gt; &amp;lt;?= Okapi::xmlescape($c[&#039;my_notes&#039;]) ?&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &amp;lt;? } ?&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Entwicklung|Codedoku]]&lt;/div&gt;</summary>
		<author><name>Schwalbe</name></author>
	</entry>
	<entry>
		<id>https://wiki.opencaching.de/index.php?title=Multicache&amp;diff=5604</id>
		<title>Multicache</title>
		<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php?title=Multicache&amp;diff=5604"/>
		<updated>2014-02-02T18:14:43Z</updated>

		<summary type="html">&lt;p&gt;Schwalbe: kk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein &#039;&#039;&#039;Multicache&#039;&#039;&#039; oder kurz &#039;&#039;&#039;Multi&#039;&#039;&#039; ist ein [[Geocache]] mit mehreren &#039;&#039;&#039;Stationen&#039;&#039;&#039; (engl. &#039;&#039;stages&#039;&#039;). Die Koordinaten des [[Listing|Cachelistings]] zeigen meist auf einen Startpunkt oder Parkplatz;&amp;lt;ref&amp;gt;Bei Opencaching.de müssen die Listingkoordinaten – im Gegensatz zu einigen anderen [[Geocaching-Plattformen]] – nicht unbedingt auf die erste Station zeigen, sondern es darf z.B. auch ein Parkplatz oder der Anfang eines Weges sein.&amp;lt;/ref&amp;gt; alle weiteren Stationen sind in der Beschreibung aufgeführt. Letzte Station ist das &#039;&#039;&#039;Finale&#039;&#039;&#039; (engl. &#039;&#039;final&#039;&#039;), an dem der Cachebehälter versteckt ist.&lt;br /&gt;
&lt;br /&gt;
Während ein einfacher „[[Cachearten|Tradi]]“ nur zu einer bestimmten Stelle führt, lernt man durch einen Multicache ein weiträumigeres Gebiet kennen. Zum Beispiel einen schönen Wanderweg, oder verschiedene historische Bauwerke in einem Ort, oder interessante Punkte eines [[Lost Place]]s.&lt;br /&gt;
&lt;br /&gt;
== Aufbau von Multicaches ==&lt;br /&gt;
Beim Legen eines eigenen Multicaches sind deiner Fantasie keine Grenzen gesetzt. Du kannst z.B. an jeder Station die Koordinaten der nächsten verstecken, oder jeweils ein Rätsel hinterlegen dessen Lösung zur nächsten Station führt. Oder du führst die Rätsel bereits in der Cachebeschreibung auf. &lt;br /&gt;
&lt;br /&gt;
Du kannst auch die Koordinaten aller Stationen in der Cachebeschreibung auflisten und als zusätzliche [[Wegpunkte]] angeben, sodass man diese direkt auf sein [[GPS-Gerät]] übertragen kann. Die Koordinaten des Finales ergeben sich dann z.B. aus Zahlen, die an den Einzelstationen zu errätseln sind.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sind zwei Arten von Multicache-Stationen zu unterscheiden:&lt;br /&gt;
&lt;br /&gt;
[[Datei:DSCN3330.JPG|thumb|200px|Beispiel einer physischen Station.]]&lt;br /&gt;
=== Physische Stationen ===&lt;br /&gt;
&lt;br /&gt;
Unter einer physischen [[Fachjargon#Station / Stage|Station]] versteht man Dinge, die eigens an der Stelle für den Geocache versteckt worden sind. Diese Dinge können ganz unterschiedlicher Natur sein. Hier gibt es unzählige Möglichkeiten, die von einem beschrifteten Stein, über [[PETling]]e mit Koodinaten über [[Filmdose]]n mit kleinen Rätseln bis hin zu großen, technisch aufwändig gearbeiteten Dosen gehen. Alle diese Stationen haben jedoch eins gemeinsam: Man findet sie, weil sie jemand gezielt dort versteckt hat und meist führen sie direkt zur nächsten Station. Physische Stationen sind für den Sucher sicher die schönste Variante von Wegpunkten, haben jedoch den Nachteil, dass wie der Cache (das Finale) selbst auch jede Station dem gemeinen [[Fachjargon#Mugge|Muggel]] oder anderen äußeren Einflüssen zum Opfer fallen können. Daher bedeutet ein Multi mit physischen Stationen auf jeden Fall mehr [[Cachepflege|Wartungsaufwand]] als:&lt;br /&gt;
&lt;br /&gt;
[[Datei:2012-05-22 12-24-42 861.jpg|thumb|200px|Beispiel für eine Ablese-Station]]&lt;br /&gt;
=== Ablese-Stationen ===&lt;br /&gt;
&lt;br /&gt;
Diese Art von Stationen kommen häufig bei Multis in urbanen Gegenden vor. Hierfür bedient sich der Owner bereits vorhandener Gegenstände wie z.B. Verkehrsschilder, Brunnen, Statuen, Gedenktafeln, usw. Zu den gewählten Gegenständen werden im Listing Fragen gestellt, z.B. &amp;quot;Was ist laut dem Schild vor dem du stehst verboten? Anzahl der Buchstaben = X&amp;quot;, oder &amp;quot;Wie viele Namen stehen auf der Gedenktafel? Anzahl = Y&amp;quot; Auch hier sind der Phantasie keine Grenzen gesetzt. Sehr gut geeignet sind Ablese-Stationen z.B. für Stadtführungscaches, bei denen dann zu jeder Station auch weiterführende Informationen im Listing stehen. &lt;br /&gt;
Ablese-Stationen haben den Vorteil, dass sie nahezu unkaputtbar sind und nicht gemuggelt werden können. Für den Sucher ist es allerdings oft ein wenig langweilig nur Ablese-Stationen zu finden und lediglich ein physisches Finale zu haben. Im urbanen Bereich ist es jedoch oft nicht anders möglich, einen Multi vor [[Fachjargon#Mugge|Muggeln]] zu schützen.&lt;br /&gt;
&lt;br /&gt;
== Wartung des Cachelistings ==&lt;br /&gt;
Wenn du einen Multicache auf mehreren Geocaching-Seiten veröffenlichst ([[Mehrfachlisting]]) denke bitte daran, Änderungen an der Beschreibung einzelner Stationen auf &#039;&#039;allen&#039;&#039; Seiten durchzuführen!&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Geocaches]]&lt;br /&gt;
&lt;br /&gt;
[[pl:Multicache]]&lt;/div&gt;</summary>
		<author><name>Schwalbe</name></author>
	</entry>
	<entry>
		<id>https://wiki.opencaching.de/index.php?title=Wie_erhalte_ich_eine_GPX-Datei%3F&amp;diff=5603</id>
		<title>Wie erhalte ich eine GPX-Datei?</title>
		<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php?title=Wie_erhalte_ich_eine_GPX-Datei%3F&amp;diff=5603"/>
		<updated>2014-02-02T18:07:40Z</updated>

		<summary type="html">&lt;p&gt;Schwalbe: /* Variante 1: Das Suchformular */ typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Auf Opencaching.de können [[GPX-Datei]]en eines einzelnen Caches oder einer ganzen Auswahl von Caches erzeugt werden, um sie anschließend auf ein [[GPS-Gerät]] oder [[Smartphone-Apps für Opencaching.de|Smartphone]] zu übertragen. Eine Datei kann die Daten von maximal 500 Caches enthalten.&lt;br /&gt;
&lt;br /&gt;
== GPX-Datei eines Caches ==&lt;br /&gt;
Wenn du eine Cachebeschreibung abrufst, erscheint dort das Feld „Download als ...“:&lt;br /&gt;
[[Datei:Cachelisting Header.png|zentriert]] &lt;br /&gt;
&lt;br /&gt;
Hier kannst du das Dateiformat [[Abkürzungen#GPX|GPX]] auswählen. Nach der Anwahl wird die GPX-Datei für diesen einen Cache erzeugt und heruntergeladen. Die GPX-Datei befindet sich nun auf dem Computer und kann mit einem Programm wie [[OpenCacheManager]] oder [[QLandkarte GT]] auf das GPS-Gerät bzw. Smartphone geladen werden. &lt;br /&gt;
&lt;br /&gt;
Bei Garmin-Geräten geht es noch einfacher: Mit einem Klick auf „An GPS-Gerät senden“ wird die Cachebeschreibung direkt aufs [[Abkürzungen#GPSr|GPSr]] übertragen, ohne den Umweg über einen Dateidownload.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPX-Datei einer ganzen Auswahl von Caches ==&lt;br /&gt;
Um GPX-Dateien für eine Auswahl von Caches zu erstellen gibt es zwei Varianten:&lt;br /&gt;
&lt;br /&gt;
=== Variante 1: Das [[Suchformular]] ===&lt;br /&gt;
;Von der [http://www.opencaching.de/index.php?id=63 Opencaching-Startseite] aus den Button &#039;&#039;Caches&#039;&#039; klicken.&lt;br /&gt;
&lt;br /&gt;
Im Suchformular wählst du aus, welche Geocaches dich interessieren und in welcher Reihenfolge sie aufgelistet werden sollten – z.&amp;amp;nbsp;B. die nahegelegensten oder neuesten zuerst. Nach dem Absenden mit einem der „Suchen“-Knöpfe erscheint die gewünschte Liste:&lt;br /&gt;
&lt;br /&gt;
[[Datei:Suchergebnisse.png|600px|thumb|zentriert|Suchergebnisse]] &lt;br /&gt;
&lt;br /&gt;
Um diese Caches als GPX-Datei herunterzuladen, ist eines der beiden Auswahlfelder „Ergebnisse auf dieser Seite“ und „Ergebnis 1 bis 500 (als zip)“ und dann das Format GPX zu wählen. Ersteres liefert nur die Caches die gerade aufgelistet sind, Letzteres dagegen bis zu 500 Suchergebnisse.&lt;br /&gt;
&lt;br /&gt;
==== Umgehen der Größenbegrenzung ====&lt;br /&gt;
Manchmal kann es sein, dass man Suchanfragen als GPX laden möchte, die mehr als 500 Caches beinhalten. Dies ist leider nicht ohne Weiteres möglich. Diese Begrenzung kann man allerdings umgehen:&lt;br /&gt;
:Man lädt nach der Suche die ersten 500 Ergebnisse und geht danach auf die zweite Ergebnisseite. Die Url ändert sich und endet mit &#039;startat=20&#039;. Aus der 20 macht man nun eine 501, drückt auf Enter und gelangt so auf Seite 26 der Suchergebnisse und kann die Caches 501 bis 1000 als GPX herunterladen. Dies lässt sich mit 1001, 1501, usw. wiederholen.&lt;br /&gt;
&lt;br /&gt;
Die [[Abkürzungen#GPX|GPX]]-Datei(en) befindet sich nun auf dem Rechner und kann auf das GPS-Gerät, bzw. Smartphone geladen werden.&lt;br /&gt;
&lt;br /&gt;
=== Variante 2: Die [[Cachekarte|Cachekarte]] ===&lt;br /&gt;
;Von der [http://www.opencaching.de/index.php?id=63 Opencaching Startseite] aus den Button &#039;&#039;Karte&#039;&#039; klicken.&lt;br /&gt;
&lt;br /&gt;
Wähle zuerst den gewünschten Kartenausschnitt, durch ziehen und Zoomen oder durch Eingabe des gesuchten Ortes. Die Auswahl von angezeigten Caches kann nun – wie in [[Cachekarte]] beschrieben – weiter eingeschränkt (&#039;&#039;gefiltert&#039;&#039;) werden, zum Beispiel auf bestimmte Cachetypen, Attribute etc.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Cachekarte_Maske.png|600px|thumb|zentriert|Cachekarte]] &lt;br /&gt;
&lt;br /&gt;
Wenn maximal 500 Caches sichtbar sind, ist der GPX-Button über der Karte aktiv. Mit einem Klick auf den Button wird nun die GPX-Datei erzeugt und heruntergeladen. &lt;br /&gt;
&lt;br /&gt;
Während auf der Karte maximal 180 Caches darstellbar sind, kann die GPX-Datei bis zu 500 Caches enthalten. Das bedeutet, dass man den Kartenausschnitt nach Auswahl der Filterkriterien auch über die darstellbaren Caches hinaus erweitern kann. Solange der GPX-Button aktiv bleibt, kann auch eine GPX-Datei heruntergeladen werden.&lt;br /&gt;
&lt;br /&gt;
Die GPX-Datei befindet sich nun auf dem Rechner und kann auf das GPS-Gerät, bzw. Smartphone geladen werden.&lt;br /&gt;
&lt;br /&gt;
== Opencaching-API ==&lt;br /&gt;
Über die [[OKAPI]] können ebenfalls GPX-Dateien abgerufen werden, mit der [http://www.opencaching.de/okapi/services/caches/formatters/gpx.html services/caches/formatters/gpx]-Methode. Auch hier gilt die Begrenzung von 500 Caches pro Download.&lt;br /&gt;
&lt;br /&gt;
[[Attribute]] können von der OKAPI bislang nur als Liste in der Cachebeschreibung ausgegeben werden; GC-kompatible Attribute sind in Arbeit.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Opencaching]]&lt;/div&gt;</summary>
		<author><name>Schwalbe</name></author>
	</entry>
	<entry>
		<id>https://wiki.opencaching.de/index.php?title=Mehrfachlisting&amp;diff=5602</id>
		<title>Mehrfachlisting</title>
		<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php?title=Mehrfachlisting&amp;diff=5602"/>
		<updated>2014-02-02T18:04:07Z</updated>

		<summary type="html">&lt;p&gt;Schwalbe: kk&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Wegpunkt extern.png|thumb|hochkant=1.4|gelistet auf OC.de und GC.com]]&lt;br /&gt;
Ein &#039;&#039;&#039;Mehrfachlisting&#039;&#039;&#039; ist das Gegenteil eines [[OConly]]-Caches: Er ist nicht nur bei Opencaching.de, sondern auch auf anderen [[Geocaching-Plattformen]] veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
Durch Mehrfachlistings kann der Cache mehr [[Log]]s erhalten, allerdings muss man als Besitzer immer dafür sorgen, dass der Inhalt aller Listings gleich bleibt. Zudem besteht gegenüber einem OConly der Nachteil, dass der Cache je nach [[Location]] und Schwierigkeitsgrad von Cachern geradezu überrannt wird. Entprechend höher ist der [[Cachepflege|Wartungsaufwand]] durch Beschädigungen, [[Fachjargon#Umverstecken|Umverstecken]], volle Logbücher etc.&lt;br /&gt;
&lt;br /&gt;
Bei Zweitlistings auf Geocaching.com oder Navicache.com sollten die entsprechenden [[Wegpunkte]] im Opencaching-Listing vermerkt sein. &lt;br /&gt;
&lt;br /&gt;
Da die Wegpunkte im Listing manchmal vergessen werden, pflegt das Opencaching-Team intern eine Liste mit zusätzlichen GC-Wegpunkten. Diese werden bislang nicht direkt angezeigt, aber bei der Ausblendoption für &amp;quot;auf GC.com veröffentlichte&amp;quot; Caches in der [[Cachekarte|Karte]] und bei der [[Suchformular|Cachesuche]] berücksichtigt.&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Opencaching]]&lt;br /&gt;
[[Kategorie:Listings und Logs]]&lt;/div&gt;</summary>
		<author><name>Schwalbe</name></author>
	</entry>
	<entry>
		<id>https://wiki.opencaching.de/index.php?title=Benutzerprofil&amp;diff=5601</id>
		<title>Benutzerprofil</title>
		<link rel="alternate" type="text/html" href="https://wiki.opencaching.de/index.php?title=Benutzerprofil&amp;diff=5601"/>
		<updated>2014-02-02T18:00:07Z</updated>

		<summary type="html">&lt;p&gt;Schwalbe: /* Persönliche Daten löschen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:Profil.png|thumb|rechts|330px|Beispiel für ein Benutzerprofil]]&lt;br /&gt;
Das &#039;&#039;&#039;Benutzerprofil&#039;&#039;&#039; ist dein persönliches „Opencaching-Kontrollzentrum“. Hier kannst du sehen, welche Geocaches du [[Das Onlinelog|geloggt]], [[Wie verstecke ich einen Cache?|versteckt]] und [[Empfehlungen|empfohlen]] hast, und hier kannst du alle deine Benutzereinstellungen ändern. &lt;br /&gt;
&lt;br /&gt;
Um ein Profil zu erhalten, musst du dich zunächst bei Opencaching.de [[Registrierung|registrieren]]. Sobald du dich [[Login auf Opencaching.de|eingeloggt]] hast, kannst du dein Profil mit dem Knopf MEIN PROFIL in der Menüleiste aufrufen.&lt;br /&gt;
&lt;br /&gt;
Andere Benutzer können sich dein &#039;&#039;öffentliches Profil&#039;&#039; anschauen, indem sie in einem deiner Logs oder [[Listing|Cachelistings]] auf deinen Benutzername klicken, genauso wie du dir die Profile anderer Benutzer ansehen kannst. Sie sehen dort das Datum deiner Registrierung, eine grobe Angabe über den Zeitraum seit deinem letzten Login und eine Statistik deiner versteckten und gefundenen Caches. Weitere Informationen kannst du auf Wunsch eingeben bzw. einblenden – siehe „Details“ im nachfolgender Abschnitt.&lt;br /&gt;
&lt;br /&gt;
Du kannst dir dein öffentliches Profil auch selbst anschauen, indem du links im Menü auf „Öffentliches Profil“ klickst.&lt;br /&gt;
&lt;br /&gt;
== Statistik ==&lt;br /&gt;
Die Zahl der gefundenen Caches im ersten Abschnitt bezieht sich auf alle geloggten Funde und [[Event|Eventteilnahmen]] – einschließlich Caches, die zwischenzeitlich [[Cachestatus#Gesperrt + Versteckt|gesperrt/versteckt]] wurden. Wenn ein Cache mehrfach geloggt wurde – z.B. ein wiederkehrendes Event oder ein beweglicher Cache – zählt er mehrfach.&lt;br /&gt;
&lt;br /&gt;
Wenn du auf „alle Funde anzeigen“ klickst, wird jeder Cache nur einmal aufgelistet, und versteckte Caches sind ausgeblendet. Daher kann die Zahl in dieser Liste geringer sein als die Gesamtzahl der Funde auf deiner Profilseite.&lt;br /&gt;
&lt;br /&gt;
Bei der Versteckstatistik im dritten Abschnitt zählen die gesperrt/versteckten Caches ebenfalls mit. In deinem öffentlichen Profil und deinem [[Statistikbild]] werden sie dagegen nicht mitgezählt, da andere Benutzer sie nicht sehen können.&lt;br /&gt;
&lt;br /&gt;
== Einstellungen ==&lt;br /&gt;
Folgende Einstellungen kannst du in deinem Profil vornehmen bzw. ändern; außer Benutzername und Email-Adresse sind diese alle freiwillig:&lt;br /&gt;
&lt;br /&gt;
* „Profildaten“: &lt;br /&gt;
** &#039;&#039;&#039;[[Registrierung#Benutzername|Benutzername]]&#039;&#039;&#039;&lt;br /&gt;
** &#039;&#039;&#039;[[Registrierung#Nachname / Vorname|Vor- und Nachname]]&#039;&#039;&#039;&lt;br /&gt;
** das &#039;&#039;&#039;[[Registrierung#Land|Land]]&#039;&#039;&#039; in dem du gerade „geocachst“&lt;br /&gt;
** die &#039;&#039;&#039;[[Koordinaten]]&#039;&#039;&#039; deines Standortes &lt;br /&gt;
** [[Benachrichtigungen#Benachrichtigung über neue Caches|&#039;&#039;&#039;Benachrichtiungsradius&#039;&#039;&#039; für neue Caches]]&lt;br /&gt;
** &#039;&#039;&#039;Emailadresse&#039;&#039;&#039;: Zum Ändern der Adresse erhältst du an die neue Adresse eine Mail mit einem Sicherheitscode, mit dem du sie aktivieren kannst. Die Adresse wird verwendet, um dir [[Benachrichtigungen]] und [[#Emailversand|Emails]] anderer Benutzer (inklusive von Opencaching-[[Support]]mitarbeitern) zuzustellen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;widelist&amp;quot;&amp;gt;&lt;br /&gt;
* „Details“: &lt;br /&gt;
** &#039;&#039;&#039;Zoomstufe&#039;&#039;&#039; für die Mini-Karte, die in den [[Listing|Cachelistings]] angezeigt wird (&#039;&#039;von–bis?&#039;&#039;)&lt;br /&gt;
** &#039;&#039;&#039;Statistikdetails&#039;&#039;&#039;: Dies bewirkt, dass andere Benutzer in deinem Profil zusätzlich eine Fund- und Versteckstatistik nach Cachetypen sehen sowie die Summe deiner Hinweis- und DNF-Logs. Bitte beachte, dass sich solche Statistiken unabhängig von dieser Einstellung auch über die [[Suchformular|Suchfunktion]] oder aus [[XML-Schnittstelle|heruntergeladenen]] Daten erstellen lassen; sie sind also nicht völlig verhinderbar.&lt;br /&gt;
** &#039;&#039;&#039;Bildstatistik&#039;&#039;&#039; und Galerie: Zeigt in deinem Profil die Anzahl deiner hochgeladenen Logbilder an, mit der Möglichkeit, sich eine Galerie aller deiner Logbilder anzusehen.&lt;br /&gt;
** &#039;&#039;&#039;[[OConly#OConly-81|OConly-81]]&#039;&#039;&#039;-Statistik&lt;br /&gt;
** &#039;&#039;&#039;Wohnort und Alter&#039;&#039;&#039;: Wird für andere Benutzer angezeigt, falls angegeben&lt;br /&gt;
** &#039;&#039;&#039;Beschreibungstext&#039;&#039;&#039;: ein belieber Text, der anderen Benutzern angezeigt wird.&lt;br /&gt;
* gewünschtes &#039;&#039;&#039;[[Statistikbild]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Passwort&#039;&#039;&#039;: Änderung erfolgt wie bei der E-Mail-Adresse durch Zusendung eines Sicherheitscodes&lt;br /&gt;
* Einstellungen für [[Benachrichtigungen#Beobachten von Caches |&#039;&#039;&#039;beobachtete Caches&#039;&#039;&#039;]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weitere Funktionen ==&lt;br /&gt;
In deinem Profil findest du auch:&lt;br /&gt;
* eine Übersicht aller gespeicherten Suchen; siehe [[Suchformular]]&lt;br /&gt;
* eine Übersicht aller [[Benachrichtigungen#Beobachtung von Caches|beobachteten Caches]]&lt;br /&gt;
* eine Übersicht aller [[Caches ignorieren|ignorierten Caches]]&lt;br /&gt;
* eine Übersicht deiner abgegebenen [[Empfehlungen]]&lt;br /&gt;
* die Möglichkeit, [[Adoption#Cache adoptioeren|Adoptionsangebote]] anzunehmen&lt;br /&gt;
&lt;br /&gt;
== Emailversand ==&lt;br /&gt;
Jeder registrierte Opencaching-Benutzer ist für andere registrierte Benutzer per Email erreichbar; dazu dient der Link „Email senden“ oben rechts im Profil. Wenn du eine Email verschickst kannst du wählen, ob die in deinem Profil hinterlegte Email-Adresse als Absender mitgeschicht wird oder nicht. Ohne Absenderadresse sieht der Empfänger nur deinen Benutzernamen und einen Link auf dein Opencaching-Profil. Dort kann er dir dann per „Email senden“ antworten. Mit Absenderadresse ist die Chance höher, dass du eine Antwort erhältst.&lt;br /&gt;
&lt;br /&gt;
Hin und wieder kommt es vor, dass eine Email in einem Spamordner landet und übersehen wird. Wenn du den Besitzer eines Caches nicht per Mail erreichst, kannst du stattdessen auch ein [[Das Onlinelog#Hinweis|Hinweislog]] bei dem Cache hinterlassen. Vielleicht hast du hier mehr Glück, und die [[Benachrichtigungen|Benachrichtigungsmail]] über deinen Logeintrag kommt an.&lt;br /&gt;
&lt;br /&gt;
== Persönliche Daten löschen  ==&lt;br /&gt;
Mit Ausnahme der Email-Adresse kannst du alle persönlichen Daten selbst aus deinem Profil löschen. Wenn du auch die Emailadresse löschen lassen möchtest, geht dies nur durch eine [[Account deaktivieren|Deaktivierung]] deines Benutzerkontos. Dies lässt sich nicht mehr rückgängig machen, und alle deine eigenen Caches werden dadurch [[Cachestatus|gesperrt]]! Daher überlege dir, ob du stattdessen nicht lieber bei einem der vielen kostenlosen Email-Anbieter eine neue Adresse anlegen möchtest, die du im Profil angeben kannst.&lt;br /&gt;
&lt;br /&gt;
Mehr zum Umgang mit persönlichen Daten findest du in der [http://www.opencaching.de/articles.php?page=dsb Datenschutzbelehrung].&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Opencaching]]&lt;/div&gt;</summary>
		<author><name>Schwalbe</name></author>
	</entry>
</feed>