Load save WMC session
From MapbenderWiki
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
- bekannt und werden als Layer-IDs per GET übergeben.
- 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. .

