Wie greife ich auf Eigenschaften des übergeordneten Dokuments zu, um sie in untergeordneten Dokumenten zu verwenden?
Frage
Ich bin neu bei Umbraco CMS.Bitte helfen Sie.
Ich habe eine Umbraco-Website, auf der ich einen DocumentType namens „Master“ erstellt habe.Auf der „Master“-Seite können Benutzer ein Ziel und einen Betrag für eine von ihnen durchgeführte Spendenaktion eingeben.Auf der „Master“-Seite habe ich ein Makro, das automatisch die Berechnung durchführt, um einen Prozentsatz zu generieren, der auf der gesamten Website verwendet wird.Das Makro ruft das folgende XSLT auf
<xsl:for-each select="$currentPage/ancestor-or-self::*">
<xsl:variable name="amount" select="* [@alias = 'FundraisingCurrentAmount']"/>
<xsl:variable name="goal" select="* [@alias = 'FundraisingGoal']"/>
<xsl:variable name="percentage" select="$amount div $goal * 100"/>
<xsl:value-of select="$percentage"/>
</xsl:for-each>
Das funktioniert, aber ich gehe davon aus, dass es auch zwei NaN-Ergebnisse zurückgibt, da es sich um ein „Für-jedes“ handelt.Wie kann ich das (a) sauberer und (b) so umschreiben, dass es besser funktioniert?
Ich verstehe ASP.NET Webforms. Ein Vergleich damit wäre hilfreich.
Schätzen Sie die Hilfe.
Lösung
In Umbraco können Sie sogenannte rekursive Werte haben.Hierbei handelt es sich grundsätzlich um Seitenwerte, die die Knotenhierarchie durchsuchen, bis ein Wert gefunden wird.
Diese können auch an Makros übergeben werden.
Wenn Sie also in Ihrem Fall davon ausgehen, dass Ihr Makro „charityTotaliser“ heißt, könnten Sie den folgenden Makroaufruf verwenden:
<umbraco:macro alias="charityTotaliser" ammount="[$FundraisingCurrentAmount]" goal="[$FundraisingGoal]"runat="server"/>
Das $ gibt an, dass der Wert rekursiv ist.
Das XSLT würde etwa so aussehen (nicht getestet, nur ein Beispiel):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:Stylesheet [ <!ENTITY nbsp " "> ]>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxml="urn:schemas-microsoft-com:xslt"
xmlns:umbraco.library="urn:umbraco.library"
xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath"
exclude-result-prefixes="msxml umbraco.library Exslt.ExsltMath">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="currentPage"/>
<!-- Macro parameters -->
<xsl:variable name="FundraisingCurrentAmount" select="/macro/FundraisingCurrentAmount"/>
<xsl:variable name="FundraisingGoal" select="/macro/FundraisingGoal"/>
<xsl:template match="/">
<xsl:value-of select="$FundraisingCurrentAmount div $FundraisingGoal * 100"/>
</xsl:template>
</xsl:stylesheet>
Bei Bedarf können Sie auch zu übergebende Fallback-Werte angeben (falls der rekursive Wert nicht gefunden werden kann):
<umbraco:macro alias="charityTotaliser" ammount="[$FundraisingCurrentAmount], [#FallBackAmmount], 1234" goal="[$FundraisingGoal]"runat="server"/>
Weitere Informationen zu Makroparametern finden Sie hier Dokumentation
Andere Tipps
Ich bin nur mit XSLT vertraut. Von diesem Standpunkt aus empfehle ich daher, eine Qualifikation für Ihre For-Each-Auswahlanweisung hinzuzufügen. Ich habe die XML nicht gesehen, aber so etwas wie:
<xsl:for-each select="$currentPage/ancestor-or-self::*[FundraisingGoal>0]">
.
.
.
</xsl:for-each>
Es sollte nur durch diejenigen gehen, die eine Zielbetrag haben, von der durch die geteilt werden kann.
Ich bin mir nicht sicher, ob Sie danach suchen, aber ich hoffe, das hilft.