2016-05-05 18 views
0

我正在處理的一個項目需要我在Joomla內建立一個郵件表單。如何顯示由ajax調用運行的PHP文件的回顯?

有人在SO的聊天中建議我使用PHPmailer - 但我注意到它包含在joomla包中,我不想再次加載它,所以我閱讀了一些關於jFactory的文檔,然後我就這樣去了。

我想用一些javascript對輸入字段進行prsonalize,所以我還使用JS(具體來說,您可以在下面閱讀ajax調用)以命令服務器向我發送郵件。如果將郵件字段傳遞給郵件程序部分(如果它位於表單所在的同一個php文件中),我不知道是否可以/更容易將郵件字段傳遞給郵件程序部分,因此我創建了一個html表單,它調用JS和一個單獨的php發件人:

  • html頁面包含窗體和一個空的div。
  • jQuery腳本在運行時修改表單(主要是根據其他選項更改下拉選項),並在單擊發送按鈕時進行變量驗證,以便發送郵件(通過ajax調用外部php文件)或輸出錯誤消息(即「需要郵件地址」)。
  • php文件實際上使用jFactory發送郵件。

整個事情能正常工作,但我還需要一些更多的測試和我不能從任何地方訪問php的回聲,包括鍍鉻的檢查

我讀到echo會自動保存到javascript中的「data」變量,但是這個變量不存在,如果我創建它(可能在錯誤的地方),它不會被填充。我嘗試過(在PHP腳本內)try/catch和if($ mail-> Send())方法來生成回顯消息,但由於我從來沒有在瀏覽器中運行php頁面,我不知道是否有任何工作。

如何獲取回顯消息回我的JS,所以我可以使用console.log()來讀取它? 我不能在Chrome上安裝擴展程序,或在不久的將來使用任何其他瀏覽器。但如果這是我的唯一選擇,我想知道它。

爲了僅顯示php調用部分,我將省略掉頭文件,_JEXEC函數和大部分文件。

JS:

function send(datastr) { 
    $.ajax({ 
    type: "POST", 
    url: "formsend.php", 
    data: datastr, 
    cache: false, 
    success: function(html) { 
     $("#systemMessage").fadeIn("slow"); 
     $("#systemMessage").html('<span>Message successfully sent.</span>'); 
     $("#systemMessage").css("background-color", "#e1ffc0"); 
     setTimeout($("#systemMessage").fadeOut("slow"), 2000); 
     console.log(data); 
    } 
    }); 
} 

PHP:

try { 
    define('JPATH_BASE', "../"); 
    define('DS', DIRECTORY_SEPARATOR); 

    require_once (JPATH_BASE .DS.'includes'.DS.'defines.php'); 
    require_once (JPATH_BASE .DS.'includes'.DS.'framework.php'); 

    require ('libraries/joomla/factory.php'); 
    # require_once '../class.phpmailer.php'; 

    $name=$_REQUEST['name']; 
    $subject=$_REQUEST['subject']; 
    $body=$_REQUEST['body']; 
    $from=$_REQUEST['from']; 

    $to = "[email protected]";; 

    # Invoke JMail Class 
    $mail = JFactory::getMailer(); 
    # $mail->isSMTP; is not working 

    # Set sender array so that my name will show up neatly in your inbox 
    $sender = array($user, $name); 
    $mail->setSender($sender); 

    # Add a recipient 
    $mail->addRecipient($to); 
    $mail->ClearCCs(); 
    $mail->ClearBCCs(); 

    $mail->setSubject($subject); 
    $mail->setBody($body); 

    $mail->ClearAttachments(); 
    $mail->ClearCustomHeaders(); 

    # Send once you have set all of your options 
    $mail->Send(); 
    echo "Message Sent OK\n"; 
} 
catch (Exception $e) { 
echo $e->getMessage(); 
} 
+1

你看到'html'變量你得到在「成功」函數中?這是你的'數據'。嘗試做'console.log(html)'而不是'console.log(data)'。 –

+0

@MikeC毆打我一秒xD – icecub

回答

1

您的變量必須相同。如果你正在使用success: function (html)那麼你的控制檯。日誌應該是console.log(html)否則,如果你決定使用data那就改htmldata

1

支票上的Chrome瀏覽器開發工具的網絡標籤中,你可以看到服務器的響應,也是這個shoulbe容易,因爲

function send(datastr) { 
    $.ajax({ 
    type: "POST", 
    url: "formsend.php", 
    data: datastr, 
    cache: false, 
    success: function(html) { 
     console.log(html); 
    } 
    }); 
} 
+0

網絡標籤告訴我什麼關於PHP文件,遺憾的是。 – Zachiel

1

JS:

function send(datastr) { 
    $.ajax({ 
    type: "POST", 
    url: "formsend.php", 
    datatype : 'json', 
    data: datastr, 
    cache: false, 
    success: function(html) { 
     $("#systemMessage").fadeIn("slow"); 
     $("#systemMessage").html('<span>Message successfully sent.</span>'); 
     $("#systemMessage").css("background-color", "#e1ffc0"); 
     setTimeout($("#systemMessage").fadeOut("slow"), 2000); 
     console.log(html); 
    } 
    }); 
} 

PHP:

try { 
    define('JPATH_BASE', "../"); 
    define('DS', DIRECTORY_SEPARATOR); 

    require_once (JPATH_BASE .DS.'includes'.DS.'defines.php'); 
    require_once (JPATH_BASE .DS.'includes'.DS.'framework.php'); 

    require ('libraries/joomla/factory.php'); 
    # require_once '../class.phpmailer.php'; 

    $name=$_REQUEST['name']; 
    $subject=$_REQUEST['subject']; 
    $body=$_REQUEST['body']; 
    $from=$_REQUEST['from']; 

    $to = "[email protected]";; 

    # Invoke JMail Class 
    $mail = JFactory::getMailer(); 
    # $mail->isSMTP; is not working 

    # Set sender array so that my name will show up neatly in your inbox 
    $sender = array($user, $name); 
    $mail->setSender($sender); 

    # Add a recipient 
    $mail->addRecipient($to); 
    $mail->ClearCCs(); 
    $mail->ClearBCCs(); 

    $mail->setSubject($subject); 
    $mail->setBody($body); 

    $mail->ClearAttachments(); 
    $mail->ClearCustomHeaders(); 

    # Send once you have set all of your options 
    $mail->Send(); 
    echo json_encode(array('status' => 'success','message'=>"Message Sent OK")); 
} 
catch (Exception $e) { 
    echo json_encode(array('status' => 'failed','message'=>$e->getMessage())); 
}