Avatar billede vels Nybegynder
01. juli 2012 - 20:10 Der er 16 kommentarer og
1 løsning

Køre script uden at vente på svar

Hej

Jeg har:
form.php 
(en html form)

modtaget.php
(modtager form indhold og kalder en funktion der laver en pdf og sender den med i en mail. Efter fuktionen er færdig vises der en besked til brugeren)

Pga. af det tager en del tid at generere PDF'en og sende mailen, så går der også langtid inden bruger ser beskeden om at formen er modtaget.

Nogle bud på hvordan jeg i modtaget.php kan kalde en anden php fil, og at modtaget.php kan køre viderer uden at skulle afvente at det kaldte script bliver færdig (pdf generering + mail afsendelse)?

/Jesper
Avatar billede olebole Juniormester
01. juli 2012 - 20:51 #1
<ole>

Du kan poste den mod en skjult IFRAME:

<form target="submitFrame" action="..." method="...">
... ... ...
</form>

<iframe name="submitFrame" style="position:absolute;left:10000px" src="about:blank"></iframe>

/mvh
</bole>
Avatar billede rax Praktikant
02. juli 2012 - 08:01 #2
Du kan blot kalde din modtaget.php med AJAX, så kaldet foregår asynkront. Du opnår samme resultat som med iframe, men det er en del mere tidssvarende at anvende AJAX (og i øvrigt også utroligt godt understøttet af de fleste script-biblioteker).

Anvender du evt. jQuery?
Avatar billede olebole Juniormester
02. juli 2012 - 13:42 #3
#2: "men det er en del mere tidssvarende at anvende AJAX" >> Det må du nok lige uddybe  =)
Avatar billede rax Praktikant
02. juli 2012 - 14:00 #4
Så gerne. Du kan opnå det samme ved at submitte formularer i gemte iframes, som hvis du anvender ajax (dvs browserens XMLHttpObject, som er forskelligt fra browser til browser).

Da spørgeren formentlig vil søge yderligere vejledning på google baseret på de svar han/hun får her, er det rart at vide at metoden med iframes langt fra anvendes i lige så høj grad idag som den gjorde tidligere, idet stigende AJAX support har gjort denne form for opgaver betydeligt mere simple. Der vil derfor være mere vejledning at finde ved søgning på dette, da iframe metoden må anses for at være deprecated sammenlignet med at anvende AJAX.

Så kort og godt, blot et godt råd til spørgerens videre søgning :)
Avatar billede olebole Juniormester
02. juli 2012 - 14:26 #5
"da iframe metoden må anses for at være deprecated sammenlignet med at anvende AJAX."

Nej, tværtimod. IFRAME gled ud og eksisterede ikke i HTML 4.01, men vil - grundet sin store anvendelighed - igen være med inde i varmen, når HTML 5 (måske senere på året) bliver gældende standard.

"stigende AJAX support har gjort denne form for opgaver betydeligt mere simple. Der vil derfor være mere vejledning at finde ved søgning på dette"

Tværtimod er langt det meste, der bliver skrevet på WWW om Ajax frygtelig forvrøvlet - og skrevet af folk, der ikke selv har fattet en bjælde af teknikken. Et af de værste eksempler må nok siges at være w3schools.com's parodi på en tutorial.

I spørgers tilfælde vil det være overkill at benytte et XMLHttpRequest objekt, da der kun er tale om envejskommunikation.

Da du netop bruger 'simpelhed' som argument, går jeg udfra, vi kan blive enige om, at det er lasngt simplere at subitte formen mod en IFRAME. Det kan oven i købet gøres i ren HTML - helt uden at blande scripting ind i processen. Desuden er metoden i øvrigt i sig selv kompatibel med X-domain requests.
Avatar billede rax Praktikant
02. juli 2012 - 14:54 #6
"da iframe metoden må anses for at være deprecated sammenlignet med at anvende AJAX."

Nej, tværtimod. IFRAME gled ud og eksisterede ikke i HTML 4.01, men vil - grundet sin store anvendelighed - igen være med inde i varmen, når HTML 5 (måske senere på året) bliver gældende standard.

Er bange for at vi kommer til at vente noget længere på, at HTML 5 bliver gældende standard, men så er vi da ihvertfald to som håber. Det være sagt, så var jeg ikke klar over at iframe ville komme tilbage i folden. Det vil jeg bestemt nyde til den tid.

"stigende AJAX support har gjort denne form for opgaver betydeligt mere simple. Der vil derfor være mere vejledning at finde ved søgning på dette"

Tværtimod er langt det meste, der bliver skrevet på WWW om Ajax frygtelig forvrøvlet - og skrevet af folk, der ikke selv har fattet en bjælde af teknikken. Et af de værste eksempler må nok siges at være w3schools.com's parodi på en tutorial.

