Avatar billede diff Nybegynder
27. juli 2004 - 10:06 Der er 16 kommentarer og
1 løsning

overførsel af formdata fra eksterne sites.

Jeg er en smule i vildrede mht. hvordan jeg får overført data fra et eksternt site via et form submit.

Helt præcist er problemet at jeg skal bruge et script (evt. javascript, da det skal kunne køre uafhængigt af serversite scriptingssprog) der skal indsættes på eksterne sites. Det skal benyttes til at hente brugerinformation ved oprettelse af brugere til f.eks en mailinglist, hvor brugeren indtaster navn og email. Meningen er så at der yderligere skal være en checkbox der angvier at brugeren acceptere at oplysningerne også benyttes af en tredjepart (mig). Når så brugeren submitter formen er det meningen at formdataen også sendes til mig.

Jeg har overvejet om man ville kunne benytte webservices, men har aldrig arbejdet med´det og kan ikke gennemskue om det er muligt. Problemet er jo at der på de eksterne sites kun må skulle indsættes en stump kode (script) som er uafhængigt af serverside prog. sprog.
Avatar billede roenving Novice
27. juli 2004 - 10:26 #1
Det lyder ikke som om du har fat i en lang ende ...

Client-side scripting er ikke muligt på tværs af domæner, og hvis man skal submitte noget som helst skal det submittes til en server, som du også vil være nødt til at have, hvis du skal sende noget udenom brugerens eget mail-program !-)

-- og brugeroplysninger kan man også kun hente, hvis man har dem i en database ...
Avatar billede yellow Nybegynder
27. juli 2004 - 11:25 #2
Som Roenving siger, er det ikke muligt at lave slient-side scripting på tværs af domæner, men det lyder umiddelbart ikke til at du har brug for dette.

Du kan sagtens submitte form data på tværs af domæner ved at sætte "action" værdien i dit form tag.
At du så anvender javascript på din form-side er ikke noget problem.

<form method="post" action="http://www.eksternt-site.foo/opret.asp">
  <input type="text" name="navn"><br>
  <input type="text" name="email"><br>
  <input type="checkbox" name="tredjepartOk" value="true"> Acceptér at blablabla.<br>
  <input type="submit" value="submit">
</form>
Avatar billede diff Nybegynder
27. juli 2004 - 12:34 #3
Ja det var jeg også kommet frem til, men problemet er så at når formen submittes bliver brugeren redirected til http://www.eksternt-site.foo/opret.asp, hvor han i stedet gerne skulle videre på det eksterne site.

Jeg er også meget åben for alternative løsninger ;)
Avatar billede roenving Novice
27. juli 2004 - 12:37 #4
Hvis du har en lille iframe (den må godt være 0px høj !-) kan du sætte target til den:

<form method="post" action="http://www.eksternt-site.foo/opret.asp" target="minSkjulteFrame">
Avatar billede diff Nybegynder
27. juli 2004 - 13:17 #5
roenving, jeg er ikke helt med på hvad du mener. Det der er mit problem ved løsningen er at brugeren bliver redirected til mit site når han submitter.

Vil du evt. ikke uddybe din kommentar ?
Avatar billede roenving Novice
27. juli 2004 - 13:24 #6
Tilføj også:

<iframe src="about:blank" name="minSkjulteFrame" style="height:0px;width:0px;"></iframe>
Avatar billede diff Nybegynder
27. juli 2004 - 15:51 #7
Jeg tror ikke a jeg har formidlet problemstillingen korrekt. Der vil være diverse sites hvor jeg skal indsætte en checkbox, der når den er "true" skal angive at det indtastet brugerdata (navn, email) skal sendes til min server, men brugeres skal ikke redirectes til mit site. Problemet er så at jeg aflevere en lille stump kode der kan indsættes på disse sites uden at de skal til at ændre en masse ting.

Med ovenstående løsning ser jeg et problem i at brugeren (browseren) sendes til min server når der submittes, da det må antages at disse sites allerede har en form der submittes ved indtastning af brugeroplysninger.

Håber det kastede bedre lys på problemstillingen.
Avatar billede yellow Nybegynder
27. juli 2004 - 18:12 #8
Ok, jeg prøvede at lave noget, men jeg har brugt en del ting, som kun er kompatibelt med Internet Explorer.

Lad os sige at et site allerede har en form:

<form action="dosomething.asp">
  <input type="text" name="name"><br>
  <input type="text" name="email"><br>
  <input type="submit" value="submit">
</form>

Du bliver nødt til at stille det krav, at felterne hedder præcist "name" og "email". Samtidig skal formen ( <form> )være den første på siden.

På sitet skal der tilføjes et script tag og en input-checkbox, så det kommer til at se sådan her ud:

<script type="text/javascript" src="http://www.DINSERVER.dk/formscript.js"></script>
<form action="dosomething.asp">
  <input type="text" name="name"><br>
  <input type="text" name="email"><br>
  <input type="checkbox" name="tredjepartOk"> Tredjepart?<br>
  <input type="submit" value="submit">
</form>

På din egen server (www.DINSERVER.dk) skal du lægge en javascript fil op - formscript.js.
Den ser sådan her ud:
***formscript.js***
  var intervalID;
  var myForm;
  var i = 0;
  window.onload = function (){ 
    myForm = document.forms[0];
      myForm.onsubmit = function (){
      if( myForm.tredjepartOk.checked ){
        var myImage = document.createElement("<img id='" + document.uniqueID + "' style='display:none;'>");
        document.body.insertBefore(myImage);
        myImage.src = "http://www.DINSERVER.dk/serverscript.php?name=" + myForm.name.value + "&email=" + myForm.email.value;
        intervalID = window.setInterval("submitWhenComplete('" + myImage.id + "')", 200)
        return false;
      }
      else{
        return true;
      }     
      }
  }       
  function submitWhenComplete( imgID ){
    myImg = eval('document.all.' + imgID);
    i++;
    if( myImg.complete || i>=20 ){       
      window.clearInterval(intervalID);
      myForm.submit();
    }
  }
