Eigene Funktionen
Eigene Funktionen können in SPML nicht innerhalb eines Templates/SPML-Datei definiert werden. Jede Funktion in SPML ist ein eigenes Templates/SPML-Datei.
Mit Hilfe von sp:include kann das Funktions-Template aufgerufen werden.
Funktions-Argumente
Dem Funktionsaufruf können Argumente übergeben werden. Dafür wird im Body von sp:include der sp:argument-Tag verwenden
Aufrufender Include:
<sp:include template="!{myfunctions.addition}">
<sp:argument name="myvar1" value="x"/>
<sp:argument name="myobj1" object="system.information.myfield"/>
</sp:include>
Die Abfrage der Übergabe-Argumente in dem Funktions-Template erfolgt über system.arguments
und enthält eine Map mit den Argumenten.
Funktions-Template:
<sp:print name="system.arguments"/>
Rückgabe-Wert
Um Werte einer Funktion zurück zu geben wird der sp:return-Tag verwendet. Dieser beendet sofort die Ausführung der Funktion und liefert den angegebene Wert an den aufrufenden sp:include-Tag zurück. Der Include-Tag kann ein Attribut return
definieren in dem der Name der Variable angegeben wird in dem der Rückgabe-Wert gespeichert werden soll.
Aufrufender Include:
<sp:include template="!{myfunction}" return="c">
<sp:argument name="mode" value="x"/>
<sp:argument name="value" object="myvalue"/>
</sp:include>
result: <sp:print name="c"/>
Funktions-Template
<sp:condition>
<sp:if name="system.arguments.mode" eq="x">
<sp:return expression="${system.arguments.value} + 10"/>
</sp:if>
<sp:else>
<sp:return expression="${system.arguments.value} * 2"/>
</sp:else>
</sp:condition>
Fehlerbehandlung
Zur Fehlerbehandlung gibt es keine zusätzliche Funktionalität. Hierfür wird ebenfalls sp:return verwendet. Das im diesem-Fall entsprechende selbst definierte Result-Objekte zurück liefert.
Aufrufender Include:
<sp:set name="myvalue" value="5"/>
<sp:include template="!{include.target.errorhandling}" return="_result">
<sp:argument name="mode" value="x"/>
<sp:argument name="value" object="myvalue"/>
</sp:include>
<sp:condition>
<sp:if name="_result.success">
result: <sp:print name="_result.value"/>
</sp:if>
<sp:else>
error: <sp:print name="_result.message"/>
</sp:else>
</sp:condition>
Funktions-Template
<sp:map name="_result" action="new"/>
<sp:map name="_result" key="success" action="put" value="true"/>
<sp:condition>
<sp:if name="system.arguments.mode" eq="x">
<sp:map name="_result" key="value" action="put" expression="${system.arguments.value} + 10"/>
</sp:if>
<sp:elseif name="system.arguments.mode" eq="y">
<sp:map name="_result" key="value" action="put" expression="${system.arguments.value} * 2"/>
</sp:elseif>
<sp:else>
<sp:map name="_result" key="success" action="put" value="false"/>
<sp:map name="_result" key="message" action="put" value="invalid mode '${system.arguments.mode}'"/>
</sp:else>
</sp:condition>
<sp:return object="_result"/>