Attributtyp-Abbildung spezifizieren

Es gibt Fälle, in denen die vorgegebene Abbildung nicht für den vorgesehenen Zweck eines Attributs geeignet ist. So ist beispielsweise das Attribut child_order für die Sortierung der Navigation vom Typ referencelist, was auf linklist abgebildet wird. Folglich erzeugt eine Sortierung der Navigation Links auf jeden ihrer Unterpunkte. Diese Links können nur erschwert gelöscht werden. Hier wäre eine Abbildung praktisch, die keine Konsistenzprüfung erzwingt.

Genau dafür sind die Custom-Attributtypen konzipiert. Sie ermöglichen es Ihnen, die Abbildung der Attributtypen zu ändern.

Zur Zeit gibt es nur zwei alternative Abbildungen: referencelist-Attribute können als text abgebildet werden statt als linklist, und reference-Attribute können als string abgebildet werden statt als linklist-Attribute. Dadurch werden keine Links im CMS anlegt, und es wird auch keine Konsistenzprüfung durchgeführt.

Es gibt drei Möglichkeiten, eine andere Abbildung zu spezifizieren.

1. Vorlagenübergreifende Abbildung

Mit dem Konfigurationsparameter Fiona7.custom_attribute_types kann Attributen über ihren Namen ein anderer Typ zugewiesen werden. Dabei spielt es keine Rolle, zu welcher Vorlage diese Attribute gehören – nur der Name zählt.

Ein guter Kandidat hierfür ist das Attribut zur Sortierung einer Navigation, child_order:

Fiona7.custom_attribute_types = {
  child_order: :text
}

Bei einer Attributtyp-Abbildung nach Name des Attributs müssen sowohl dieser Name als auch der Ersatztyp ein Ruby-Symbol sein.

2. Vorlagenspezifische Abbildung

Die Abbildung im Konfigurationsparameter Fiona7.custom_attribute_types kann auch pro Vorlage definiert werden. Zum Beispiel:

Fiona7.custom_attribute_types = {
  'MyPage' => {
    child_order: :text
  }
}

Vorlagenspezifische Attributtyp-Abbildungen sind nur im standalone Modus möglich.
Sowohl der Attributname als auch der Ersatztyp müssen ein Ruby-Symbol sein; der Vorlagenname muss ein String sein.

3. Dynamische Abbildung

In Situationen, in denen die statische Konfiguration nicht flexibel genug ist, kann die dynamische Variante verwendet werden. Als Wert von Fiona7.custom_attribute_types wird dann ein Proc oder ein Lambda gesetzt, das zwei Parameter hat, den Vorlagennamen und den Attributnamen. Als Beispiel wird hier die Ersatzabbildung von child_order auf Vorlagen eingeschränkt, deren Name auf Page (oder page) endet:

Fiona7.custom_attribute_types = lambda do |obj_class, attribute|
  if obj_class =~ /Page$/i
    if attribute == :child_order
      :text
    end
  end
end

Im legacy-Modus muss ein Attribut in allen Vorlagen, denen es zugewiesen wurde, denselben (alternativen) Typ haben.