Scrivito 0.41.0

Erweiterbare Widget- und Listenmenüs

Menüs von Widget-Feldern, Widgets und Tag-Listen können nun kundenspezifisch erweitert werden.

Mit scrivito("menu") kann auf das Menü-Objekt eines DOM-Elements zugegriffen werden, das CMS-Inhalte repräsentiert. Derzeit ist dies nur bei DOM-Elementen möglich, die Widgets (das Element hat ein data-scrivito-widget-obj-class-Attribut) oder Widget-Felder (der data-scrivito-field-type-Attributwert entspricht widget). Das Menü-Objekt hat mehrere Methoden.

Menüeinträge hinzufügen

Mit der Methode add können neue Menüeinträge erzeugt werden:

$(."..").scrivito("menu").add("my_app.my_menu_item", {
  title: "My Menu Item",
  icon: "relation",
  present: function(dom_element) {
    // see below
  },
  disabled: function(dom_element) {
    // see below
  },
  execute: function(dom_element) {
    // invoked when the user clicks
  },
})

Das erste Argument, my_app.my_menu_item im obigen Beispiel, ist die id des Menüeintrags, der referenziert wird. Wenn Aufrufe in mehr als einem Kontext genutzt werden, sollten den IDs ein Namensraum zugewiesen und die Komponenten des Namensraums durch einen Punkt voneinander getrennt werden. Der Namensraum auf der obersten Ebene (beispielsweise eine ID ohne Punkte) ist für die Applikation reserviert und sollte nicht von einer Bibliothek genutzt werden. Alle Menüeinträge, die das SDK liefert, haben beispielsweise den Präfix scrivito.sdk wie in scrivito.sdk.copy_widget.

Die folgenden Optionen werden unterstützt:

  • title Der Titel des Menüeintrags, der dem Benutzer angezeigt wird.
  • execute (Funktion) Ein Callback, der aufgerufen wird, wenn ein Redakteur auf den Menüeintrag klickt. Das betreffende DOM-Element wird dem Callback als Parameter übergeben.
  • present (Funktion, optional) Ein Callback, der steuert, ob der Menüeintrag angezeigt werden soll. Er wird ausgeführt, wenn ein Redakteur das Widget- oder Widget-Feld-Menü öffnet. Wenn die Funktion false zurückliefert, enthält das Menü den Eintrag nicht. Voreingestellt sind alle Menüeinträge sichtbar.
  • disabled (Funktion, optional) Ein Callback, der steuert, ob der Menüeintrag deaktiviert werden soll. Er wird ausgeführt, wenn ein Redakteur das Menü öffnet. Wenn die Funktion true oder einen String zurückgibt, wird der Menüeintrag deaktiviert. Das heißt, er ist sichtbar, kann aber nicht ausgewählt werden. Das betreffende DOM-Element wird dem Callback als Parameter übergeben. Voreingestellt sind Menüeinträge aktiviert.
  • icon (String, optional) Der Name eines mitgelieferten Icons. Derzeit gibt es in Scrivito die folgenden Icons:

Menüeinträge manipulieren

Es gibt zahlreiche Möglichkeiten, Menüeinträge zu manipulieren:

  // remove the menu item with the given id
  $(."..").scrivito("menu").remove(id)

  // return an array containing all menu items in the menu of the element.
  $(."..").scrivito("menu").list()

  // replace a menu item
  $(."..").scrivito("menu").replace(id, new_menu_item)

  // change properties of a menu item
  $(."..").scrivito("menu").update(id, {
    title: "A new title"
  })

Die Reihenfolge der Einträge ändern

Mit configure_menu_order kann die Reihenfolge der Einträge, die in einem Menü enthalten sind, spezifiziert werden. Der Parameter order ist ein String-Array. Jeder String kann entweder die voll qualifizierte ID eines Menüeintrags sein, oder ein Namensraum, der sich auf mehrere Menüeinträge bezieht, gefolgt von einem Platzhalter (*):

scrivito.configure_menu_order([
  "special_command",
  "scrivito.editors.cool_stuff",
  "scrivito.sdk.*",
  "scrivito.editors.*"
])

Das obige Beispiel definiert, dass der Menüeintrag special_command der erste Eintrag (wenn im Menü vorhanden) ist, gefolgt vom Eintrag scrivito.editors.cool_stuff. Danach werden alle Menüeinträge, die aus dem Namensraum scrivito.sdk stammen, eingefügt. Zum Schluss werden die Menüeinträge des scrivito.editors-Namensraums angefügt.

Bitte beachten Sie, dass configure_menu_order eine globale Reihenfolge für alle Menüeinträge in der Applikation definiert, auch wenn einzelne Menüs typischerweise nur eine Teilmenge der Einträge enthalten, die in configure_menu_order vorhanden sind. Menüeinträge, die in configure_menu_order nicht spezifiziert werden, werden am Ende des Menüs eingefügt, und zwar in der Reihenfolge, in der sie zum betreffenden Menü hinzugefügt wurden. Menüeinträge, die zu einem Platzhalter passen, werden auch in der Reihenfolge in das Menü eingefügt, in der sie hinzugefügt wurden.

configure_menu_order sollte von der Applikation aufgerufen werden und nicht von Gems. Gems sollten ihre Menüeinträge in einer sinnvollen voreingestellten Reihenfolge liefern (indem sie in dieser Reihenfolge per add hinzugefügt werden) und diese in einem Namensraum für die Gruppierung zur Verfügung stellen. Dadurch kann der Entwickler der Applikation einfach die Position für alle Menüeinträge, die durch ein Gem erzeugt werden, festlegen.

Second Level Data Cache

Man kann nun mittels Scrivito::Configuration.second_level_cache in Scrivito einen projektspezifischen Second Level Cache zur Cache Store Chain hinzufügen. Dies ist beispielsweise beim Deployment zu Heroku nützlich, weil das Dateisystem dieses Dienstes flüchtig ist.

Voreingestellt ist kein Second Level Cache konfiguriert. Wenn er gesetzt ist, legt Scrivito den Cache sowohl im Dateisystem als auch im Second Level Cache ab. Ferner durchsucht Scrivito den Second Level Cache, wenn der Dateisystem-Cache kein Ergebnis liefert. Wenn der Second Level Cache Ergebnisse liefert, werden diese im Dateisystem-Cache gespeichert.

Die Konfiguration könnte beispielsweise folgendermaßen aussehen:

# Use Memcached as the 2nd level cache (https://rubygems.org/gems/dalli):

require 'active_support/cache/dalli_store'

Scrivito.configure do |config|
  config.second_level_cache = ActiveSupport::Cache::DalliStore.new(
    'server-downstairs.localnetwork:1234',    
    'server-downstairs.localnetwork:4321',
    username: 'root', password: 'secret'
  )
end

Voreingestellte Attribute für hochgeladenen Content

Der Content Browser ermöglicht es nun, Attributwerte zu spezifizieren, die beim Anlegen von Objekten über den Content Browser automatisch gesetzt werden. Der preset-Konfigurationswert kann für jeden auswählbaren Filter gesetzt werden:

[…]
  language:
    title: 'Languages'
    field: 'language'
    type: 'check_box'
    options:
      en:
        title: 'English'
        preset:
          language: 'en'
      fr:
        title: 'French'
        preset:
          language: 'fr'
[…]

Die obige Definition spezifiziert das language-Attribut eines per Upload angelegten CMS-Objekts. Das Attribut wird auf „en“ gesetzt, wenn ein Redakteur zuvor den Filter „en“ ausgewählt hat. Entsprechend würde es auf „fr“ gesetzt, wenn vorher dieser Filter ausgewählt werden würde.

Beachten Sie, dass bei der Suche nach Inhalten mehr als ein Wert für ein Einzelauswahl-Attribut (enum) akzeptiert wird. Trotzdem führt dies beim Upload zu einem Fehler, da die Werte sich gegenseitig ausschließen. In diesem Fall wird der Redakteur gebeten, seine Selektion zu korrigieren und den Upload zu wiederholen.