您的位置:首页 > 编程语言 > PHP开发

zendframework form with captcha(Base on ZendFrameWork2.4)

2015-08-05 18:21 741 查看
1.首先扩展Zend\Captcha\Image,重写一下图片生成过程:

<?php

namespace Test\Captche;

use Zend\Captcha\Exception\NoFontProvidedException;
use Zend\Captcha\Image;

/**
* Class ImageCaptche
*
* @package Test\Captche
* @author  Xuman
* @version $Id$
*/
class ImageCaptche extends Image
{
protected $width = 130;
protected $height = 40;
protected $wordlen = 5;
protected $code;
protected $img;
protected $fonts = array();
//生成背景
private function createBg()
{
$this->img = imagecreatetruecolor($this->width, $this->height);
$color     = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));
imagefilledrectangle($this->img, 0, $this->height, $this->width, 0, $color);
}
public function getFont()
{
return $this->fonts[array_rand($this->fonts)];
}
//生成文字
private function createFont($word)
{
$_x = $this->width / $this->wordlen;
for ($i = 0; $i < $this->wordlen; $i++) {
$fcolor = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
imagettftext(
$this->img, $this->fsize, mt_rand(-30, 30), $_x * $i + mt_rand(1, 5), $this->height / 1.4,
$fcolor, $this->getFont(), $word[$i]
);
}
}

//生成线条、雪花
private function createLine()
{
for ($i = 0; $i < 6; $i++) {
$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));
imageline(
$this->img, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width),
mt_rand(0, $this->height), $color
);
}
for ($i = 0; $i < 100; $i++) {
$color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));
imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->height), '*', $color);
}
}
protected function generateImage($id, $word)
{
if (empty($this->fonts)) {
throw new NoFontProvidedException('Image CAPTCHA requires font');
}

$imgFile = $this->getImgDir() . $id . $this->getSuffix();

$this->createBg();
$this->createLine();
$this->createFont($word);

imagepng($this->img, $imgFile);
imagedestroy($this->img);
}
  public function isValid($value,$context=null){
    $bool = parent::isValid($value,$context);
    $this->setWord($this->generateWord());

    return $bool;
  }

}


2.创建登录表单LoginForm

<?php
namespace Test\Model;

use Zend\Captcha\AdapterInterface as CaptchaAdapter;
use Zend\Form\Element;
use Zend\Form\Form;

class LoginForm extends Form
{
protected $captcha;

public function __construct(CaptchaAdapter $captcha)
{

parent::__construct();

$this->captcha = $captcha;

// add() can take either an Element/Fieldset instance,
// or a specification, from which the appropriate object
// will be built.

$this->add(
array(
'name'       => 'account',
'options'    => array(
'label' => '用户名',
),
'type'       => 'Text',
'attributes' =>
[
'class' => 'form-control'
]
)
);
$this->add(
array(
'name'       => 'password',
'options'    => array(
'label' => '密码',
),
'type'       => 'Password',
'attributes' =>
[
'class' => 'form-control'
]
)
);
$this->add(
array(
'type'       => 'Zend\Form\Element\Captcha',
'name'       => 'captcha',
'options'    => array(
'label'   => '输入验证码',
'captcha' => $this->captcha,
),
'attributes' =>
[
'class' => 'form-control',
'id'    => 'login-captcha'
]
)
);
$this->add(new Element\Csrf('security'));
$this->add(
array(
'name'       => 'send',
'type'       => 'Submit',
'attributes' => array(
'value' => '登录',
'class' => 'btn btn-success'
),
)
);

// We could also define the input filter here, or
// lazy-create it in the getInputFilter() method.
}
}


3.编写Action代码,testFormAction

public function testFormAction()
{
$captche = new ImageCaptche(
[
'name'    => 'test',
'wordLen' => '4',
'timeout' => 600,
'height'  => 36,
'width'   => 100,
'fsize'   => 18,
'fonts'   => array('data/font/CooperBlackStd.otf', 'data/font/BOOKOSB.TTF', 'data/font/BOOKOSI.TTF')
]
);
$this->layout('layout/layout');
$form = new LoginForm($captche);
if ($this->request->isPost()) {
$form->setData($this->request->getPost());
if ($form->isValid()) {
return $this->redirect()->toRoute('test');
}
}
return ['form' => $form];
}


4.编写test-form.phtml

<?php

$title = 'Test Form';
/** @var Zend\View\Renderer\PhpRenderer $this */
$this->headTitle($title);
// within a view script
$form->prepare();

// Assuming the "contact/process" route exists...
$form->setAttribute('action', '');

// Set the method attribute for the form
$form->setAttribute('method', 'post');

// Get the form label plugin
$formLabel = $this->plugin('formLabel');
?>
<div class="container">
<div class="panel">

<?php
// Render the opening tag

echo $this->form()->openTag($form);
?>
<div class="form_element form-group">
<?php
$name = $form->get('account');
//$name->setAttribute('class', 'form-control');
echo $formLabel->openTag() . $name->getOption('label');
echo $this->formInput($name);
echo $this->formElementErrors($name);
echo $formLabel->closeTag();
?>
</div>

<div class="form_element form-group">
<?php
$subject = $form->get('password');
echo $formLabel->openTag() . $subject->getOption('label');
echo $this->formPassword($subject);
echo $this->formElementErrors($subject);
echo $formLabel->closeTag();
?>
</div>

<div class="form_element form-group">
<?php
$captcha = $form->get('captcha');
echo $formLabel->openTag() . $captcha->getOption('label');
echo $formLabel->closeTag();
?>
<br>
<?php
/** @var \Zend\Form\View\Helper\Captcha\Image $helper */
$helper = $this->plugin($captcha->getCaptcha()->getHelperName());

$helper->setCaptchaPosition(\Zend\Form\View\Helper\Captcha\AbstractWord::CAPTCHA_PREPEND);
//$helper->setSeparator('<span class="input-group-addon">');
echo $helper($captcha);
//echo $this->formCaptcha();
?>

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

?>
</div>

<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>

<?php echo $this->form()->closeTag() ?>

</div>
</div>
<style>
#login-captcha{
display: inline;
width: 100px;
}
</style>


5.css支持:bootstrap

6.效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: