Ga naar inhoud
  • 0

Webviewer - FileMaker 19 interactie


andries

Vraag

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:

function onEventDrop(event,revertDrop){
  
    //fm.performScript (scriptname, parameter, successCallback, errorCallback )
    fm.performScript("Bewaar Event",event,
       //success callback deze wordt nadien aangeroepen als FileMaker OK terugstuurt
       function ( data ) {
            //data is teruggestuurd vanuit filemaker
            alert("hoi pipeloi, het is bewaard");
       },
       //error callback deze wordt nadien aangeroepen als FileMaker ERROR terugstuurt
       function( 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);
 
    })
    

callback.fmp12

Link naar reactie

Aanbevolen berichten

  • 0

Hi Farbice,

Thanks for your explanation.

Citaat

If your open source project does not deserve the few hours to discuss the right license, it means your project isn't worth developing…

You have the right to have an opinion.

Citaat

I thought it was fair that the repository where the project would be managed would be the one of the company that originated this code, which, sorry but this is a fact, is ours. 

Let me rephrase that. Your company is one of the contributors of the code of this project, but not the only one. The code in this project is more than your 20 lines of ( very nice ) JavaScript. Remember, that from the moment that you put it in the public domain 2 years ago, it became free for everybody to build upon. And kudos for that. But by doing so, you also gave it away. You can continue calling it yours, but I do not agree that it's yours in the sense of giving you any claims on how derivative work should be published. I do not keep you from taking the project on github ( https://github.com/fmWebViewerWorkingGroup/fmBridgit ) , and fork your own maybe much better one. If you think you should manage that one, please do.

Pease let's not continue to argue on this. You made your points and I do not agree. My anger is gone, but my opinion remains.

Link naar reactie

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.

Gast
Beantwoord deze vraag...

×   Geplakt als verrijkte tekst.   Plak in plaats daarvan als platte tekst

  Er zijn maximaal 75 emoji toegestaan.

×   Je link werd automatisch ingevoegd.   Tonen als normale link

×   Je vorige inhoud werd hersteld.   Leeg de tekstverwerker

×   Je kunt afbeeldingen niet direct plakken. Upload of voeg afbeeldingen vanaf een URL in

×
×
  • Nieuwe aanmaken...