Du vil aldrig nogensinde se mig anbefale w3schools.com, som efter min mening er noget af det værste du kan begive dig ud i.

I spørgers tilfælde vil det være overkill at benytte et XMLHttpRequest objekt, da der kun er tale om envejskommunikation.

Da du netop bruger 'simpelhed' som argument, går jeg udfra, vi kan blive enige om, at det er lasngt simplere at subitte formen mod en IFRAME. Det kan oven i købet gøres i ren HTML - helt uden at blande scripting ind i processen. Desuden er metoden i øvrigt i sig selv kompatibel med X-domain requests.

Det jeg ville frem til i mit oprindelige svar til spørgeren var at finde ud af, om han/hun i forvejen anvender jQuery. Er det tilfældet ville jeg anbefale at anvende et jQuery.post ajax kald. Men vi kan jo have forskellige meninger.
Avatar billede olebole Juniormester
02. juli 2012 - 15:36 #7
Selv som gammel feltartillerist 255 mm trukken kanon og 105 mm haubitz, vil jeg klart hælde til, at en mindre kaliber vil være alt rigelig til den givne opgave.

Der er ingen grund til at hive et større library ud af skabet og scripte sig til noget, som konceptuelt hører til i markup delen (submit af en form), uden at vinde noget ved det. Løsningen er i forvejen indbygget i markup standarden. Det er jo præcis årsagen, FORM tagget har mulighed for en target attribut  =)
Avatar billede rax Praktikant
02. juli 2012 - 15:52 #8
hehe, der er vi helt enige, men bemærk, at mit råd om at anvende jQuerys post-function kun er hvis spørgeren allerede anvender jQuery i forvejen ;)

Hvis dette ikke er tilfældet, er iframe metoden tilsydenladene at foretrække. Og så lærte jeg også noget idag =)
Avatar billede vels Nybegynder
12. juli 2012 - 14:06 #9
Hej Rax

Ja jeg har brugt jQuery meget lidt.

Kan du evt post et ultra simpel eks?

/Jesper
Avatar billede olebole Juniormester
12. juli 2012 - 14:18 #10
Som du har fået at vide af alle i tråden, er jQuery ikke løsningen på denne opgave. Hvad vil du så med en jQuery løsning?
Avatar billede rax Praktikant
12. juli 2012 - 14:25 #11
Hej vels

Nu ved jeg jo ikke hvilke variabler din modtaget.php forventer, men lad os antage at den kigger efter $_POST["name"], $_POST["message"] og $_POST["email"].

I din form.php kan du via jQuery samle værdierne op fra formularen, og opbygge følgende object (du bør naturligvis validere den indsamlede data, men det udelader vi her for nemhedens skyld):

var data = {'name':'vels', 'message':'hello world', 'email':'vels@velsworld.com'};

Denne data kan du nu sende til din modtaget.php med følgende jQuery kommando:

$.post('modtaget.php', data);

Mere simpelt bliver det næppe.

Du kan læse mere om jQuery.post her: http://api.jquery.com/jQuery.post/

Håber det kan hjælpe dig lidt videre, ellers må du gerne smide noget kode op, så skal vi nok få dig hjulpet videre.

Mvh. Kristian
Avatar billede olebole Juniormester
12. juli 2012 - 14:45 #12
- men 'simpelheden' opnås udelukkende på baggrund af, at man helt unødigt tvinger brugeren til at downloade et større script library.

Det giver ingen mening, når du ikke i forvejen bruger jQuery på siden. Så består 'simpelheden' bare af skidt kodeskik, klædt ud som 'noget smart'
Avatar billede rax Praktikant
12. juli 2012 - 14:58 #13
#8
Avatar billede olebole Juniormester
12. juli 2012 - 15:10 #14
Præcis ... #12 var møntet på spørgeren  *o)
Avatar billede rax Praktikant
12. juli 2012 - 15:18 #15
Ole, kan du evt. poste et eksempel (eller linke til et) som anvender iframe metoden? Giver god værdi for tråden, at begge muligheder vises, og samtidig kan man se hvordan det kan gøres udelukkende i html.

... og endelig vil jeg også gerne personligt se et eksempel :)
Avatar billede olebole Juniormester
12. juli 2012 - 15:28 #16
<iframe name="postFrame" src="about:blank" style="left-margin:1000em"></iframe>

<form action="foo.php" target="postFrame" method="post">
... ... ...
</form>

... simple as that  =)
Avatar billede olebole Juniormester
12. juli 2012 - 15:30 #17
Mjaaahhh ... det var nok ikke den mest begavede CSS  =)

style="position:absolute;left:1000em">
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester