Zend Framework – Sử dụng Zend_Captcha_Image

Zend Framework Captcha ImageZend Framework hỗ trợ việc tạo captcha rất đơn giản với lớp Zend_Captcha_Image. Bài viêt này sẽ giúp bạn tìm hiểu cách sử dụng lớp này để ứng dụng trong các trường hợp cụ thể.

Tạo Captcha

Minh họa:

Zend Captcha Demo

Để tạo một đối tượng captcha mới, bạn cần chỉ ra đường dẫn đến thư mục chứa ảnh captcha (sẽ tự động được tạo), đường dẫn đến font dùng để vẽ và các tùy chọn vẽ (số từ, kích thước, mức độ nhiễu,…). Ví dụ phương thức sau sẽ tạo và trả về một đối tượng Zend_Captcha_Image có kèm thêm một thuộc tính url trỏ đến đường dẫn captcha để client có thể truy xuất trực tiếp đến đó.

<?php
public function genCaptcha($controller){

	$captcha = new Zend_Captcha_Image();
	$captcha->setImgDir(APPLICATION_PATH . "/public/images/auth/login/captcha/")
			->setImgUrl($controller->view->baseUrl("/public/images/auth/login/captcha/"))
			->setFont(APPLICATION_PATH ."/public/images/auth/login/ARIAL.TTF")
			->setWordlen(4)
			->setFontSize(12)
			->setDotNoiseLevel(2)
			->setLineNoiseLevel(2)
			->setWidth(85)
			->setHeight(30)
			->generate();
	$captcha->url = $captcha->getImgUrl().$captcha->getId().$captcha->getSuffix();
	return $captcha;
}

Tại view, bạn có thể hiển thị captcha bằng cách dùng phương thức Zend_Captcha_Image->render(Zend_View_Interface $view = null, $element = null);

<?php echo $this->captcha->render($this); ?>

Ngoài ra, vì đã có url đến captcha, bạn có thể tạo thẻ img với html. Như vậy có thể bổ sung các thuộc tính khác cho thẻ dễ dàng.

<img id="captcha" src="<?php echo $this->captchaUrl; ?>"/>

Cuối cùng, bạn cần lưu lại captchaid để dùng cho việc xác thực captcha. Ta sẽ đặt nó trong một thẻ hidden trong form. Khi post lên server, ta sẽ lấy được giá trị của nó cùng với captcha code:

<input type="hidden" id="captchaid" name="captchaid" value="<?php echo $this->captcha->getId() ?>" >

Xác thực Captcha

Khi một captcha được tạo ra, thông tin của nó sẽ được lưu trong session với key có dạng “Zend_Session_Namespace_{captchaid}”. Ta sẽ lấy ra session này với lớp Zend_Session_Namespace và so sánh captcha code với thuộc tính $session->word.

<?php

class AuthController extends Zend_Controller_Action
{
	// ...

    public function loginAction()
    {
    	Zend_Layout::getMvcInstance()->setLayout('public');
		if ($this->_request->isPost())
		{
			$data = $this->_request->getPost();
			if (isset($_POST['captchaid'])){
				$capId = trim($_POST['captchaid']);
				$capSession = new Zend_Session_Namespace('Zend_Form_Captcha_'.$capId);
				if ($_POST['captchacode'] == $capSession->word)
				{
					// captcha code is correct
					// do something else such as checking username, password,...
					return;
				}else
					$this->view->msg = "Invalid captcha";
			}
			$this->view->formdata = $data;
		}

		$captcha = AuthController::genCaptcha($this);
		$this->view->captcha = $captcha;
		$this->view->captchaUrl = $captcha->url;
    }

	/**
	 *
	 * Generate new captcha
	 * @param Zend_Controller_Action $controller
	 * @var Zend_Captcha_Image
	 */
	public function genCaptcha($controller){

		$module = $this->getRequest()->getModuleName();
    	$captcha = new Zend_Captcha_Image();
		$captcha->setImgDir(APPLICATION_PATH . "/public/$module/images/auth/login/captcha/")
				->setImgUrl($controller->view->baseUrl("/public/$module/images/auth/login/captcha/"))
				->setFont(APPLICATION_PATH ."/public/$module/images/auth/login/ARIAL.TTF")
				->setWordlen(4)
				->setFontSize(12)
				->setDotNoiseLevel(2)
				->setLineNoiseLevel(2)
				->setWidth(85)
				->setHeight(30)
				->generate();
		$captcha->url = $captcha->getImgUrl().$captcha->getId().$captcha->getSuffix();
		return $captcha;
    }
}

Chức năng Refresh Captcha

Bổ sung thêm một action vào AuthController dùng để tạo ra captcha mới và trả về thông tin cho trình duyệt. Vì đây là action sử dụng riêng cho ajax, nên ta sẽ vô hiệu hóa layout và trả dữ liệu dạng json.

 public function refreshAction(){

    	$captcha = AuthController::genCaptcha($this);
    	$data = array();
    	$data["id"]=$captcha->getId();
    	$data["url"]=$captcha->url;
		$this->_helper->json($data);
}

Tại view, ta tạo một hàm javascript để và dùng ajax gọi đến action trên và thay đổi giá trị của captcha.

function getCaptcha()
{
	$.ajax({ url: "/admin/auth/refresh",
	   type: "POST",
	   success: function(data){
			var src = data.url;
			$("#captcha").attr("src",src);
			$("#captchaid").val(data.id);
	   }
	});
}

YinYangIt’s Blog

Advertisements

One thought on “Zend Framework – Sử dụng Zend_Captcha_Image

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s