Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress

ตอนนี้คุณมีเว็บไซต์ที่ใช้ระบบไฟล์แบบเรียบแล้ว คุณต้องการรับคำติชมจากผู้ใช้ของคุณ การเพิ่ม Disqus นั้นง่ายเพราะเป็นโค้ด JavaScript ทั้งหมดที่เพิ่มลงในหน้า แต่มันไม่ใช่สิ่งที่คุณต้องการ คุณต้องการให้พวกเขาส่งอีเมลถึงคุณโดยตรงเพื่อให้คุณสามารถตอบกลับได้

คุณสามารถสร้างระบบ JavaScript ทั้งหมดเพื่อส่งอีเมลจากคอมพิวเตอร์ของผู้ใช้ได้โดยตรง แต่นั่นทำให้อีเมลของคุณเปิดกว้างต่อผู้ส่งสแปมที่สามารถดึงข้อมูลจากโค้ดของคุณ และขายให้กับนักส่งสแปมคนอื่นๆ ดังนั้น คุณต้องซ่อนที่อยู่อีเมลของคุณบนเซิร์ฟเวอร์

บทแนะนำนี้เป็นเรื่องเกี่ยวกับการเพิ่มระบบข้อความอีเมลใน PressCMS . ใหม่ของคุณ (เช่น phpPress , rubyPress , nodePress และ goPress ). ฉันกำลังเริ่มต้นด้วย front-end แล้วจัดการกับ back-end สำหรับแต่ละระบบ ฉันคิดว่าคุณมีเซิร์ฟเวอร์เหล่านี้อยู่ในระบบของคุณแล้ว

วิธีการสร้างแบบฟอร์มในเบราว์เซอร์

เนื่องจากรหัสส่วนหน้าจะเหมือนกันสำหรับแต่ละเซิร์ฟเวอร์ คุณจะต้องคัดลอกไฟล์ใหม่เหล่านี้ไปยังแต่ละไดเรกทอรีของเซิร์ฟเวอร์ ดังนั้น ผมจะพูดถึงไฟล์ในพาธที่อ้างอิงจากไดเร็กทอรีเซิร์ฟเวอร์

แทนที่จะเพิ่มการกำหนดรูปแบบเฉพาะแบบฟอร์มให้กับธีม สคริปต์ของแบบฟอร์มนี้มีทุกอย่างในที่เดียว สร้างไฟล์ questions.html ใน site/parts ไดเร็กทอรีสำหรับเว็บไซต์ที่มีเนื้อหาดังต่อไปนี้:

<!-- Styling for the form -->
<style>
    form {
        margin:        20px auto;
        width:         400px;
        padding:       1em;
        border:        1px solid #f0d5ad;
        border-radius: 1em;
    }

    form div + div {
        margin-top:    1em;
    }

    label {
        display:       inline-block;
        width:         90px;
        text-align:    right;
    }

    input, textarea {
        width:           300px;
        -moz-box-sizing: border-box;
    }

    input:focus, textarea:focus {
        border-color:    #000;
    }

    textarea {
        vertical-align: top;
        height:         5em;
        resize:         vertical;
    }

    button {
        margin-top:     10px;
        margin-left:    8em;
    }
</style>

<!-- HTML for the Form -->

<form action="/api/message" method="post">
    <div>
        <label for="Name">Name:</label>
        <input id="Name" name="Name" type="text" value="" pattern="[a-zA-Z]{3,3} [a-zA-Z]{3,3}" title="First and Last name." autofocus required />
    </div>
    <div>
        <label for="Email">Email:</label>
        <input id="Email" name="Email" type="email" pattern="[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}" title="Valid Email only." value="" required />
    </div>
    <div>
        <label for="Message">Message:</label>
        <textarea id="Message" name="Message" type="text" value="" required></textarea>
    </div>
    <button type="submit">Send Message</button>
</form>

