When I write a form, I want to define the “transition” attribute value according to a certain condition. For example, if “map” is not empty, “transition = updatexxx”, if it is empty, “transition = createxxx”. What should I do?
You can use variable in transition such as transition="${myTransition}"
be careful!!!
the variables have to be defined in an <always action>
. Here are the docs for reference (i never though i would be saying these words regarding moqui).
Tag name: always-actions
Description : These actions always run when this screen appears in a screen path, including both screen rendering and transition running. One difference between this and the pre-actions element is that this runs before transitions are processed while pre-actions do not. The always-actions also run for all screens in a path while the pre-actions only run for screens that will be rendered.
Thank you for your reply!
Thank you for your reply! I will pay attention to what you said.
FWIW, the transitions can have an actions section…and conditional-response…i.e. if you want to return to different locations. It may be more clear to handle the conditional action inside a single transition.
One thing to remember…Moqui effectively adds in-map=“context” and out-map=“context” to the service-call if it is there instead of an actions block. If using an actions-block, you need to control the in-map and out-map yourself
e.g. from BulkPaymentCheck.xml in SimpleScreens
<transition name="handleSubmit">
<actions>
<if condition="setDelivered"><then>
<service-call name="update#mantle.account.payment.Payment" in-map="context + [statusId:'PmntDelivered']" multi="true"/>
</then>
<else-if condition="setAuthorized">
<service-call name="update#mantle.account.payment.Payment" in-map="context + [statusId:'PmntAuthorized']" multi="true"/>
</else-if><else-if condition="setRefNums">
<service-call name="mantle.account.PaymentServices.assign#BankAccountCheckNumber" in-map="context" multi="true"/>
</else-if><else>
<script><![CDATA[
paymentIds = new StringBuilder()
for (int i = 0; ; i++) {
if ((context.get("_useRowSubmit") == "true" || context.get("_useRowSubmit_" + i) == "true")
&& context.get("_rowSubmit_" + i) != "true") continue
String curKey = "paymentId_" + i
if (context.containsKey(curKey)) {
if (paymentIds.length() > 0) paymentIds.append(",")
paymentIds.append(context.get(curKey))
} else { break }
}
]]></script>
</else></if>
</actions>
<conditional-response url="${ec.web.getWebappRootUrl(false, null)}/fop/apps/${appRoot}/Accounting/Payment/PaymentCheck" url-type="plain">
<condition><expression>checksPdf</expression></condition>
<parameter name="paymentIds" from="paymentIds"/><parameter name="filename" value="PaymentChecks.pdf"/>
</conditional-response>
<conditional-response url="${ec.web.getWebappRootUrl(false, null)}/fop/apps/${appRoot}/Accounting/Payment/PaymentDetail" url-type="plain">
<condition><expression>detailsPdf</expression></condition>
<parameter name="paymentIds" from="paymentIds"/><parameter name="filename" value="PaymentDetails.pdf"/>
</conditional-response>
<default-response url="."/>
</transition>
Also, separately, note that store#xxx would do create#xxx or update#xxx where xxx is an entity name, so you might be able to just replace it with that instead if that is all you are trying to do.
Thank you for your reply!
I will pay attention to what you said.