Avatar billede nicoolai Nybegynder
15. februar 2008 - 18:50 Der er 7 kommentarer og
1 løsning

iframe og php

Hej Eksperter

Jeg har lavet en webside som ikke skal reloades. Index siden er en lang side hvor man smooth scroller ved hjælp af anchor-links. (ret fancy).
Jeg har lavet en kontakt form i bunden. Jeg har lavet den sådan at javascript laver en "usynlig" iframe (for at undgå history) og min form sender variabler til php mailsender i iframen. Php mailsender sender en mail og hvis den bliver sendt, kalder den funktion (sendt/ikke sendt) fra index-siden og returnerer et svar på index-siden. Derved reloader index-siden ikke, og men bliver ved anchorpointen for kontakt. Smart!

Problemet er at mit php script ikke modtager variablerne rigtig.
Hver gang formen bliver processed, returnerer den ikke-sendt. Mit javascript til iframen er:

<script type="text/javascript">

    var IFrameObj; // our IFrame object
    function callToServer() {
      if (!document.createElement) {return true};
      var IFrameDoc;
      var URL = 'send.php';
      if (!IFrameObj && document.createElement) {
        // create the IFrame and assign a reference to the
        // object to our global variable IFrameObj.
        // this will only happen the first time
        // callToServer() is called
      try {
          var tempIFrame=document.createElement('iframe');
          tempIFrame.setAttribute('id','RSIFrame');
          tempIFrame.style.border='0px';
          tempIFrame.style.width='0px';
          tempIFrame.style.height='0px';
          IFrameObj = document.body.appendChild(tempIFrame);
         
          if (document.frames) {
            // this is for IE5 Mac, because it will only
            // allow access to the document object
            // of the IFrame if we access it through
            // the document.frames array
            IFrameObj = document.frames['RSIFrame'];
          }
        } catch(exception) {
          // This is for IE5 PC, which does not allow dynamic creation
          // and manipulation of an iframe object. Instead, we'll fake
          // it up by creating our own objects.
          iframeHTML='\<iframe id="RSIFrame" style="';
          iframeHTML+='border:0px;';
          iframeHTML+='width:0px;';
          iframeHTML+='height:0px;';
          iframeHTML+='"><\/iframe>';
          document.body.innerHTML+=iframeHTML;
          IFrameObj = new Object();
          IFrameObj.document = new Object();
          IFrameObj.document.location = new Object();
          IFrameObj.document.location.iframe = document.getElementById('RSIFrame');
          IFrameObj.document.location.replace = function(location) {
            this.iframe.src = location;
          }
        }
      }
     
      if (navigator.userAgent.indexOf('Gecko') !=-1 && !IFrameObj.contentDocument) {
        // we have to give NS6 a fraction of a second
        // to recognize the new IFrame
        setTimeout('callToServer()',10);
        return false;
      }
     
      if (IFrameObj.contentDocument) {
        // For NS6
        IFrameDoc = IFrameObj.contentDocument;
      } else if (IFrameObj.contentWindow) {
        // For IE5.5 and IE6
        IFrameDoc = IFrameObj.contentWindow.document;
      } else if (IFrameObj.document) {
        // For IE5
        IFrameDoc = IFrameObj.document;
      } else {
        return true;
      }
     
      IFrameDoc.location.replace(URL);
      return false;
    }
   
    function handleResponseTrue() {
    var responseMessage = document.getElementById('responseMessage');
    var message = '<p>Beskeden blev sendt! Tak, tak tak!<\/p>'
    responseMessage.innerHTML = message;
    responseMessage.style.display = 'block';
    }
   
    function handleResponseFalse() {
    var responseMessage = document.getElementById('responseMessage');
    var message = '<p>Beskeden blev ikke sendt! Det kan skyldes fejl i den indtastede e-mail adresse. Prøv igen!<\/p>'
    responseMessage.innerHTML = message;
    responseMessage.style.display = 'block';
    }

    function handleResponseFault() {
    var responseMessage = document.getElementById('responseMessage');
    var message = '<p>Der er et eller andet galt med den her server. Prøv igen om lidt tid.<\/p>'
    responseMessage.innerHTML = message;
    responseMessage.style.display = 'block';
    }

</script>

Mit php mailscript er:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>MINUS21</title>
<?php
    error_reporting(E_NOTICE);

    function valid_email($str)
    {
        return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
    }

    if($_REQUEST['name']!='' && $_REQUEST['e_mail']!='' && $_REQUEST['sub_ject']!='' && valid_email($_REQUEST['e_mail'])==TRUE)
    {
        $to = 'EMAIL ADRESSE';
        $headers =     'From: '.$_REQUEST['e_mail'].''. "\r\n" .
                'Reply-To: '.$_REQUEST['e_mail'].'' . "\r\n" .
        $subject = "Mailform";
        $message = htmlspecialchars($_REQUEST['message']);
       
        if(mail($to, $subject, $message, $headers))
        {//we show the good guy only in one case and the bad one for the rest.
            echo '<script type="text/javascript">window.parent.handleResponseTrue()</script>';
        }
        else {
            echo '<script type="text/javascript">window.parent.handleResponseFault()</script>';
        }
    }
    else {
        echo '<script type="text/javascript">window.parent.handleResponseFalse()</script>';
    }
   
?>
</head>
<body>
</body>
</html>

Håber på lidt hjælp da jeg har deadline mandag.
På forhånd tak
/Nicoolai
Avatar billede olebole Juniormester
15. februar 2008 - 21:57 #1
<ole>

Dit script sender ikke nogen variabler, så det kan ikke undre nogen, de ikke bliver modtaget  :)

Derudover er det en gammeldags skrammelkode. Prøv dette i stedet:

<script type="text/JavaScript">
function AjaxReq(sMethod, sUrl, oVars, fnCallBack) {
    var oHttp = new XMLHttpRequest();
    oHttp.open(sMethod, sUrl, true);
    oHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
    oHttp.onreadystatechange = _fnCallBack;
    var aQuery = [];
    for (var x in oVars) aQuery.push( encodeURIComponent(x) + "=" + encodeURIComponent(oVars[x]) );
    oHttp.send( aQuery.join("&") );
    aQuery = null;
   
    function _fnCallBack() {
        if (oHttp.readyState<4) return;
        fnCallBack(oHttp);
        oHttp = null;
    }
    return this;
}

function myCallBack(oHttp) {
    var oDispl = document.getElementById("responseMessage");
    oDispl.firstChild.nodeValue = oHttp.responseText;
    oDispl.style.display = "block";
}

function callToServer(sUrl, sName, sEmail, sSubject, sMessage) {
    var oVars = {"name":sName, "email":sEmail, "subject":sSubject, "message":sMessage};
    new AjaxReq("POST", sUrl, oVars, myCallBack);
}
</script>

<div id="responseMessage" style="display:none">&nbsp;</div>

<form action="http://www.domain.dk/sti/til/fil.php"
    onsubmit="callToServer(this.action, this.recName.value, this.email.value, this.subject.value, this.message.value);return false">
    <div>Navn:<br><input type="text" name="recName"></div>
    <div>E-mail:<br><input type="text" name="email"></div>
    <div>Emne:<br><input type="text" name="subject"></div>
    <p>Besked:<br><textarea name="message"></textarea></p>
    <p><button type="submit">Send</button></p>
</form>

- og PHP-koden:

<?php
    error_reporting(E_NOTICE);

    function valid_email($str)
    {
        return ( ! preg_match("/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
    }

    if (isset($_POST['name']) && $_POST['name']!='' && isset($_POST['email']) && isset($_POST['subject']) && $_POST['subject']!='' && valid_email($_POST['email'])==TRUE)
    {
        $to = 'EMAIL ADRESSE';
        $headers =    'From: '.$_POST['email'].''. "\r\n" .
                'Reply-To: '.$_POST['email'].'' . "\r\n" .
        $subject = "Mailform";
        $message = htmlspecialchars($_POST['message']);
       
        if(mail($to, $subject, $message, $headers))
        {//we show the good guy only in one case and the bad one for the rest.
            echo "Beskeden blev sendt! Tak, tak tak!";
        }
        else {
            echo "Beskeden blev ikke sendt! Det kan skyldes fejl i den indtastede e-mail adresse. Prøv igen!";
        }
    }
    else {
        echo "Der er et eller andet galt med den her server. Prøv igen om lidt tid.";
    }
   
?>

/mvh
</bole>
Avatar billede nicoolai Nybegynder
16. februar 2008 - 10:59 #2
Hej

Mange tak.
Det sker dog intet når jeg trykker på send. Er du sikker på det ikke skal være en <input type="submit">?

Mange tak

/nicoolai
Avatar billede olebole Juniormester
16. februar 2008 - 13:44 #3
Ja, det er jeg helt sikker på. Prøv at lægge et link til forsøget
Avatar billede nicoolai Nybegynder
16. februar 2008 - 13:49 #4
Ja, jeg uploader det lige.

Jeg skal lægge php'en i en seperat fil ikke?
I php henter du variablen name, skal den ikke ændres til recName?
Avatar billede olebole Juniormester
16. februar 2008 - 13:53 #5
Variablen skal hedde 'name' - og PHP-filen er den, der står i formens action:
    action="http://www.domain.dk/sti/til/fil.php"
Avatar billede nicoolai Nybegynder
16. februar 2008 - 13:55 #6
Du er gud! hehe :-)

Det virker helt perfekt! Lige som jeg har ønsket det!
Nu kan jeg overholde deadline til mandag!

Smid et svar

Og endnu en gang mange tak!
Avatar billede olebole Juniormester
24. september 2008 - 21:55 #7
Ups ... dette har jeg da aldrig fået mail om. Kom forbi, da jeg søgte noget andet  =)
Avatar billede olebole Juniormester
21. oktober 2008 - 01:03 #8
Tak for points  ;o)
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