ซึ่งจะสร้างแบบฟอร์มพื้นฐานเพื่อขอชื่อเต็ม (ชื่อและนามสกุล) อีเมล และข้อความ แบบฟอร์มนี้ใช้นิพจน์ทั่วไปเพื่อให้แน่ใจว่าชื่อและที่อยู่อีเมลถูกต้อง หากสิ่งที่ผู้ใช้ป้อนลงในฟิลด์เหล่านั้นไม่ตรงกับนิพจน์ทั่วไปใน pattern คำสั่งแล้วแบบฟอร์มจะไม่ถูกส่ง ป๊อปอัปจะขอให้ผู้ใช้กรอกข้อความในช่อง title . ให้ถูกต้อง พารามิเตอร์. ช่องป้อนข้อมูลแต่ละช่องมี required ดั้งเดิมเช่นกัน วิธีนี้ช่วยป้องกันไม่ให้ส่งแบบฟอร์มเปล่า นี่คือการตรวจสอบความถูกต้องของข้อมูลขั้นต่ำที่คุณควรใช้ในส่วนหน้า

action คำสั่งใน form องค์ประกอบบอกเว็บเบราว์เซอร์ว่าต้องส่งข้อมูลแบบฟอร์มไปยังที่อยู่ใด method คำสั่งบอกให้เบราว์เซอร์ส่งเป็น post กระบวนการ. ข้อมูลแบบฟอร์มจะถูกวางไว้ใน URL ของคำขอโพสต์ไปยังเซิร์ฟเวอร์ นี่คือ สตริงข้อความค้นหา . จากนั้นเซิร์ฟเวอร์จะประมวลผลข้อมูลในสตริงการสืบค้น

ใน site/pages ไดเร็กทอรี สร้างไฟล์ contact.md แล้ววางโค้ดนี้:

### Contact Us

This is a simple contact form. Please fill in your name, first and last, email address, and message. I will get back to you as soon as possible. Thanks.

{{{question}}}

เมื่อบันทึกแล้ว คุณสามารถลองใช้หน้าต่างๆ ในเซิร์ฟเวอร์ได้ ในเบราว์เซอร์ของคุณ ให้เปิดหน้า https://localhost:8081/contact.

แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress
หน้าแบบฟอร์มการติดต่อ

ติดต่อเรา หน้าจะมีลักษณะเหมือนภาพด้านบน สังเกตการเน้นของฟิลด์ชื่อโดยตรงเมื่อโหลด autofocus คำสั่งสร้างพฤติกรรมที่ต้องการนี้ เป็นการออกแบบที่ดีเสมอที่จะมีฟิลด์แรกที่ผู้ใช้ต้องพิมพ์ลงในโฟกัสโดยอัตโนมัติ

หลังจากส่งข้อความแล้ว ข้อความยืนยันไปยังผู้ใช้ก็น่าจะดี ใน site/pages ไดเร็กทอรี สร้างไฟล์ messagesent.md แล้ววางโค้ดนี้:

### Message was sent

Thank you so much for taking time to send me a message. I will reply as soon as possible.

เพียงข้อความง่ายๆ เพื่อให้ผู้ใช้ทราบว่าข้อความถูกส่งไปอย่างถูกต้อง คุณสามารถขยายได้ตามต้องการ

แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress แบบฟอร์มการประมวลผลด้วย phpPress, goPress, rubyPress และ nodePress
ส่งข้อความยืนยันหน้าเพจ

การประมวลผลแบบฟอร์มด้วย goPress

ในการฆ่าเชื้อข้อความที่ผู้ใช้มอบให้ ฉันใช้ Blue Monday ห้องสมุด. ในการโหลดไลบรารีนั้นในระบบของคุณ คุณต้องเรียกใช้บรรทัดคำสั่งนี้:

go get github.com/microcosm-cc/bluemonday

ซึ่งจะทำให้ห้องสมุดพร้อมใช้งานสำหรับโปรแกรมของคุณ นั่นคือห้องสมุดที่ไม่ได้มาตรฐานเพียงแห่งเดียวที่จำเป็น

