Deployed 256c1d6 to 5.4 with MkDocs 1.1.2 and mike 1.0.0
[GitHub/WoltLab/woltlab.github.io.git] / 5.3 / php_api_form_builder-validation_data.html
1 <!DOCTYPE html>
2 <head>
3 <meta charset="utf-8">
4 <meta http-equiv="X-UA-Compatible" content="IE=edge">
5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 <meta name="description" content="">
7 <meta name="keywords" content=" ">
8 <title>Form Validation and Form Data | WoltLab Suite 5.3 Documentation</title>
9
10 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/syntax.css">
11 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,300,600">
12 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/font-awesome.min.css">
13 <!--<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">-->
14 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/modern-business.css">
15 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/lavish-bootstrap.css">
16 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/customstyles.css">
17 <link rel="stylesheet" href="https://docs.woltlab.com/5.3/css/theme-blue.css?v=3">
18
19 <script src="https://docs.woltlab.com/5.3/js/jquery.min.js"></script>
20 <script src="https://docs.woltlab.com/5.3/js/jquery.cookie.min.js"></script>
21 <script src="https://docs.woltlab.com/5.3/js/jquery.navgoco.min.js"></script>
22 <script src="https://docs.woltlab.com/5.3/js/bootstrap.min.js"></script>
23 <script src="https://docs.woltlab.com/5.3/js/anchor.min.js"></script>
24 <script src="https://docs.woltlab.com/5.3/js/toc.js"></script>
25 <script src="https://docs.woltlab.com/5.3/js/customscripts.js"></script>
26
27 <link rel="shortcut icon" href="https://docs.woltlab.com/5.3/images/favicon.ico">
28
29 <link rel="alternate" type="application/rss+xml" title="woltlab.github.io" href="https://docs.woltlab.com/5.3feed.xml">
30
31 <script>
32 $(document).ready(function() {
33 // Initialize navgoco with default options
34 $("#mysidebar").navgoco({
35 caretHtml: '',
36 accordion: true,
37 openClass: 'active', // open
38 save: false, // leave false or nav highlighting doesn't work right
39 cookie: {
40 name: 'navgoco',
41 expires: false,
42 path: '/'
43 },
44 slide: {
45 duration: 400,
46 easing: 'swing'
47 }
48 });
49
50 $("#collapseAll").click(function(e) {
51 e.preventDefault();
52 $("#mysidebar").navgoco('toggle', false);
53 });
54
55 $("#expandAll").click(function(e) {
56 e.preventDefault();
57 $("#mysidebar").navgoco('toggle', true);
58 });
59
60 });
61
62 </script>
63 <script>
64 $(function () {
65 $('[data-toggle="tooltip"]').tooltip()
66 })
67 </script>
68
69
70 </head>
71 <body>
72 <!-- Navigation -->
73 <nav class="navbar navbar-inverse navbar-fixed-top">
74 <div class="container topnavlinks">
75 <div class="navbar-header">
76 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
77 <span class="sr-only">Toggle navigation</span>
78 <span class="icon-bar"></span>
79 <span class="icon-bar"></span>
80 <span class="icon-bar"></span>
81 </button>
82 <a class="fa fa-home fa-lg navbar-brand" href="index.html">&nbsp;<span class="projectTitle"> WoltLab Suite 5.3 Documentation</span></a>
83 </div>
84 <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
85 <ul class="nav navbar-nav navbar-right">
86 <!-- entries without drop-downs appear here -->
87
88
89
90 <li><a href="https://www.woltlab.com" target="_blank">woltlab.com</a></li>
91
92
93
94
95
96 <li><a href="https://github.com/WoltLab/WCF/" target="_blank">Code on github.com</a></li>
97
98
99
100 <!-- entries with drop-downs appear here -->
101 <!-- conditional logic to control which topnav appears for the audience defined in the configuration file.-->
102
103
104 <!--comment out this block if you want to hide search-->
105 <li>
106 <!--start search-->
107 <div id="search-demo-container">
108 <input type="text" id="search-input" placeholder="search...">
109 <ul id="results-container"></ul>
110 </div>
111 <script src="https://docs.woltlab.com/5.3/js/jekyll-search.js" type="text/javascript"></script>
112 <script type="text/javascript">
113 SimpleJekyllSearch.init({
114 searchInput: document.getElementById('search-input'),
115 resultsContainer: document.getElementById('results-container'),
116 dataSource: 'https://docs.woltlab.com/5.3/search.json',
117 searchResultTemplate: '<li><a href="{url}" title="Form Validation and Form Data">{title}</a></li>',
118 noResultsText: 'No results found.',
119 limit: 10,
120 fuzzy: true,
121 })
122 </script>
123 <!--end search-->
124 </li>
125 </ul>
126 </div>
127 </div>
128 <!-- /.container -->
129 </nav>
130
131
132 <div class="container">
133 <div class="col-lg-12">&nbsp;</div>
134
135 <div class="row">
136 <div class="col-md-3">
137
138
139
140 <ul id="mysidebar" class="nav">
141 <li class="sidebarTitle">WoltLab Suite 5.3</li>
142
143
144
145 <li>
146 <a href="#">Getting Started</a>
147 <ul>
148
149
150
151
152 <li data-identifier="index"><a href="index.html">Introduction</a></li>
153
154
155
156
157
158
159
160
161 <li data-identifier="getting-started_quick-start"><a href="getting-started_quick-start.html">Quick Start</a></li>
162
163
164
165
166
167 </ul>
168 </li>
169
170 <li>
171 <a href="#">PHP API</a>
172 <ul>
173
174
175
176
177 <li data-identifier="php_pages"><a href="php_pages.html">Pages</a></li>
178
179
180
181
182
183
184
185
186 <li data-identifier="php_database-objects"><a href="php_database-objects.html">Database Objects</a></li>
187
188
189
190
191
192
193
194
195 <li data-identifier="php_database-access"><a href="php_database-access.html">Database Access</a></li>
196
197
198
199
200
201
202
203
204 <li data-identifier="php_exceptions"><a href="php_exceptions.html">Exceptions</a></li>
205
206
207
208
209
210
211
212
213 <li class="subfolders">
214 <a href="#">API</a>
215 <ul>
216
217
218
219 <li data-identifier="php_api_caches"><a href="php_api_caches.html">Caches</a></li>
220
221
222
223
224 <li data-identifier="php_api_comments"><a href="php_api_comments.html">Comments</a></li>
225
226
227
228
229 <li data-identifier="php_api_cronjobs"><a href="php_api_cronjobs.html">Cronjobs</a></li>
230
231
232
233
234 <li data-identifier="php_api_events"><a href="php_api_events.html">Events</a></li>
235
236
237
238
239 <li data-identifier="php_api_form_builder"><a href="php_api_form_builder.html">Form Builder</a></li>
240
241
242
243
244 <li data-identifier="php_api_package_installation_plugins"><a href="php_api_package_installation_plugins.html">Package Installation Plugins</a></li>
245
246
247
248
249 <li data-identifier="php_api_user_activity_points"><a href="php_api_user_activity_points.html">User Activity Points</a></li>
250
251
252
253
254 <li data-identifier="php_api_user_notifications"><a href="php_api_user_notifications.html">User Notifications</a></li>
255
256
257
258
259 <li data-identifier="php_api_sitemaps"><a href="php_api_sitemaps.html">Sitemaps</a></li>
260
261
262 </ul>
263 </li>
264
265
266
267
268
269 <li data-identifier="php_code-style"><a href="php_code-style.html">Code Style</a></li>
270
271
272
273
274
275
276
277
278 <li data-identifier="php_apps"><a href="php_apps.html">Apps</a></li>
279
280
281
282
283
284
285
286
287 <li data-identifier="php_gdpr"><a href="php_gdpr.html">GDPR</a></li>
288
289
290
291
292
293 </ul>
294 </li>
295
296 <li>
297 <a href="#">Languages, Templates & CSS</a>
298 <ul>
299
300
301
302
303 <li data-identifier="view_languages"><a href="view_languages.html">Languages</a></li>
304
305
306
307
308
309
310
311
312 <li data-identifier="view_templates"><a href="view_templates.html">Templates</a></li>
313
314
315
316
317
318
319
320
321 <li data-identifier="view_css"><a href="view_css.html">CSS</a></li>
322
323
324
325
326
327 </ul>
328 </li>
329
330 <li>
331 <a href="#">JavaScript API</a>
332 <ul>
333
334
335
336
337 <li data-identifier="javascript_general-usage"><a href="javascript_general-usage.html">General Usage</a></li>
338
339
340
341
342
343
344
345
346 <li class="subfolders">
347 <a href="#">New API</a>
348 <ul>
349
350
351
352 <li data-identifier="javascript_new-api_writing-a-module"><a href="javascript_new-api_writing-a-module.html">Writing a module</a></li>
353
354
355
356
357 <li data-identifier="javascript_new-api_data-structures"><a href="javascript_new-api_data-structures.html">Data Structures</a></li>
358
359
360
361
362 <li data-identifier="javascript_new-api_core"><a href="javascript_new-api_core.html">Core Functions</a></li>
363
364
365
366
367 <li data-identifier="javascript_new-api_dom"><a href="javascript_new-api_dom.html">DOM</a></li>
368
369
370
371
372 <li data-identifier="javascript_new-api_events"><a href="javascript_new-api_events.html">Event Handling</a></li>
373
374
375
376
377 <li data-identifier="javascript_new-api_ajax"><a href="javascript_new-api_ajax.html">Ajax</a></li>
378
379
380
381
382 <li data-identifier="javascript_new-api_dialogs"><a href="javascript_new-api_dialogs.html">Dialogs</a></li>
383
384
385
386
387 <li data-identifier="javascript_new-api_browser"><a href="javascript_new-api_browser.html">Browser and Screen Sizes</a></li>
388
389
390
391
392 <li data-identifier="javascript_new-api_ui"><a href="javascript_new-api_ui.html">User Interface</a></li>
393
394
395 </ul>
396 </li>
397
398
399
400
401
402 <li data-identifier="javascript_legacy-api"><a href="javascript_legacy-api.html">Legacy API</a></li>
403
404
405
406
407
408
409
410
411 <li data-identifier="javascript_helper-functions"><a href="javascript_helper-functions.html">Helper Functions</a></li>
412
413
414
415
416
417
418
419
420 <li data-identifier="javascript_code-snippets"><a href="javascript_code-snippets.html">Code Snippets</a></li>
421
422
423
424
425
426 </ul>
427 </li>
428
429 <li>
430 <a href="#">Package Components</a>
431 <ul>
432
433
434
435
436 <li data-identifier="package_package-xml"><a href="package_package-xml.html">package.xml</a></li>
437
438
439
440
441
442
443
444
445 <li data-identifier="package_pip"><a href="package_pip.html">PIPs</a></li>
446
447
448
449
450
451 </ul>
452 </li>
453
454 <li>
455 <a href="#">Migration</a>
456 <ul>
457
458
459
460
461 <li class="subfolders">
462 <a href="#">Migrating from WSC 5.2</a>
463 <ul>
464
465
466
467 <li data-identifier="migration_wsc-52_php"><a href="migration_wsc-52_php.html">PHP API</a></li>
468
469
470
471
472 <li data-identifier="migration_wsc-52_templates"><a href="migration_wsc-52_templates.html">Templates and Languages</a></li>
473
474
475
476
477 <li data-identifier="migration_wsc-52_libraries"><a href="migration_wsc-52_libraries.html">Third Party Libraries</a></li>
478
479
480 </ul>
481 </li>
482
483 <li class="subfolders">
484 <a href="#">Migrating from WSC 3.1</a>
485 <ul>
486
487
488
489 <li data-identifier="migration_wsc-31_php"><a href="migration_wsc-31_php.html">PHP API</a></li>
490
491
492 </ul>
493 </li>
494
495 <li class="subfolders">
496 <a href="#">Migrating from WSC 3.0</a>
497 <ul>
498
499
500
501 <li data-identifier="migration_wsc-30_php"><a href="migration_wsc-30_php.html">PHP API</a></li>
502
503
504
505
506 <li data-identifier="migration_wsc-30_javascript"><a href="migration_wsc-30_javascript.html">JavaScript API</a></li>
507
508
509
510
511 <li data-identifier="migration_wsc-30_templates"><a href="migration_wsc-30_templates.html">Templates</a></li>
512
513
514
515
516 <li data-identifier="migration_wsc-30_css"><a href="migration_wsc-30_css.html">CSS</a></li>
517
518
519
520
521 <li data-identifier="migration_wsc-30_package"><a href="migration_wsc-30_package.html">Package Components</a></li>
522
523
524 </ul>
525 </li>
526
527 <li class="subfolders">
528 <a href="#">Migrating from WCF 2.1</a>
529 <ul>
530
531
532
533 <li data-identifier="migration_wcf-21_php"><a href="migration_wcf-21_php.html">PHP API</a></li>
534
535
536
537
538 <li data-identifier="migration_wcf-21_templates"><a href="migration_wcf-21_templates.html">Templates</a></li>
539
540
541
542
543 <li data-identifier="migration_wcf-21_css"><a href="migration_wcf-21_css.html">CSS</a></li>
544
545
546
547
548 <li data-identifier="migration_wcf-21_package"><a href="migration_wcf-21_package.html">Package Components</a></li>
549
550
551 </ul>
552 </li>
553
554
555 </ul>
556 </li>
557
558 <li>
559 <a href="#">Tutorials</a>
560 <ul>
561
562
563
564
565 <li data-identifier="tutorial_tutorial-series"><a href="tutorial_tutorial-series.html">Tutorial Series</a></li>
566
567
568
569
570
571 </ul>
572 </li>
573
574
575 </ul>
576
577 <script>
578 (function() {
579 var sidebar = $('#mysidebar');
580 var item = sidebar.find('.active');
581 if (item.length === 0) {
582 var parent = 'php_api_form_builder';
583 if (parent) {
584 sidebar.find('li[data-identifier="' + parent + '"]').addClass('active');
585 }
586 }
587
588 sidebar.find(".active").parents('li').toggleClass("active");
589 })();
590 </script>
591
592 </div>
593
594 <div class="col-md-9">
595 <div class="post-header">
596 <h1 class="post-title-main">Form Validation and Form Data</h1>
597 </div>
598
599
600
601 <div class="post-content">
602
603
604
605
606
607 <!-- this handles the automatic toc. use ## for subheads to auto-generate the on-page minitoc. if you use html tags, you must supply an ID for the heading element in order for it to appear in the minitoc. -->
608 <script>
609 $( document ).ready(function() {
610 // Handler for .ready() called.
611
612 $('#toc').toc({ minimumHeaders: 0, listType: 'ul', showSpeed: 0, headers: 'h2,h3,h4' });
613
614 /* this offset helps account for the space taken up by the floating toolbar. */
615 $('#toc').on('click', 'a', function() {
616 var target = $(this.getAttribute('href'))
617 , scroll_target = target.offset().top
618
619 $(window).scrollTop(scroll_target - 10);
620 return false
621 })
622
623 });
624 </script>
625
626 <div id="toc"></div>
627
628
629
630 <h2 id="form-validation">Form Validation</h2>
631
632 <p>Every form field class has to implement <code class="language-plaintext highlighter-rouge">IFormField::validate()</code> according to their internal logic of what constitutes a valid value.
633 If a certain constraint for the value is no met, a form field validation error object is added to the form field.
634 Form field validation error classes have to implement the interface <code class="language-plaintext highlighter-rouge">IFormFieldValidationError</code>.</p>
635
636 <p>In addition to intrinsic validations like checking the length of the value of a text form field, in many cases, there are additional constraints specific to the form like ensuring that the text is not already used by a different object of the same database object class.
637 Such additional validations can be added to (and removed from) the form field via implementations of the <code class="language-plaintext highlighter-rouge">IFormFieldValidator</code> interface.</p>
638
639 <h3 id="iformfieldvalidationerror--formfieldvalidationerror"><code class="language-plaintext highlighter-rouge">IFormFieldValidationError</code> / <code class="language-plaintext highlighter-rouge">FormFieldValidationError</code></h3>
640
641 <p><code class="language-plaintext highlighter-rouge">IFormFieldValidationError</code> requires the following methods:</p>
642
643 <ul>
644 <li><code class="language-plaintext highlighter-rouge">__construct($type, $languageItem = null, array $information = [])</code> creates a new validation error object for an error with the given type and message stored in the given language items.
645 The information array is used when generating the error message.</li>
646 <li><code class="language-plaintext highlighter-rouge">getHtml()</code> returns the HTML element representing the error that is shown to the user.</li>
647 <li><code class="language-plaintext highlighter-rouge">getMessage()</code> returns the error message based on the language item and information array given in the constructor.</li>
648 <li><code class="language-plaintext highlighter-rouge">getInformation()</code> and <code class="language-plaintext highlighter-rouge">getType()</code> are getters for the first and third parameter of the constructor.</li>
649 </ul>
650
651 <p><code class="language-plaintext highlighter-rouge">FormFieldValidationError</code> is a default implementation of the interface that shows the error in an <code class="language-plaintext highlighter-rouge">small.innerError</code> HTML element below the form field.</p>
652
653 <p>Form field validation errors are added to form fields via the <code class="language-plaintext highlighter-rouge">IFormField::addValidationError(IFormFieldValidationError $error)</code> method.</p>
654
655 <h3 id="iformfieldvalidator--formfieldvalidator"><code class="language-plaintext highlighter-rouge">IFormFieldValidator</code> / <code class="language-plaintext highlighter-rouge">FormFieldValidator</code></h3>
656
657 <p><code class="language-plaintext highlighter-rouge">IFormFieldValidator</code> requires the following methods:</p>
658
659 <ul>
660 <li><code class="language-plaintext highlighter-rouge">__construct($id, callable $validator)</code> creates a new validator with the given id that passes the validated form field to the given callable that does the actual validation.
661 <code class="language-plaintext highlighter-rouge">static validateId($id)</code> is used to check if the given id is valid.</li>
662 <li><code class="language-plaintext highlighter-rouge">__invoke(IFormField $field)</code> is used when the form field is validated to execute the validator.</li>
663 <li><code class="language-plaintext highlighter-rouge">getId()</code> returns the id of the validator.</li>
664 </ul>
665
666 <p><code class="language-plaintext highlighter-rouge">FormFieldValidator</code> is a default implementation of the interface.</p>
667
668 <p>Form field validators are added to form fields via the <code class="language-plaintext highlighter-rouge">addValidator(IFormFieldValidator $validator)</code> method.</p>
669
670 <h2 id="form-data">Form Data</h2>
671
672 <p>After a form is successfully validated, the data of the form fields (returned by <code class="language-plaintext highlighter-rouge">IFormDocument::getData()</code>) have to be extracted which is the job of the <code class="language-plaintext highlighter-rouge">IFormDataHandler</code> object returned by <code class="language-plaintext highlighter-rouge">IFormDocument::getDataHandler()</code>.
673 Form data handlers themselves, however, are only iterating through all <code class="language-plaintext highlighter-rouge">IFormDataProcessor</code> instances that have been registered with the data handler.</p>
674
675 <h3 id="iformdatahandler--formdatahandler"><code class="language-plaintext highlighter-rouge">IFormDataHandler</code> / <code class="language-plaintext highlighter-rouge">FormDataHandler</code></h3>
676
677 <p><code class="language-plaintext highlighter-rouge">IFormDataHandler</code> requires the following methods:</p>
678
679 <ul>
680 <li><code class="language-plaintext highlighter-rouge">addProcessor(IFormDataProcessor $processor)</code> adds a new data processor to the data handler.</li>
681 <li><code class="language-plaintext highlighter-rouge">getFormData(IFormDocument $document)</code> returns the data of the given form by applying all registered data handlers on the form.</li>
682 <li><code class="language-plaintext highlighter-rouge">getObjectData(IFormDocument $document, IStorableObject $object)</code> returns the data of the given object which will be used to populate the form field values of the given form.</li>
683 </ul>
684
685 <p><code class="language-plaintext highlighter-rouge">FormDataHandler</code> is the default implementation of this interface and should also be extended instead of implementing the interface directly.</p>
686
687 <h3 id="iformdataprocessor--defaultformdataprocessor"><code class="language-plaintext highlighter-rouge">IFormDataProcessor</code> / <code class="language-plaintext highlighter-rouge">DefaultFormDataProcessor</code></h3>
688
689 <p><code class="language-plaintext highlighter-rouge">IFormDataProcessor</code> requires the following methods:</p>
690
691 <ul>
692 <li><code class="language-plaintext highlighter-rouge">processFormData(IFormDocument $document, array $parameters)</code> is called by <code class="language-plaintext highlighter-rouge">IFormDataHandler::getFormData()</code>.
693 The method processes the given parameters array and returns the processed version.</li>
694 <li><code class="language-plaintext highlighter-rouge">processObjectData(IFormDocument $document, array $data, IStorableObject $object)</code> is called by <code class="language-plaintext highlighter-rouge">IFormDataHandler::getObjectData()</code>.
695 The method processes the given object data array and returns the processed version.</li>
696 </ul>
697
698 <p>When <code class="language-plaintext highlighter-rouge">FormDocument</code> creates its <code class="language-plaintext highlighter-rouge">FormDataHandler</code> instance, it automatically registers an <code class="language-plaintext highlighter-rouge">DefaultFormDataProcessor</code> object as the first data processor.
699 <code class="language-plaintext highlighter-rouge">DefaultFormDataProcessor</code> puts the save value of all form fields that are available and have a save value into <code class="language-plaintext highlighter-rouge">$parameters['data']</code> using the form field’s object property as the array key.</p>
700
701 <div class="bs-callout bs-callout-warning"><code class="language-plaintext highlighter-rouge">IFormDataProcessor</code> should not be implemented directly. Instead, <code class="language-plaintext highlighter-rouge">AbstractFormDataProcessor</code> should be extended.</div>
702
703 <div class="bs-callout bs-callout-info">All form data is put into the <code class="language-plaintext highlighter-rouge">data</code> sub-array so that the whole <code class="language-plaintext highlighter-rouge">$parameters</code> array can be passed to a database object action object that requires the actual database object data to be in the <code class="language-plaintext highlighter-rouge">data</code> sub-array.</div>
704
705 <h3 id="additional-data-processors">Additional Data Processors</h3>
706
707 <h4 id="customformdataprocessor"><code class="language-plaintext highlighter-rouge">CustomFormDataProcessor</code></h4>
708
709 <p>As mentioned above, the data in the <code class="language-plaintext highlighter-rouge">data</code> sub-array is intended to directly create or update the database object with.
710 As these values are used in the database query directly, these values cannot contain arrays.
711 Several form fields, however, store and return their data in form of arrays.
712 Thus, this data cannot be returned by <code class="language-plaintext highlighter-rouge">IFormField::getSaveValue()</code> so that <code class="language-plaintext highlighter-rouge">IFormField::hasSaveValue()</code> returns <code class="language-plaintext highlighter-rouge">false</code> and the form field’s data is not collected by the standard <code class="language-plaintext highlighter-rouge">DefaultFormDataProcessor</code> object.</p>
713
714 <p>Instead, such form fields register a <code class="language-plaintext highlighter-rouge">CustomFormDataProcessor</code> in their <code class="language-plaintext highlighter-rouge">IFormField::populate()</code> method that inserts the form field value into the <code class="language-plaintext highlighter-rouge">$parameters</code> array directly.
715 This way, the relevant database object action method has access to the data to save it appropriately.</p>
716
717 <p>The constructor of <code class="language-plaintext highlighter-rouge">CustomFormDataProcessor</code> requires an id (that is primarily used in error messages during the validation of the second parameter) and callables for <code class="language-plaintext highlighter-rouge">IFormDataProcessor::processFormData()</code> and <code class="language-plaintext highlighter-rouge">IFormDataProcessor::processObjectData()</code> which are passed the same parameters as the <code class="language-plaintext highlighter-rouge">IFormDataProcessor</code> methods.
718 Only one of the callables has to be given, the other one then defaults to simply returning the relevant array unchanged.</p>
719
720 <h4 id="voidformdataprocessor"><code class="language-plaintext highlighter-rouge">VoidFormDataProcessor</code></h4>
721
722 <p>Some form fields might only exist to toggle the visibility of other form fields (via dependencies) but the data of form field itself is irrelevant.
723 As <code class="language-plaintext highlighter-rouge">DefaultFormDataProcessor</code> collects the data of all form fields, an additional data processor in the form of a <code class="language-plaintext highlighter-rouge">VoidFormDataProcessor</code> can be added whose constructor <code class="language-plaintext highlighter-rouge">__construct($property, $isDataProperty = true)</code> requires the name of the relevant object property/form id and whether the form field value is stored in the <code class="language-plaintext highlighter-rouge">data</code> sub-array or directory in the <code class="language-plaintext highlighter-rouge">$parameters</code> array.
724 When the data processor is invoked, it checks whether the relevant entry in the <code class="language-plaintext highlighter-rouge">$parameters</code> array exists and voids it by removing it from the array.</p>
725
726
727 <div class="tags">
728
729 </div>
730
731
732
733 </div>
734
735 </div>
736 </div>
737 </div>
738
739 <div class="footerBox">
740 <div class="container">
741 <div class="footerBoxLeft">
742
743 <a target="_blank" href="https://github.com/woltlab/woltlab.github.io/blob/master/pages/php/api/formBuilder/php_api_form_builder-validation_data.md" class="btn btn-default githubEditButton no_icon" role="button"><i class="fa fa-github fa-lg"></i> Edit on GitHub</a>
744 <p>Site last generated: Mar 5, 2021</p>
745 </div>
746 <div class="footerBoxRight">
747 <a class="no_icon" href="https://www.woltlab.com"><img src="https://docs.woltlab.com/5.3/images/woltlab-black.png" srcset="https://docs.woltlab.com/5.3/images/woltlab-black@2x.png 2x" height="40" width="204" alt=""></a>
748 </div>
749 </div>
750 </div>
751
752 <div class="pageFooter">
753 <div class="container">
754 &copy; 20012021 <a class="no_icon" href="https://www.woltlab.com">WoltLab GmbH</a>. All rights reserved. | <a class="no_icon" href="https://www.woltlab.com/legal-notice/">Legal Notice</a> | <a class="no_icon" href="https://www.woltlab.com/privacy-policy/">Privacy Policy</a>
755 </div>
756 </div>
757 </body>
758
759 </html>