Created captcha type (this works, but still no image generation)

This commit is contained in:
Gregwar 2011-08-25 22:50:59 +02:00
commit 4e1892fc02
6 changed files with 175 additions and 0 deletions

View File

@ -0,0 +1,23 @@
<?php
namespace Gregwar\CaptchaBundle\DependencyInjection;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;
class GregwarCaptchaExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
$resources = $container->getParameter('twig.form.resources');
$resources[] = 'GregwarCaptchaBundle::captcha.html.twig';
$container->setParameter('twig.form.resources', $resources);
}
}

9
GregwarCaptchaBundle.php Executable file
View File

@ -0,0 +1,9 @@
<?php
namespace Gregwar\CaptchaBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
class GregwarCaptchaBundle extends Bundle
{
}

8
Resources/config/services.yml Executable file
View File

@ -0,0 +1,8 @@
services:
# captcha type
captcha.type:
class: Gregwar\CaptchaBundle\Type\CaptchaType
arguments: [@session]
tags:
- { name: form.type, alias: captcha }

View File

@ -0,0 +1,4 @@
{% block captcha_widget %}
[{{ captcha_code }}]<br />
{{ form_widget(form) }}
{% endblock %}

67
Type/CaptchaType.php Executable file
View File

@ -0,0 +1,67 @@
<?php
namespace Gregwar\CaptchaBundle\Type;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Symfony\Component\Form\Exception\FormException;
use Symfony\Component\HttpFoundation\Session;
use Gregwar\CaptchaBundle\Validator\CaptchaValidator;
/**
* Captcha type
*
* @author Gregwar <g.passault@gmail.com>
*/
class CaptchaType extends AbstractType
{
private $key = 'captcha';
protected $session;
public function __construct(Session $session)
{
$this->session = $session;
}
public function buildForm(FormBuilder $builder, array $options)
{
$builder->addValidator(
new CaptchaValidator($this->session, $this->key)
);
}
public function buildView(FormView $view, FormInterface $form)
{
$view->set('captcha_code', $this->generateCaptchaValue());
}
public function getParent(array $options)
{
return 'text';
}
public function getName()
{
return 'captcha';
}
private function generateCaptchaValue()
{
$charset = 'abcdefghijklmnopqrstuvwxyz0123456789';
$value = '';
$chars = str_split($charset);
for ($i=0; $i<5; $i++) {
$value.= $chars[array_rand($chars)];
}
$this->session->set($this->key, $value);
return $value;
}
}

View File

@ -0,0 +1,64 @@
<?php
namespace Gregwar\CaptchaBundle\Validator;
use Symfony\Component\Form\FormValidatorInterface;
use Symfony\Component\HttpFoundation\Session;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormError;
/**
* Captcha validator
*
* @author Gregwar <g.passault@gmail.com>
*/
class CaptchaValidator implements FormValidatorInterface
{
/**
* Session
*/
private $session;
/**
* Session key to store the code
*/
private $key;
public function __construct(Session $session, $key)
{
$this->session = $session;
$this->key = $key;
}
public function validate(FormInterface $form)
{
$code = $form->getData();
$excepted_code = $this->getExceptedCode();
if (!($code && $excepted_code && is_string($code) && is_string($excepted_code)
&& $this->niceize($code) == $this->niceize($excepted_code))) {
$form->addError(new FormError('Bad code value'));
}
$this->session->remove($this->key);
}
/**
* Retrieve the excepted CAPTCHA code
*/
private function getExceptedCode()
{
if ($this->session->has($this->key)) {
return $this->session->get($this->key);
}
return null;
}
/**
* Process the codes
*/
private function niceize($code)
{
return strtr($code, 'oil', '01l');
}
}