CMS-Vorlagen als erweiterbare Seitentypen

Mit unserem Rails Connector kann man aus Rails-Anwendungen heraus auf die CMS-Dateien zugreifen. Hierfür stellt der Rails Connector die Variable @obj zur Verfügung, die die auszuliefernde Datei repräsentiert. So kann man beispielsweise mit @obj.abstract den Wert des Feldes abstract ermitteln.

@obj gehört zur Klasse Obj. Bis Version 6.7.2 bildet der Rails Connector auf der Grundlage des Vorlagennamens automatisch Subklassen von Obj, so dass beispielsweise eine CMS-Datei mit der Vorlage NewsArticle automatisch eine Instanz der Klasse NewsArticle ist.

Ab Version 6.7.3 werden Subklassen von Obj nicht mehr automatisch erzeugt, sondern alle CMS-Dateien gehören immer zur Klasse Obj. Enthält die Applikation jedoch eine von Obj abgeleitete Klasse, deren Name dem Namen einer Vorlage entspricht, so sind Dateien mit dieser Vorlage automatisch Instanzen dieser Klasse.

Vorlagen-Klassen lassen sich nutzen, um CMS-Dateien, die eine bestimmte Vorlage haben, um die gewünschten Eigenschaften und Methoden zu erweitern. Sollen etwa alle CMS-Dateien mit der Vorlage Product bewertbar sein, so kann man hierfür das Modell für Product folgendermaßen definieren:

# This Model describes the behavior of all CMS objects of the Product class.
class Product < Obj

  has_many :ratings, :dependent => :delete_all, :foreign_key => :obj_id

  def rate(score)
    rating = ratings.find_by_score(score) || ratings.build(:score => score)
    rating.count += 1
    rating.save
  end

  def count_for_score(score)
    rating = ratings.find_by_score(score)
    rating ? rating.count : 0
  end

  def rated?
    !ratings.empty?
  end

  def average_rating
    raise TypeError unless rated?
    sum, count = ratings.inject([0, 0]) do |(sum, count), rating|
      [sum + rating.score * rating.count, count + rating.count]
    end
    sum.to_f / count.to_f
  end

  def average_rating_in_percent
    if rated?
      (100 * average_rating / Rating::MAXIMUM).to_i
    else
      0
    end
  end

  def reset_rating
    ratings.clear
  end
end

Vorlagen- und dateispezifische Action-Namen

Die voreingestellte Action beim Zugriff auf eine CMS-Datei obj ist ìndex. Um bei einzelnen Vorlagen andere Actions zu nutzen, kann im gegebenenfalls anzulegenden Model für den betreffenden Contoller die Methode controller_action_name überschrieben werden. Die Action ließe sich beispielsweise aus einem Feld action der CMS-Datei auslesen:

class Product < Obj
  # ...

  def controller_action_name
    self[:action]
    end

  end

Um für alle Instanzen von Obj unabhängig von der Vorlage die auszuführende Action zu berechnen, implementieren Sie controller_action_name in der Datei obj_extensions.rb Ihrer Webanwendung.

Anmerkung zu Klassennamen

Ruby verlangt, dass Klassennamen der CamelCase-Notation folgen, d.h. mit einem Großbuchstaben beginnen. Wir empfehlen dringend, Vorlagen, deren Name nicht dieser Konvention entspricht, umzubenennen. Welche Vorlagen betroffen sind, kann mit dem Rake-Task check:obj_classes ermittelt werden. Danach können die Vorlagen mit dem Tcl-Kommando renameObjClass umbenannt werden.