***/formscript.js***

Hvis 3.part-checkboksen er sat, vil formen nu først sende data til http://www.DINSERVER.dk/serverscript.php. Det er lavet sådan at den får max 2 sekunder til dette (burde være rigeligt), ellers submitter den siden videre. Hvis du i dit serverscript.php slutter af med at udskrive et dummy-billede, vil det som regel gå hurtigere end 2 sekunder.
Jeg ved godt det ser lidt underligt ud med billeder og ting - men det er een måde at submitte one-way-data på uden at skulle forlade en side, eller gøre det via en anden frame.
I mit eksempel hed dit serverscript "serverscript.php" - du kunne selvfølgelig være asp eller et andet sprog også. Det er i dette script du skal behandle brugerdata til dig eget brug.
Jeg lavede et lille test php script som bare skrev "name" og "email" ned i en tekst-fil.
***serverscript.php***
<?php
$filename = 'foo.txt';
$content = $_GET['name'] . ":" . $_GET['email'];
if (!$handle = fopen($filename, 'w')) {
  print "Cannot open file ($filename)";
  exit;
}
if (!fwrite($handle, $content)) {
  print "Cannot write to file ($filename)";
  exit;
}
fclose($handle);

header ("Content-type: image/png");
$im = @imagecreate (50, 100);
$background_color = imagecolorallocate ($im, 255, 255, 255);
$text_color = imagecolorallocate ($im, 233, 14, 91);
imagestring ($im, 1, 5, 5,  "Dummy image", $text_color);
imagepng ($im);
?>
***/serverscript.php***

Var det sådan noget du var ude efter?
Avatar billede yellow Nybegynder
27. juli 2004 - 18:16 #9
"...Det er lavet sådan at den får max 2 sekunder til dette..."
4 sekunder, sorry...
Avatar billede diff Nybegynder
28. juli 2004 - 12:19 #10
yellow: Det er lige hvad jeg skal bruge ;)

Jeg har prøvet at sætte det op, men har lidt problemer me at få serverscript til at fungere.... hvis jeg bare kalder det fra min server opretter det fint filen foo.txt men ikke hvis det kaldes som angivet ovenfor... Nogen ide ?
Avatar billede diff Nybegynder
28. juli 2004 - 12:25 #11
det ser ud til at det er kaldet fra formscript.js der ikke udføres korrekt.
Avatar billede yellow Nybegynder
28. juli 2004 - 12:34 #12
Har et link til din udviklings-side? Jeg testede det på egen server, og der virkede det fint.
Avatar billede diff Nybegynder
28. juli 2004 - 12:37 #13
ahh jeg kan se at det er fordi den når a time ud som angivet i fomrscript.js koden
Avatar billede diff Nybegynder
28. juli 2004 - 12:42 #14
yellow: her er links til "client" siden og serversiden.... 

client : www.outsourcit.dk/~diff/ekstern
server : www.outsourcit.dk/~diff/webservice
Avatar billede yellow Nybegynder
28. juli 2004 - 12:48 #15
i din formscript.js skal du have hele stien til serverscript.php:
myImage.src = "serverscript.php?name=" + myForm.name.value + "&email=" + myForm.email.value;
skal laves til:
myImage.src = "http://www.outsourcit.dk/~diff/webservice/serverscript.php?name=" + myForm.name.value + "&email=" + myForm.email.value;
Avatar billede diff Nybegynder
28. juli 2004 - 13:43 #16
Super yellow ;)

vil du ikke lige skrive et "svar" så jeg kan give mit bidrag, hvis du altså er interesseret i det.

Lige en ting, mht. at scriptet kun er kompatibelt med IE, vil det være muligt at ændre det til at kunne benyttes af f.eks. netscape og mozilla m.m. ? evt. hvilke dele er specifikke for IE ?
Avatar billede yellow Nybegynder
28. juli 2004 - 17:41 #17
Ok, hvis du ændrer formscript.js til følgende, virker det både i IE6 og NS7.1 (testet på de 2 i hvertfald). Er en god chance for at det virker i flere browsere også, når NS godtager den.
Der går dog kludder i den hvis et site har et element med ID'et "OneWayDataSubmit" (usandsynligt) - jeg kunne ikke lige finde en uniqueID funktion i NS.


  var intervalID;
  var myForm;
  var i = 0;
  window.onload = function (){     
    myForm = document.forms[0];
      myForm.onsubmit = function (){
      if( myForm.tredjepartOk.checked ){
        var myImage = document.createElement("img");
        myImage.id = "OneWayDataSubmit";
        myImage.style.display = "none";
        myImage.src = "http://www.outsourcit.dk/~diff/webservice/serverscript.php?name=" + myForm.name.value + "&email=" + myForm.email.value;
        myForm.appendChild(myImage);
        intervalID = window.setInterval("submitWhenComplete('" + myImage.id + "')", 200)
        return false;
      }
      else{
        return true;
      }     
      }
  }       
  function submitWhenComplete( imgID ){
    myImg = document.getElementById(imgID);
    i++;
    if( myImg.complete || i>=20 ){   
      window.clearInterval(intervalID);
      myForm.submit();
    }
  }
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