@Peter Wagemans hierbij je voorbeeldje. Het is zonder bibliotheek, maar ik heb wel een eigen klasse moeten schrijven die FileMaker.PerformScript een beetje extend naar FileMaker.PerformScript ( scriptname, parameter, successCallback, errorCallback ).
een klein voorbeeldje om 2 way interactie te gaan doen tussen FileMaker en Webviewer. Dit maakt gebruikt van callbacks en/of Promises, een manier waarmee in Javascript vaak een extern iets wordt aangeroepen en afhankelijk of het allemaal goed is gegaan (success) of er iets is misgegaan (error) laat je dan iets gebeuren in je Javascript applicatie.
Het komt dus eigenlijk hier op neer: "Filemaker, roep dit script aan, als alles goed is gegaan doe dan dit, als alles fout is gegaan doe dan dat." Een concreet voorbeeld voor bijvoorbeeld een kalendarintegratie is. Indien de gebruiker een event van plek veranderd, roep dan FileMaker aan om dit weg te schrijven in de databank. Indien dit NIET gelukt is (error bij wegschrijven naar record bijvoorbeeld), revert dan de beweging en zet het event weer op de oorspronkelijke plaats zodat de gebruiker ziet dat het niet bewaard is. Dit heet asynchroon programmeren, en is eigenlijk een must om goed te snappen als je wil verder gaan met Javascript.
Als een tijdslijn gebeurt dus eigenlijk dit:
1. Actie in Javascript wordt aangeroepen, met daarbij direct de acties: wat als het goed gaat, wat als het mis gaat.
2. Intern worden deze acties geregistreerd, en Javascript roept FileMaker aan.
3. Javascript code stopt nu met werken, dit is ook GEEN PAUZE, we zijn effectief aan het einde van de code gekomen
4. FileMaker doet zijn ding, en bepaalt of hij aan de Webviewer wil zeggen of het goed of slecht is gelopen.
5. De webviewer voert de stukjes code (geregistreerd in stap 1) uit.
In code:
function onEventDrop(event,revertDrop){//fm.performScript (scriptname, parameter, successCallback, errorCallback )
fm.performScript("Bewaar Event",event,//success callback deze wordt nadien aangeroepen als FileMaker OK terugstuurtfunction( data ){//data is teruggestuurd vanuit filemaker
alert("hoi pipeloi, het is bewaard");},//error callback deze wordt nadien aangeroepen als FileMaker ERROR terugstuurtfunction( error ){//error is teruggestuurd vanuit filemaker
alert("oeps, foutcode in filemaker: "+ code );//revertDrop is een functie die we kregen van FullCalendar om een drop te annuleren, dus roepen we die aan.
revertDrop();}}
In FileMaker:
#BUSINESS LOGICA
#hier kan je heel wat logica doen en bijvoorbeeld proberen weg te schrijven naar een filemaker record
#ALS DEMO: een custom dialog
Show Custom Dialog [ Title: "Keuze"; Message: "Is de record bewaard?"; Default Button: “Yes”, Commit: “No”; Button 2: “No”, Commit: “No” ]
If [ Get ( LastMessageChoice ) = 1 ]
#we pass success to the callback
Set Variable [ $result; Value:JSONSetElement ( "" ;
[ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "success" ; Get ( LastMessageChoice ) = 1 ; JSONString ]
)]
Else If [ Get ( LastMessageChoice ) = 2 ]
#we pass error to the callback
Set Variable [ $result; Value:JSONSetElement ( "" ;
[ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "error" ; Get ( LastMessageChoice ) = 2 ; JSONString ]
)]
End If
#RETURN TO WEBVIEWER
Perform JavaScript in Web Viewer [ Object Name: "wv"; Function Name: "fmcallback"; Parameter 1: $result ]
Zoals je in het voorbeeld zult zien heb ik toch een eigenlijk bibliotheek er in gezet. Heeft me veel bloed zweet en tranen gekost om dit helemaal werkende te krijgen. Ik wil dit gerust wel eens uitleggen hoe het allemaal werkt, maar het komt hier op neer:
Ik heb de FileMaker.performScript een beetje uitgebreid zodat je nu ook een success callback en error callback kunt meegeven. Deze registreer ik, en ik roep dan het filemaker script aan. De parameter pas ik wat aan, want ik voeg er nog een "id" aan toe en dan de parameter zoals doorgegeven.
Bekijk dit als een soort "telefoon lijn waarop filemaker kan terugroepen". Als FileMaker met dit ID de webviewer opnieuw aanroept, weet de webviewer dus om welke actie het ging.
Eigenlijk zegt de webviewer tegen filemaker: hallo, ik ben actie 23 en ik zou willen dat je de record bewaart. Nadien zegt Filemaker tegen de webviewer, actie 23 is helemaal goed gelopen!
En hierbij het voorbeeldje, speel er eens mee, en als er vragen zijn shoot! het is nogal een moeilijk concept, maar éénmaal dat je asynchroon kopieren onder de knie hebt, zou je dit eigenlijk ook in Filemaker willen
Oh ja, voor de diehards: dit werkt ook met Promises (toch op Mac, op Windows niet zeker), dus je kan ook dit doen:
fm.performScript ("getData","").then ((data)=>{//data is scriptresultaat van van getData
data.sort();
fm.performScript ("storeData", data);}).then (( data )=>{//data is script resultaat van storeData//doe hier nog dingen}).catch(( error )=>{//dit is ofwel de error van getData of van storeData, cool he :)
alert(error);})
Vraag
andries
Haai haai,
@Peter Wagemans hierbij je voorbeeldje. Het is zonder bibliotheek, maar ik heb wel een eigen klasse moeten schrijven die FileMaker.PerformScript een beetje extend naar FileMaker.PerformScript ( scriptname, parameter, successCallback, errorCallback ).
een klein voorbeeldje om 2 way interactie te gaan doen tussen FileMaker en Webviewer. Dit maakt gebruikt van callbacks en/of Promises, een manier waarmee in Javascript vaak een extern iets wordt aangeroepen en afhankelijk of het allemaal goed is gegaan (success) of er iets is misgegaan (error) laat je dan iets gebeuren in je Javascript applicatie.
Het komt dus eigenlijk hier op neer: "Filemaker, roep dit script aan, als alles goed is gegaan doe dan dit, als alles fout is gegaan doe dan dat." Een concreet voorbeeld voor bijvoorbeeld een kalendarintegratie is. Indien de gebruiker een event van plek veranderd, roep dan FileMaker aan om dit weg te schrijven in de databank. Indien dit NIET gelukt is (error bij wegschrijven naar record bijvoorbeeld), revert dan de beweging en zet het event weer op de oorspronkelijke plaats zodat de gebruiker ziet dat het niet bewaard is. Dit heet asynchroon programmeren, en is eigenlijk een must om goed te snappen als je wil verder gaan met Javascript.
Als een tijdslijn gebeurt dus eigenlijk dit:
1. Actie in Javascript wordt aangeroepen, met daarbij direct de acties: wat als het goed gaat, wat als het mis gaat.
2. Intern worden deze acties geregistreerd, en Javascript roept FileMaker aan.
3. Javascript code stopt nu met werken, dit is ook GEEN PAUZE, we zijn effectief aan het einde van de code gekomen
4. FileMaker doet zijn ding, en bepaalt of hij aan de Webviewer wil zeggen of het goed of slecht is gelopen.
5. De webviewer voert de stukjes code (geregistreerd in stap 1) uit.
In code:
In FileMaker:
#BUSINESS LOGICA #hier kan je heel wat logica doen en bijvoorbeeld proberen weg te schrijven naar een filemaker record #ALS DEMO: een custom dialog Show Custom Dialog [ Title: "Keuze"; Message: "Is de record bewaard?"; Default Button: “Yes”, Commit: “No”; Button 2: “No”, Commit: “No” ] If [ Get ( LastMessageChoice ) = 1 ] #we pass success to the callback Set Variable [ $result; Value:JSONSetElement ( "" ; [ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "success" ; Get ( LastMessageChoice ) = 1 ; JSONString ] )] Else If [ Get ( LastMessageChoice ) = 2 ] #we pass error to the callback Set Variable [ $result; Value:JSONSetElement ( "" ; [ "id" ; JSONGetElement ( Get ( ScriptParameter ) ; "id" ) ; JSONString ]; [ "error" ; Get ( LastMessageChoice ) = 2 ; JSONString ] )] End If #RETURN TO WEBVIEWER Perform JavaScript in Web Viewer [ Object Name: "wv"; Function Name: "fmcallback"; Parameter 1: $result ]
Zoals je in het voorbeeld zult zien heb ik toch een eigenlijk bibliotheek er in gezet. Heeft me veel bloed zweet en tranen gekost om dit helemaal werkende te krijgen. Ik wil dit gerust wel eens uitleggen hoe het allemaal werkt, maar het komt hier op neer:
Ik heb de FileMaker.performScript een beetje uitgebreid zodat je nu ook een success callback en error callback kunt meegeven. Deze registreer ik, en ik roep dan het filemaker script aan. De parameter pas ik wat aan, want ik voeg er nog een "id" aan toe en dan de parameter zoals doorgegeven.
Bekijk dit als een soort "telefoon lijn waarop filemaker kan terugroepen". Als FileMaker met dit ID de webviewer opnieuw aanroept, weet de webviewer dus om welke actie het ging.
Eigenlijk zegt de webviewer tegen filemaker: hallo, ik ben actie 23 en ik zou willen dat je de record bewaart. Nadien zegt Filemaker tegen de webviewer, actie 23 is helemaal goed gelopen!
En hierbij het voorbeeldje, speel er eens mee, en als er vragen zijn shoot! het is nogal een moeilijk concept, maar éénmaal dat je asynchroon kopieren onder de knie hebt, zou je dit eigenlijk ook in Filemaker willen
Oh ja, voor de diehards: dit werkt ook met Promises (toch op Mac, op Windows niet zeker), dus je kan ook dit doen:
callback.fmp12
Link naar reactie
26 antwoorden op deze vraag
Aanbevolen berichten
Doe mee aan dit gesprek
Je kunt dit nu plaatsen en later registreren. Indien je reeds een account hebt, log dan nu in om het bericht te plaatsen met je account.