<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
Wo:
- Name: Name der Makrovariablen. Es ist kein Ausdruck. Es folgt die gleiche Syntax wie Top-Level-Variablen Referenzen, wie myMacro oder my-Makro. Es kann jedoch auch als Zeichenfolgenliteral geschrieben werden. ist nützlich, wenn der Makroname Zeichen enthält, die in einer Kennung nicht angegeben werden können, z. B. < #macro "foo ~ bar"> .... Hinweis dass dieses String-Literal keine Interpolationen erweitert (wie "$ {foo}").
- param1, param2, ... etc .: Der Name der lokalen Variablen speichert die Parameterwerte (nicht Ausdruck), optional gefolgt von = und dem Standardwert (das ist ein Ausdruck). Der Standardwert kann sogar ein anderer Parameter sein, zum Beispiel < #macro Abschnitt titel label = Titel>. Der Parametername verwendet die gleiche Syntax wie die Referenzen der obersten Ebene, daher gelten die gleichen Funktionen und Einschränkungen.
- paramN, der letzte Parameter kann optional 3 nachlaufende Punkte (...) haben, was darauf hinweist, dass das Makro eine variable Anzahl von Parametern annimmt und die Parameter, die nicht mit anderen Parametern übereinstimmen, sind letzter Parameter (auch Catch-All-Parameter genannt). Wenn das Makro mit benannten Parametern aufgerufen wird, ist paramN ein Hash, der alle nicht deklarierten Schlüssel/Wert-Paare enthält, die an das Makro übergeben werden. Wenn das Makro unter Verwendung der positionalen Parameter aufgerufen wird, ist paramN die Sequenz des zusätzlichen Parameters Werte. (Innerhalb der Makro, um herauszufinden, welche der Fall war, kann man Verwendung myCatchAllParam? Is_sequence.)
Deshalb, wie Sie Makro keine Einschränkung N Parameter nehmen hat sehen können.
Diese Struktur erstellt eine Makrovariable (im aktuellen Namespace, wenn Sie das Namespace-Feature kennen). Wenn Sie neu in Makros und user-defined directives sind, sollten Sie das Tutorial über benutzerdefinierte Anweisungen lesen.
Die Makrovariable speichert ein Vorlagenfragment (Makrodefinitionskörper), das als benutzerdefinierte Anweisung verwendet werden kann. Die Variable speichert außerdem den Namen zulässiger Parameter für die benutzerdefinierte Anweisung. Sie müssen für alle diese Parameter einen Wert angeben, wenn Sie die Variable als directive verwenden, außer für Parameter mit einem Standardwert. Der Standardwert wird nur dann verwendet, wenn Sie beim Aufruf des Makros keinen Wert für den Parameter angeben.
Die Variable wird am Anfang der Vorlage erstellt; Es ist nicht wichtig, wo die Makro-Direktive in der Vorlage platziert wird.
Beispiel: Macro mit Parametern:
<#macro test foo bar baaz>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<#-- call the macro: -->
<@test foo="a" bar="b" baaz=5*5-2/>
Output:
Test text, and the params: a, b, 23
Beispiel: Macro mit Parametern und Standardparameterwerte:
<#macro test foo bar="Bar" baaz=-1>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<@test foo="a" bar="b" baaz=5*5-2/>
<@test foo="a" bar="b"/>
<@test foo="a" baaz=5*5-2/>
<@test foo="a"/>
Output
:
Test text, and the params: a, b, 23
Test text, and the params: a, b, -1
Test text, and the params: a, Bar, 23
Test text, and the params: a, Bar, -1
jedoch über den letzten Teil Ihrer Frage gibt es eine explanation:
Der NULL-Verweis ist von Entwurf ein Fehler in Freemarker. Einen benutzerdefinierten Nullwert zu definieren - was eine Zeichenkette ist - ist aus den von Ihnen genannten Gründen keine gute Idee. Die folgenden Konstrukte sollten stattdessen verwendet werden:
- Makro- und Funktionsparameter einen Standardwert haben können, so dass die Anrufer können sie
- Um zu überprüfen, weglassen, wenn eine Variable null ist, sollten Sie die Verwendung ?? operator: < #if (name ??)>
- Wenn Sie eine Variable verwenden, die null sein kann, sollten Sie das! Operator einen Standardwert angeben: Name "No Name"
- Um zu überprüfen, ob eine Sequenz (oder eine Zeichenfolge) leer ist, verwenden Sie die has_content builtin: < #if (? Namen has_content)>
Sie können eine leere Sequenz als Standardparameterwert in einem Makro angeben und einfach testen, ob sie leer ist.
Ich schätze Sie sich die Zeit zu beantworten, aber ich spreche über Makros in Freemarker –
@AnnMathews Ja, ich geändert, dass, hoffe, es wird für Sie hilfreich sein – Ssein
Aber wenn ich variable Parameter, wie 'paramN' in Ihrer Antwort habe, muss ich einen Wert dafür geben? Oder kann ich es in einigen Fällen ignorieren? –