用PHP从HTML Ajax表单创建PDF文件

3

我有一个简单的联系表格。它通过AJAX发送邮件。运行良好。

现在我需要从此表格结果中创建PDF文件,并像这里一样将其下载给用户。

所以,HTML表格:

<form id="contact-form">
    <input type="hidden" name="action" value="contact_send" />
    <input type="text" name="name" placeholder="Your name..." />
    <input type="email" name="email" placeholder="Your email..." />
    <textarea name="message" placeholder="Your message..."></textarea>
    <input type="submit" value="Send Message" />
</form>

在functions.php文件中,我有一个发送电子邮件的函数:

function sendContactFormToSiteAdmin () {

  try {
    if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['message'])) {
      throw new Exception('Bad form parameters. Check the markup to make sure you are naming the inputs correctly.');
    }
    if (!is_email($_POST['email'])) {
      throw new Exception('Email address not formatted correctly.');
    }

    $subject = 'Contact Form: '.$reason.' - '.$_POST['name'];
    $headers = 'From: My Blog Contact Form <contact@myblog.com>';
    $send_to = "contact@myblog.com";
    $subject = "MyBlog Contact Form ($reason): ".$_POST['name'];
    $message = "Message from ".$_POST['name'].": \n\n ". $_POST['message'] . " \n\n Reply to: " . $_POST['email'];

    if (wp_mail($send_to, $subject, $message, $headers)) {
      echo json_encode(array('status' => 'success', 'message' => 'Contact message sent.'));
      exit;
    } else {
      throw new Exception('Failed to send email. Check AJAX handler.');
    }
  } catch (Exception $e) {
    echo json_encode(array('status' => 'error', 'message' => $e->getMessage()));
    exit;
  }


}
add_action("wp_ajax_contact_send", "sendContactFormToSiteAdmin");
add_action("wp_ajax_nopriv_contact_send", "sendContactFormToSiteAdmin");

因此在footer.php中,我有一个ajax处理器脚本:

jQuery(document).ready(function ($) {
    $('#contact-form').submit(function (e) {
      e.preventDefault(); // Prevent the default form submit
      var $this = $(this); // Cache this
      $.ajax({
        url: '<?php echo admin_url("admin-ajax.php") ?>', // Let WordPress figure this url out...
        type: 'post',
        dataType: 'JSON', // Set this so we don't need to decode the response...
        data: $this.serialize(), // One-liner form data prep...
        beforeSend: function () {},
        error: handleFormError,
        success: function (data) {
          if (data.status === 'success') {
           handleFormSuccess();
          } else {
            handleFormError(); // If we don't get the expected response, it's an error...
          }
        }
      });
    });
});

所有的都很好。但我不明白我应该在哪里粘贴创建PDF的代码,我尝试将其粘贴到sendContactFormToSiteAdmin PHP函数中,但它没有起作用。

就像这个例子中所示,我需要将这段代码精确地粘贴到sendContactFormToSiteAdmin PHP函数中:

ob_start();
?>

<h1>Data from form</h1>
<p>Name: <?php echo $name;?></p>
<p>Email: <?php echo $email;?></p>

<?php 
$body = ob_get_clean();
$body = iconv("UTF-8","UTF-8//IGNORE",$body);
include("mpdf/mpdf.php");
$mpdf=new \mPDF('c','A4','','' , 0, 0, 0, 0, 0, 0); 
$mpdf->WriteHTML($body);
$mpdf->Output('demo.pdf','D');

但我不知道如何使用ajax响应来完成这个操作。

编辑 正如Shoaib Zafar所评论的那样,如果可以将pdf文件作为附件发送到电子邮件中,对我来说当然是最好的选择。


我不是很明白。您想将 PDF 作为附件发送电子邮件吗? - Shoaib Zafar
@Shoaib Zafar,如果可能的话,当然可以!在mPDF中,有可能将此文件写入服务器...我假设将其下载到客户端并保存到服务器。但是,如果真的可以作为附件通过电子邮件发送PDF文件,那当然我需要它。 - Zhurka
1个回答

0

如果要将PDF作为附件发送到电子邮件中,您需要更改您的电子邮件发送功能。

function sendContactFormToSiteAdmin () {

  try {
    if (empty($_POST['name']) || empty($_POST['email']) || empty($_POST['message'])) {
      throw new Exception('Bad form parameters. Check the markup to make sure you are naming the inputs correctly.');
    }
    if (!is_email($_POST['email'])) {
      throw new Exception('Email address not formatted correctly.');
    }

ob_start();
?>
<h1>Data from form</h1>
<p>Name: <?php echo $_POST['name'];?></p>
<p>Email: <?php echo $_POST['email'];?></p>
<?php 
$body = ob_get_clean();
// Supposing you have already included ("mpdf/mpdf.php");
$mpdf=new \mPDF('c','A4','','' , 0, 0, 0, 0, 0, 0); 
$mpdf->WriteHTML($body);
$pdf_content = $mpdf->Output('', 'S');
$pdf_content = chunk_split(base64_encode($pdf_content));
$uid = md5(uniqid(time()));
$filename = 'contact.pdf';

    $subject = 'Contact Form: '.$reason.' - '.$_POST['name'];
    $message = "Message from ".$_POST['name'].": \n\n ". $_POST['message'] . " \n\n Reply to: " . $_POST['email'];
    $header = 'From: My Blog Contact Form <contact@myblog.com>';

$header .= "--".$uid."\r\n";
$header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$header .= $message."\r\n\r\n";
$header .= "--".$uid."\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";  
$header .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
$header .= "Content-Transfer-Encoding: base64\r\n";
$header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
$header .= $pdf_content."\r\n\r\n";
$header .= "--".$uid."--";

    $send_to = "contact@myblog.com";
    $subject = "MyBlog Contact Form ($reason): ".$_POST['name'];

    if (wp_mail($send_to, $subject, $message, $header)) {
      echo json_encode(array('status' => 'success', 'message' => 'Contact message sent.'));
      exit;
    } else {
      throw new Exception('Failed to send email. Check AJAX handler.');
    }
  } catch (Exception $e) {
    echo json_encode(array('status' => 'error', 'message' => $e->getMessage()));
    exit;
  }


}

我对wp_email函数的工作原理不是很了解,但从技术上讲,这段代码应该可以工作,你只需要重构它。 你也可以在官方文档中找到更多关于它的信息mPDF示例#3


Zafarthe,电子邮件内容为“1ы,j Ў­zЫQzrЖ^Вл^Вкю эz{CЪhВ+bЂv­ЕЇ!щэ~)^Љ”,不包含附件=) - Zhurka
可能是行尾符问题...我刚刚搜索了一下,似乎wp_mail使用第四个参数来处理附件文件。为此,您可以将文件保存在某个目录中,并将其用作附件。请参阅我为您创建的这个代码片段。https://gist.github.com/mszb/994754f9db66ba533f361146780e8efd - Shoaib Zafar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接