Skip to content

Commit c68f99c

Browse files
committed
javascript validator, jquery plugin, form and twig extension update
1 parent 0fd424a commit c68f99c

5 files changed

Lines changed: 155 additions & 87 deletions

File tree

Extension/ValidationExtension.php

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22

3-
namespace Symfony\Bridge\Twig\Extension;
3+
namespace SimpleThings\FormExtraBundle\Extension;
44

5-
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
5+
use Symfony\Component\Validator\ValidatorInterface;
66

77
/**
88
*
@@ -15,13 +15,13 @@ class ValidationExtension extends \Twig_Extension
1515
*
1616
* @var ValidatorInterface
1717
*/
18-
private $validation;
18+
private $validator;
1919

2020
private $objects;
2121

22-
public function __construct(ValidatorInterface $validation, array $objects)
22+
public function __construct(ValidatorInterface $validator, array $objects)
2323
{
24-
$this->validation = $validation;
24+
$this->validator = $validator;
2525
$this->objects = $objects;
2626
}
2727

@@ -33,30 +33,41 @@ public function __construct(ValidatorInterface $validation, array $objects)
3333
public function getFunctions()
3434
{
3535
return array(
36-
'simplethings_formextra_validation' => new \Twig_Function_Method($this, 'getValidationConstraints'),
36+
'simplethings_formextra_validation' => new \Twig_Function_Method($this, 'getValidationConstraints', array('is_safe' => array('html'))),
3737
);
3838
}
3939

4040
public function getValidationConstraints()
4141
{
4242

43-
$metadataFactory = $this->validation->getMetadataFactory();
43+
$metadataFactory = $this->validator->getMetadataFactory();
44+
$data = array();
4445

45-
foreach($objects as $object) {
46+
foreach($this->objects as $object) {
47+
$data[$object] = array();
48+
4649
$metadata = $metadataFactory->getClassMetadata($object);
4750
$properties = $metadata->getConstrainedProperties();
4851

49-
var_dump($properties);
50-
52+
foreach($properties as $propertie) {
53+
$data[$object][$propertie] = array();
54+
$constraints = $metadata->getMemberMetadatas($propertie);
55+
foreach($constraints[0]->constraints as $constraint) {
56+
$data[$object][$propertie][$this->getConstraintName($constraint)] = $constraint;
57+
}
58+
}
5159
}
5260

53-
54-
55-
56-
57-
61+
return \json_encode($data);
5862

5963
}
64+
65+
protected function getConstraintName($constraint) {
66+
$class = \get_class($constraint);
67+
$parts = \explode('\\', $class);
68+
return \lcfirst(\array_pop($parts));
69+
}
70+
6071

6172

6273
/**

Form/Extension/ValidationTypeExtension.php

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
use Symfony\Component\Form\FormBuilder;
99

1010
/**
11-
* Generic extension for fields that allows any attr to be set when building
12-
* the form.
13-
*
11+
*
1412
* @author David Badura <badura@simplethings.de>
1513
*/
1614
class ValidationTypeExtension extends AbstractTypeExtension
@@ -19,15 +17,15 @@ class ValidationTypeExtension extends AbstractTypeExtension
1917

2018
public function __construct($validatedObjects)
2119
{
22-
$this->validatedObjects = array_keys($validatedObjects);
20+
$this->validatedObjects = array_flip($validatedObjects);
2321
}
2422

2523
/**
2624
* @return string
2725
*/
2826
public function getExtendedType()
2927
{
30-
return 'field';
28+
return 'form';
3129
}
3230

3331
/**
@@ -47,8 +45,8 @@ public function buildForm(FormBuilder $builder, array $options)
4745
*/
4846
public function buildView(FormView $view, FormInterface $form)
4947
{
50-
if (isset($this->validatedObjects[$options['data_class']])) {
51-
$attr = $view->get('attr', array());
48+
if ($form->hasAttribute('data_class')) {
49+
$attr = $form->getAttribute('attr');
5250
$attr['data-simplethings-validation-class'] = $form->getAttribute('data_class');
5351
$view->set('attr', $attr);
5452
}

Resources/config/form_extra.xml

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
<parameter key="simple_things_form_extra.form.type.file_set.class">SimpleThings\FormExtraBundle\Form\Type\FileSetType</parameter>
1111
<parameter key="simple_things_form_extra.form.extension.field.class">SimpleThings\FormExtraBundle\Form\Extension\FieldTypeExtension</parameter>
1212
<parameter key="simple_things_form_extra.form.extension.validation.class">SimpleThings\FormExtraBundle\Form\Extension\ValidationTypeExtension</parameter>
13+
<parameter key="simple_things_form_extra.twig.extension.validation.class">SimpleThings\FormExtraBundle\Extension\ValidationExtension</parameter>
1314
<parameter key="simple_things_form_extra.client_validation.objects" type="collection" />
1415
</parameters>
1516

@@ -31,10 +32,15 @@
3132
</service>
3233

3334
<service id="simple_things_form_extra.form.extension.validation" class="%simple_things_form_extra.form.extension.validation.class%">
34-
<tag name="form.extension" alias="validation" />
35+
<tag name="form.type_extension" alias="form" />
3536
<argument>%simple_things_form_extra.client_validation.objects%</argument>
3637
</service>
37-
38+
39+
<service id="simple_things_form_extra.twig.extension.validation" class="%simple_things_form_extra.twig.extension.validation.class%">
40+
<tag name="twig.extension" alias="form" />
41+
<argument type="service" id="validator" />
42+
<argument>%simple_things_form_extra.client_validation.objects%</argument>
43+
</service>
3844

3945
</services>
4046
</container>
Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
1+
/**
2+
* @author David Badura <badura@simplethings.de>
3+
*/
14
(function($, jQuery) {
2-
jQuery.fn.simplethingsFormextraValidation = function (options) {
3-
options = jQuery.extend({}, jQuery.fn.SimpleThingsFormExtraValidation.defaults, options);
4-
5+
jQuery.fn.simpleThingsFormExtraValidation = function (options) {
6+
options = jQuery.extend({}, jQuery.fn.simpleThingsFormExtraValidation.defaults, options);
7+
58
return $(this).each(function() {
9+
10+
var objectName = $(this).data('simplethings-validation-class');
611

7-
var self = $(this);
8-
9-
self.change(function() {
12+
$(this).find('input').each(function() {
1013

11-
if(options.validator.isValid(self.val(), self.data('simplethings-validation-contraints'))) {
12-
13-
self.removeClass('error');
14-
self.addClass('success');
15-
16-
} else {
14+
var $this = $(this);
15+
16+
var name = $this.attr('name');
17+
name = name.substr(name.indexOf("[") + 1, name.indexOf("]") - name.indexOf("[") - 1);
1718

18-
self.removeClass('success');
19-
self.addClass('error');
19+
$this.change(function() {
2020

21-
}
21+
if(options.validator.isValid($this.val(), options.constraints[objectName][name])) {
22+
options.onSuccess($this);
23+
} else {
24+
options.onError($this, options.validator.violations);
25+
}
26+
27+
});
2228

2329
});
2430

31+
32+
33+
2534
});
26-
}
27-
jQuery.fn.SimpleThingsFormExtraValidation.defaults = {
28-
validator: simpleThingsFormExtraValidator
29-
}
30-
})(jQuery, jQuery);
35+
};
36+
37+
jQuery.fn.simpleThingsFormExtraValidation.defaults = {
38+
validator: null,
39+
constraints: null,
40+
onSuccess: function(object) {},
41+
onError: function(object, violations) {}
42+
};
43+
44+
})(jQuery, jQuery);

0 commit comments

Comments
 (0)