21 |
44 | ...
45 |
46 | ```
47 | As you see, all the tags are placed in the id=form_task_tags holder.
48 | This is important, because this element is an implementation of the direct form child ```tags```, and it contains such importent data as prototype for each tag, also it can contains some validations rules which you have sent for the ```tags``` field in the ```Task``` entity.
49 |
50 | For this reason, if you render this form manually, and do not create the ```#form_task_tags``` field:
51 | ```twig
52 | {{ form_start(form) }}
53 | {{ form_row(form.description) }}
54 |
55 |
Tags
56 |
61 | {{ form_end(form) }}
62 | ```
63 | in this case you can lose important validation data.
64 |
65 | So we suggest to add the ids manually:
66 | ```twig
67 | {{ form_start(form) }}
68 | {{ form_row(form.description) }}
69 |
70 |
Tags
71 |
78 | {{ form_end(form) }}
79 | ```
80 |
--------------------------------------------------------------------------------
/src/Resources/doc/3_1.md:
--------------------------------------------------------------------------------
1 | ### 3.1 Disable validation for a specified field
2 |
3 | jQuery plugin:
4 | ```js
5 | $('#user_email').jsFormValidator({
6 | disabled: true
7 | });
8 | ```
9 |
10 | Pure Javascript:
11 | ```js
12 | var field = document.getElementById('user_email');
13 | FpJsFormValidator.customize(field, {
14 | disabled: true
15 | });
16 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_10.md:
--------------------------------------------------------------------------------
1 | ### 3.10 Form submit by Javascript
2 |
3 | If you want to submit your form by click on link or by another Javascript action:
4 | ```js
5 | $('a#link_submit').click(function(event){
6 | $('form#user').jsFormValidator('submitForm', event);
7 | });
8 | ```
9 |
10 | Pure Javascript:
11 | ```js
12 | var link = document.getElementById('link_submit');
13 | link.addEventListener('click', function (event) {
14 | var form = document.getElementById('user');
15 | FpJsFormValidator.customize(form, 'submitForm', event);
16 | });
17 | ```
18 |
--------------------------------------------------------------------------------
/src/Resources/doc/3_11.md:
--------------------------------------------------------------------------------
1 | ### 3.11 onValidate callback
2 |
3 | To add an extra action that will be run after the validation:
4 | ```js
5 | $('form#user').jsFormValidator({
6 | onValidate: function(errors, event) {
7 | // event - a form submittion event
8 | // errors - an object that looks like:
9 | /*
10 | errors = {
11 | element_1_id: {
12 | source_1_id: ['error_1', 'error_2', 'error_3'],
13 | source_2_id: ['error_4', 'error_5']
14 | },
15 | element_2_id: {
16 | ...
17 | },
18 | ...
19 | }
20 | */
21 |
22 | // Here your code
23 | }
24 | });
25 | ```
26 |
27 | Pure Javascript:
28 | ```js
29 | var field = document.getElementById('user');
30 | FpJsFormValidator.customize(field, {
31 | onValidate: function(errors, event) {
32 | ...
33 | }
34 | });
35 | ```
36 |
37 | **NB:** this option should be defined for the parent form element
--------------------------------------------------------------------------------
/src/Resources/doc/3_12.md:
--------------------------------------------------------------------------------
1 | ### 3.12 Run validation on custom event
2 |
3 | This is a real example, how to validate text fields on their change, and add error-markers instead of showing errors:
4 | ```css
5 | input[type=text].error, textarea.error {
6 | border: 1px solid red;
7 | }
8 | input[type=text].ready, textarea.ready {
9 | border: 1px solid green;
10 | }
11 | ```
12 | ```js
13 | $('form')
14 | .find('input[type=text], textarea')
15 | .blur(function(){
16 | // Run validation for this field
17 | $(this).jsFormValidator('validate')
18 | })
19 | .focus(function() {
20 | // Reset markers when focus on a field
21 | $(this).removeClass('error');
22 | $(this).removeClass('ready');
23 | })
24 | .jsFormValidator({
25 | 'showErrors': function(errors) {
26 | if (errors.length) {
27 | $(this).removeClass('ready');
28 | $(this).addClass('error');
29 | } else {
30 | $(this).removeClass('error');
31 | $(this).addClass('ready');
32 | }
33 | }
34 | });
35 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_13.md:
--------------------------------------------------------------------------------
1 | ### 3.13 Collections validation
2 |
3 | **NB**: Read [this note](Resources/doc/3_0.md) - it's important for this task.
4 |
5 | So, if you went [here](http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype) to the ```addTagForm``` JavaScript function,
6 | now you can add definition for the validator:
7 | ```js
8 | function addTagForm($collectionHolder, $newLinkLi) {
9 | // Get the data-prototype explained earlier
10 | var prototype = $collectionHolder.data('prototype');
11 |
12 | // get the new index
13 | var index = $collectionHolder.data('index');
14 |
15 | // Replace '__name__' in the prototype's HTML to
16 | // instead be a number based on how many items we have
17 | var newForm = prototype.replace(/__name__/g, index);
18 |
19 | // increase the index with one for the next item
20 | $collectionHolder.data('index', index + 1);
21 |
22 | // Display the form in the page in an li, before the "Add a tag" link li
23 | var $newFormLi = $('
').append(newForm);
24 | $newLinkLi.before($newFormLi);
25 |
26 |
27 | // And here we add a validation using jQuery:
28 | $($collectionHolder).jsFormValidator('addPrototype', index);
29 | // Or using pure JS:
30 | FpJsFormValidator.customize($collectionHolder, 'addPrototype', index);
31 | }
32 | ```
33 |
34 | Deleting of elements is as simple as adding, e.g. for the [addTagFormDeleteLink](http://symfony.com/doc/current/cookbook/form/form_collections.html#templates-modifications) function:
35 | ```js
36 | function addTagFormDeleteLink($tagFormLi) {
37 | var $removeFormA = $('
delete this tag');
38 | $tagFormLi.append($removeFormA);
39 |
40 | $removeFormA.on('click', function(e) {
41 | // prevent the link from creating a "#" on the URL
42 | e.preventDefault();
43 |
44 | // Here you should receive two important variable which are mentioned in the previous function:
45 | // $collectionHolder - DOM element of collection holder
46 | // index - the current tag name, e.g. can be matched from id
47 | $($collectionHolder).jsFormValidator('delPrototype', index);
48 |
49 | // Or using pure JS:
50 | FpJsFormValidator.customize($collectionHolder, 'delPrototype', index);
51 |
52 | // remove the li for the tag form
53 | $tagFormLi.remove();
54 | });
55 | }
56 | ```
57 |
--------------------------------------------------------------------------------
/src/Resources/doc/3_2.md:
--------------------------------------------------------------------------------
1 | ### 3.2 Error display
2 |
3 | The showErrors function should delete previous errors and display new ones.
4 | The example below shows you how it works in our default implementation.
5 | The ```sourceId``` variable is an identifier of validation source.
6 | It can be used to prevent any confusion between the field's errors and other errors which have come from other sources.
7 | For example, this field (user_email) may contain the Email constraint, and its own parent may contain the UniqueEntity constraint by this field.
8 | Both of these errors should be displayed for the email field, but the first one will be displayed/deleted by the 'user_email' validator and the second one - by the parent.
9 | By default we use this variable to add it as a class name to 'li' tags, and then we use it to remove the errors by this class name:
10 |
11 | ```js
12 | $('#user_email').jsFormValidator({
13 | showErrors: function(errors, sourceId) {
14 | var list = $(this).prev('ul.form-errors');
15 | if (!list.length) {
16 | list = $('
');
17 | $(this).before(list);
18 | }
19 | list.find('.' + sourceId).remove();
20 |
21 | for (var i in errors) {
22 | var li = $('
', {
23 | 'class': sourceId,
24 | 'text': 'custom_'+ errors[i]
25 | });
26 | list.append(li);
27 | }
28 | }
29 | });
30 | ```
31 |
32 | Pure Javascript:
33 | ```js
34 | var field = document.getElementById('user_email');
35 | FpJsFormValidator.customize(field, {
36 | showErrors: function(errors, sourceId) {
37 | for (var i in errors) {
38 | // do something with each error
39 | }
40 | }
41 | });
42 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_3.md:
--------------------------------------------------------------------------------
1 | ### 3.3 Get validation groups from a closure
2 |
3 | If you have defined validation groups as a callback:
4 |
5 | ```php
6 | namespace Acme\DemoBundle\Form;
7 |
8 | class UserType extends AbstractType
9 | {
10 | // ...
11 |
12 | public function setDefaultOptions(OptionsResolverInterface $resolver)
13 | {
14 | $resolver->setDefaults(
15 | array(
16 | 'data_class' => 'Acme\DemoBundle\Entity\User',
17 | 'validation_groups' => function () {
18 | if (...) {
19 | return array(...);
20 | } else {
21 | return array(...);
22 | }
23 | }
24 | )
25 | );
26 | }
27 | }
28 | ```
29 |
30 | Then you have to implement it on the JS side:
31 | ```js
32 | $('form#user').jsFormValidator({
33 | groups: function () {
34 | if (...) {
35 | return [...];
36 | } else {
37 | return [...];
38 | }
39 | }
40 | });
41 | ```
42 |
43 | Pure Javascript:
44 | ```js
45 | var field = document.getElementById('user');
46 | FpJsFormValidator.customize(field, {
47 | groups: function () {
48 | if (...) {
49 | return [...];
50 | } else {
51 | return [...];
52 | }
53 | }
54 | });
55 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_4.md:
--------------------------------------------------------------------------------
1 | ### 3.4 Getters validation
2 |
3 | If you have getters validation:
4 | ```php
5 | namespace Acme\DemoBundle\Entity;
6 | class User
7 | {
8 | // ...
9 |
10 | /**
11 | * @return bool
12 | *
13 | * @Assert\True(message="The password cannot match your first name")
14 | */
15 | public function isPasswordLegal()
16 | {
17 | return $this->firstName != $this->password;
18 | }
19 | }
20 | ```
21 |
22 | then you have to create a callback:
23 |
24 | Then you have to implement it on the JS side:
25 | ```js
26 | $('form#user').jsFormValidator({
27 | callbacks: {
28 | 'isPasswordLegal': function() {
29 | var firstName = $('#user_firstName').val();
30 | var password = $('#user_password').val();
31 | return firstName != password;
32 | }
33 | }
34 | });
35 | ```
36 |
37 | Pure Javascript:
38 | ```js
39 | var field = document.getElementById('user');
40 | FpJsFormValidator.customize(field, {
41 | callbacks: {
42 | 'isPasswordLegal': function() {
43 | var firstName = document.getElementById('user_firstName').value;
44 | var password = document.getElementById('user_password').value;
45 | return firstName != password;
46 | }
47 | }
48 | });
49 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_5.md:
--------------------------------------------------------------------------------
1 | ### 3.5 The Callback constraint
2 |
3 | #### 3.5.1 Callback by a method name
4 |
5 | For the next cases:
6 |
7 | ```php
8 | namespace Acme\DemoBundle\Entity;
9 |
10 | use Symfony\Component\Validator\Constraints as Assert;
11 |
12 | /**
13 | * @Assert\Callback("checkEmail")
14 | * or
15 | * @Assert\Callback({"checkEmail"})
16 | */
17 | class User
18 | {
19 | // ...
20 |
21 | public function checkEmail()
22 | {
23 | if (...) {
24 | $context->addViolationAt('email', 'Email is not valid');
25 | }
26 | }
27 | }
28 | ```
29 | or
30 | ```php
31 | /**
32 | * @Assert\Callback
33 | */
34 | public function checkEmail()
35 | {
36 | if (...) {
37 | $context->addViolationAt('email', 'Email is not valid');
38 | }
39 | }
40 | ```
41 |
42 | You have to create the next callback (pay attention that here you should pass the [sourceId](3_2.md) parameter):
43 | ```js
44 | $('form#user').jsFormValidator({
45 | callbacks: {
46 | 'checkEmail': function() {
47 | var errors = [];
48 | if (...) {
49 | errors.push('Email is not valid');
50 | }
51 | $('#form_email').jsFormValidator('showErrors', {
52 | errors: errors,
53 | sourceId: 'check-email-callback'
54 | });
55 | }
56 | }
57 | });
58 | ```
59 |
60 | Pure Javascript:
61 | ```js
62 | var field = document.getElementById('user');
63 | FpJsFormValidator.customize(field, {
64 | callbacks: {
65 | 'checkEmail': function() {
66 | var errors = [];
67 | if (...) {
68 | errors.push('Email is not valid');
69 | }
70 | var email = document.getElementById('user_email');
71 | FpJsFormValidator.customize(email, 'showErrors', {
72 | errors: errors,
73 | sourceId: 'check-email-callback'
74 | });
75 | }
76 | }
77 | });
78 | ```
79 |
80 | #### 3.5.2 Callback by class and method names
81 |
82 | In case if you have defined a callback like this:
83 | ```php
84 | namespace Acme\DemoBundle\Entity;
85 |
86 | /**
87 | * @Assert\Callback({"Acme\DemoBundle\Validator\ExternalValidator", "checkEmail"})
88 | */
89 | class User
90 | {
91 | // ...
92 | }
93 | ```
94 |
95 | then you can define it on the JS side like:
96 | ```js
97 | // ...
98 | callbacks: {
99 | 'Acme\\DemoBundle\\Validator\\ExternalValidator': {
100 | 'checkEmail': function () {
101 | // ...
102 | }
103 | }
104 | }
105 | ```
106 |
107 |
or you can also define it without nesting (like in the [3.5.1](#p_3_5_1) paragraph), but only if the method name is unique:
108 | ```js
109 | // ...
110 | callbacks: {
111 | 'checkEmail': function () {
112 | // ...
113 | }
114 | }
115 | ```
--------------------------------------------------------------------------------
/src/Resources/doc/3_6.md:
--------------------------------------------------------------------------------
1 | ### 3.6 The Choice constraint. How to get the choices list from a callback
2 |
3 | In general, it works in the same way as the previous step.
4 | In case if you have:
5 | ```php
6 | namespace Acme\DemoBundle\Entity;
7 |
8 | use Symfony\Component\Validator\Constraints as Assert;
9 |
10 | class User
11 | {
12 | /**
13 | * @Assert\Choice(callback = {"Acme\DemoBundle\Entity\Util", "getGenders"})
14 | */
15 | protected $gender;
16 | }
17 | ```
18 | ```php
19 | namespace Acme\DemoBundle\Entity;
20 |
21 | class Util
22 | {
23 | public static function getGenders()
24 | {
25 | return array('male', 'female');
26 | }
27 | }
28 | ```
29 |
30 | Then:
31 | ```js
32 | $('form#user').jsFormValidator({
33 | callbacks: {
34 | 'Acme\\DemoBundle\\Entity\\Util': {
35 | 'getGenders': function() {
36 | return ['male', 'female'];
37 | }
38 | }
39 | }
40 | });
41 | ```
42 |
43 | Pure Javascript:
44 | ```js
45 | var field = document.getElementById('user');
46 | FpJsFormValidator.customize(field, {
47 | callbacks: {
48 | 'Acme\\DemoBundle\\Entity\\Util': {
49 | 'getGenders': function() {
50 | return ['male', 'female'];
51 | }
52 | }
53 | }
54 | });
55 | ```
56 |
57 | also, you can simplify it as it was described [here](3_5.md#p_3_5_2_1)
--------------------------------------------------------------------------------
/src/Resources/doc/3_7.md:
--------------------------------------------------------------------------------
1 | ### 3.7 Custom constraints
2 |
3 | If you have your own constraint, you have to implement it on the JS side too.
4 | Just add a JS class with a name, similar to the full class name of the related constraint (but without slashes).
5 | For example, you have created the next constraint:
6 |
7 | ```php
8 | // src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumeric.php
9 | namespace Acme\DemoBundle\Validator\Constraints;
10 |
11 | use Symfony\Component\Validator\Constraint;
12 |
13 | class ContainsAlphanumeric extends Constraint
14 | {
15 | public $message = 'The string "%string%" contains an illegal character: it can only contain letters or numbers.';
16 | }
17 |
18 | // src/Acme/DemoBundle/Validator/Constraints/ContainsAlphanumericValidator.php
19 | namespace Acme\DemoBundle\Validator\Constraints;
20 |
21 | use Symfony\Component\Validator\Constraint;
22 | use Symfony\Component\Validator\ConstraintValidator;
23 |
24 | class ContainsAlphanumericValidator extends ConstraintValidator
25 | {
26 | public function validate($value, Constraint $constraint)
27 | {
28 | if (!preg_match('/^[a-zA-Za0-9]+$/', $value, $matches)) {
29 | $this->context->addViolation($constraint->message, array('%string%' => $value));
30 | }
31 | }
32 | }
33 | ```
34 |
35 | To cover it on JS side, you have to create:
36 |
37 | ```js
38 | ';
74 | }
75 |
76 | return $jsModels;
77 | }
78 |
79 | /**
80 | * Returns the name of the extension.
81 | *
82 | * @return string The extension name
83 | * @codeCoverageIgnore
84 | */
85 | public function getName()
86 | {
87 | return 'fp_js_form_validator';
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/symfony.lock:
--------------------------------------------------------------------------------
1 | {
2 | "composer/ca-bundle": {
3 | "version": "1.2.6"
4 | },
5 | "doctrine/annotations": {
6 | "version": "1.0",
7 | "recipe": {
8 | "repo": "github.com/symfony/recipes",
9 | "branch": "master",
10 | "version": "1.0",
11 | "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672"
12 | },
13 | "files": [
14 | "config/routes/annotations.yaml"
15 | ]
16 | },
17 | "doctrine/lexer": {
18 | "version": "1.2.0"
19 | },
20 | "erusev/parsedown": {
21 | "version": "1.7.4"
22 | },
23 | "league/uri-parser": {
24 | "version": "1.4.1"
25 | },
26 | "masterminds/html5": {
27 | "version": "2.7.0"
28 | },
29 | "php": {
30 | "version": "7.2"
31 | },
32 | "psr/cache": {
33 | "version": "1.0.1"
34 | },
35 | "psr/container": {
36 | "version": "1.0.0"
37 | },
38 | "psr/log": {
39 | "version": "1.1.2"
40 | },
41 | "sensio/framework-extra-bundle": {
42 | "version": "5.2",
43 | "recipe": {
44 | "repo": "github.com/symfony/recipes",
45 | "branch": "master",
46 | "version": "5.2",
47 | "ref": "fb7e19da7f013d0d422fa9bce16f5c510e27609b"
48 | },
49 | "files": [
50 | "config/packages/sensio_framework_extra.yaml"
51 | ]
52 | },
53 | "sensiolabs/security-checker": {
54 | "version": "4.0",
55 | "recipe": {
56 | "repo": "github.com/symfony/recipes",
57 | "branch": "master",
58 | "version": "4.0",
59 | "ref": "160c9b600564faa1224e8f387d49ef13ceb8b793"
60 | },
61 | "files": [
62 | "config/packages/security_checker.yaml"
63 | ]
64 | },
65 | "symfony/asset": {
66 | "version": "v5.0.3"
67 | },
68 | "symfony/cache": {
69 | "version": "v5.0.3"
70 | },
71 | "symfony/cache-contracts": {
72 | "version": "v2.0.1"
73 | },
74 | "symfony/config": {
75 | "version": "v5.0.3"
76 | },
77 | "symfony/console": {
78 | "version": "4.4",
79 | "recipe": {
80 | "repo": "github.com/symfony/recipes",
81 | "branch": "master",
82 | "version": "4.4",
83 | "ref": "ea8c0eda34fda57e7d5cd8cbd889e2a387e3472c"
84 | },
85 | "files": [
86 | "bin/console",
87 | "config/bootstrap.php"
88 | ]
89 | },
90 | "symfony/debug": {
91 | "version": "v4.4.3"
92 | },
93 | "symfony/dependency-injection": {
94 | "version": "v5.0.3"
95 | },
96 | "symfony/dotenv": {
97 | "version": "v5.0.3"
98 | },
99 | "symfony/error-handler": {
100 | "version": "v4.4.3"
101 | },
102 | "symfony/event-dispatcher": {
103 | "version": "v4.4.3"
104 | },
105 | "symfony/event-dispatcher-contracts": {
106 | "version": "v1.1.7"
107 | },
108 | "symfony/expression-language": {
109 | "version": "v5.0.3"
110 | },
111 | "symfony/filesystem": {
112 | "version": "v5.0.3"
113 | },
114 | "symfony/finder": {
115 | "version": "v5.0.3"
116 | },
117 | "symfony/flex": {
118 | "version": "1.0",
119 | "recipe": {
120 | "repo": "github.com/symfony/recipes",
121 | "branch": "master",
122 | "version": "1.0",
123 | "ref": "c0eeb50665f0f77226616b6038a9b06c03752d8e"
124 | },
125 | "files": [
126 | ".env"
127 | ]
128 | },
129 | "symfony/form": {
130 | "version": "v4.4.3"
131 | },
132 | "symfony/framework-bundle": {
133 | "version": "4.4",
134 | "recipe": {
135 | "repo": "github.com/symfony/recipes",
136 | "branch": "master",
137 | "version": "4.4",
138 | "ref": "23ecaccc551fe2f74baf613811ae529eb07762fa"
139 | },
140 | "files": [
141 | "config/bootstrap.php",
142 | "config/packages/cache.yaml",
143 | "config/packages/framework.yaml",
144 | "config/packages/test/framework.yaml",
145 | "config/routes/dev/framework.yaml",
146 | "config/services.yaml",
147 | "public/index.php",
148 | "src/Controller/.gitignore",
149 | "src/Kernel.php"
150 | ]
151 | },
152 | "symfony/http-foundation": {
153 | "version": "v5.0.3"
154 | },
155 | "symfony/http-kernel": {
156 | "version": "v4.4.3"
157 | },
158 | "symfony/inflector": {
159 | "version": "v5.0.3"
160 | },
161 | "symfony/intl": {
162 | "version": "v5.0.3"
163 | },
164 | "symfony/mime": {
165 | "version": "v5.0.3"
166 | },
167 | "symfony/options-resolver": {
168 | "version": "v5.0.3"
169 | },
170 | "symfony/polyfill-ctype": {
171 | "version": "v1.13.1"
172 | },
173 | "symfony/polyfill-intl-icu": {
174 | "version": "v1.13.1"
175 | },
176 | "symfony/polyfill-intl-idn": {
177 | "version": "v1.13.1"
178 | },
179 | "symfony/polyfill-mbstring": {
180 | "version": "v1.13.1"
181 | },
182 | "symfony/polyfill-php72": {
183 | "version": "v1.13.1"
184 | },
185 | "symfony/polyfill-php73": {
186 | "version": "v1.13.1"
187 | },
188 | "symfony/property-access": {
189 | "version": "v5.0.3"
190 | },
191 | "symfony/routing": {
192 | "version": "4.2",
193 | "recipe": {
194 | "repo": "github.com/symfony/recipes",
195 | "branch": "master",
196 | "version": "4.2",
197 | "ref": "683dcb08707ba8d41b7e34adb0344bfd68d248a7"
198 | },
199 | "files": [
200 | "config/packages/prod/routing.yaml",
201 | "config/packages/routing.yaml",
202 | "config/routes.yaml"
203 | ]
204 | },
205 | "symfony/security-bundle": {
206 | "version": "4.4",
207 | "recipe": {
208 | "repo": "github.com/symfony/recipes",
209 | "branch": "master",
210 | "version": "4.4",
211 | "ref": "30efd98dd3b4ead6e9ad4713b1efc43bbe94bf77"
212 | },
213 | "files": [
214 | "config/packages/security.yaml"
215 | ]
216 | },
217 | "symfony/security-core": {
218 | "version": "v4.4.3"
219 | },
220 | "symfony/security-csrf": {
221 | "version": "v5.0.3"
222 | },
223 | "symfony/security-guard": {
224 | "version": "v4.4.3"
225 | },
226 | "symfony/security-http": {
227 | "version": "v4.4.3"
228 | },
229 | "symfony/service-contracts": {
230 | "version": "v2.0.1"
231 | },
232 | "symfony/translation": {
233 | "version": "3.3",
234 | "recipe": {
235 | "repo": "github.com/symfony/recipes",
236 | "branch": "master",
237 | "version": "3.3",
238 | "ref": "2ad9d2545bce8ca1a863e50e92141f0b9d87ffcd"
239 | },
240 | "files": [
241 | "config/packages/translation.yaml",
242 | "translations/.gitignore"
243 | ]
244 | },
245 | "symfony/translation-contracts": {
246 | "version": "v2.0.1"
247 | },
248 | "symfony/twig-bridge": {
249 | "version": "v4.4.3"
250 | },
251 | "symfony/twig-bundle": {
252 | "version": "4.4",
253 | "recipe": {
254 | "repo": "github.com/symfony/recipes",
255 | "branch": "master",
256 | "version": "4.4",
257 | "ref": "15a41bbd66a1323d09824a189b485c126bbefa51"
258 | },
259 | "files": [
260 | "config/packages/test/twig.yaml",
261 | "config/packages/twig.yaml",
262 | "templates/base.html.twig"
263 | ]
264 | },
265 | "symfony/validator": {
266 | "version": "4.3",
267 | "recipe": {
268 | "repo": "github.com/symfony/recipes",
269 | "branch": "master",
270 | "version": "4.3",
271 | "ref": "d902da3e4952f18d3bf05aab29512eb61cabd869"
272 | },
273 | "files": [
274 | "config/packages/test/validator.yaml",
275 | "config/packages/validator.yaml"
276 | ]
277 | },
278 | "symfony/var-dumper": {
279 | "version": "v5.0.3"
280 | },
281 | "symfony/var-exporter": {
282 | "version": "v5.0.3"
283 | },
284 | "symfony/webpack-encore-bundle": {
285 | "version": "1.6",
286 | "recipe": {
287 | "repo": "github.com/symfony/recipes",
288 | "branch": "master",
289 | "version": "1.6",
290 | "ref": "69e1d805ad95964088bd510c05995e87dc391564"
291 | },
292 | "files": [
293 | "assets/css/app.css",
294 | "assets/js/app.js",
295 | "config/packages/assets.yaml",
296 | "config/packages/prod/webpack_encore.yaml",
297 | "config/packages/test/webpack_encore.yaml",
298 | "config/packages/webpack_encore.yaml",
299 | "package.json",
300 | "webpack.config.js"
301 | ]
302 | },
303 | "symfony/yaml": {
304 | "version": "v5.0.3"
305 | },
306 | "tgalopin/html-sanitizer": {
307 | "version": "1.2.0"
308 | },
309 | "tgalopin/html-sanitizer-bundle": {
310 | "version": "1.0",
311 | "recipe": {
312 | "repo": "github.com/symfony/recipes-contrib",
313 | "branch": "master",
314 | "version": "1.0",
315 | "ref": "26a72f38eede2c53b5d3ccbed5c150e10a93268d"
316 | },
317 | "files": [
318 | "config/packages/html_sanitizer.yaml"
319 | ]
320 | },
321 | "twig/extensions": {
322 | "version": "1.0",
323 | "recipe": {
324 | "repo": "github.com/symfony/recipes",
325 | "branch": "master",
326 | "version": "1.0",
327 | "ref": "a86723ee8d8b2f9437c8ce60a5546a1c267da5ed"
328 | },
329 | "files": [
330 | "config/packages/twig_extensions.yaml"
331 | ]
332 | },
333 | "twig/twig": {
334 | "version": "v2.12.3"
335 | }
336 | }
337 |
--------------------------------------------------------------------------------