Elemente verstehen

Anmerkung: Dieser Guide wird überarbeitet. Wir werden eine neue Dokumentation im Contributing Guide für Entwickler bereitstellen, der sich im Git-Repository befindet:

https://github.com/mapbender/mapbender-starter/blob/release/3.0.6/CONTRIBUTING.md#elements.

Bereiche der Elemente

PHP Class

TODO

Twig Template

Jedes Element benötigt ein HTML-Element. In den meisten Fällen kann das ein DIV-Element sein, aber es kann auch komplexer sein.

Für Mapbender wird Twig verwendet. Eine einfache Twig-Vorlage für ein Element kann wie folgt aussehen:

<div id="{{ id }}" class="mb-element mb-element-myclass"></div>

Mehrere Angaben müssen gesetzt werden:

  • id (wird von Mapbender generiert)
  • allgemeine mb-element-Klasse
  • spezielle Klasse für das Element

JavaScript Widgets

Element Widgets werden unter Verwendung der jQuery UI widget factory erzeugt. Dies gewährleistet eine einheitliche Struktur für die Widget-Entwicklung und bietet:

  • voreingestellte Optionen.
  • Konstruktoren und Dekonstruktoren (optional)
  • private und öffentliche Methoden.

Das grundlegende Gerüst sieht folgendermaßen aus:

(function($) {

// Das ist die Widget Factory. Es wird sowohl die Widget-Klasse "mbMyClass" im jQuery-Objekt als auch eine
//  "mbMyClass" Object im "mapbender"-Namensraum im jQuery-Object  erzeugt (sie werden beide unterschiedlich verwendet). Verwenden Sie ein
// "mb"-Präfix für Ihre Widget-Namen, damit existierende jQuery-Funktionen nicht überschrieben werden.
$.widget('mapbender.mbMyClass', {
             // Es werden voreingestellte Optionen angelegt, die in der Mapbender-Konfiguration überschrieben werden kann.
    //  Es wird später in die PHP-Klasse verschoben.
    // Auf das endgültige options-Objekt kann zugegriffen werden als "this.options".

    options: {
        foo:    'bar',
        answer: 42
    },

    // Dieses Attribut ist privat für Ihr Widget.
    var1: null,

    // Der Konstruktor wird bei der Widget-Initialisierung aufgerufen.
    _create: function() {
        // Hier wird alles für das Setup angelegt, beispielsweise für das Event Handling
        this.element.bind('mbmyclassmagicdone', $.proxy(this._onMagicDone, this));
        this.element.bind('click', $.proxy(this._clickCallback, this));
    },

    // Der Destruktor, wird in diesem Beispiel über jQuery geliefert.
    destroy: $.noop,

    // Öffentliche Funktion, sind beispielsweise über "$('#element-13').mbMyClass('methodA', parameterA, parameterB)" abrufbar
    methodA: function(parameterA, parameterB) {
        this._methodB(parameterA);
    },

    //  Private Funktion, sind nur innerhalb des Widget abrufbar
    _methodB: function(parameterA) {
        // Das ausgelöste Signal wird genannt "mbmyclassmagicdone" (kleingeschrieben)
        this._trigger('magicdone');
    },

    _onMagicDone: function() {
        alert("Oh, magic!");
    },

    _clickCallback: function(event) {
        var target = $(event.target);
        var id = target.attr('id');
        // ...
    }

});

})(jQuery);

Für das Event Handling wird jQuery.proxy verwendet, um sicherzustellen, dass ein der Callback im richtigen Kontext gewährleistet wird:

// ...

this.element.click($.proxy(this._clickCallback, this));

// ...

In diesem Fall ist “this” innerhalb der clickCallback Methode das This, das als der zweite Parameter übergeben wird (in der Regel die Widget Instanz) und nicht das HTML-Element, das das Event angestoßen hat.

Kommunikation zwischen Elementen

Es gibt eine aktive und passive Kommunikation zwischen den Widgets. Die aktive Kommunikation, wird genutzt, um eine öffentliche Methode eines anderen Widget abzurufen. Dazu selektieren Sie das HTML-Element des Widgets mit jQuery und rufen die Methode folgendermaßen auf:

var otherElement = $('#element-13').mbMyClass('methodA', parameterA, parameterB);

Dies ist eine Standard-jQuery UI Syntax und selbsterklärend. Es ist die Frage, wie Sie die anderen HTML-Elemente erkennen? Um ein Element zu selektieren, wird bevorzugt die ID verwendet. Diese ID’s werden jedoch zur Laufzeit von Mapbender generiert, wenn die Anwendung startet, so dass Sie nicht davon ausgehen können, dass die ID immer gleich ist. Glücklicherweise können Sie in der Konfiguration eine Element-ID als eine Target-Option für ein anderes Element übergeben. Diese wird mit der Laufzeit-ID des Target-Elements des HTML-Element überschrieben, so dass Sie in Ihrem Widget-Code auf die richtige ID “this.options.target” zugreifen können.

$('#' + this.options.target).mbMyClass('methodA', parameterA, parameterB);

Die passive Kommunikation wird verwendet, um Ereignisse anderer Targets anzumelden. Sie müssen das HTML-Element kennen und können nun dem anderen Widget lauschen, um ihr Widget abzurufen. Dieses wird mit Standard-jQuery-Events vorgenommen:

Wenn Sie die “_trigger”-Methode mit jQuery UI Widget Factory bereitstellen …