Re: [Xsltforms-support] Cancelling loop/action
Brought to you by:
alain-couthures
From: Steven P. <ste...@cw...> - 2021-02-04 21:25:24
|
What error do you get? Hint, use: <submission resource="..." ...> <action ev:event="xforms-submit-error"> <message>Submission error. error-type: <output value="event('error-type')"/> error-message: <output value="event('error-message')"/> response-status-code: <output value="event('response-status-code')"/> response-reason-phrase: <output value="event('response-reason-phrase')"/> resource-uri: <output value="event('resource-uri')"/> </message> </action> </submission> Steven On Thursday 04 February 2021 19:23:25 (+01:00), Josselin Morvan wrote: Hi Steven, hi all, Unfortunately, when I use the last method (submission/action[@ev:event="xforms-submit-done"]/send) I get an error with the second submission. I don’t know why I have this error as everything seems OK and it works with the "iteration method" or with the "@while method (if all the required fields are filled of course for this last one). Actually it is an old form that I’m reviewing with the release of xsltforms 1.5 and I remember now why I was using the @while attribute. Do you have any idea why I get an error when I’m looping with xforms-submit-done ? Tomorrow I’ll try with dispatch and I’ll make a sample form to show you. Thanks a lot for your help, Best, Josselin Envoyé de mon iPhone Le 4 févr. 2021 à 15:34, Josselin Morvan <mor...@gm...> a écrit : Hi Steven, Thank you very much for your answer. I don't know why I didn’t think of it before, as I use this method with another form… but not for a loop. It’s simple and efficient! Just for my personal understanding, do you know (or anyone else) how works ev:defaultAction and if it’s fully implemented with XSLTforms? Thanks a lot, Best, Josselin. Le 4 févr. 2021 à 12:12, Steven Pemberton <ste...@cw...> a écrit : I was initially too lazy to check if a handler for submit-done was allowed to initiate a submission using the same submission element, but then my shame got the better of me and I looked it up. It is, so this is better (and I also added the necessary if= that I forgot to add): <submission id="submitNewEntity" blabla> <action ev:event="xforms-submit-done"> <send if="instance('xprEntities')/xpr:entity[@localType = 'new']" submission="submitNewEntity"/> </action> </submission> <trigger> <label>save</label> <action ev:event="DOMActivate"> <send submission="submitNewEntity"/> </action> </trigger> Steven On Thursday 04 February 2021 11:58:49 (+01:00), Steven Pemberton wrote: One way would be to submit just one, and let the xforms-submit-done event handler initiate the next. <submission id="submitNewEntity" blabla> <action ev:event="xforms-submit-done"> <dispatch name="NEXT" targetid="M"/> </action> </submission> <action ev:event="NEXT"> <send submission="submitNewEntity"/> </action> <trigger> <label>save</label> <action ev:event="DOMActivate"> <send submission="submitNewEntity"/> </action> </trigger> Steven On Wednesday 03 February 2021 15:33:21 (+01:00), Josselin Morvan wrote: Hi all, With one of my forms I have a « submission loop » and I try, when I get an « xforms-submit-error », to stop the loop, do you know how we can do that ?. Basically, my form concerns a list of person. I can add informations about the existing ones and, of course, add new persons. Each « new person » is saved individually, and for this I use a loop : <xf:trigger> <xf:label>save</xf:label> <xf:action ev:event="DOMActivate" while="instance('xprEntities')/xpr:entity[@localType = 'new']"> <xf:send submission="submitNewEntity"/> </xf:action> </xf:trigger> When the submission is done, I update my instance with my server’s response and I change the @localType value to ’stored’, and then the loop submit the next entity. <xf:submission mode="synchronous" id="submitNewEntity" ref="instance('xprEntities')/xpr:entity[@localType='new'][1]/eac:eac-cpf" resource="/xpr/biographies/put" method="put" replace="none"> <xf:action ev:event="xforms-submit-done"> <xf:message level="modal">Entity Saved!</xf:message> <xf:setvalue ref="instance('xprEntities')/xpr:entity[@xml:id=normalize-space(event('response-body')//xpr:xforms-id)]/@xml:id" value="event('response-body')//xpr:id"/> <xf:setvalue ref="instance('xprEntities')/xpr:entity[@xml:id=normalize-space(event('response-body')//xpr:id)]/@localType" value="'stored'"/> <xf:delete nodeset="instance('xprEntities')/xpr:entity[@xml:id=normalize-space(event('response-body')//xpr:id)]/eac:eac-cpf"/> </xf:action> <xf:action ev:event="xforms-submit-error"> <xf:message level="modal">Error</xf:message> </xf:action> </xf:submission> Here is my issue, when an xforms-submit-error occurs, by example because the name is required and is not filled, I’d like to stop the submission loop. For now, it is looping endlessly, as the @localType of current entity won’t be modified until the submission will be done… I tried to use ev:defaultAction="cancel" with the xf:action in the save trigger but it doesn’t work and I think I don’t use it properly! <xf:trigger> <xf:label>save</xf:label> <xf:action ev:event="DOMActivate" while="instance('xprEntities')/xpr:entity[@localType = 'new']"> <xf:action ev:event="xforms-submit-error" ev:defaultAction="cancel"> <xf:send submission="submitNewEntity"/> </xf:action> </xf:action> </xf:trigger> (I also tried this on the xf:send without success). Do you have any idea to achieve this or how to use ev:defaultAction ? I know I could add an incrementation system in my loop, (adding +1 to an iterator instance when xforms-submit-done or xforms-submit-error occurs, and submitting the next entity with position() = instance(‘iterator’)), but I’d like to avoid this way of proceeding. Thanks a lot for you help, best, Josselin. -- -- |