เปิด goPressServer.go ไฟล์และเพิ่มไปที่ด้านบนของไฟล์ภายใน import () คำสั่ง:

    "fmt"
    "github.com/hoisie/web"
    "net/smtp"
    "github.com/microcosm-cc/bluemonday"

การส่งอีเมลข้อความจากเซิร์ฟเวอร์ต้องใช้ไลบรารีเหล่านี้ หลังบรรทัดที่มี goPress.DefaultRoutes( เรียกฟังก์ชัน เพิ่มโค้ดต่อไปนี้:

//
// Setup special route for our form processing.
//

goPress.SetPostRoute('/api/message', postMessage)

ซึ่งจะกำหนดเส้นทางการโพสต์ของ /api/message เพื่อเรียกใช้ฟังก์ชัน postMessage() . ที่ส่วนท้ายของไฟล์ ให้เพิ่มโค้ดนี้:

//
// Function:         postMessage
//
// Description:      This function will send
//                   the message from them
//                   the website to the owner
//                   of the site.
//
// Inputs:
//                   ctx     The web server 
//                           context.
//
func postMessage(ctx *web.Context) string {
    //
	// Get the post information and send the 
    // email.
	//
	name := ctx.Params["Name"]
	from := ctx.Params["Email"]
	p := bluemonday.UGCPolicy()
	message := p.Sanitize(ctx.Params["Message"])
	to := "<your email address>"
	subject := "Message from User:" + name + " of CustomCT.com"
	sendEmail(to, from, subject, message)

	//
	// Get the messagesent page contents and 
    // process it.
	//
	pgloc := goPress.SiteData.Sitebase + "pages/messagesent"
	return goPress.RenderPageContents(ctx, goPress.GetPageContents(pgloc), pgloc)
}

//
// Function:         sendEmail
//
// Description:      This function sends an 
//                   email message.
//
// Inputs:
//                   to      The email address 
//                           to send the 
//                           message
//                   from    The email address 
//                           of the person 
//                           sending the 
//                           message
//                   subject The subject of the 
//                           message
//                   message The message of the 
//                           email
//
func sendEmail(to string, from string, subject string, message string) {
	body := fmt.Sprintf("To: %s\r\nSubject: %s\r\n\r\n%s", to, subject, message)
	auth := smtp.PlainAuth("", "<your email address>", "<your password>", "smtp.gmail.com")
	err := smtp.SendMail("smtp.gmail.com:587", auth, from, []string{to}, []byte(body))
	if err != nil {
		//
		// Process the error. Currently, assuming there 
        // isn't a problem.
		//
	}
}

ฟังก์ชันทั้งสองนี้ประกอบขึ้นเป็นเครื่องจัดการสำหรับการประมวลผลอีเมลที่ส่งจากเบราว์เซอร์ /api/message เส้นทางเรียก postMessage() การทำงาน. ดึงข้อมูลที่ส่งจากแบบฟอร์มที่ผู้ใช้กรอก ล้างข้อความด้วยห้องสมุด BlueMonday และส่งอีเมลไปยังเจ้าของเว็บไซต์โดยใช้ sendEmail() การทำงาน. คุณจะต้องใส่ที่อยู่ Gmail ของคุณแทน <your email address> เจ้าของและรหัสผ่านใน <password> ผู้ถือ

ใน goPress.go ไฟล์ เพิ่มฟังก์ชันนี้ต่อจาก SetGetRoute() ฟังก์ชัน:

//
// Function:           SetPostRoute
//
// Description:       This function gives an 
//                    easy access to the 
//                    web variable setup in 
//                    this library.
//
// Inputs:
//     	route 	     Route to setup
//		handler      Function to run that 
//                   route.
//
func SetPostRoute(route string, handler interface{}) {
	web.Post(route, handler)
}

ฟังก์ชันนี้เหมือนกับ SetGetRoute() การทำงาน. ข้อแตกต่างเพียงอย่างเดียวคือการใช้ web.Post() ฟังก์ชัน

ด้วยการเปลี่ยนแปลงเหล่านี้ เซิร์ฟเวอร์ goPress ของคุณสามารถส่งอีเมลจากผู้ใช้ได้

การประมวลผลแบบฟอร์มด้วย nodePress

ในการส่งอีเมลจากโหนด คุณจะต้องติดตั้ง ไลบรารี Nodemailerก่อน และ ไลบรารีตัวแยกวิเคราะห์ ด้วยบรรทัดคำสั่งต่อไปนี้:

npm install -save nodemailer
npm install -save body-parser

จากนั้นคุณต้องโหลดไลบรารีใหม่และกำหนดค่าวัตถุเมล ที่ด้านบนของ nodePress.js หลังจากโหลดไลบรารี่ล่าสุด ให้เพิ่มบรรทัดเหล่านี้:

var nodemailer = require('nodemailer');  // https://nodemailer.com/
var bodyParser = require('body-parser'); // https://github.com/expressjs/body-parser

//
// create reusable transporter object using the 
// default SMTP transport
//
var transporter = nodemailer.createTransport('smtps://<your email name%40<your email domain>:<your password>@smtp.gmail.com');

การดำเนินการนี้จะโหลดไลบรารี nodemailer และตั้งค่าส่วนประกอบที่ใช้ซ้ำได้สำหรับการส่งอีเมล คุณต้องแทนที่ <your email name> ด้วยชื่อที่อยู่อีเมลของคุณ (เช่น ก่อนเครื่องหมาย @) <your email domain> เป็นโดเมนสำหรับที่อยู่อีเมลของคุณ (เช่น gmail.com สำหรับ gmail ปกติหรือชื่อโดเมนของคุณหากคุณตั้งค่า Gmail ในชื่อโดเมนของคุณ) และ <your password> ด้วยรหัสผ่านสำหรับบัญชีอีเมลของคุณ

หลังจากบรรทัดที่เริ่มต้นตัวแปร nodePress ให้เพิ่มโค้ดนี้:

//
// Configure the body parser library.
//
nodePress.use(bodyParser.urlencoded({
    extended: true
}));

ตอนนี้หลังจาก nodePress.get() . ล่าสุด เรียกฟังก์ชัน เพิ่มโค้ดนี้:

nodePress.post('/api/message', function(request, response) {
    //
	// setup e-mail data
  	//
    var mailOptions = {
        from: request.body.Email,
        to: '<your email address>',
        subject: 'Message from ' + request.body.Name + ' on contact form.',
        text: request.body.Message,
        html: request.body.Message
    };
  	//
  	// Send the email.
  	//
    transporter.sendMail(mailOptions, function(error, info){
        if(error){
            return console.log(error);
        }
        //
        // Send the user to the message was sent okay page.
        //
        response.send(page("messagesent"));
    });
});

นี่คือตัวจัดการสำหรับ /api/message ที่อยู่. ฟังก์ชันนี้รับข้อมูลที่ส่งจากแบบฟอร์ม สร้างข้อความอีเมลที่เหมาะสม และส่งไปยังที่อยู่อีเมลที่ให้ไว้ใน <your email address> . หลังจากส่งอีเมลแล้ว ระบบจะส่งผู้ใช้ไปที่ /messagesent หน้าหนังสือ. มิดเดิลแวร์ตัวแยกวิเคราะห์เนื้อหามีพารามิเตอร์ url ที่บันทึกไว้ใน request.body แปรผันและผ่านการฆ่าเชื้ออย่างถูกต้อง

รหัสนี้ใช้ได้กับการตั้งค่า Gmail โดยไม่มีการตรวจสอบสิทธิ์แบบสองปัจจัย หากคุณมีการตรวจสอบสิทธิ์แบบสองปัจจัย คุณสามารถอ้างถึง Nodemailer เอกสารประกอบการตั้งค่า

การประมวลผลแบบฟอร์มด้วย rubyPress

ในการส่งอีเมลใน Ruby คุณจะต้องติดตั้ง ruby-gmail ไลบรารีด้วยบรรทัดคำสั่งต่อไปนี้:

gem install ruby-gmail

คุณอาจต้องใช้ sudo . ทั้งนี้ขึ้นอยู่กับการตั้งค่า Ruby ของคุณ ต่อหน้าคำสั่ง ตอนนี้ในการโหลดไลบรารี ให้เพิ่มบรรทัดต่อไปนี้ที่ด้านบนของ rubyPress.rb ไฟล์:

require 'gmail'       # https://github.com/dcparker/ruby-gmail

หลังจากทั้งหมด get คำจำกัดความ เพิ่มบรรทัดต่อไปนี้:

post '/api/message' do
  #
  # Get the parameters from the form.
  #
  name = params[:Name]
  email = params[:Email]
  message = params[:Message]

  #
  # Create and send the email.
  #
  Gmail.new('<your email address>', '<your password>') do |gmail|
    gmail.deliver do
      to "<your email address>"
      from email
      subject "Message from " + name
      text_part do
        body message
      end
    end
  end
  #
  # Send the user to the message sent page.
  #
  page 'messagesent'
end

ด้วยส่วนเพิ่มเติมเหล่านี้ เซิร์ฟเวอร์ rubyPress ของคุณสามารถประมวลผลแบบฟอร์มอีเมลได้ เมื่อคุณเปลี่ยน <your email address> ไปยังที่อยู่อีเมลของคุณและ <your password> สำหรับรหัสผ่านสำหรับเซิร์ฟเวอร์อีเมลของคุณ สคริปต์จะเสร็จสิ้น

การประมวลผลแบบฟอร์มด้วย phpPress

เซิร์ฟเวอร์สุดท้ายที่จะแก้ไขคือเซิร์ฟเวอร์ phpPress ในการเพิ่มความสามารถของอีเมลไปยังเซิร์ฟเวอร์ ฉันจะติดตั้ง ไลบรารี phpmailer . นี่เป็นไลบรารี่ที่ใช้กันอย่างแพร่หลายที่สุดใน PHP สำหรับการทำงานกับอีเมล ในการติดตั้งไลบรารี คุณต้องเรียกใช้คำสั่งบรรทัดคำสั่งเหล่านี้ในไดเร็กทอรี phpPress:

composer update
composer require phpmailer/phpmailer

ขออภัย การอัปเดตผู้แต่งจะอัปเดตไลบรารี LightnCandy นี่เป็นสิ่งที่ดีเพราะเร็วกว่าและใช้งานง่ายกว่ามาก แต่มันทำลายรหัสเซิร์ฟเวอร์ ในไฟล์ index.php ค้นหา ProcessPage() และแทนที่ด้วยรหัสต่อไปนี้:

//
// Function:        ProcessPage
//
// Description:     This function will process 
//                  a page into the template, 
//                  process all Mustache
//                  macros, and process all 
//                  shortcodes.
//
// Inputs:
//                  $layout     The layout for 
//                              the page
//                  $page       The pages main 
//                              contents
//
function ProcessPage( $layout, $page ) {
   global $site, $parts, $helpers;

   //
   // Get the page contents.
   //
   $parts['content'] = figurePage($page);

   //
   // First pass on Handlebars.
   //
   $phpStr = LightnCandy::compile($layout, $helpers);
   $renderer = LightnCandy::prepare($phpStr);
   $page = $renderer($parts);

   //
   // Process the shortcodes.
   //
   $pageShort = processShortcodes($page);

   //
   // Second pass Handlebars.
   //
   $phpStr = LightnCandy::compile($pageShort, $helpers);
   $renderer = LightnCandy::prepare($phpStr);
   $page = $renderer($parts);

   //
   // Return the results.
   //
   return($page);
}

เมื่อเปรียบเทียบกับรหัสที่เก่ากว่า คุณไม่จำเป็นต้องทำงานกับไฟล์ชั่วคราวอีกต่อไป ทั้งหมดนี้ทำได้ในหน่วยความจำและเร็วกว่ามาก ตอนนี้ ที่ด้านบนของ index.php ไฟล์เพิ่มหลังไลบรารีหยก:

//
// PHP Mailer:  https://github.com/PHPMailer/PHPMailer
//
require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php';

สิ่งนี้จะโหลดไลบรารี phpmailer ตอนนี้หลังจาก $app->get() . ล่าสุด ฟังก์ชั่นเพิ่มรหัสนี้:

//
// This route is for processing the post request from the
// email form on the website.
//
$app->post('/api/message', function(Request $request, Response $response) {
    global $_POST;

    //
    // Get the post variables.
    //
    $Name = $_POST['Name'];
    $Email = $_POST['Email'];
    $Message = $_POST['Message'];

    //
    // Create the email message and send it.
    //
    $mail = new PHPMailer;

    $mail->isSMTP();                           // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';            // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                    // Enable SMTP authentication
    $mail->Username = '<your email address>';  // SMTP username
    $mail->Password = '<your password>';       // SMTP password
    $mail->SMTPSecure = 'tls';                 // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                         // TCP port to connect to

    $mail->setFrom($Email, $Name);
    $mail->addAddress('<your email>', '<your name>');     // Add a recipient

    $mail->Subject = "Message from $Name";
    $mail->Body    = $Message;

    if(!$mail->send()) {
        echo 'Message could not be sent.';
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        $newResponse = SetBasicHeader($response);
        $newResponse->getBody()->write(page('messagesent'));
        return($newResponse);
    }
});

นี่คือตัวจัดการคำขอโพสต์สำหรับ /api/message เส้นทาง. จะดึงข้อมูลแบบฟอร์มที่ส่งจากเบราว์เซอร์ สร้างอีเมลด้วย และส่งอีเมล PHP นำพารามิเตอร์ URL ใด ๆ มาใส่ในอาร์เรย์ส่วนกลาง $_POST .

คุณจะต้องเปลี่ยน <your email address> , <your password> และ <your name> ด้วยค่าที่เหมาะสมสำหรับอีเมลของคุณ หากคุณกำลังใช้อย่างอื่นที่ไม่ใช่เซิร์ฟเวอร์ Gmail SMTP คุณจะต้องเปลี่ยน $mail->Host ที่อยู่ด้วย

บทสรุป

ฉันได้แสดงวิธีการเพิ่มแบบฟอร์มอีเมลไปยังไซต์ pressCMS อย่างง่ายดาย การดาวน์โหลดสำหรับบทช่วยสอนนี้มีเซิร์ฟเวอร์ทั้งหมดที่มีการแก้ไข คุณจึงดาวน์โหลดแทนการพิมพ์ได้ ฉันทำผิดพลาดเล็กน้อยในการจัดการ ฉันจะปล่อยให้ที่เหลือเป็นการออกกำลังกายของคุณ

วิธีที่ฉันสอนที่นี่คือการโพสต์ข้อมูลในแบบฟอร์มพร้อมข้อมูลใน URL ปัจจุบันไซต์จำนวนมากใช้ REST API ด้วยข้อมูลใน JSON สตริงในร่างกายเพื่อดำเนินการ กิจวัตรเหล่านี้ใช้ได้กับวิธีการนั้นอย่างง่ายดาย แต่นั่นเป็นแบบฝึกหัดสำหรับคุณ (หรืออาจจะเป็นบทช่วยสอนในอนาคต) เมื่อคุณทราบวิธีการทำเช่นนี้แล้ว ให้เพิ่มแบบฟอร์มของคุณเองลงในไซต์ของคุณ การปรับแต่งประเภทนี้สนุกมาก ขีดจำกัดเพียงอย่างเดียวคือจินตนาการของคุณ