Wie erstelle ich modale Fenster (Popups)?


10

Ich versuche, die Kernfunktion von Drupal 8 zu verwenden, um eine Seite in einem modalen Fenster zu öffnen. Leider ist es sehr schwierig, eine offizielle Dokumentation darüber zu finden, und die meisten Blogs zu diesem Thema scheinen veraltet zu sein. Soweit ich weiß, sollte es jedoch möglich sein, einen modalen Dialog zu erstellen, indem einem a-Element die folgenden Attribute hinzugefügt werden:

class="use-ajax” data-dialog-type="modal"

Damit ein vollständiges Beispiel aussehen würde:

<a href="/impressum/lizenzen/43" class="use-ajax" data-dialog-type="modal">
   <span class="glyphicon glyphicon-copyright-mark" aria-hidden="true"></span>
</a>

Wo in meinem Fall /impressum/lizenzen/43ist ein Pfad zu einer Ansichtsseite.

Dies scheint zu funktionieren, aber nur, wenn ich als Administrator angemeldet bin. Da dies kein Berechtigungsproblem zu sein scheint, gehe ich davon aus, dass es mit dem Admin-Thema ( Seven ) zusammenhängt, das möglicherweise einige Kernbibliotheken enthält, die Bootstrap (das ich für meine Site verwende) möglicherweise nicht enthält. Aber seltsamerweise erschien in der Titelleiste des Modals anstelle des Seitentitels die Zeichenfolge "Array", was mich vermuten lässt, dass ein unerwartetes Gespräch zwischen Array und Zeichenfolge stattgefunden hat: Geben Sie hier die Bildbeschreibung ein

Könnte jemand

  • führe mich zur offiziellen Dokumentation der Cores Modal API,
  • Erklären Sie mir, was der Grund sein könnte, dass es nur als Administrator funktioniert.
  • Und zum Schluss sag mir, warum um alles in der Welt findet ein Array-zu-String-Gespräch statt, das ein Modal aufruft?

Antworten:


6

Dies ist die offizielle Dokumentation für die API-Änderung, die Sie erwähnt haben:

Modal / dialog / ajax verwendet Abfrageparameter, anstatt Header zu akzeptieren

Das wichtigste Detail ist das Anhängen dieser Bibliothek:

$build['#attached']['library'][] = 'core/drupal.dialog.ajax';

Sie fragen, warum dies auf Administrationsseiten ohne dies funktioniert. Der Grund dafür ist, dass Administrationsseiten bereits Abhängigkeiten von den meisten Drupal-jQuery-Bibliotheken aufweisen, während Nicht-Administrationsseiten sofort ohne jQuery geladen werden (was eine große Leistungsverbesserung in D8 darstellt).

Bootstrap-Thema

Wenn in den Designeinstellungen des Bootstrap-Themas aktiviert, wird "jQuery Modal" durch "Bootstrap Modal" ersetzt. Weitere Informationen finden Sie in diesem Codeausschnitt:

LibraryInfo :: alter ()

elseif ($extension === 'core') {
  // Replace core dialog/jQuery UI implementations with Bootstrap Modals.
  if ($this->theme->getSetting('modal_enabled')) {
    $libraries['drupal.dialog']['override'] = 'bootstrap/drupal.dialog';
    $libraries['drupal.dialog.ajax']['override'] = 'bootstrap/drupal.dialog.ajax';
  }

Damit dies funktioniert, fügen Sie dieselbe Kernbibliothek wie oben hinzu, damit das Bootstrap-Design diese Kernbibliotheken finden kann, um sie zu überschreiben.


Hatten Sie ein Problem mit dem Popup, als die Seite noch geladen wurde und der Benutzer auf die Schaltfläche klickte? Die Seite wird zur Popup-URL der Seite weitergeleitet.
Jonh

Ich versuche, dies auf dem Knotenformular zum Laufen zu bringen, kann es aber bisher nicht. Sollte das einfache Hinzufügen eines Links zum Knotenformular mit den entsprechenden Eigenschaften das Laden eines Modals auslösen? Ich <a href="https://drupal.stackexchange.com/node/43" class="use-ajax" data-dialog-type="modal"> test </a>
füge

Ja, das sollte funktionieren. Überprüfen Sie im Browser, ob die erwähnte js-Bibliothek geladen ist und fehlerfrei ausgeführt wird (deaktivieren Sie die js-Dateiaggregation in den Systemleistungseinstellungen, um alle js-Dateien anzuzeigen).
4k4

5

Für alle, die versuchen, dies einem Thema hinzuzufügen, können Sie einfach die Datei drupal.dialog.ajax zu Ihrer Datei library.yml unter JS-Abhängigkeiten hinzufügen:

- core/drupal.dialog.ajax

Mehr zu Themenabhängigkeiten hier .


2
Dies löst das Problem für mich nicht. Im Bootstrap-Design ist diese Bibliothek standardmäßig bereits enthalten.
user5950

4

Ich hatte auch Probleme mit der Dokumentation. Mit der von D8 Core bereitgestellten Dialog-API konnte ich mein Modal jedoch zum Laufen bringen.

confirmationDialog = Drupal.dialog(CONTENT_OF_MODAL, {
  dialogClass: 'ADD_ANY_CLASSES',
  resizable: false,
  closeOnEscape: false,
  create: function () {
    $(this).parent().find('.ui-dialog-titlebar-close').remove();
  },
  beforeClose: false,
  close: function (event) {
    $(event.target).remove();
  }
});

Anzeigen eines Modals

confirmationDialog.showModal();

Modal schließen

confirmationDialog.close();

Dies scheint basierend auf korrekt zu sein drupal.org/node/1852224
Smartsheet ger

1

Ihr Thema muss eine Abhängigkeit von core / drupal.ajax deklarieren, da Ajax für anonyme Benutzer nicht automatisch geladen wird.

dependencies:
    - core/jquery
    - core/drupal.ajax
    - core/drupal
    - core/drupalSettings
    - core/jquery.once
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.