Hilfe:Infobox Module

Aus Star Citizen Wiki

Wie in Hilfe:Module beschrieben werden Module hauptsächlich für die Generierung von Infoboxen erstellt. Im folgenden bauen wir beispielhaft eine Vorlage mit Modul für Beiträge aus dem Spectrum.

Erstellen der Vorlage

Ein Modul sollte nie durch einen Nutzer selbst aufgerufen werden müssen, stattdessen rufen wir ein Modul immer über eine gleichnamige Vorlage auf.

In unsere Fall erstellen wir die Seite Vorlage:Spectrum Beitrag mit folgendem Inhalt:

<includeonly><!--
-->{{#invoke:Spectrum Beitrag|main}}<!--
--></includeonly><noinclude>
{{Dokumentation}}
[[Kategorie:Vorlage]]
</noinclude>

Die Tags <includeonly>...</includeonly> und <noinclude>...</noinclude> steuern welche Inhalt von der Vorlage auf anderen Seiten angezeigt werden. Dieses Konzept ist im Wiki als Transklusion bekannt.

Dabei sagt includeonly, dass Inhalte zwischen den Tags ausschließlich auf anderen Seiten angezeigt werden, und noinclude besagt, dass Inhalte zwischen den Tags nicht auf anderen Seiten angezeigt werden dürfen.

Der Part {{#invoke:Spectrum Beitrag|main}} ruft die Funktion main in dem noch zu erstellenden Modul Modul:Spectrum Beitrag auf.

Anschließend binden wir die Vorlage:Dokumentation ein, und kategorisieren die Vorlage in die Kategorie Vorlage ein.

Da {{Dokumentation}} und [[Kategorie:Vorlage]] innerhalb von noinclude stehen, werden diese Inhalte nicht auf anderen Seiten angezeigt.

Folgende Werte soll der Nutzer unserer Vorlage hinzufügen können:

  • Autor
  • Thema
  • Veröffentlichungsdatum
  • Spectrum Url

Entsprechend würde der Aufruf unserer Vorlage wie folgt aussehen:

{{Spectrum Beitrag
|Autor=
|Titel=
|Thema=
|Veröffentlichungsdatum=
|Spectrum Url=
}}

Erstellen des Moduls

Nun erstellen wir unser Modul, welches sich zum die auszugebende Infobox kümmert. Folgenden Inhalt fügen wir unter Modul:Spectrum Beitrag ein:

-- Der Name unseres Moduls
local SpectrumBeitrag = {}

-- Die folgenden drei Zeilen "forcieren", dass wir objekt orientiert programmieren müssen
local metatable = {}
local methodtable = {}

metatable.__index = methodtable

-- Hier binden wir den Inhalt anderer Modulseiten ein. In userem Fall binden wir das Modul:Infobox ein,
-- welches die Funktionalität zur Erstellung einer Infobox liefert
local infobox = require( 'Module:Infobox' )


-- Diese Methode wird unsere spätere Infobox erstellen.
-- Das 'self' in der Klammer referenziert hierbei unser aktuelles 'SpectrumBeitrag'-Objekt.
-- Über 'self' können wir auf die anderen Methoden und Variablen in unserem Objekt zugreifen

function methodtable.getInfoBox( self )
    -- Wir rufen die Methode 'create' auf dem Modul:Infobox auf
    -- Werte in den geschweiften Klammern steuern das Verhalten der Infobox

    -- Durch 'local box' erzeugen wir eine Variable mit dem Namen 'box', sie enthält alle Methoden zur Erstellung unserer Infobox
    local box = infobox.create( {
        -- Die CSS Klasse 'floatright' lässt die Infobox auf der rechten Seite anzeigen
        bodyClass = 'floatright',
        -- Zellen ohne Inhalt werden später nicht in der Tabelle angezeigt,
        -- dies ist nützlich wenn wir nicht für jedes Argument (z.B. 'Titel') prüfen wollen, ob der Nutzer etwas eingetragen hat
        removeEmpty = true,
    } )

    -- Zellen in der Infobox werden in der Reihenfolge angezeigt, in der sie hinzugefügt wurden.
    -- Daher fügen wir zuerst der Infobox ein Bild hinzu
    box:addImage( self.frameArgs[ 'Bild' ] )

    -- self.frameArgs enthält die Werte, die der Nutzer der Vorlage hinzugefügt hat.
    -- In unserem Fall ist dies 'Autor', 'Titel', 'Thema', 'Veröffentlichungsdatum', und 'Spectrum Url'

    -- Der Titel einer Infobox wird prominent unterhalb des Bilds angezeigt
	box:addTitle( self.frameArgs[ 'Titel' ] )

    -- Ein 'Header' ist eine kleinere Überschrift in einer Infobox, der thematische Inhalte voneinander trennt
    -- In diesem Fall zeigen wir den Text 'Ein Spectrum Beitrag von AUTOR' an,
    -- dabei verwenden wir den durch den Benutzer eingegebenen Autor
    box:addHeader( 'Ein Spectrum Beitrag von ' .. self.frameArgs[ 'Autor' ] )

    -- Nun wollen wir die Infobox mit dem eigentlichen Inhalt befüllen
    -- Wir fügen der Infobox dabei "Reihen" (Row) hinzu.
    -- In diesem Fall wollen wir zwei Reihen nebeneinander anzeigen und nutzen dafür 'col2'
    box:addRow( 'Thema', self.frameArgs[ 'Thema' ], nil, 'col2' )
    box:addRow( 'Veröffentlichung', self.frameArgs[ 'Veröffentlichungsdatum' ], nil, 'col2' )

    -- Nun prüfen wir explizit, ob der Benutzer etwas in das Feld 'Spectrum Url' eingefügt hat
    -- Dies geschieht über '~=' (was ungleich bedeutet) und 'nil' (was für 'leer' steht)
    if self.frameArgs[ 'Spectrum Url' ] ~= nil then
        -- Wenn also der Nutzer etwas in das Feld 'Spectrum Url' eingetragen hat, dann

        -- Fügen wir der Infobox eine neuen Abschnitt mit Namen 'Quelle' hinzu
        box:addHeader( 'Quelle' )
        -- Und fügen den Link als einzelne Zeile ein
    	box:addRow( 'Geboren', self.frameArgs[ 'Spectrum Url' ] )
    end

    -- Am Ende geben wir die gesamte Infobox als Zeichenkette aus (dies ändert alles was wir gebaut haben zu HTML Code)
    return tostring( box )
end


-- Diese Methode extrahiert die vom Nutzer eingegebenen Daten, und speichert diese auf 'self.frameArgs'
function methodtable.setFrame( self, frame )
    self.currentFrame = frame
    self.frameArgs = require( 'Module:Arguments' ).getArgs( frame )
end


-- Diese Methode erstellt uns ein neues Objekt von SpectrumBeitrag
function SpectrumBeitrag.new( self )
    local instance = {}

    setmetatable( instance, metatable )

    return instance
end


-- Diese Methode wird durch usnere Vorlage aufgerufen
function SpectrumBeitrag.main( frame )
    -- Wir erstellen ein neues Objekt von unserem SpectrumBeitrag
    -- Dabei rufen wir die Methode 'new' auf. Der Doppelpunkt (:) sorgt dafür, dass 'self' mit unserem Objekt befüllt wird
    local instance = SpectrumBeitrag:new()

    -- Wir rufen die Methode 'setFrame' auf, und übergeben damit die Daten die der Benutzer eingegeben hat
    -- Auch hier sorgt der : wieder dafür, dass 'self' in der Methode 'setFrame' befüllt ist
    instance:setFrame( frame )

    -- Wir rufen die Methode 'getInfoBox()' auf, und zeigen das generierte HTML an
    return instance:getInfoBox()
end


return SpectrumBeitrag

Unsere Vorlage:Spectrum Beitrag ruft also die Methode main des neu erstellen Modul:Spectrum Beitrag auf. Diese Methode extrahiert die Eingaben des Nutzers und erstellt letztentlich die am Ende angezeigte Infobox.


Automatische Kategorisierung

Verwenden wir nun die Vorlage:Spectrum Beitrag wird uns eine entsprechende Infobox generiert. Allerdings werden diese Seiten keiner Kategorie hinzugefügt.

Wir ändern die Methode main wie folgt ab:

-- Diese Methode wird durch usnere Vorlage aufgerufen
function SpectrumBeitrag.main( frame )
    -- [Vorheriger Inhalt] --

    -- Neben der Infobox fürgen wir nun noch die Kategorie 'Spectrum Beitrag' hinzu
    return instance:getInfoBox() .. '[[Kategorie:Spectrum Beitrag]]'
end
Cookies helfen uns bei der Bereitstellung dieses Wikis. Durch die Nutzung des Star Citizen Wiki erklärst du dich damit einverstanden, dass wir Cookies speichern.