Smarty Template Engine หรือเรียกสั้นๆว่า smarty เป็นชุด Class Library ที่สร้างขึ้น เพื่อมาจัดการส่วนการแสดงผล หรือ Presentation Layer หรือ Views ใน MVC ที่มีประสิทธิภาพยอดเยี่ยม และใช้งานง่าย
ทำไมต้อง Smarty ?
ถ้าเก่งภาษาอังกฤษ แนะนำให้อ่านโดยตรงที่นี่นะคับ http://smarty.php.net/whyuse.php
วัตถุประสงค์หลักสำหรับการออกแบบโปรแกรม Smarty ขึ้นมานั้น ก็ เพื่อต้องการแยกการทำงานในส่วนของ การแสดงผล (Presentation Layers) ออกจาก ส่วนของ การประมวลผล ข้อมูล(Business Logic Layers) อย่างชัดเจน ซึ่ง โดย ส่วนใหญ่ แล้ว โปรแกรมการประมวลผล และ การแสดงผลจะ ใช้ รูปแบบ ของ ภาษาที่ ต่างกัน ค่อน ข้างชัดเจ นอยู่แล้วโดย ที่การ แสดง ผล เราจะ ใช้ ภาษา HTML ส่วนการ ประมวลผล เราจะใช้ ภาษา PHP
<strong>Business Logic Layer -><font color=”#000080″>PHP</font>
Presentation Layer -> <font color=”#000080″>HTML</font></strong>
สำหรับ ส่วนการแสดงผล จะเป็นส่วนที่ แสดงข้อมูลต่างๆ ถึง ผู้ใช้งาน ระบบโดยตรง ซึ่งจะถูกสร้าง และ ดูแล ผ่าน ไฟล์ template ต่างๆ และส่วนใหญ่ ถูกสร้าง และปรับปรุงโดย ผู้ออกแบบ(Designer) หน้าตาของ เว็บไซต์ หรือ ระบบโดยตรง นอกจากนี้ฟังก์ชัน พื้นฐานทั่วๆ ไปของ เว็บไซต์ หรือ ระบบ ก็จะเป็นการ ดึงข้อมูล แล้วไปกำหนดค่าที่ไฟล์ Template แล้วทำการแสดงผลออกมา และข้อมูล โดยทั่วไปแล้ว จะเป็น หัวเรื่อง ข้อมูลรายละเอียด อื่นๆ เกี่ยวกับ ข่าว ต่างๆ เป็นต้นสำหรับการออกแบบระบบถ้ามีการ แยกส่วนของการแสดงผล ออกจาก ส่วน ของการประมวลผล ข้อมูล ที่จะนำมาแสดง ออกจากกัน อย่างชัดเจนแล้วโปรแกรมเมอร์ ที่ดูแลโปรแกรม ก็ไม่ต้องห่วงเรื่องการแสดงผล ในขั้นตอนการเขียนและแก้ไขโปรแกรม
และ ขณะเดียวกัน ดีไซน์เนอร์ ผู้ที่ดูแลส่วนของของการแสดงผล ก็ ไม่ต้องห่วงเรื่อง ข้อมูล หรือโปรแกรม เวลาจะปรับปรุงหรือ แก้ไข รูปแบบการแสดงผล และ โดยส่วนใหญ่ แล้ว การแก้ไข หรือ ปรับปรุงระบบส่วน มากจะเกี่ยวข้องกับการแสดงผล โดยส่วนใหญ่ เช่น การปรับปรุง tag html บางอย่าง การแก้ไข สไตล์ชีต (CSS) และส่วนใหญ่แล้ว ก็ จะใช้หรือทำผ่านโปรแกรมเฉพาะด้านต่าง อาทิ เช่น Dreamweaver เป็นต้น
สรุปหลักๆโดยรวม สำหรับข้อดี การใช้ Smarty
*) การปรังปรุง การประมวล ผลข้อมูลต่างๆ ทำได้ ค่อนข้าง อิสระ ไม่ต้องกังวล ในส่วนที่เกี่ยวข้องกับ การแสดงมากนัก
*) ลดผลกระทบกับ โปรแกรมที่เกิดจาก Designer , โดยที Designer ยังสามารถแก้ไข ปรับปรุง การแสดงผลได้ตามต้องการ
*) ระบบความปลอดภัยของ โปรแกรม มีมากขึ้น รวมทั้ง ง่ายต่อการ ดูแลรักษาด้วย
*) Smarty มีฟังก์ชัน ที่ช่วยจัดการเกี่ยวกับ ความปลอดภัย รวมถึง การเข้า ถึง ข้อมูลในส่วนต่างๆ เป็นอย่างดี เราจึง สามารถ กำหนด และบริหาร การเข้าถึง โปรแกรม สำหรับ Designer เพื่อป้อง กันปัญหาต่างๆ อัน อาจจะเกิดจาก การแก้ไข หรือปรับปรุงการแสดงผล ได้
อย่างไร ก็ตาม ถึงแม้จะมีการแยกส่วนของโปรแกรม (Application Code) ออกจาก ส่วนการแสดงผล (Presentation) เป็นสัดส่วนอย่างชัดเจน ก็ใช่ว่า การประมวลผลจะต้อง
แยกออกไปทั้งหมด Smarty เข้าใจว่า สำหรับการประมวลผล บางอย่าง ยังมีความจำเป็น และน่าจะต้องทำในส่วนการแสดงผล เช่น
1. กรณี ที่ สำหรับ ข้อมูลชุดเดียวกัน เวลาแสดงผลในตารางหนึ่ง สำหรับ บางแถว อาจจะต้องการแสดงผลด้วยสี อื่นๆ ต่างออกไป หรือ
2. กรณี สำหรับ ข้อมูลชุดเดียวกัน ข้อมูล บางอย่าง อาจจะต้องการ แสดงให้เป็น ตัวหนา หรือ มีสีที่ต่างออกไป
smarty จะทำให้เราแยกโปรแกรม php ออกจาก html แยกออกจากกันอย่างสิ้นเชิงเลยน้ะครับ แยก folder กันด้วย โดยที่ฝั่ง php ก็ทำงาน ไปเอาข้อมูล ไป query database ไป ได้ข้อมูลมา เช่น array ของข้อมูลลูกค้า ก็โยน (assign) ข้อมูลนี้ให้ smarty ส่วน smarty ก็เอาข้อมูลไปแสดง ไปเช็คว่าข้อมูลมีค่าไหม ถ้าไม่มีก็ขึ้นข้อความว่า “Not found” หรืออื่นๆ หรือถ้ามีก็แสดง list ออกมา มันจะทำให้เวลาที่เราต้องการแก้ไขหน้าตาของ web app แล้ว เราไม่ต้องไปยุ่งกับ code php ของเรา ก็แก้ที่ฝั่ง html แค่นั้นพอ ยังงี้แล้ว ทำให้เราเขียน 1 โปรแกรม แต่เอาไปรันได้ หลาย templates เลยทีเดียว หรือโปรแกรมแบบที่เขาแยก themes เลือก themes ได้ ใช้ smarty แล้วช่วยได้มากมายเลยครับในการนำ smarty มาใช้ เราสามารถ ดาวน์โหลด แล้วเอามาวางใน folder ใดๆ ใน app ของเรา แล้วก็ include หรือ require และเรียกใช้งานได้ทันที
ตัวอย่างขั้นตอนการใช้งาน (ใน Windows) เช่น:
1. ดาวน์โหลดไฟล์ smarty ลองดูตรง “Latest Stable Release” แล้วดาวน์โหลดมา ในที่นี้ผมดาวน์โหลด Smarty 2.6.18 Source March 7th, 2007
2. ทำการแตก zip ไฟล์ (.tar.gz ก็เป็น zip ไฟล์แบบหนึ่ง ไม่ต้องตกใจ สามารถใช้WinZip หรือ WinRar แตกได้สบายๆ) จะได้ folder ชื่อ Smarty-2.6.18 มา
3. copy Smarty-2.6.18 ทั้ง folder ไปวางไว้ใน folder library ของคุณ หรือถ้าไม่มี ก็วางไว้ที่เดียวกับที่ app อยู่ แล้วเปลี่ยนชื่อจาก Smarty-2.6.18 เป็น Smarty ก็พอ จะได้จำง่ายๆ จากนั้นก็ลองเขียน app ง่ายๆ ดูเลย
ตัวอย่างโปรแกรม PHPFile: helloSmarty.php
——————–
<?php
include “Smarty/libs/Smarty.class.php”;
// สร้าง Smarty instance
$smarty = new Smarty; // เซตที่อยู่ของ template
$smarty->template_dir = ‘templates’;
// เซตที่อยู่ของไฟล์ template ที่ compile แล้ว
$smarty->compile_dir = ‘templates_c’; // assign ค่าให้ pattern ‘message’ (หรือจะเรียกว่า “ตัวแปร ของ smarty” ก็คงไม่ผิดอะไร)
// เวลาเราอ้าง pattern นี้ใน template file จะอ้างเป็น $message
$smarty->assign(’message’, ‘Hello Smarty!’);
// สั่งแสดงผล โดยใช้ template file ที่ระบุ
$smarty->display(’helloSmarty.html’);
?>ตัวอย่าง Template FileFile: templates/helloSmarty.html
——————–
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Test Smarty - phpzealots.com</title>
<meta name=”generator” content=”editplus” />
</head> <body>
<h1>{$message}</h1>
</body>
</html>เสร็จแล้วลองเรียกรัน helloSmarty.php ดูครับอันนี้เป็นการใช้งาน Smarty แบบเบื้องต้นจริงๆ น้ะครับ ถ้าใช้งานจริง คุณอาจจะเก็บ library ของ Smarty (ที่อยู่ใน libs ทั้งหมด) ออกมาไว้ที่ folder Smarty แล้วย้าย folder Smarty นี้ไปไว้ใน library ของคุณ และอ้าง include_path มาหา เวลาเอาไปใช้งานจะได้ไม่ต้อง include ชื่อ folder ยาวๆ
เว็บไซต์ : http://smarty.php.net/
Download : http://smarty.php.net/download.php
เอกสารการใช้งาน : http://smarty.php.net/docs.php
Contents
- PHPMailer What is it? What does it do? Who needs it? Brief examples of PHPMailer’s features.
- First time
Sending your first email with PHPMailer. Tells you how to start. Anyone who completely understands the source on the PHPMailer homepage or README can skip this section.
- Using Attachments
Sending mails with file attachments: filesystem, database or inline.
- Using HTML Mail
Using the class’s integrated HTML Email features.
- Support: Where do I get help?
How to find support resources: PHPMailer website, mailing list etc.
- Other Resources Email and PHP Resources
There is a lot of information in the net about email, php and PHPMailer.
PHPMailer
PHPMailer is a PHP class for PHP (www.php.net) that provides a package of functions to send email. The two primary features are sending HTML Email and e-mails with attachments. PHPMailer supports nearly all possiblities to send email: mail(), Sendmail, qmail & direct to SMTP server. You can use any feature of SMTP-based e-mail, multiple recepients via to, CC, BCC, etc. In short: PHPMailer is an efficient way to send e-mail within PHP.
As you may know, it is simply to send mails with the PHP mail() function. So why use PHPMailer? Isn’t it slower? Yes that’s true, but PHPMailer makes it easy to send e-mail, makes it possible to attachm files, send HTML e-mail, etc. With PHPMailer you can even use your own SNTP server and avoid Sendmail routines used by the mail() function on *nix platforms.
This tutorial explains how to implement the class into your script or website and how to build an e-mail application. If you just want to send simple e-mail and you have no problems with the mail() function, it’s suggested that you continue to use mail(), instead of this class.
First time
For those who have not used PHP’s mail() function before, this section will provide information about email and e-mailing in general, in addition to explaining how to get started with PHPMailer.
Before continuing, please be sure that PHPMailer is installed correctly. If you feel uncertain, please read the installion instructions that accompany the package. If you’re still not sure, you can verify that you’ve installed PHPMailer correctly with this little script:
<?php
require(”class.phpmailer.php”);
$mail = new PHPMailer();
?>
Save it as a PHP document in the same directory where you’ve saved class.phpmailer.php. If no errors result from running the script, your installation has been done correctly. If you switched error messages and warnings off, then go ahead and set it on; refer to your PHP manual for more on this topic.
This snippet of code is also the start of any use of PHPMailer. require(”class.phpmailer.php”); includes the source code of the class and $mail = new PHPMailer(); creates a new instance of the class the class as $mail. All features, functions and methods of the class maybe accessed via the variable (object) $mail.
Merely creating an instance of the class is only the first step, of course. Let’s go ahead and send out the first mail. For this you’ll require the basics: An receipient address, a from address, a subject and the text of the message (called “mail-body” or simply “body” for short).
You will also need to select a method of delivering the message. We need a program to communicate with an SMTP server which, in turn, sends the mail out to the internet. In the *nix world, Sendmail is very popular and used widely.
PHPMailer provides several methods of sending mail. It’s best to start with SMTP, though (as mentioned above)_ the mail() function, Sendmail or qmail are also possible. When using SMTP, you’ll need a valid SMTP server; this may well be the same one that you use in your personal mail client.
Having gathered the necessary information to send your first e-mail, you’d use that information in place of the example information provided here:
<?php
require(”class.phpmailer.php”);
$mail = new PHPMailer();
$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = “smtp.example.com”; // SMTP server
$mail->From = “from@example.com”;
$mail->AddAddress(”myfriend@example.net”);$mail->Subject = “First PHPMailer Message”;
$mail->Body = “Hi! \n\n This is my first e-mail sent through PHPMailer.”;
$mail->WordWrap = 50;if(!$mail->Send())
{
echo ‘Message was not sent.’;
echo ‘Mailer error: ‘ . $mail->ErrorInfo;
}
else
{
echo ‘Message has been sent.’;
}
?> |
Save this as a php file and change the values to your values, of course. Here is an explanation of what each stanza in this script does:
$mail->IsSMTP();
This sets up STMP-Server as method to send out email(s).
$mail->Host = “smtp.example.com”;
Setting smtp.example.com as the SMTP server. Just replace it with your own SMTP server address. You can even specify more then one: just separate them with a semicolon (;): “smtp.example.com;smtp2.example.com”. If the first one fails, the second one will be used, instead.
Enter the address that the e-mail should appear to come from. You can use any address that the SMTP server will accept as valid.
$mail->From = “from@example.com”;
If displaying only an e-mail address in the “From” field is too simple, you can add another line of code to give the address an associated name. This will add ‘Your Name’ to the from address, so that the recipient will know the name of the person who sent the e-mail.
The following line
$mail->FromName = “Your Name”;
The following will add the to address, the address to which the e-mail will be sent. You must use a valid e-mail here, of course, if only so that you can verify that your PHPMailer test worked. It’s best to use your own e-mail address here for this inintial test. As with the “From” field, you may provide a name for the recipient. This is done somewhat differently:
$mail->AddAddress(”myfriend@example.net”,”Friend’s name”);
$mail->AddAddress(”myfriend@example.net”);
Setting the subject and body is done next. $mail->WordWrap = 50; is a feature of PHPMailer to word-wrap your message limiting all lines to a maximum length of X
characters, even if not set as body= …. Admittedly, there’s not much point in wrapping the text in a message as brief as the one in this example.
Finally, we send out the e-mail, once all necessary information has been provided. This is done with $return = $mail->Send();. In this example script, it’s combined with an error message; if Send() fails, it’ll return false and you can catch it and display an error message. This is done in the last lines. Or, in case of success, it displays a kind of “done ” message.
Using Attachments
Sending plain text e-mails is oten insufficient. Perhaps you need to attach something to your mail, such as an image or an audio file. Or perhaps you need to attach multiple files.
There are two ways of attaching something to your mail: You can simply attach a file from the filesystem or you can attach (binary) data stored in a variable. The latter is called Stringattachment. This makes it possible put extract data from a database and attach it to an e-mail, without ever having to actually save it as a file.
File Attachments
The command to attach a file can be placed anywhere between $mail = new PHPMailer(); and !$mail->Send(); and it’s called AddAttachment($path);. This single line will add the attachment to your mail.
$path is the path of the filename. It can be a relative one (from your script, not the PHPMailer class) or a full path to the file you want to attach.
If you want more options or you want to specify encoding and the MIME type of the file, then you can use three more parameters, all of which are optional:
AddAttachment($path,$name,$encoding,$type);
$name is an optional parameter, used to set the name of the file that will be embedded within the e-mail. The person who will recieve your mail will then only see this name, rather than the original filename.
$encoding is a little more technical, but with this parameter you can set the type of encoding of the attachment. The default is base64. Other types that are supported include: 7bit, 8bit, binary & quoted-printable. Please refer to your SMTP documentation about encoding and the differences between types. In general, mail servers will convert encodings they don’t want to handle into their preferred encoding type.
$type is the MIME type of the attached file. Content types are defined not necessarily by file suffixes (i.e., .GIF or .MP3), but, rather, a MIME type (MIME = Multipurpose Internet Mail Extensions) is used. This parameter makes it possible change the MIME type of an attachment from the default value of application/octet-stream (which works with every kind of file) to a more specific MIME type, such as image/jpeg for a .JPG photo, for instance.
String Attachments
String attachments have been supported since PHPMailer version 1.29. This method works much like AddAttachment(), and is called with AddStringAttachment($string,$filename,$encoding,$type). The string data is passed to the method with the first parameter, $string. Because the string will become a standard file (which is what the attachment will be when received via e-mail), the $filename parameter is required. It’s used to provide that filename for the string data.
The rest is just the same as described in detail above.
So, why use AddStringAttachment instead of AddAttachment? Is it for text-only files? No, not at all. It’s primarily for databases. Data stored in a database is always stored as a string (or perhaps, in the case of binary data, as as a BLOB: Binary Large OBject). You could query your database for an image stored as a BLOG and pass the resulting string to the AddStringAttachment.
Inline Attachments
There is an additional way to add an attachment. If you want to make a HTML e-mail with images incorporated into the desk, it’s necessary to attach the image and then link the <img src=”cid:CID” /> tag to it. For example, if you add an image as inline attachment with the CID my-photo, you would access it within the HTML e-mail with <img src=”cid:my-photo” mce_src=”cid:my-photo” alt=”my-photo” />.
In detail, here is the function to add an inline attachment:
$mail->AddEmbeddedImage(filename, cid, name);
By using this function with this example’s value above, results in this code:$mail->AddEmbeddedImage(’my-photo.jpg’, ‘my-photo’, ‘my-photo.jpg ‘);
For more Information about HTML Email, see the section Using HTML E-Mail.
Handling Attachments
If you want to attach multiple files (or strings), just call AddAttachment() or AddStringAttachment() multiple times. All attachments (file, string, and inline) may be stripped from an e-mail by invoking ClearAttachments().
Using HTML Email
Sending out HTML e-mail is a simple enough task with PHPMailer, though it can require significant knowledge of HTML. In particular, mail clients vary greatly in their rendering of HTML e-mail, with some refusing to show it entirely. For those mail clients which are not able to display HTML, you can provide an alternate e-mail body containing the message as plain text.
First we’ll create a basic HTML message:
<?phprequire(”class.phpmailer.php”);$mail = new PHPMailer();$mail->IsSMTP(); // telling the class to use SMTP
$mail->Host = “smtp.example.com”; // SMTP server$mail->From = “from@example.com”;
$mail->AddAddress(”myfriend@example.net”);
$mail->Subject = “An HTML Message”;
$mail->Body = “Hello, <b>my friend</b>! \n\n This message uses HTML entities!”;
?> |
It’s as easy as creating a plain text e-mail. Simply use a string with embedded HTML for $mail->body.
Before sending this out, we have to modify the PHPMailer object to indicate that the message should be interpreted as HTML. Technically-speaking, the message body has to be set up as multipart/alternative. This is done with:
$mail->IsHTML(true);
To make ensure that the recipient will be able to read the e-mail, even if his e-mail client doesn’t support HTML, use $mail->AltBody=”Hello, my friend! \n\n This message uses HTML entities, but you prefer plain text !”; to set the alternative body (AltBody in short). If you use this feature, the mail will be automatically set as multipart/alternative, making it unnecessary to specify $mail->IsHTML(true);.
And that’s how to create an HTML email. Simply apply the send command and the mail will be sent. It’s recommended that you avoid using HTML messages, because these messages are often used for viruses and exploits, they are much larger than plain text mails, and they’re not standarized in the way the plain text mail is. On the other hand, even attachments are used for viruses, but nobody would propose that we stop sending mails with attachments. Do what fits your needs: PHPMailer can be your solution, whatever you decide.
If you want to send out a HTML email with pictures, Flash animations or whatever else, PHPMailer supports this as well. Adding a picture to your HTML e-mail, for example, is explained in the Inline Attachments section. Briefly, here are 2 lines of code you’d use to insert an image before sending out an e-mail:
$mail->AddEmbeddedImage(”rocks.png”, “my-attach”, “rocks.png”);
$mail->Body = ‘Embedded Image: <img alt=”PHPMailer” src=”cid:my-attach” mce_src=”cid:my-attach”> Here is an image!’; |
Support - Where do I get help?
PHPMailer is open source and published under the GPL. Most of the questions how to start are answered within this tutorial, but inevitably some questions may well remain. For this, PHPMailer has its own homepage on SourceForge and a mailing list where you can post your questions.
PhpCaptcha is a library for generating visual and audio CAPTCHAs (completely automated public Turing test to tell computers and humans apart). You can read more about CAPTCHAs at Wikipedia.
It can help you to prevent/reduce:
- Automated sign-ups in registration forms.
- Comment spam in blogs and guestbooks.
- Brute force attacks on login systems.
A Word of Warning
OK, so this might sounds strange given what follows but please consider whether you really need to use a CAPTCHA before implementing this on your site. Although it’s legitimate to use CAPTCHAs in some situations you really need to be aware of the inherent accessibility pitfalls before implementing. I’d also encourage you to fully investigate the alternatives such as the Akismet spam filtering WordPress plug-in and API before resorting to a CAPTCHA to solve your spam problems.
Right, I’ve said my piece - on with the script.
Origins
The library is loosely based on an article I wrote for SitePoint which was published on 9th November 2005 - Toughen Forms’ Security with an Image.
Supported Features
- Multiple random TrueType fonts
- Character rotation
- Optional chararacter shadow support
- Optional site owner display text
- Random custom background images
- Font size selection
- Greyscale or colour lines and characters
- Character set selection
- Integration of validation function for checking the user entered code with the generated code
Requirements
The library requires PHP 4 compiled with GD 1 or 2 (Image Generation) and FreeType text support. It should work fine with Linux, Mac OS X or Windows based systems although you will need to change the default temporary file storage directory specified when using with Windows. PHP session support is also required. The audio CAPTCHA requires the Flite text to speech synthesis engine - more details on set up below.
Download
You can download a zip file of the source code here.
License
PhpCaptcha is licensed under the Free BSD license.
Hosting
If you need suitable hosting checkout DreamHost. They offer really good value accounts starting from $7.95 per month which should be suitable for running this CAPTCHA class. If you enter the promo code “ejeliot” when signing up you’ll save $49.95. It is also possible to download and compile the Flite text to speech synthesis engine required for the audio captcha. See instructions below.
Implementation Steps
Step 1
Unzip and copy the php-captcha.inc.php to a directory within your site.
Step 2
To create a basic visual CAPTCHA with the minimal options create a new file (visual-captcha.php) containing the code shown below. You can download some suitable TrueType fonts here.
<?php
require('php-captcha.inc.php');
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
$oVisualCaptcha = new PhpCaptcha($aFonts, 200, 60);
$oVisualCaptcha->Create();
?>
Step 3
To create an audio CAPTCHA create a new file (audio-captcha.php) containing the code shown below. For this to work you’ll need to ensure that your have a working installation of Flite.
<?php
require('php-captcha.inc.php');
$oAudioCaptcha = new AudioPhpCaptcha('/usr/bin/flite', '/tmp/');
$oAudioCaptcha->Create();
?>
You need to pass the path to the Flite binary and the temporary directory you want to use for storing generated audio CAPTCHAs to the class constructor. Alternatively you can modify the corresponding constants in the library file and then omit the parameters in the constructor.
Step 4
Include the visual and audio CAPTCHAs in your application/form with the following code. The audio CAPTCHA should ideally follow the visual CAPTCHA in the source code. This will ensure the visual CAPTCHA has generated a random code before the audio CAPTCHA is called.
<p><img src="visual-captcha.php" mce_src="visual-captcha.php" width="200" height="60" alt="Visual CAPTCHA" /></p>
<p><a href="audio-captcha.php" mce_href="audio-captcha.php">Can't see the image? Click for audible version</a></p>
Step 5
On form submission you need to check the code the user enters with the one generated by the CAPTCHA. You can do this with the following code assuming that the user entered code was submitted in an HTML POST form field “user_code”.
<?php
require('php-captcha.inc.php');
if (PhpCaptcha::Validate($_POST['user_code'])) {
echo 'Valid code entered';
} else {
echo 'Invalid code entered';
}
?>
Please note that the Validate method needs to be called statically, i.e you don’t create an instance of the class before calling it.
Some Examples
Some examples of CAPTCHAs with various options set are shown below.
CAPTCHA with site owner display text
// include captcha class
require('php-captcha.inc.php');
// define fonts
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
// create new image
$oPhpCaptcha = new PhpCaptcha($aFonts, 200, 60);
$oPhpCaptcha->SetOwnerText('Source: www.ejeliot.com');
$oPhpCaptcha->Create();
CAPTCHA with site owner display text and character shadows
// include captcha class
require('php-captcha.inc.php');
// define fonts
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
// create new image
$oPhpCaptcha = new PhpCaptcha($aFonts, 200, 60);
$oPhpCaptcha->DisplayShadow(true);
$oPhpCaptcha->SetOwnerText('Source: www.ejeliot.com');
$oPhpCaptcha->Create();
CAPTCHA with default settings
// include captcha class
require('php-captcha.inc.php');
// define fonts
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
// create new image
$oPhpCaptcha = new PhpCaptcha($aFonts, 200, 50);
$oPhpCaptcha->Create();
CAPTCHA with custom background image
// include captcha class
require('php-captcha.inc.php');
// define fonts
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
// create new image
$oPhpCaptcha = new PhpCaptcha($aFonts, 200, 50);
$oPhpCaptcha->SetBackgroundImages('images/captcha.jpg');
$oPhpCaptcha->Create();
CAPTCHA with colour
// include captcha class
require('php-captcha.inc.php');
// define fonts
$aFonts = array('fonts/VeraBd.ttf', 'fonts/VeraIt.ttf', 'fonts/Vera.ttf');
// create new image
$oPhpCaptcha = new PhpCaptcha($aFonts, 200, 50);
$oPhpCaptcha->UseColour(true);
$oPhpCaptcha->Create();
Audio CAPTCHA
You can listen to an example of the audio CAPTCHA alternative on any of my blog post pages.
Configuration Options
The methods listed below allow you to refine the look and feel as well as the behaviour of the generated CAPTCHA. They should all be called before the “Create” method.
- SetWidth(int iWidth) - set the width of the CAPTCHA image. Defaults to 200px.
- SetHeight(int iHeight) - set the height of the CAPTCHA image. Defaults to 50px.
- SetNumChars(int iNumChars) - set the number of characters to display. Defaults to 5.
- SetNumLines(int iNumLines) - set the number of interference lines to draw. Defaults to 70.
- DisplayShadow(bool bShadow) - specify whether or not to display character shadows.
- SetOwnerText(sting sOwnerText) - owner text to display at bottom of CAPTCHA image, discourages attempts to break your CAPTCHA through display on porn and other unsavoury sites.
- SetCharSet(variant vCharSet) - specify the character set to select characters from. If left blank defaults to A-Z. Can be specified as an array of chracters e.g. array(’1′, ‘G’, ‘3′) or as a string of characters and character ranges e.g. ‘a-z,A-Z,0,3,7′.
- CaseInsensitive(bool bCaseInsensitive) - specify whether or not to save user code preserving case. If setting to “false” you need to pass “false” as the second parameter to the “Validate” function when checking the user entered code.
- SetBackgroundImages(variant vBackgroundImages) - specify one (a string) or more (an array) images to display instead of noise lines. If more than one image is specified the library selects one at random.
- SetMinFontSize(int iMinFontSize) - specify the minimum font size to display. Defaults to 16.
- SetMaxFontSize(int iMaxFontSize) - specify the maximum font size to display. Defaults to 25.
- UseColour(bool bUseColour) - if true displays noise lines and characters in randomly selected colours.
- SetFileType(string sFileType) - specify the output format jpeg, gif or png. Defaults to jpeg.
TrueType Fonts
If you don’t have any TrueType fonts you can use with this class you can find some here.
Flite text to speech synthesis engine
You can download the source distribution of Flite from here. It is also available as a Debian package as well as RPMs which are suitable for use on RedHat and Mandrake Linux. If you’re compiling from source ensure that your server has plenty of memory. Most compile time errors are caused by lack of memory. To download and compile Flite from source run the following commands on the command line:
wget http://www.speech.cs.cmu.edu/flite/packed/flite-1.3/ flite-1.3-release.tar.gz
tar zxvf flite-1.3-release.tar.gz
cd flite-1.3-release
./configure
make
You can test if Flite installed successfully by running the following command to generate a sample wav file:
flite -t 'Hello World' -o hello.wav