Load save WMC session

From MapbenderWiki

Jump to: navigation, search

Contents

Laden und Speichern des Client-Zustands aus/in der Session

Mapbender ermöglicht das Speichern des aktuellen Zustands des Clients, d.h. geladene Kartendienste, deren Einstellungen, Kartenausschnitt usw.) in einem Web Map Context Dokument (Beispiel). Dieses WMC kann auch onunload (d.h. beim Verlassen oder Neuladen der Seite) in einer Sessionvariable gespeichert werden, und beim Start wieder aus dieser ausgelesen werden.

Hierfür werden die Mapbender-nativen Module LoadWMC und SaveWMC benötigt. Dabei muss in beiden Modulen eine Element Var mit dem Wert 1 belegt sein, in SaveWMC ist dies saveInSession, in LoadWMC loadFromSession.

ACHTUNG:
Da das WMC Dokument auf der Serverseite geschrieben wird, muss der AJAX-Aufruf an das Skript
php/mod_insertWmcIntoDb.php in jedem Fall synchron und nicht asynchron sein, um zu gewährleisten, 
dass alle Daten gesendet werden!

Hinzufügen von Diensten von externen Komponenten

Darüberhinaus ist es möglich, Mapbender dahingehend zu erweitern, dass beim Ladevorgang weitere Kartendienste eingebunden werden können.

Dabei sind zwei Fälle zu unterscheiden: Die Kartendienste sind Mapbender

  1. bekannt und werden als Layer-IDs per GET übergeben.
  2. unbekannt und werden als WMC übergeben.

Änderungen

index.php

Um Mapbender von hinzuzuladenden Diensten zu informieren, müssen diese in als GET-Parameter an index.php übergeben werden. Es handelt sich dabei um folgende Variablen

  • $_GET['portal_services']: kommaseparierte Liste von Layer-IDs, z.B. 923,54,234
  • $_GET["zoomToLayer"]: entscheided, ob auf diese gezoomt wird. Sind mehrere Layer angegeben, werden die Bounding Boxen vereinigt, um alle Layer darzustellen. 0 oder 1.

Dem Aufruf des Skript map.php müssen diese Parameter angehängt werden, in etwa

echo "<script type='text/javascript' src='../javascripts/map.php?gui_id=".$_REQUEST["gui_id"]    
."&zoomToLayer=".$_REQUEST["zoomToLayer"]."&portal_services=".$_REQUEST['portal_services']
."&".strip_tags(SID)."&mb_myBBOX=".$_REQUEST["mb_myBBOX"]."'></script>";

Diese Änderungen beziehen sich auf Fall 1 (Kartendienste sind Mapbender bekannt).

map.php

Hier werden zwei Variablen bereitgestellt

$gui_changed=0;
$new_wmc=0;

Mapbender muss hier entscheiden, ob es sich bei dem Aufbau um das Neuladen einer bestehenden GUI handelt, oder um einen GUI-Wechsel.

ACHTUNG
Diese Variablen mögen invers zuenander scheinen, da auf den ersten Blick nur ein 
GUI-Wechsel ein neues WMC bedingt, und umgekehrt ein neues WMC einen GUI-Wechsel 
impliziert. In dem Projekt, in dem diese Funktionalität entwickelt wurde, gab es
zudem noch andere use cases, in denen diese beiden Fälle nicht trivial zu trennen
waren. 

Berechnet werden die Werte aus den GET-Parametern, für $gui_changed so

if (isset($_SESSION["mb_user_gui"]) && $_SESSION["mb_user_gui"] != $_REQUEST["gui_id"]) {
	$gui_changed=1;
}

und für $new_wmc wie folgt

if (!isset($_SESSION['mb_wmc']) || $gui_changed==1) {
	$new_wmc=1;
}

Erst danach darf die Session-Variable für GUI gesetzt, und die Session geschrieben werden!

$_SESSION["mb_user_gui"] = $_REQUEST["gui_id"];
session_write_close();

Diese Änderungen beziehen sich auf Fall 1 (Kartendienste sind Mapbender bekannt).

mod_loadwmc.php

Das Module kann die Variablen $gui_changed und $new_wmc weiterverarbeiten, da alle Module (wie eben mod_loadwmc.php) in map.php inkludiert werden.

Zuerst wird geprüft, ob ein neues, leeres WMC generiert werden muss, dies geschieht in generate_defaultWmc.php

if ($new_wmc == 1) {
	include("../x_xxxxxxxxx/generate_defaultWmc.php");
	$startup = true;
}
else {
	$startup = false;
}

Danach wird geprüft, ob Ebenen von Kartendiensten hinzugeladen werden sollen

if ($gui_changed == 0) {
	if ($_REQUEST['portal_services']) {
		$e = new mb_notice("loadwmc: merging layers");
 		include("../x_xxxxxxxxx/merge_layers.php");
	 }
}

Eine beim Initialisieren von Mapbender ausgeführte Javascript-Funktion lädt nun das WMC hinzu

function load_wmc_session() {
   <?php
      if (isset($_SESSION['mb_wmc'])) {
         $wmc = new wmc();
         if ($wmc->createObjFromWMC_xml($_SESSION['mb_wmc'])) {
            $js = "";
            if ($startup == true) {
               $js = $wmc->createJsObjFromWMC("", $e_target, "merge");
               $startup = false;
            }		
            else {
               $js = $wmc->createJsObjFromWMC("", $e_target, "load");
            }
         }
      }
  ?>
}

if (loadFromSession) {
   mb_registerInitFunctions('load_wmc_session()');
}

Diese Änderungen beziehen sich auf Fall 1 (Kartendienste sind Mapbender bekannt).

Für Fall 2 würde nach

$wmc = new wmc();
$wmc->createObjFromWMC_xml($_SESSION['mb_wmc']);
$js = $wmc->createJsObjFromWMC("", $e_target, "load");

noch das zweite WMC mit den Mapbender unbekannten Diensten hinzugemergt werden, in etwa so

$wmc2 = new wmc();
$wmc2->createObjFromWMC_xml($someWMC);
$js2 = $wmc2->createJsObjFromWMC("", $e_target, "merge");

Man beachte, dass zuerst das WMC mit den Einstellungen des Mapbenders, und erst danach das WMC mit hinzuzuladenden Diensten kommt.

generate_defaultWmc.php

Diese Datei ist nicht im Standardumfang von Mapbender enthalten. Hier ansehen.

merge_layers.php

Diese Datei ist nicht im Standardumfang von Mapbender enthalten. Hier ansehen. .

Personal tools