Deployed 3bf25ab to 5.4 with MkDocs 1.1.2 and mike 0.5.5
[GitHub/WoltLab/woltlab.github.io.git] / 5.3 / migration_wsc-31_form-builder.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>Migrating from WSC 3.1 - Form Builder | 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="Migrating from WSC 3.1 - Form Builder">{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 = 'migration_wsc-31_php';
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">Migrating from WSC 3.1 - Form Builder</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="example-two-text-form-fields">Example: Two Text Form Fields</h2>
631
632 <p>As the first example, the pre-WoltLab Suite Core 5.2 versions of the forms to add and edit persons from the <a href="tutorial_tutorial-series_part-1-base-structure.html">first part of the tutorial series</a> will be updated to the new form builder API.
633 This form is the perfect first examples as it is very simple with only two text fields whose only restriction is that they have to be filled out and that their values may not be longer than 255 characters each.</p>
634
635 <p>As a reminder, here are the two relevant PHP files and the relevant template file:</p>
636
637 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
638 <span class="kn">namespace</span> <span class="nn">wcf\acp\form</span><span class="p">;</span>
639 <span class="kn">use</span> <span class="nn">wcf\data\person\PersonAction</span><span class="p">;</span>
640 <span class="kn">use</span> <span class="nn">wcf\form\AbstractForm</span><span class="p">;</span>
641 <span class="kn">use</span> <span class="nn">wcf\system\exception\UserInputException</span><span class="p">;</span>
642 <span class="kn">use</span> <span class="nn">wcf\system\WCF</span><span class="p">;</span>
643 <span class="kn">use</span> <span class="nn">wcf\util\StringUtil</span><span class="p">;</span>
644
645 <span class="cd">/**
646 * Shows the form to create a new person.
647 *
648 * @author Matthias Schmidt
649 * @copyright 2001-2019 WoltLab GmbH
650 * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;
651 * @package WoltLabSuite\Core\Acp\Form
652 */</span>
653 <span class="kd">class</span> <span class="nc">PersonAddForm</span> <span class="k">extends</span> <span class="nx">AbstractForm</span> <span class="p">{</span>
654 <span class="cd">/**
655 * @inheritDoc
656 */</span>
657 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">'wcf.acp.menu.link.person.add'</span><span class="p">;</span>
658
659 <span class="cd">/**
660 * first name of the person
661 * @var string
662 */</span>
663 <span class="k">public</span> <span class="nv">$firstName</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
664
665 <span class="cd">/**
666 * last name of the person
667 * @var string
668 */</span>
669 <span class="k">public</span> <span class="nv">$lastName</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
670
671 <span class="cd">/**
672 * @inheritDoc
673 */</span>
674 <span class="k">public</span> <span class="nv">$neededPermissions</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'admin.content.canManagePeople'</span><span class="p">];</span>
675
676 <span class="cd">/**
677 * @inheritDoc
678 */</span>
679 <span class="k">public</span> <span class="k">function</span> <span class="nf">assignVariables</span><span class="p">()</span> <span class="p">{</span>
680 <span class="k">parent</span><span class="o">::</span><span class="na">assignVariables</span><span class="p">();</span>
681
682 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">([</span>
683 <span class="s1">'action'</span> <span class="o">=&gt;</span> <span class="s1">'add'</span><span class="p">,</span>
684 <span class="s1">'firstName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
685 <span class="s1">'lastName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
686 <span class="p">]);</span>
687 <span class="p">}</span>
688
689 <span class="cd">/**
690 * @inheritDoc
691 */</span>
692 <span class="k">public</span> <span class="k">function</span> <span class="nf">readFormParameters</span><span class="p">()</span> <span class="p">{</span>
693 <span class="k">parent</span><span class="o">::</span><span class="na">readFormParameters</span><span class="p">();</span>
694
695 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'firstName'</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="nx">StringUtil</span><span class="o">::</span><span class="na">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'firstName'</span><span class="p">]);</span>
696 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'lastName'</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="nx">StringUtil</span><span class="o">::</span><span class="na">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'lastName'</span><span class="p">]);</span>
697 <span class="p">}</span>
698
699 <span class="cd">/**
700 * @inheritDoc
701 */</span>
702 <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span> <span class="p">{</span>
703 <span class="k">parent</span><span class="o">::</span><span class="na">save</span><span class="p">();</span>
704
705 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonAction</span><span class="p">([],</span> <span class="s1">'create'</span><span class="p">,</span> <span class="p">[</span>
706 <span class="s1">'data'</span> <span class="o">=&gt;</span> <span class="nb">array_merge</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">additionalFields</span><span class="p">,</span> <span class="p">[</span>
707 <span class="s1">'firstName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
708 <span class="s1">'lastName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
709 <span class="p">])</span>
710 <span class="p">]);</span>
711 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
712
713 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">();</span>
714
715 <span class="c1">// reset values</span>
716 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
717 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="s1">''</span><span class="p">;</span>
718
719 <span class="c1">// show success message</span>
720 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s1">'success'</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
721 <span class="p">}</span>
722
723 <span class="cd">/**
724 * @inheritDoc
725 */</span>
726 <span class="k">public</span> <span class="k">function</span> <span class="nf">validate</span><span class="p">()</span> <span class="p">{</span>
727 <span class="k">parent</span><span class="o">::</span><span class="na">validate</span><span class="p">();</span>
728
729 <span class="c1">// validate first name</span>
730 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">))</span> <span class="p">{</span>
731 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">'firstName'</span><span class="p">);</span>
732 <span class="p">}</span>
733 <span class="k">if</span> <span class="p">(</span><span class="nb">mb_strlen</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">255</span><span class="p">)</span> <span class="p">{</span>
734 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">'firstName'</span><span class="p">,</span> <span class="s1">'tooLong'</span><span class="p">);</span>
735 <span class="p">}</span>
736
737 <span class="c1">// validate last name</span>
738 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">))</span> <span class="p">{</span>
739 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">'lastName'</span><span class="p">);</span>
740 <span class="p">}</span>
741 <span class="k">if</span> <span class="p">(</span><span class="nb">mb_strlen</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">255</span><span class="p">)</span> <span class="p">{</span>
742 <span class="k">throw</span> <span class="k">new</span> <span class="nx">UserInputException</span><span class="p">(</span><span class="s1">'lastName'</span><span class="p">,</span> <span class="s1">'tooLong'</span><span class="p">);</span>
743 <span class="p">}</span>
744 <span class="p">}</span>
745 <span class="p">}</span></code></pre></figure>
746
747 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
748 <span class="kn">namespace</span> <span class="nn">wcf\acp\form</span><span class="p">;</span>
749 <span class="kn">use</span> <span class="nn">wcf\data\person\Person</span><span class="p">;</span>
750 <span class="kn">use</span> <span class="nn">wcf\data\person\PersonAction</span><span class="p">;</span>
751 <span class="kn">use</span> <span class="nn">wcf\form\AbstractForm</span><span class="p">;</span>
752 <span class="kn">use</span> <span class="nn">wcf\system\exception\IllegalLinkException</span><span class="p">;</span>
753 <span class="kn">use</span> <span class="nn">wcf\system\WCF</span><span class="p">;</span>
754
755 <span class="cd">/**
756 * Shows the form to edit an existing person.
757 *
758 * @author Matthias Schmidt
759 * @copyright 2001-2019 WoltLab GmbH
760 * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;
761 * @package WoltLabSuite\Core\Acp\Form
762 */</span>
763 <span class="kd">class</span> <span class="nc">PersonEditForm</span> <span class="k">extends</span> <span class="nx">PersonAddForm</span> <span class="p">{</span>
764 <span class="cd">/**
765 * @inheritDoc
766 */</span>
767 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">'wcf.acp.menu.link.person'</span><span class="p">;</span>
768
769 <span class="cd">/**
770 * edited person object
771 * @var Person
772 */</span>
773 <span class="k">public</span> <span class="nv">$person</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
774
775 <span class="cd">/**
776 * id of the edited person
777 * @var integer
778 */</span>
779 <span class="k">public</span> <span class="nv">$personID</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
780
781 <span class="cd">/**
782 * @inheritDoc
783 */</span>
784 <span class="k">public</span> <span class="k">function</span> <span class="nf">assignVariables</span><span class="p">()</span> <span class="p">{</span>
785 <span class="k">parent</span><span class="o">::</span><span class="na">assignVariables</span><span class="p">();</span>
786
787 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">([</span>
788 <span class="s1">'action'</span> <span class="o">=&gt;</span> <span class="s1">'edit'</span><span class="p">,</span>
789 <span class="s1">'person'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span>
790 <span class="p">]);</span>
791 <span class="p">}</span>
792
793 <span class="cd">/**
794 * @inheritDoc
795 */</span>
796 <span class="k">public</span> <span class="k">function</span> <span class="nf">readData</span><span class="p">()</span> <span class="p">{</span>
797 <span class="k">parent</span><span class="o">::</span><span class="na">readData</span><span class="p">();</span>
798
799 <span class="k">if</span> <span class="p">(</span><span class="k">empty</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">))</span> <span class="p">{</span>
800 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">;</span>
801 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">lastName</span><span class="p">;</span>
802 <span class="p">}</span>
803 <span class="p">}</span>
804
805 <span class="cd">/**
806 * @inheritDoc
807 */</span>
808 <span class="k">public</span> <span class="k">function</span> <span class="nf">readParameters</span><span class="p">()</span> <span class="p">{</span>
809 <span class="k">parent</span><span class="o">::</span><span class="na">readParameters</span><span class="p">();</span>
810
811 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]))</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">personID</span> <span class="o">=</span> <span class="nb">intval</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]);</span>
812 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">);</span>
813 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">)</span> <span class="p">{</span>
814 <span class="k">throw</span> <span class="k">new</span> <span class="nx">IllegalLinkException</span><span class="p">();</span>
815 <span class="p">}</span>
816 <span class="p">}</span>
817
818 <span class="cd">/**
819 * @inheritDoc
820 */</span>
821 <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span> <span class="p">{</span>
822 <span class="nx">AbstractForm</span><span class="o">::</span><span class="na">save</span><span class="p">();</span>
823
824 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">PersonAction</span><span class="p">([</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">person</span><span class="p">],</span> <span class="s1">'update'</span><span class="p">,</span> <span class="p">[</span>
825 <span class="s1">'data'</span> <span class="o">=&gt;</span> <span class="nb">array_merge</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">additionalFields</span><span class="p">,</span> <span class="p">[</span>
826 <span class="s1">'firstName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">firstName</span><span class="p">,</span>
827 <span class="s1">'lastName'</span> <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">lastName</span>
828 <span class="p">])</span>
829 <span class="p">]);</span>
830 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">objectAction</span><span class="o">-&gt;</span><span class="na">executeAction</span><span class="p">();</span>
831
832 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">saved</span><span class="p">();</span>
833
834 <span class="c1">// show success message</span>
835 <span class="nx">WCF</span><span class="o">::</span><span class="na">getTPL</span><span class="p">()</span><span class="o">-&gt;</span><span class="na">assign</span><span class="p">(</span><span class="s1">'success'</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
836 <span class="p">}</span>
837 <span class="p">}</span></code></pre></figure>
838
839 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">'header'</span> <span class="nx">pageTitle</span><span class="o">=</span><span class="s1">'wcf.acp.person.'</span><span class="o">|</span><span class="nx">concat</span><span class="o">:</span><span class="nv">$action</span><span class="p">}</span>
840
841 <span class="o">&lt;</span><span class="nb">header</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeader"</span><span class="o">&gt;</span>
842 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeaderTitle"</span><span class="o">&gt;</span>
843 <span class="o">&lt;</span><span class="nx">h1</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentTitle"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">h1</span><span class="o">&gt;</span>
844 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
845
846 <span class="o">&lt;</span><span class="nx">nav</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeaderNavigation"</span><span class="o">&gt;</span>
847 <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
848 <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">"{link controller='PersonList'}</span><span class="si">{</span><span class="nv">/link</span><span class="si">}</span><span class="s2">"</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"button"</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"icon icon16 fa-list"</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">menu</span><span class="o">.</span><span class="nb">link</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="k">list</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">span</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
849
850 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">'contentHeaderNavigation'</span><span class="p">}</span>
851 <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
852 <span class="o">&lt;/</span><span class="nx">nav</span><span class="o">&gt;</span>
853 <span class="o">&lt;/</span><span class="nb">header</span><span class="o">&gt;</span>
854
855 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">'formError'</span><span class="p">}</span>
856
857 <span class="p">{</span><span class="k">if</span> <span class="nv">$success</span><span class="o">|</span><span class="nb">isset</span><span class="p">}</span>
858 <span class="o">&lt;</span><span class="nx">p</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"success"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">success</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">p</span><span class="o">&gt;</span>
859 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
860
861 <span class="o">&lt;</span><span class="nx">form</span> <span class="nx">method</span><span class="o">=</span><span class="s2">"post"</span> <span class="nx">action</span><span class="o">=</span><span class="s2">"{if </span><span class="nv">$action</span><span class="s2"> == 'add'}{link controller='PersonAdd'}</span><span class="si">{</span><span class="nv">/link}{else</span><span class="si">}</span><span class="s2">{link controller='PersonEdit' object=</span><span class="nv">$person</span><span class="s2">}</span><span class="si">{</span><span class="nv">/link}{/if</span><span class="si">}</span><span class="s2">"</span><span class="o">&gt;</span>
862 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"section"</span><span class="o">&gt;</span>
863 <span class="o">&lt;</span><span class="nb">dl</span><span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">'firstName'</span><span class="p">}</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"formError"</span><span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span><span class="o">&gt;</span>
864 <span class="o">&lt;</span><span class="nx">dt</span><span class="o">&gt;&lt;</span><span class="nx">label</span> <span class="k">for</span><span class="o">=</span><span class="s2">"firstName"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">firstName</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">label</span><span class="o">&gt;&lt;/</span><span class="nx">dt</span><span class="o">&gt;</span>
865 <span class="o">&lt;</span><span class="nx">dd</span><span class="o">&gt;</span>
866 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="nx">id</span><span class="o">=</span><span class="s2">"firstName"</span> <span class="nx">name</span><span class="o">=</span><span class="s2">"firstName"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"</span><span class="si">{</span><span class="nv">$firstName</span><span class="si">}</span><span class="s2">"</span> <span class="nx">required</span> <span class="nx">autofocus</span> <span class="nx">maxlength</span><span class="o">=</span><span class="s2">"255"</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"long"</span><span class="o">&gt;</span>
867 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">'firstName'</span><span class="p">}</span>
868 <span class="o">&lt;</span><span class="nx">small</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"innerError"</span><span class="o">&gt;</span>
869 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorType</span> <span class="o">==</span> <span class="s1">'empty'</span><span class="p">}</span>
870 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">form</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="k">empty</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
871 <span class="p">{</span><span class="k">else</span><span class="p">}</span>
872 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">firstName</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="p">{</span><span class="nv">$errorType</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
873 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
874 <span class="o">&lt;/</span><span class="nx">small</span><span class="o">&gt;</span>
875 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
876 <span class="o">&lt;/</span><span class="nx">dd</span><span class="o">&gt;</span>
877 <span class="o">&lt;/</span><span class="nb">dl</span><span class="o">&gt;</span>
878
879 <span class="o">&lt;</span><span class="nb">dl</span><span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">'lastName'</span><span class="p">}</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"formError"</span><span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span><span class="o">&gt;</span>
880 <span class="o">&lt;</span><span class="nx">dt</span><span class="o">&gt;&lt;</span><span class="nx">label</span> <span class="k">for</span><span class="o">=</span><span class="s2">"lastName"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">lastName</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">label</span><span class="o">&gt;&lt;/</span><span class="nx">dt</span><span class="o">&gt;</span>
881 <span class="o">&lt;</span><span class="nx">dd</span><span class="o">&gt;</span>
882 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"text"</span> <span class="nx">id</span><span class="o">=</span><span class="s2">"lastName"</span> <span class="nx">name</span><span class="o">=</span><span class="s2">"lastName"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"</span><span class="si">{</span><span class="nv">$lastName</span><span class="si">}</span><span class="s2">"</span> <span class="nx">required</span> <span class="nx">maxlength</span><span class="o">=</span><span class="s2">"255"</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"long"</span><span class="o">&gt;</span>
883 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorField</span> <span class="o">==</span> <span class="s1">'lastName'</span><span class="p">}</span>
884 <span class="o">&lt;</span><span class="nx">small</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"innerError"</span><span class="o">&gt;</span>
885 <span class="p">{</span><span class="k">if</span> <span class="nv">$errorType</span> <span class="o">==</span> <span class="s1">'empty'</span><span class="p">}</span>
886 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="k">global</span><span class="o">.</span><span class="nx">form</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="k">empty</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
887 <span class="p">{</span><span class="k">else</span><span class="p">}</span>
888 <span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="nx">lastName</span><span class="o">.</span><span class="nx">error</span><span class="o">.</span><span class="p">{</span><span class="nv">$errorType</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span>
889 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
890 <span class="o">&lt;/</span><span class="nx">small</span><span class="o">&gt;</span>
891 <span class="p">{</span><span class="o">/</span><span class="k">if</span><span class="p">}</span>
892 <span class="o">&lt;/</span><span class="nx">dd</span><span class="o">&gt;</span>
893 <span class="o">&lt;/</span><span class="nb">dl</span><span class="o">&gt;</span>
894
895 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">'dataFields'</span><span class="p">}</span>
896 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
897
898 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">'sections'</span><span class="p">}</span>
899
900 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"formSubmit"</span><span class="o">&gt;</span>
901 <span class="o">&lt;</span><span class="nx">input</span> <span class="nx">type</span><span class="o">=</span><span class="s2">"submit"</span> <span class="nx">value</span><span class="o">=</span><span class="s2">"</span><span class="si">{</span><span class="nv">lang}wcf.global.button.submit{/lang</span><span class="si">}</span><span class="s2">"</span> <span class="nx">accesskey</span><span class="o">=</span><span class="s2">"s"</span><span class="o">&gt;</span>
902 <span class="p">{</span><span class="o">@</span><span class="nx">SECURITY_TOKEN_INPUT_TAG</span><span class="p">}</span>
903 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
904 <span class="o">&lt;/</span><span class="nx">form</span><span class="o">&gt;</span>
905
906 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">'footer'</span><span class="p">}</span></code></pre></figure>
907
908 <p>Updating the template is easy as the complete form is replace by a single line of code:</p>
909
910 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">'header'</span> <span class="nx">pageTitle</span><span class="o">=</span><span class="s1">'wcf.acp.person.'</span><span class="o">|</span><span class="nx">concat</span><span class="o">:</span><span class="nv">$action</span><span class="p">}</span>
911
912 <span class="o">&lt;</span><span class="nb">header</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeader"</span><span class="o">&gt;</span>
913 <span class="o">&lt;</span><span class="nx">div</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeaderTitle"</span><span class="o">&gt;</span>
914 <span class="o">&lt;</span><span class="nx">h1</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentTitle"</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="p">{</span><span class="nv">$action</span><span class="p">}{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">h1</span><span class="o">&gt;</span>
915 <span class="o">&lt;/</span><span class="nx">div</span><span class="o">&gt;</span>
916
917 <span class="o">&lt;</span><span class="nx">nav</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"contentHeaderNavigation"</span><span class="o">&gt;</span>
918 <span class="o">&lt;</span><span class="nx">ul</span><span class="o">&gt;</span>
919 <span class="o">&lt;</span><span class="nx">li</span><span class="o">&gt;&lt;</span><span class="nx">a</span> <span class="nx">href</span><span class="o">=</span><span class="s2">"{link controller='PersonList'}</span><span class="si">{</span><span class="nv">/link</span><span class="si">}</span><span class="s2">"</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"button"</span><span class="o">&gt;&lt;</span><span class="nx">span</span> <span class="nx">class</span><span class="o">=</span><span class="s2">"icon icon16 fa-list"</span><span class="o">&gt;&lt;/</span><span class="nx">span</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="nx">span</span><span class="o">&gt;</span><span class="p">{</span><span class="nx">lang</span><span class="p">}</span><span class="nx">wcf</span><span class="o">.</span><span class="nx">acp</span><span class="o">.</span><span class="nx">menu</span><span class="o">.</span><span class="nb">link</span><span class="o">.</span><span class="nx">person</span><span class="o">.</span><span class="k">list</span><span class="p">{</span><span class="o">/</span><span class="nx">lang</span><span class="p">}</span><span class="o">&lt;/</span><span class="nx">span</span><span class="o">&gt;&lt;/</span><span class="nx">a</span><span class="o">&gt;&lt;/</span><span class="nx">li</span><span class="o">&gt;</span>
920
921 <span class="p">{</span><span class="nx">event</span> <span class="nx">name</span><span class="o">=</span><span class="s1">'contentHeaderNavigation'</span><span class="p">}</span>
922 <span class="o">&lt;/</span><span class="nx">ul</span><span class="o">&gt;</span>
923 <span class="o">&lt;/</span><span class="nx">nav</span><span class="o">&gt;</span>
924 <span class="o">&lt;/</span><span class="nb">header</span><span class="o">&gt;</span>
925
926 <span class="p">{</span><span class="o">@</span><span class="nv">$form</span><span class="o">-&gt;</span><span class="na">getHtml</span><span class="p">()}</span>
927
928 <span class="p">{</span><span class="k">include</span> <span class="nb">file</span><span class="o">=</span><span class="s1">'footer'</span><span class="p">}</span></code></pre></figure>
929
930 <p><code class="language-plaintext highlighter-rouge">PersonEditForm</code> also becomes much simpler:
931 only the edited <code class="language-plaintext highlighter-rouge">Person</code> object must be read:</p>
932
933 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
934 <span class="kn">namespace</span> <span class="nn">wcf\acp\form</span><span class="p">;</span>
935 <span class="kn">use</span> <span class="nn">wcf\data\person\Person</span><span class="p">;</span>
936 <span class="kn">use</span> <span class="nn">wcf\system\exception\IllegalLinkException</span><span class="p">;</span>
937
938 <span class="cd">/**
939 * Shows the form to edit an existing person.
940 *
941 * @author Matthias Schmidt
942 * @copyright 2001-2019 WoltLab GmbH
943 * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;
944 * @package WoltLabSuite\Core\Acp\Form
945 */</span>
946 <span class="kd">class</span> <span class="nc">PersonEditForm</span> <span class="k">extends</span> <span class="nx">PersonAddForm</span> <span class="p">{</span>
947 <span class="cd">/**
948 * @inheritDoc
949 */</span>
950 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">'wcf.acp.menu.link.person'</span><span class="p">;</span>
951
952 <span class="cd">/**
953 * @inheritDoc
954 */</span>
955 <span class="k">public</span> <span class="k">function</span> <span class="nf">readParameters</span><span class="p">()</span> <span class="p">{</span>
956 <span class="k">parent</span><span class="o">::</span><span class="na">readParameters</span><span class="p">();</span>
957
958 <span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]))</span> <span class="p">{</span>
959 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">formObject</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Person</span><span class="p">(</span><span class="nb">intval</span><span class="p">(</span><span class="nv">$_REQUEST</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]));</span>
960 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">formObject</span><span class="o">-&gt;</span><span class="na">personID</span><span class="p">)</span> <span class="p">{</span>
961 <span class="k">throw</span> <span class="k">new</span> <span class="nx">IllegalLinkException</span><span class="p">();</span>
962 <span class="p">}</span>
963 <span class="p">}</span>
964 <span class="p">}</span>
965 <span class="p">}</span></code></pre></figure>
966
967 <p>Most of the work is done in <code class="language-plaintext highlighter-rouge">PersonAddForm</code>:</p>
968
969 <figure class="highlight"><pre><code class="language-php" data-lang="php"><span class="cp">&lt;?php</span>
970 <span class="kn">namespace</span> <span class="nn">wcf\acp\form</span><span class="p">;</span>
971 <span class="kn">use</span> <span class="nn">wcf\data\person\PersonAction</span><span class="p">;</span>
972 <span class="kn">use</span> <span class="nn">wcf\form\AbstractFormBuilderForm</span><span class="p">;</span>
973 <span class="kn">use</span> <span class="nn">wcf\system\form\builder\container\FormContainer</span><span class="p">;</span>
974 <span class="kn">use</span> <span class="nn">wcf\system\form\builder\field\TextFormField</span><span class="p">;</span>
975
976 <span class="cd">/**
977 * Shows the form to create a new person.
978 *
979 * @author Matthias Schmidt
980 * @copyright 2001-2019 WoltLab GmbH
981 * @license GNU Lesser General Public License &lt;http://opensource.org/licenses/lgpl-license.php&gt;
982 * @package WoltLabSuite\Core\Acp\Form
983 */</span>
984 <span class="kd">class</span> <span class="nc">PersonAddForm</span> <span class="k">extends</span> <span class="nx">AbstractFormBuilderForm</span> <span class="p">{</span>
985 <span class="cd">/**
986 * @inheritDoc
987 */</span>
988 <span class="k">public</span> <span class="nv">$activeMenuItem</span> <span class="o">=</span> <span class="s1">'wcf.acp.menu.link.person.add'</span><span class="p">;</span>
989
990 <span class="cd">/**
991 * @inheritDoc
992 */</span>
993 <span class="k">public</span> <span class="nv">$formAction</span> <span class="o">=</span> <span class="s1">'create'</span><span class="p">;</span>
994
995 <span class="cd">/**
996 * @inheritDoc
997 */</span>
998 <span class="k">public</span> <span class="nv">$neededPermissions</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'admin.content.canManagePeople'</span><span class="p">];</span>
999
1000 <span class="cd">/**
1001 * @inheritDoc
1002 */</span>
1003 <span class="k">public</span> <span class="nv">$objectActionClass</span> <span class="o">=</span> <span class="nx">PersonAction</span><span class="o">::</span><span class="na">class</span><span class="p">;</span>
1004
1005 <span class="cd">/**
1006 * @inheritDoc
1007 */</span>
1008 <span class="k">protected</span> <span class="k">function</span> <span class="nf">createForm</span><span class="p">()</span> <span class="p">{</span>
1009 <span class="k">parent</span><span class="o">::</span><span class="na">createForm</span><span class="p">();</span>
1010
1011 <span class="nv">$dataContainer</span> <span class="o">=</span> <span class="nx">FormContainer</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">'data'</span><span class="p">)</span>
1012 <span class="o">-&gt;</span><span class="na">appendChildren</span><span class="p">([</span>
1013 <span class="nx">TextFormField</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">'firstName'</span><span class="p">)</span>
1014 <span class="o">-&gt;</span><span class="na">label</span><span class="p">(</span><span class="s1">'wcf.person.firstName'</span><span class="p">)</span>
1015 <span class="o">-&gt;</span><span class="na">required</span><span class="p">()</span>
1016 <span class="o">-&gt;</span><span class="na">maximumLength</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
1017
1018 <span class="nx">TextFormField</span><span class="o">::</span><span class="na">create</span><span class="p">(</span><span class="s1">'lastName'</span><span class="p">)</span>
1019 <span class="o">-&gt;</span><span class="na">label</span><span class="p">(</span><span class="s1">'wcf.person.lastName'</span><span class="p">)</span>
1020 <span class="o">-&gt;</span><span class="na">required</span><span class="p">()</span>
1021 <span class="o">-&gt;</span><span class="na">maximumLength</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span>
1022 <span class="p">]);</span>
1023
1024 <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">form</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$dataContainer</span><span class="p">);</span>
1025 <span class="p">}</span>
1026 <span class="p">}</span></code></pre></figure>
1027
1028 <p>But, as you can see, the number of lines almost decreased by half.
1029 All changes are due to extending <code class="language-plaintext highlighter-rouge">AbstractFormBuilderForm</code>:</p>
1030
1031 <ul>
1032 <li><code class="language-plaintext highlighter-rouge">$formAction</code> is added and set to <code class="language-plaintext highlighter-rouge">create</code> as the form is used to create a new person.
1033 In the edit form, <code class="language-plaintext highlighter-rouge">$formAction</code> has not to be set explicitly as it is done automatically if a <code class="language-plaintext highlighter-rouge">$formObject</code> is set.</li>
1034 <li><code class="language-plaintext highlighter-rouge">$objectActionClass</code> is set to <code class="language-plaintext highlighter-rouge">PersonAction::class</code> and is the class name of the used <code class="language-plaintext highlighter-rouge">AbstractForm::$objectAction</code> object to create and update the <code class="language-plaintext highlighter-rouge">Person</code> object.</li>
1035 <li><code class="language-plaintext highlighter-rouge">AbstractFormBuilderForm::createForm()</code> is overridden and the form contents are added:
1036 a form container representing the <code class="language-plaintext highlighter-rouge">div.section</code> element from the old version and the two form fields with the same ids and labels as before.
1037 The contents of the old <code class="language-plaintext highlighter-rouge">validate()</code> method is put into two method calls:
1038 <code class="language-plaintext highlighter-rouge">required()</code> to ensure that the form is filled out and <code class="language-plaintext highlighter-rouge">maximumLength(255)</code> to ensure that the names are not longer than 255 characters.</li>
1039 </ul>
1040
1041
1042 <div class="tags">
1043
1044 </div>
1045
1046
1047
1048 </div>
1049
1050 </div>
1051 </div>
1052 </div>
1053
1054 <div class="footerBox">
1055 <div class="container">
1056 <div class="footerBoxLeft">
1057
1058 <a target="_blank" href="https://github.com/woltlab/woltlab.github.io/blob/master/pages/migration/wsc-31/migration_wsc-31_form-builder.md" class="btn btn-default githubEditButton no_icon" role="button"><i class="fa fa-github fa-lg"></i> Edit on GitHub</a>
1059 <p>Site last generated: Mar 5, 2021</p>
1060 </div>
1061 <div class="footerBoxRight">
1062 <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>
1063 </div>
1064 </div>
1065 </div>
1066
1067 <div class="pageFooter">
1068 <div class="container">
1069 &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>
1070 </div>
1071 </div>
1072 </body>
1073
1074 </html>