Multi-Domains
=============

Wir haben das AddOn entwickelt, um einfacher Projekte umzusetzen, die die
gleiche SallyCMS-Installation zum Betreiben mehrerer Domains verwenden. Dazu
kann zu einem Artikel neben dem Alias auch eine alternative Domain gespeichert
werden. Dies wirkt sich auf den Artikel selbst sowie alle Kinder aus.

realURL2 ist clever genug, auf einer Seite mit Links zu verschiedenen Domains an
den richtigen Stellen vollständige URLs zu erzeugen.

Beispiel
--------

Die hier dargestellte Website befindet sich in **www.example.com/projekt1/**.
Wir gehen auch davon aus, dass der Besucher sich gerade auf der
example.com-Variante befindet.

.. note::

  Diese Tabelle ignoriert die Sprach-Angaben in den URLs. Das ist so gewollt.

::

  +---------------------+----------------------+------------------------------------+--------------------------------------------------+
  |STRUKTUR             | ALIAS-ANGABE         | ERZEUGTE URL                       | HINWEISE                                         |
  +---------------------+----------------------+------------------------------------+--------------------------------------------------+
  |  |                  |                      |                                    |                                                  |
  |  +-- Kategorie 1    |                      | kategorie1/                        | (keine Domain, weil unnötig)                     |
  |  +-- Kategorie 2    | alternativ           | alternativ/                        | (Aliasname zum kommt Zug)                        |
  |  |   +-- Kind 1     |                      | alternativ/kind-1.html             | (Aliasname wirkt sich auf alle Kinder aus)       |
  |  |   +-- Kind 2     | bruder               | alternativ/bruder/                 | (Kindkategorie)                                  |
  |  |                  |                      |                                    |                                                  |
  |  +-- Wiki           | //wiki.example.com   | http://wiki.example.com/           | (Domainwechsel)                                  |
  |  |   +-- Backend    | /backend             | http://wiki.example.com/backend    | (completely useless alias)                       |
  |  |   +-- Hilfe      |                      | http://wiki.example.com/hilfe      |                                                  |
  |  |       +-- Syntax | /syntax              | http://wiki.example.com/syntax     | (Kürzel)                                         |
  |  |                  |                      |                                    |                                                  |
  |  +-- Blog           | //blog.foo.com/wp    | http://blog.foo.com/wp/            | (Domain kann auch Root-Pfad enthalten)           |
  |      +-- Backend    | /back                | http://blog.foo.com/wp/back        | (Alias + Kürzel)                                 |
  |      +-- Hilfe      |                      | http://blog.foo.com/wp/hilfe       |                                                  |
  |      |   +-- Syntax | /syntax/foo          | http://blog.foo.com/wp/syntax/foo  | (Kürzel können auch virtuelle Pfade enthalten)   |
  |      +-- Impressum  | /im                  | http://blog.foo.com/wp/im.html     | (Alias + Kürzel für einen Artikel)               |
  |                     |                      |                                    |                                                  |
  +---------------------+----------------------+------------------------------------+--------------------------------------------------+

Mehrere Projekte
----------------

Möchte man zwei gänzlich unabhängige Projekte in einer Installation verwalten,
so trifft man zwangsweise auf das "Seiten-Startartikel & die
Home-Kategorie"-Problem, das sich wie folgt darstellt.

.. note::

  Multi-Projekt-Systeme sind nichts weiter als eine clevere Nutzung der
  Konfliktlösung von realURL2.

TL;DR
^^^^^

Um mehrere Projekte in einer Sally-Installation zu verwalten, legt man pro
Projekt eine Kategorie auf der obersten Ebene ab und routet dann wie folgt:

* Das erste Projekt (die erste Kategorie) erhält keine Routing-Angabe.
* Alle weiteren Projektkategorien werden auf die Projekt-Domain geroutet
  (``//projektb.com``, ``//projectc.com``, ...).
* Die erste Kategorie innerhalb der Projektkategorien (meistens **Home** oder
  **Start**) wird jeweils auf ``/`` geroutet.
* Der Seiten-Startartikel (Homepage) wird auf die erste Projektkategorie gelegt
  (die, die keine eigene Routing-Angabe erhielt).


Einfache Projekte
^^^^^^^^^^^^^^^^^

Üblicherweise besteht ein Projekt aus einer Reihe von Kategorien, aus denen die
Navigation zusammengebaut wird. Für ein einfaches Projekt kann dies wie folgt
aussehen:

::

  # Home
  # Unternehmen
  # Produkte
  # Blog
  # Über uns
  + Impressum        <- jeweils Artikel
  + AGB              <- jeweils Artikel
  + Suchergebnisse   <- jeweils Artikel

Nun würde man der Kategorie **Home** zum Seiten-Startartikel
(``START_ARTICLE_ID``) machen, wodurch sie auf den Root des Projekts geroutet
wird. Die URLs könnten dann wie folgt aussehen (angenommen, die Standard-Domain
ist auf ``//example.com`` eingestellt):

::

  # Home              http://example.com/
  # Unternehmen       http://example.com/unternehmen/
  # Produkte          http://example.com/produkte/
  # Blog              http://example.com/blog/
  # Über uns          http://example.com/ueber-uns/
  + Impressum         http://example.com/impressum.html
  + AGB               http://example.com/agb.html
  + Suchergebnisse    http://example.com/suchergebnisse.html

Damit sind alle URLs eindeutig und alles ist in Ordnung.

Zwei Projekte
^^^^^^^^^^^^^

Nun duplizieren wir die Struktur und führen eine Projekt-Ebene ein. Die neue
Struktur:

::

  # Projekt A
     # Home
     # Unternehmen
     # Produkte
     # Blog
     # Über uns
     + Impressum
     + AGB
     + Suchergebnisse

  # Projekt B
     # Home
     # Unternehmen
     # Produkte
     # Blog
     # Über uns
     + Impressum
     + AGB

Nun kann man den Startartikel auf **Projekt A** legen und **Projekt B** auf
eine eigene Domain routen. Das ergäbe dann URLs wie folgt:

::

  # Projekt A          (Homepage)         http://example.com/
     # Home                               http://example.com/home/
     # Unternehmen                        http://example.com/unternehmen/
     # Produkte                           http://example.com/produkte/
     # Blog                               http://example.com/blog/
     # Über uns                           http://example.com/ueber-uns/
     + Impressum                          http://example.com/impressum.html
     + AGB                                http://example.com/agb.html
     + Suchergebnisse                     http://example.com/suchergebnisse.html

  # Projekt B          //projektb.com     http://projektb.com/
     # Home                               http://projektb.com/home/
     # Unternehmen                        http://projektb.com/unternehmen/
     # Produkte                           http://projektb.com/produkte/
     # Blog                               http://projektb.com/blog/
     # Über uns                           http://projektb.com/ueber-uns/
     + Impressum                          http://projektb.com/impressum.html
     + AGB                                http://projektb.com/agb.html

Nun möchte man aber weiterhin die **Home**-Kategorien auf den Root der Domains
legen können. Also routet man diese noch von Hand auf ``/``.

::

  # Projekt A          (Homepage)         http://example.com/
     # Home            /                  http://example.com/
     # Unternehmen                        http://example.com/unternehmen/
     # Produkte                           http://example.com/produkte/
     # Blog                               http://example.com/blog/
     # Über uns                           http://example.com/ueber-uns/
     + Impressum                          http://example.com/impressum.html
     + AGB                                http://example.com/agb.html
     + Suchergebnisse                     http://example.com/suchergebnisse.html

  # Projekt B          //projektb.com     http://projektb.com/
     # Home            /                  http://projektb.com/
     # Unternehmen                        http://projektb.com/unternehmen/
     # Produkte                           http://projektb.com/produkte/
     # Blog                               http://projektb.com/blog/
     # Über uns                           http://projektb.com/ueber-uns/
     + Impressum                          http://projektb.com/impressum.html
     + AGB                                http://projektb.com/agb.html

Jetzt sind die URLs der **Home**-Kategorien in Ordnung, aber jeweils doppelt
vergeben. Wir haben einen *Konflikt* erzeugt.

Konfliktbereinigung
^^^^^^^^^^^^^^^^^^^

Dieser Konflikt ist natürlich gewollt. Von Seiten der API gibt es keine
Unterscheidung bei Konflikten, d.h. sowohl die **Projekt B**-Kategorie als auch
die **Home**-Kategorie darin geben bei ``->getURL()`` ihre URL zurück. Nur beim
Auflösen von URLs in den jeweiligen Artikel kommt nun eine automatische
Konfliktbereinigung zum Einsatz.

Beim Auflösen einer URL wird wie folgt vorgegangen:

#. finde alle Datensätze mit dieser URL in der Datenbank
#. falls keine URL gefunden wurde, abbrechen.
#. falls nur eine URL gefunden wurde, fertig.
#. trenne URLs in realURL2-URLs und AddOn-URLs auf.

   #. wenn eine oder mehrere AddOn-URLs gefunden wurde, gib die erste zurück.
   #. sind alle URLs von realURL2 erzeugt, werden die URLs anhand ihrer Tiefe
      im Strukturbaum sortiert (Tiefensuche). Der tiefste Treffer wird
      zurückgegeben.

Da zwei Artikel niemals die gleiche Position einnehmen können, terminiert der
Algorithmus immer mit einem eindeutigen Ergebnis.

Einfach gesprochen gilt also die Regel: Tieferliegende Artikel haben Vorrang
und überlagern die URLs ihrer Eltern. Wenn die Kandidaten-URLs nicht innerhalb
des gleichen Pfads liegen, gilt "je weiter unten in der Liste, desto wichtiger".

Nimmt man diesen Algorithmus, so wird die **Home**-Kategorie, da sie innerhalb
der **Projekt B**-Kategorie liegt, als wichtiger bewertet und daher beim
Auflösen von **http://projektb.com/** ausgewählt und schlussendlich dem Besucher
angezeigt.
