Einbinden anderer Seiten
Die (:include:)
-Direktive ermöglicht das Einbinden (oder die "Transclusion") des Inhaltes anderer Wikiseiten in die aktuelle Wikiseite. Alle der unten aufgeführten Direktiven fügen nur den reinen Wiki-(Quell-)-Text ein. Insbesondere werden alle Seiten-Verweise der eingebundenen Seite auf die aktuelle Gruppe der aktuellen Seite bezogen, wenn nichts anderes angegeben ist.
Syntax
Die grundlegende Syntax ist
(:include SeitenName:)
bindet die ganze Seite mit dem SeitennamenSeitenName
aus der gleichen Gruppe ein.{Gruppe/SeitenName$:STVar}
fügt eine Seiten-Text-Variable aus einer Seite ein, Gruppe und SeitenName sind Optionen.
Die vollständige Syntax ist
Parameter
Die Direktive kann mehrere Namen-Parameter mit oder ohne Anker und mehrere Vorlagenvariablen-Parameter enthalten.
Benannte Seiten
(:include SeitenName:) (:include Gruppe.SeitenName:) (:include Seite1 Seite2 Gruppe1.Seite3 Gruppe2.Seite4:)
Bindet den kompletten Text einer anderen Wikiseite in die aktuelle Seite ein. Mehrere Seiten dürfen angegeben werden, aber nur die erste gefundene Seite wird eingebunden.
Sie können das obige Verhalten nutzen, um eine Fehlermeldung anzuzeigen, wenn ein Einbinden scheitert. Legen Sie eine Seite an, z. B. Site.EinbindenGescheitert
, die die Fehlermeldung enthält. Sie können jeden Seitennamen wählen. In der Include-Direktive hängen Sie dann diese Seite an das Ende der Seitenliste an:
(:include Seite1 Seite2 Seite3 Site.EinbindenGescheitert:)
Ein etwas komplexerer Ansatz wird in der 'talk'-Seite beschrieben (auf englisch).
#von#bis-Anker
(:include SeitenName#von#bis:) | bindet Zeilen von SeitenName zwischen den [[#von]] - und [[#bis]] -Ankern ein |
(:include SeitenName#von#:) | bindet alle Zeilen nach [[#von]] bis zum Seitenende ein |
(:include SeitenName##bis:) | bindet alle Zeilen vom Seitenanfang an bis [[#bis]] ein |
(:include SeitenName#von:) | bindet alles zwischen [[#von]] und dem nächsten Anker ein |
(:include SeitenName#:) | bindet alles vom Seitenanfang bis zum ersten Anker ein |
[[#start]]Etwas Text in der ersten Zeile.
Etwas Text in der letzten Zeile. [[#ende]]
(:include SeitenName#start:)
eingebunden wird, nur den Text der ersten Zeile enthalten, nicht den Text der zweiten Zeile.
(:include Seite1 Seite2 #von#bis:)
[[#von]]
und dem [[#bis]]
ein
(:include Seite1#von1#bis1 Seite2#von2#bis2:)
[[#von1]]
und [[#bis1]]
) oder Seite2 (zwischen [[#von2]]
und [[#bis2]]
) ein.
#von
- und #bis
-Ankern, obwohl es so nicht vorgesehen war. Neuere Versionen erlauben kein Whitespace mehr. Um das ausgenutze Fehlverhalten wieder zu reaktivieren, setzen Sie dies in config.php oder farmconfig.php:
Markup('includeanchors', '<include', '/(\\(:include.*?#\\w+)\\s+(#\\w+)/', '$1$2');
Lines=von..bis
(:include SeitenName lines=10:)
(:include SeitenName lines=5..10:)
(:include SeitenName lines=5..:)
(:include Seite1 Seite2 Seite3 lines=1..5:)
Self=
(:include SeitenName self=0:)
self
kann 0
oder 1
sein. Er gibt der Include-Direktive an, ob es erlaubt ist, die aktuelle Seite einzubinden. Das ist nützlich, wenn SeitenName
ein Variablenverweis wie {$Name}
ist und Sie verhindern wollen, dass die aktuelle Seite eingebunden wird.
Seiten-Text-Variablen
{Gruppe/SeitenName$:STVar}
- einer Definitionsliste (
:Begriff:Beschreibung
), - einfacher Doppelpunkttrenner (
Begriff:Beschreibung
) - oder spezieller Markups (
(:Begriff:Beschreibung:)
).
Basepage=
(:include SeitenName basepage=BasisSeitenName:)
Wenn basepage=
übergeben wird, werden alle relativen Verweise und alle Seitenvariablen relativ zur 'basepage' interpretiert.
Wenn also jemand die Seite VorlagenName
anlegt mit
Name: {$:Name} Addresse: {$:Addresse},
wird die Direktive
(:include VorlagenName basepage=SeitenName:)
den Inhalt von VorlagenName
holen, dabei aber alle Seitenvariablen und Verweise als relativ zu SeitenName
behandeln.
Insbesondere werden die Werte von {$:Name}
und {$:Addresse}
von SeitenName
geholt, auch Dinge wie {$Title}
und {$LastModifiedBy}
würden hier funktionieren.
Einsatz von Basepage
Die vornehmliche Aufgabe von Basepage ist, das Einbinden von Seiten auf eine Weise zu erlauben, die das Verhalten von 2.1.x nachahmt, wo Seitenvariablen und Links relativ zur aktuellen Seite interpretiert wurden. Das machen Sie mit:
(:include SomeOtherPage basepage='' :)
-oder-
(:include SomeOtherPage basepage={*$FullName} :)
Das erlaubt auch GroupHeader und GroupFooter, ihre Seitenvariablen relativ zur (umrahmten) aktuellen Seite zu sehen (anstatt relativ zum GroupHeader oder GroupFooter):
## PmWikis Standard-$GroupHeaderFmt
-Einstellung$GroupHeaderFmt
= '(:include {$Group}.GroupHeader self=0 basepage={*$FullName}:)(:nl:)';
Andernfalls würde der Einsatz von {$Name}
innerhalb eines GroupHeaders eben 'GroupHeader' anzeigen und nicht den Namen der aktuellen Seite.
Der basepage=
-Parameter ist generell genug, dass er auch als Vorlagen-Maschine benutzt werden kann,
sodass wir eine Vorlagenseite hernehmen können, die Variablen enthält, welche dann mit den Werten aus einer anderen Seite gefüllt werden:
(:include VorlagenSeite basepage=DatenSeite :)
Und natürlich kann eine einzelne Vorlagenseite mehrere Vorlagen, begrenzt durch Anker, enthalten, so dass wir am Ende bei einer Syntax landen, die der von Seitenlistenvorlagen auf unheimliche Weise[1] ähnlich ist:
(:include VorlagenSeite#abc basepage=DatenSeite :)
Passend dazu kann VorlagenSeite eine Syntax wie diese benutzen:
[[#abc]] ... hier der Vorlagenkrimskrams ... [[#abcend]]
und es ist möglich die VorlagenSeite als Vorlage zu nutzen, ohne dass sie insgesamt angezeigt wird – gerade so wie wir es bei Site.PageListTemplates machen.
(:include:)
, um seine Vorlagen zu holen. Aber es bleibt eine nützlich Parallele.
Angabe von Variablen als Parameter: Nutze Abschnitte als Vorlage
Man kann auch Variablenwerte in der Include-Direktive angeben und Bezüge zu den Variablen der Vorlage herstellen mit dem {$$variable1}
-Format:
(:include VorlagenSeite variable1="wert1" variable2="wert2":)
Das setzt voraus, dass eine Site $EnableRelativePageVars
aktiviert hat, was seit PmWiki 2.2.0 angeraten wird – es war aber nicht Standard in Version 2.2.8 und früheren wegen der Kompatibilität mit Versionen 1.x.x.
Ich könnte zum Beispiel auf meiner Einfügeseite Folgendes haben:
[[#ivars]] Hi, {$$Name}, wie geht es dir heute? [[#ivarsend]] |
Wenn man dann den obigen Abschnitt einfügt (der Abschnitt ist erreichbar durch den Abschnitt {$FullName}#ivars
), ergibt sich dieses Verhalten:
(:include {$FullName}#ivars Name=Sam:) | Hi, Sam, wie geht es dir heute? |
Wenn ein Wert Leerzeichen enthält, gehört er in Anführungszeichen.
(:include {$FullName}#ivars Name="mein Freund":) | Hi, mein Freund, wie geht es dir heute? |
Siehe auch $EnableUndefinedTemplateVars
.
Eine besondere Anweisung
(:nl:)
wirkt wie ein Zeilenvorschub im Quelltext, doch nur, wenn an der Stelle noch keiner ist.
Der Zweck von (:nl:)
ist, Konstruktionen wie "(:include Page1:)(:nl:)(:include Page2:)
" zu ermöglichen und dabei sicherzustellen, dass die erste Zeile von Page2 getrennt von der letzten Zeile in Page1 behandelt wird, ohne dabei unbeabsichtigt eine Leerzeile zu erzeugen.
Mehr Informationen in dieser Diskussion und dieser Diskussion (englisch).
(:nl:)
ist nicht vorgesehen, einen Zeilenvorschub in der Ausgabe zu erzeugen!
Parameterbezüge
Alle an eine Include-Direktive übergebenen Parameter (ob es nun Schlüsselwörter sind oder nicht) sind innerhalb der eingebunden Seite erreichbar als eine besondere {$$...}
-Variable gleichen Namens. Dieses Feature kann ausgenutzt werden, um Extrainformationen zu liefern, wenn die eingebundene Seite angezeigt wird.
Anmerkungen
- man kann auch
(:include Meine/Seite#meinAnker lines=4:)
schreiben, womit vier Zeilen, beginnend mit und einschließlich der Zeile mit dem Anker[[#meinAnker]]
, eingebunden werden.
Anmerkung zum Stil
Im Standard können eingebundene Seiten oder Zeilen nicht vom anderen Text unterschieden werden. Um einen visuellen Hinweis darauf zu geben, dass dieser Text besonders ist, kann man Wiki Styles anwenden. Zum Beispiel:
%define=leftborder border-left="2px solid #88f" margin-left="2px" padding="1px 0 3px 10px"% Was ist PmWiki? >>leftborder<< (:include PmWikiDe.PmWiki lines=8..10:) >><< ''Einen schönen Tag noch!'' |
Was ist PmWiki? PmWiki ist ein wiki-basiertes System für die gemeinsame Erstellung und Pflege von Webseiten.
PmWiki-Seiten sehen genauso aus wie normale Webseiten, bis auf den kleinen Unterschied, dass sie einen "Bearbeiten"-Link aufweisen. Das macht es einfach, bestehende Seiten zu verändern bzw. neue Seiten zu erstellen. Hierzu gibt es einige Grundlagen der Bearbeitung. Man muss nichts über HTML oder CSS wissen bzw. es benutzen. Das Bearbeiten von Seiten kann jedermann ermöglicht werden, es kann aber auch auf nur eine kleine Gruppe von Autoren beschränkt werden. Einen schönen Tag noch! |
Anmerkungen zum Einsatz von bedingten Auszeichnungen
Die (:include:)
-Direktive wird erst ausgeführt, nachdem bedingte Textauszeichnungen ausgewertet wurden.
Deshalb kann man eine Seite als Teil einer Bedingung einbinden:
(:if eine Bedingung:)(:include EineSeite#abschnitt:)(:if:)
Aber (:include EineSeite#abschnitt:)
prüft nicht, ob [[#abschnitt]]
selbst Teil einer bedingten Textauszeichnung wie
(:if eine Bedingung:)[[#abschnitt]]...[[#abschnittend]](:ifend:)
ist. (:include EineSeite#abschnitt:)
ignoriert eine solche Bedingung.
Wenn man in eingebundenen Seiten Variablen testet, kann der Kontext (Quelle oder Ziel) nützlich sein. Siehe Spezielle Verweise wegen der Details.
Siehe auch
- Seiten-Text-Variablen Beschreibt die Verwendung von im Text der Seiten verwendeten Variablen
- Cookbook:IncludeUrl
FAQ
Wieviele Include-Direktiven kann es höchstens in einer Seite geben.
$MaxIncludes
)
Im Standard limitiert PmWiki die Zahl der Include-Direktiven für eine Seite auf 50, um unendliche Schleifen zu verhindern – auch andere Situationen, die die Recourcen des Servers aufessen könnten. Zwei der eingebundenen Seiten sind GroupHeader und GroupFooter, bleiben noch die 48. Die Grenze kann von einem Wiki-Administrator über die Variable $MaxIncludes
hochgesetzt werden.
Gibt es eine Möglichkeit, Einbindungen aus einer Gruppe von Seiten zu machen, ohne exakte Namen anzugeben, z. B. zwischen Anker X und Y von allen Seiten namens IFClass-* ?
Das kann man mit Seitenlisten erreichen.
Es scheint ein Problem mit der Anzeige zu geben, wenn eine Seite die (:title:)-Direktive enthält.
In der Standard-Installation überschreibt der letzte Titel in der Seite alle vorangegangenen Direktiven. Man kann seine (:title :)
-Directive an das Ende der Seite setzen, nach allen Include-Direktiven, siehe auch $EnablePageTitlePriority
.
Welchen Test mache ich, um zu sehen, ob die Seite ein Teil einer anderen Seite ist?
(:if ! name {$FullName}:) %comment% Der Name dieser Seite ist nicht der Gleiche wie der Name der Seite, aus der dieser Text herausgezogen wurde. ->[[{$FullName}#anchor | more ...]] (:ifend:) |
Gibt es irgendeinen Weg, (Kapitel von) Seiten, die geschützt sind (authuser.php), woanders einzubinden.
Sie können Ihr Ziel andersherum erreichen: setzen Sie die öffentlichen Abschnitte in eine öffentliche Seite (passwdread=@nopass or @_site_read) und binden Sie diese Abschnitte sowohl in die geschützte Seite als auch in die ungeschützte Seite ein.
Beachten Sie, dass es nachdrücklich empfohlen wird, NICHT zu versuchen, in einer ungeschützten Seite sensitive Inhalte innerhalb einer bedingten Auszeichnung zu verbergen.
Übersetzung von PmWiki.IncludeOtherPages, Originalseite auf PmWikiDe.IncludeOtherPages — Rückverweise
Zuletzt geändert: | PmWikiDe.IncludeOtherPages | am 17.03.2022 |
PmWiki.IncludeOtherPages | am 13.03.2024 |