Browse code

Remote Progress

Benjamin Roth authored on08/11/2022 14:32:22
Showing20 changed files
... ...
@@ -20,6 +20,9 @@
20 20
         "esalesmedia/contao-swiperjs-slider": "^2.3",
21 21
         "oveleon/contao-component-style-manager": "^2.6"
22 22
     },
23
+    "require-dev": {
24
+        "contao/maker-bundle": "^4.13"
25
+    },
23 26
     "conflict": {
24 27
         "contao-components/installer": "<1.3"
25 28
     },
... ...
@@ -4,7 +4,7 @@
4 4
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 5
         "This file is @generated automatically"
6 6
     ],
7
-    "content-hash": "62e56d88352d71d2b3554e99d601ddf1",
7
+    "content-hash": "fd7d082cfe88b95e5d45fe8ff4ef4165",
8 8
     "packages": [
9 9
         {
10 10
             "name": "ausi/slug-generator",
... ...
@@ -13437,7 +13437,170 @@
13437 13437
             "time": "2019-11-06T18:30:11+00:00"
13438 13438
         }
13439 13439
     ],
13440
-    "packages-dev": [],
13440
+    "packages-dev": [
13441
+        {
13442
+            "name": "contao/maker-bundle",
13443
+            "version": "4.13.12",
13444
+            "source": {
13445
+                "type": "git",
13446
+                "url": "https://github.com/contao/maker-bundle.git",
13447
+                "reference": "25cc02555f86b89482557fd3e1379cc042b570e7"
13448
+            },
13449
+            "dist": {
13450
+                "type": "zip",
13451
+                "url": "https://api.github.com/repos/contao/maker-bundle/zipball/25cc02555f86b89482557fd3e1379cc042b570e7",
13452
+                "reference": "25cc02555f86b89482557fd3e1379cc042b570e7",
13453
+                "shasum": ""
13454
+            },
13455
+            "require": {
13456
+                "contao/core-bundle": "self.version",
13457
+                "php": "^7.4 || ^8.0",
13458
+                "symfony/filesystem": "^5.4",
13459
+                "symfony/maker-bundle": "^1.1",
13460
+                "symfony/options-resolver": "^5.4"
13461
+            },
13462
+            "conflict": {
13463
+                "contao/core": "*",
13464
+                "contao/manager-plugin": "<2.0 || >=3.0"
13465
+            },
13466
+            "require-dev": {
13467
+                "contao/manager-plugin": "^2.3.1",
13468
+                "phpunit/phpunit": "^9.3",
13469
+                "symfony/phpunit-bridge": "^5.3"
13470
+            },
13471
+            "type": "contao-bundle",
13472
+            "extra": {
13473
+                "contao-manager-plugin": "Contao\\MakerBundle\\ContaoManager\\Plugin"
13474
+            },
13475
+            "autoload": {
13476
+                "psr-4": {
13477
+                    "Contao\\MakerBundle\\": "src/"
13478
+                }
13479
+            },
13480
+            "notification-url": "https://packagist.org/downloads/",
13481
+            "license": [
13482
+                "LGPL-3.0-or-later"
13483
+            ],
13484
+            "authors": [
13485
+                {
13486
+                    "name": "Leo Feyer",
13487
+                    "homepage": "https://github.com/leofeyer"
13488
+                },
13489
+                {
13490
+                    "name": "Contao Community",
13491
+                    "homepage": "https://contao.org/contributors"
13492
+                }
13493
+            ],
13494
+            "description": "Allows you to create content elements, modules, hooks and more",
13495
+            "homepage": "https://contao.org",
13496
+            "support": {
13497
+                "docs": "https://docs.contao.org",
13498
+                "forum": "https://community.contao.org",
13499
+                "issues": "https://github.com/contao/contao/issues",
13500
+                "source": "https://github.com/contao/maker-bundle"
13501
+            },
13502
+            "funding": [
13503
+                {
13504
+                    "url": "https://to.contao.org/donate",
13505
+                    "type": "custom"
13506
+                }
13507
+            ],
13508
+            "time": "2022-08-17T14:43:40+00:00"
13509
+        },
13510
+        {
13511
+            "name": "symfony/maker-bundle",
13512
+            "version": "v1.47.0",
13513
+            "source": {
13514
+                "type": "git",
13515
+                "url": "https://github.com/symfony/maker-bundle.git",
13516
+                "reference": "e607f129d29a6c1e9a9e1ef3d229d653311d58f3"
13517
+            },
13518
+            "dist": {
13519
+                "type": "zip",
13520
+                "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/e607f129d29a6c1e9a9e1ef3d229d653311d58f3",
13521
+                "reference": "e607f129d29a6c1e9a9e1ef3d229d653311d58f3",
13522
+                "shasum": ""
13523
+            },
13524
+            "require": {
13525
+                "doctrine/inflector": "^2.0",
13526
+                "nikic/php-parser": "^4.11",
13527
+                "php": ">=8.0",
13528
+                "symfony/config": "^5.4.7|^6.0",
13529
+                "symfony/console": "^5.4.7|^6.0",
13530
+                "symfony/dependency-injection": "^5.4.7|^6.0",
13531
+                "symfony/deprecation-contracts": "^2.2|^3",
13532
+                "symfony/filesystem": "^5.4.7|^6.0",
13533
+                "symfony/finder": "^5.4.3|^6.0",
13534
+                "symfony/framework-bundle": "^5.4.7|^6.0",
13535
+                "symfony/http-kernel": "^5.4.7|^6.0"
13536
+            },
13537
+            "conflict": {
13538
+                "doctrine/doctrine-bundle": "<2.4",
13539
+                "doctrine/orm": "<2.10",
13540
+                "symfony/doctrine-bridge": "<5.4"
13541
+            },
13542
+            "require-dev": {
13543
+                "composer/semver": "^3.0",
13544
+                "doctrine/doctrine-bundle": "^2.4",
13545
+                "doctrine/orm": "^2.10.0",
13546
+                "symfony/http-client": "^5.4.7|^6.0",
13547
+                "symfony/phpunit-bridge": "^5.4.7|^6.0",
13548
+                "symfony/polyfill-php80": "^1.16.0",
13549
+                "symfony/process": "^5.4.7|^6.0",
13550
+                "symfony/security-core": "^5.4.7|^6.0",
13551
+                "symfony/yaml": "^5.4.3|^6.0",
13552
+                "twig/twig": "^2.0|^3.0"
13553
+            },
13554
+            "type": "symfony-bundle",
13555
+            "extra": {
13556
+                "branch-alias": {
13557
+                    "dev-main": "1.0-dev"
13558
+                }
13559
+            },
13560
+            "autoload": {
13561
+                "psr-4": {
13562
+                    "Symfony\\Bundle\\MakerBundle\\": "src/"
13563
+                }
13564
+            },
13565
+            "notification-url": "https://packagist.org/downloads/",
13566
+            "license": [
13567
+                "MIT"
13568
+            ],
13569
+            "authors": [
13570
+                {
13571
+                    "name": "Symfony Community",
13572
+                    "homepage": "https://symfony.com/contributors"
13573
+                }
13574
+            ],
13575
+            "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.",
13576
+            "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html",
13577
+            "keywords": [
13578
+                "code generator",
13579
+                "generator",
13580
+                "scaffold",
13581
+                "scaffolding"
13582
+            ],
13583
+            "support": {
13584
+                "issues": "https://github.com/symfony/maker-bundle/issues",
13585
+                "source": "https://github.com/symfony/maker-bundle/tree/v1.47.0"
13586
+            },
13587
+            "funding": [
13588
+                {
13589
+                    "url": "https://symfony.com/sponsor",
13590
+                    "type": "custom"
13591
+                },
13592
+                {
13593
+                    "url": "https://github.com/fabpot",
13594
+                    "type": "github"
13595
+                },
13596
+                {
13597
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
13598
+                    "type": "tidelift"
13599
+                }
13600
+            ],
13601
+            "time": "2022-10-04T15:05:10+00:00"
13602
+        }
13603
+    ],
13441 13604
     "aliases": [],
13442 13605
     "minimum-stability": "stable",
13443 13606
     "stability-flags": {
13444 13607
new file mode 100644
... ...
@@ -0,0 +1,53 @@
1
+<?php
2
+
3
+/**
4
+ * JustifiedGallery for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Asset version
14
+ */
15
+$GLOBALS['TL_ASSETS']['TEAMLIST_QUICKSAND'] = '1.4';
16
+
17
+/**
18
+ * Backend modules
19
+ */
20
+
21
+$GLOBALS['BE_MOD']['content']['eSM_team'] = array
22
+(
23
+    'tables'   => array('tl_eSM_team_group','tl_eSM_team'),
24
+    'icon'     => 'system/modules/eSM_team/html/icon.png',
25
+);
26
+
27
+/**
28
+ * Frontend modules
29
+ */
30
+
31
+$GLOBALS['FE_MOD']['team']['teamlist'] = 'ModuleTeam';
32
+
33
+/**
34
+ * Divisions
35
+ */
36
+
37
+$GLOBALS['eSM_team']['divisions'] = array
38
+(
39
+    'management',
40
+    'representatives',
41
+    'office',
42
+    'sales',
43
+    'administration',
44
+    'accounting',
45
+    'tasting',
46
+    'warehouse',
47
+    'bottling',
48
+    'cellar',
49
+    'logistics',
50
+    'spirits',
51
+    'facility_management',
52
+    'marketing'
53
+);
0 54
\ No newline at end of file
1 55
new file mode 100644
... ...
@@ -0,0 +1,299 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+/**
12
+ * Table tl_eSM_team
13
+ */
14
+
15
+$GLOBALS['TL_DCA']['tl_eSM_team'] = array
16
+(
17
+
18
+	// Config
19
+	'config' => array
20
+	(
21
+		'dataContainer'               => 'Table',
22
+        'ptable'                      => 'tl_eSM_team_group',
23
+		'enableVersioning'            => true,
24
+		'sql' => array
25
+		(
26
+			'keys' => array
27
+			(
28
+				'id' => 'primary',
29
+                'pid' => 'index',
30
+                'pid,published' => 'index'
31
+            )
32
+		)
33
+	),
34
+
35
+	// List
36
+	'list' => array
37
+	(
38
+		'sorting' => array
39
+		(
40
+
41
+			'mode'                    => 4,
42
+			'fields'                  => array('division', 'lastname'),
43
+            'headerFields'            => array('title'),
44
+            'panelLayout'             => 'filter,search;sort,limit',
45
+            'child_record_callback'   => array('tl_eSM_team', 'listMembers')
46
+    ),
47
+		'global_operations' => array
48
+		(
49
+			'all' => array
50
+			(
51
+				'label'               => &$GLOBALS['TL_LANG']['MSC']['all'],
52
+				'href'                => 'act=select',
53
+				'class'               => 'header_edit_all',
54
+				'attributes'          => 'onclick="Backend.getScrollOffset()" accesskey="e"'
55
+			)
56
+		),
57
+		'operations' => array
58
+		(
59
+			'edit' => array
60
+			(
61
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team']['edit'],
62
+				'href'                => 'act=edit',
63
+				'icon'                => 'edit.gif'
64
+			),
65
+			'copy' => array
66
+			(
67
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team']['copy'],
68
+				'href'                => 'act=copy',
69
+				'icon'                => 'copy.gif'
70
+			),
71
+			'delete' => array
72
+			(
73
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team']['delete'],
74
+				'href'                => 'act=delete',
75
+				'icon'                => 'delete.gif',
76
+				'attributes'          => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['tl_eSM_team']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"'
77
+			),
78
+			'toggle' => array
79
+			(
80
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team']['toggle'],
81
+				'icon'                => 'visible.gif',
82
+				'attributes'          => 'onclick="Backend.getScrollOffset();return AjaxRequest.toggleVisibility(this,%s)"',
83
+				'button_callback'     => array('tl_eSM_team', 'toggleIcon')
84
+			),
85
+			'show' => array
86
+			(
87
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team']['show'],
88
+				'href'                => 'act=show',
89
+				'icon'                => 'show.gif'
90
+			)
91
+		)
92
+	),
93
+
94
+	// Palettes
95
+	'palettes' => array
96
+	(
97
+		'default'                     => '{person_legend},firstname,lastname;{company_legend},position,division;{picture_legend},singleSRC;{publish_legend:hide},published'
98
+	),
99
+
100
+	// Subpalettes
101
+	'subpalettes' => array
102
+	(
103
+	),
104
+
105
+	// Fields
106
+	'fields' => array
107
+	(
108
+		'id' => array
109
+		(
110
+			'sql'                     => "int(10) unsigned NOT NULL auto_increment"
111
+		),
112
+        'pid' => array
113
+        (
114
+          'foreignKey'              => 'tl_faq_category.title',
115
+          'sql'                     => "int(10) unsigned NOT NULL default '0'",
116
+          'relation'                => array('type'=>'belongsTo', 'load'=>'eager')
117
+        ),
118
+		'tstamp' => array
119
+		(
120
+			'sql'                     => "int(10) unsigned NOT NULL default '0'"
121
+		),
122
+		'firstname' => array
123
+		(
124
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'],
125
+			'exclude'                 => true,
126
+			'search'                  => true,
127
+			'inputType'               => 'text',
128
+			'eval'                    => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'),
129
+			'sql'                     => "varchar(128) NOT NULL default ''"
130
+		),
131
+		'lastname' => array
132
+		(
133
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'],
134
+			'exclude'                 => true,
135
+			'search'                  => true,
136
+			'inputType'               => 'text',
137
+			'eval'                    => array('mandatory'=>false, 'maxlength'=>128, 'tl_class'=>'w50'),
138
+			'sql'                     => "varchar(128) NOT NULL default ''"
139
+		),
140
+		'position' => array
141
+		(
142
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['position'],
143
+			'exclude'                 => true,
144
+			'search'                  => true,
145
+			'inputType'               => 'text',
146
+			'eval'                    => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'),
147
+			'sql'                     => "varchar(128) NOT NULL default ''"
148
+		),
149
+		'division' => array
150
+		(
151
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['division'],
152
+			'exclude'                 => true,
153
+			'filter'                  => true,
154
+			'inputType'               => 'select',
155
+			'options'                 => $GLOBALS['eSM_team']['divisions'],
156
+			'reference'               => &$GLOBALS['TL_LANG']['REF']['divisions'],
157
+			'eval'                    => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'),
158
+			'sql'                     => "varchar(128) NOT NULL default ''"
159
+		),
160
+		'singleSRC' => array
161
+		(
162
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'],
163
+			'exclude'                 => true,
164
+			'inputType'               => 'fileTree',
165
+			'eval'                    => array('filesOnly'=>true, 'extensions'=>Config::get('validImageTypes'), 'fieldType'=>'radio', 'mandatory'=>true),
166
+			'sql'                     => "binary(16) NULL"
167
+		),
168
+		'published' => array
169
+		(
170
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team']['published'],
171
+			'exclude'                 => true,
172
+			'filter'                  => true,
173
+			'inputType'               => 'checkbox',
174
+			'default'                 => '1',
175
+			'eval'                    => array('doNotCopy'=>true),
176
+			'sql'                     => "char(1) NOT NULL default ''"
177
+		),
178
+	)
179
+);
180
+
181
+/**
182
+ * Provide miscellaneous methods that are used by the data configuration array.
183
+ */
184
+class tl_eSM_team extends Backend
185
+{
186
+
187
+	/**
188
+	 * Import the back end user object
189
+	 */
190
+	public function __construct()
191
+	{
192
+		parent::__construct();
193
+		$this->import('BackendUser', 'User');
194
+	}
195
+
196
+  /**
197
+   * Add the type of input field
198
+   *
199
+   * @param array $arrRow
200
+   *
201
+   * @return string
202
+   */
203
+  public function listMembers($arrRow)
204
+  {
205
+    return '
206
+<div style="float: left; width: 35%;">' . $arrRow['firstname'] . ' ' . $arrRow['lastname'] . '</div>
207
+<div style="font-size: .625rem; color: #c6c6c6;"><strong>[' . $arrRow['position'] . ']</strong></div>' . "\n";
208
+  }
209
+
210
+	/**
211
+	 * Return the "toggle visibility" button
212
+	 *
213
+	 * @param array  $row
214
+	 * @param string $href
215
+	 * @param string $label
216
+	 * @param string $title
217
+	 * @param string $icon
218
+	 * @param string $attributes
219
+	 *
220
+	 * @return string
221
+	 */
222
+	public function toggleIcon($row, $href, $label, $title, $icon, $attributes)
223
+	{
224
+		if (strlen(Input::get('tid')))
225
+		{
226
+			$this->toggleVisibility(Input::get('tid'), (Input::get('state') == 1), (@func_get_arg(12) ?: null));
227
+			$this->redirect($this->getReferer());
228
+		}
229
+
230
+		// Check permissions AFTER checking the tid, so hacking attempts are logged
231
+		if (!$this->User->hasAccess('tl_eSM_team::published', 'alexf'))
232
+		{
233
+			return '';
234
+		}
235
+
236
+		$href .= '&amp;tid='.$row['id'].'&amp;state='.($row['published'] ? '' : 1);
237
+
238
+		if (!$row['published'])
239
+		{
240
+			$icon = 'invisible.gif';
241
+		}
242
+
243
+		return '<a href="'.$this->addToUrl($href).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label, 'data-state="' . ($row['published'] ? 1 : 0) . '"').'</a> ';
244
+	}
245
+
246
+
247
+	/**
248
+	 * Disable/enable a user group
249
+	 *
250
+	 * @param integer       $intId
251
+	 * @param boolean       $blnVisible
252
+	 * @param DataContainer $dc
253
+	 */
254
+	public function toggleVisibility($intId, $blnVisible, DataContainer $dc=null)
255
+	{
256
+		// Set the ID and action
257
+		Input::setGet('id', $intId);
258
+		Input::setGet('act', 'toggle');
259
+
260
+		if ($dc)
261
+		{
262
+			$dc->id = $intId; // see #8043
263
+		}
264
+
265
+		// Check the field access
266
+		if (!$this->User->hasAccess('tl_eSM_team::published', 'alexf'))
267
+		{
268
+			$this->log('Not enough permissions to publish/unpublish teammember ID "'.$intId.'"', __METHOD__, TL_ERROR);
269
+			$this->redirect('contao/main.php?act=error');
270
+		}
271
+
272
+		$objVersions = new Versions('tl_eSM_team', $intId);
273
+		$objVersions->initialize();
274
+
275
+		// Trigger the save_callback
276
+		if (is_array($GLOBALS['TL_DCA']['tl_news']['fields']['published']['save_callback']))
277
+		{
278
+			foreach ($GLOBALS['TL_DCA']['tl_news']['fields']['published']['save_callback'] as $callback)
279
+			{
280
+				if (is_array($callback))
281
+				{
282
+					$this->import($callback[0]);
283
+					$blnVisible = $this->{$callback[0]}->{$callback[1]}($blnVisible, ($dc ?: $this));
284
+				}
285
+				elseif (is_callable($callback))
286
+				{
287
+					$blnVisible = $callback($blnVisible, ($dc ?: $this));
288
+				}
289
+			}
290
+		}
291
+
292
+		// Update the database
293
+		$this->Database->prepare("UPDATE tl_eSM_team SET tstamp=". time() .", published='" . ($blnVisible ? '1' : '') . "' WHERE id=?")
294
+			->execute($intId);
295
+
296
+		$objVersions->create();
297
+		$this->log('A new version of record "tl_eSM_team.id='.$intId.'" has been created'.$this->getParentEntries('tl_eSM_team', $intId), __METHOD__, TL_GENERAL);
298
+	}
299
+}
0 300
\ No newline at end of file
1 301
new file mode 100644
... ...
@@ -0,0 +1,161 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+/**
12
+ * Table tl_eSM_team_group
13
+ */
14
+
15
+$GLOBALS['TL_DCA']['tl_eSM_team_group'] = array
16
+(
17
+
18
+	// Config
19
+	'config' => array
20
+	(
21
+		'dataContainer'               => 'Table',
22
+        'ctable'                      => array('tl_eSM_team'),
23
+        'switchToEdit'                => true,
24
+        'enableVersioning'            => true,
25
+		'sql' => array
26
+		(
27
+			'keys' => array
28
+			(
29
+				'id' => 'primary'
30
+			)
31
+		)
32
+	),
33
+
34
+	// List
35
+	'list' => array
36
+	(
37
+		'sorting' => array
38
+		(
39
+			'mode'                    => 1,
40
+			'fields'                  => array('title'),
41
+			'flag'                    => 1,
42
+			'panelLayout'             => 'filter,search;sort,limit',
43
+		),
44
+		'label' => array
45
+		(
46
+			'fields'                  => array('title'),
47
+			'format'                  => '%s'
48
+		),
49
+		'global_operations' => array
50
+		(
51
+			'all' => array
52
+			(
53
+				'label'               => &$GLOBALS['TL_LANG']['MSC']['all'],
54
+				'href'                => 'act=select',
55
+				'class'               => 'header_edit_all',
56
+				'attributes'          => 'onclick="Backend.getScrollOffset()" accesskey="e"'
57
+			)
58
+		),
59
+		'operations' => array
60
+		(
61
+            'edit' => array
62
+            (
63
+                'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['edit'],
64
+                'href'                => 'table=tl_eSM_team',
65
+                'icon'                => 'edit.gif'
66
+            ),
67
+            'editheader' => array
68
+            (
69
+                'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['editheader'],
70
+                'href'                => 'act=edit',
71
+                'icon'                => 'header.gif',
72
+                'button_callback'     => array('tl_eSM_team_group', 'editHeader')
73
+            ),
74
+			'copy' => array
75
+			(
76
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['copy'],
77
+				'href'                => 'act=copy',
78
+				'icon'                => 'copy.gif'
79
+			),
80
+			'delete' => array
81
+			(
82
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['delete'],
83
+				'href'                => 'act=delete',
84
+				'icon'                => 'delete.gif',
85
+				'attributes'          => 'onclick="if (!confirm(\'' . $GLOBALS['TL_LANG']['tl_eSM_team_group']['deleteConfirm'] . '\')) return false; Backend.getScrollOffset();"'
86
+			),
87
+			'show' => array
88
+			(
89
+				'label'               => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['show'],
90
+				'href'                => 'act=show',
91
+				'icon'                => 'show.gif'
92
+			)
93
+		)
94
+	),
95
+
96
+	// Palettes
97
+	'palettes' => array
98
+	(
99
+		'default'                     => '{title_legend},title'
100
+	),
101
+
102
+	// Subpalettes
103
+	'subpalettes' => array
104
+	(
105
+	),
106
+
107
+	// Fields
108
+	'fields' => array
109
+	(
110
+		'id' => array
111
+		(
112
+			'sql'                     => "int(10) unsigned NOT NULL auto_increment"
113
+		),
114
+		'tstamp' => array
115
+		(
116
+			'sql'                     => "int(10) unsigned NOT NULL default '0'"
117
+		),
118
+		'title' => array
119
+		(
120
+			'label'                   => &$GLOBALS['TL_LANG']['tl_eSM_team_group']['title'],
121
+			'exclude'                 => true,
122
+			'search'                  => true,
123
+			'inputType'               => 'text',
124
+			'eval'                    => array('mandatory'=>true, 'maxlength'=>128, 'tl_class'=>'w50'),
125
+			'sql'                     => "varchar(128) NOT NULL default ''"
126
+		)
127
+	)
128
+);
129
+
130
+/**
131
+ * Provide miscellaneous methods that are used by the data configuration array.
132
+ */
133
+class tl_eSM_team_group extends Backend
134
+{
135
+
136
+	/**
137
+	 * Import the back end user object
138
+	 */
139
+	public function __construct()
140
+	{
141
+		parent::__construct();
142
+		$this->import('BackendUser', 'User');
143
+	}
144
+
145
+  /**
146
+   * Return the edit header button
147
+   *
148
+   * @param array  $row
149
+   * @param string $href
150
+   * @param string $label
151
+   * @param string $title
152
+   * @param string $icon
153
+   * @param string $attributes
154
+   *
155
+   * @return string
156
+   */
157
+  public function editHeader($row, $href, $label, $title, $icon, $attributes)
158
+  {
159
+    return $this->User->canEditFieldsOf('tl_eSM_team') ? '<a href="'.$this->addToUrl($href.'&amp;id='.$row['id']).'" title="'.specialchars($title).'"'.$attributes.'>'.Image::getHtml($icon, $label).'</a> ' : Image::getHtml(preg_replace('/\.gif$/i', '_.gif', $icon)).' ';
160
+  }
161
+}
0 162
\ No newline at end of file
1 163
new file mode 100644
... ...
@@ -0,0 +1,39 @@
1
+<?php
2
+
3
+/**
4
+* TeamList for Contao
5
+*
6
+* Copyright (c) 2016 Benjamin Roth
7
+*
8
+* @license LGPL-3.0+
9
+*/
10
+
11
+$GLOBALS['TL_DCA']['tl_module']['palettes']['teamlist'] = '{title_legend},name,headline,type;{team_legend},eSM_team_group,eSM_team_divisions;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID,space';
12
+
13
+$GLOBALS['TL_DCA']['tl_module']['fields']['eSM_team_group'] = array
14
+(
15
+  'label'                   => &$GLOBALS['TL_LANG']['tl_module']['eSM_team_group'],
16
+  'exclude'                 => true,
17
+  'inputType'               => 'select',
18
+  'foreignKey'              => 'tl_eSM_team_group.title',
19
+  'eval'                    => array('mandatory'=>true,'includeBlankOption'=>true),
20
+  'sql'                     => "int(10) unsigned NOT NULL default '0'"
21
+);
22
+
23
+$GLOBALS['TL_DCA']['tl_module']['fields']['eSM_team_divisions'] = array
24
+(
25
+	'label'                   => &$GLOBALS['TL_LANG']['tl_module']['eSM_team_divisions'],
26
+	'exclude'                 => true,
27
+	'inputType'               => 'checkboxWizard',
28
+	'options'                 => $GLOBALS['eSM_team']['divisions'],
29
+	'reference'               => &$GLOBALS['TL_LANG']['REF']['divisions'],
30
+	'eval'                    => array('mandatory'=>true, 'multiple'=>true),
31
+	'sql'                     => "blob NULL"
32
+);
33
+
34
+$GLOBALS['TL_DCA']['tl_module']['palettes']['team_list'] = '
35
+    {title_legend},name,headline,type;
36
+    {template_legend:hide},customTpl;
37
+    {protected_legend:hide},protected;
38
+    {expert_legend:hide},guests,cssID
39
+';
0 40
new file mode 100644
... ...
@@ -0,0 +1,26 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+$GLOBALS['TL_LANG']['REF']['divisions']['management'] = 'Geschäftsführung / Vetrieb';
12
+$GLOBALS['TL_LANG']['REF']['divisions']['representatives'] = 'Aussendienst';
13
+$GLOBALS['TL_LANG']['REF']['divisions']['office'] = 'Telefonverkauf / Büro';
14
+$GLOBALS['TL_LANG']['REF']['divisions']['sales'] = 'Verkauf';
15
+$GLOBALS['TL_LANG']['REF']['divisions']['administration'] = 'Sekretariat';
16
+$GLOBALS['TL_LANG']['REF']['divisions']['accounting'] = 'Buchhaltung';
17
+$GLOBALS['TL_LANG']['REF']['divisions']['tasting'] = 'Weinprobe';
18
+$GLOBALS['TL_LANG']['REF']['divisions']['warehouse'] = 'Lager / Versand';
19
+$GLOBALS['TL_LANG']['REF']['divisions']['bottling'] = 'Abfülltechnik';
20
+$GLOBALS['TL_LANG']['REF']['divisions']['cellar'] = 'Kellertechnik';
21
+$GLOBALS['TL_LANG']['REF']['divisions']['logistics'] = 'Zustellung';
22
+$GLOBALS['TL_LANG']['REF']['divisions']['spirits'] = 'Edelbrände';
23
+$GLOBALS['TL_LANG']['REF']['divisions']['facility_management'] = 'Reinigung';
24
+$GLOBALS['TL_LANG']['REF']['divisions']['marketing'] = 'Marketing';
25
+
26
+$GLOBALS['TL_LANG']['MSC']['divisions_filter'] = 'Abteilung:';
0 27
new file mode 100644
... ...
@@ -0,0 +1,15 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<xliff version="1.1">
3
+  <file>
4
+    <body>
5
+      <trans-unit id="FMD.team_list.0">
6
+        <source>Team List</source>
7
+        <target>Teamliste</target>
8
+      </trans-unit>
9
+      <trans-unit id="FMD.team_list.1">
10
+        <source>Outputs a list of team members</source>
11
+        <target>Gibt eine Liste mit Teammitgliedern aus</target>
12
+      </trans-unit>
13
+    </body>
14
+  </file>
15
+</xliff>
0 16
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+$GLOBALS['TL_LANG']['MOD']['eSM_team'] = array('Team','Verwaltung der Teamseite');
12
+$GLOBALS['TL_LANG']['FMD']['teamlist'] = array('Teamübersicht','Teammitglieder auflisten');
13
+$GLOBALS['TL_LANG']['FMD']['team'] = 'Team';
0 14
new file mode 100644
... ...
@@ -0,0 +1,50 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'][0] = "Vorname";
16
+$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'][1] = "Der Vorname des Teammitglieds.";
17
+$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'][0] = "Nachname";
18
+$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'][1] = "Der Nachname des Teammitglieds.";
19
+$GLOBALS['TL_LANG']['tl_eSM_team']['position'][0] = "Position";
20
+$GLOBALS['TL_LANG']['tl_eSM_team']['position'][1] = "Die Position der Person im Team/Firma.";
21
+$GLOBALS['TL_LANG']['tl_eSM_team']['division'][0] = "Abteilung";
22
+$GLOBALS['TL_LANG']['tl_eSM_team']['division'][1] = "Die Abteilung zu welcher das Teammitglied gehört.";
23
+$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'][0] = "Bild";
24
+$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'][1] = "Das Portraibild der Person.";
25
+$GLOBALS['TL_LANG']['tl_eSM_team']['published'][0] = "Veröffentlicht";
26
+$GLOBALS['TL_LANG']['tl_eSM_team']['published'][1] = "Das Teammitglied wird in der Ausgabe angezeigt.";
27
+
28
+/**
29
+ * Legends
30
+ */
31
+$GLOBALS['TL_LANG']['tl_eSM_team']['title_legend']      = 'Grundeinstellungen';
32
+$GLOBALS['TL_LANG']['tl_eSM_team']['company_legend']    = 'Aufgabenbereich im Unternehmen';
33
+$GLOBALS['TL_LANG']['tl_eSM_team']['picture_legend']    = 'Bilddefinition';
34
+$GLOBALS['TL_LANG']['tl_eSM_team']['publish_legend']    = 'Veröffentlichungseinstellungen';
35
+
36
+/**
37
+ * Buttons
38
+ */
39
+$GLOBALS['TL_LANG']['tl_eSM_team']['new']               = array('Neues Teammitglied', 'Ein neues Teammitglied hinzufügen');
40
+$GLOBALS['TL_LANG']['tl_eSM_team']['toggle']            = array('Mitglied aktiv/inaktiv', 'Teammitglied ID %s aktiv/inaktiv schalten');
41
+$GLOBALS['TL_LANG']['tl_eSM_team']['show']              = array('Teammitglieddetails', 'Details des Teammitglieds ID %s anzeigen');
42
+$GLOBALS['TL_LANG']['tl_eSM_team']['edit']              = array('Teammitglied bearbeiten', 'Teammitglied ID %s bearbeiten');
43
+$GLOBALS['TL_LANG']['tl_eSM_team']['copy']              = array('Teammitglied duplizieren', 'Teammitglied ID %s duplizieren');
44
+$GLOBALS['TL_LANG']['tl_eSM_team']['delete']            = array('Teammitglied löschen', 'Teammitglied ID %s löschen');
45
+
46
+/**
47
+ * Misc
48
+ */
49
+
50
+$GLOBALS['TL_LANG']['tl_eSM_team']['includeTemplatesJQuery'] = "Das <em>%s</em>-Template muss im Seitenlayout eingebunden sein.";
0 51
\ No newline at end of file
1 52
new file mode 100644
... ...
@@ -0,0 +1,30 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title'][0] = "Team-Kategorie";
16
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title'][1] = "Kategoriename des Teams";
17
+
18
+/**
19
+ * Legends
20
+ */
21
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title_legend']      = 'Grundeinstellungen';
22
+
23
+/**
24
+ * Buttons
25
+ */
26
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['new']               = array('Neue Team-Kategorie', 'Eine neue Team-Kategorie hinzufügen');
27
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['show']              = array('Team-Kategoriedetails', 'Details der Team-Kategorie ID %s anzeigen');
28
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['edit']              = array('Team-Kategorie bearbeiten', 'Team-Kategorie ID %s bearbeiten');
29
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['copy']              = array('Team-Kategorie duplizieren', 'Team-Kategorie ID %s duplizieren');
30
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['delete']            = array('Team-Kategorie löschen', 'Team-Kategorie ID %s löschen');
0 31
\ No newline at end of file
1 32
new file mode 100644
... ...
@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_group'][0] = "Team-Kategorie";
16
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_group'][1] = "Die anzuzeigende Team-Kategorie.";
17
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_divisions'][0] = "Abteilungen";
18
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_divisions'][1] = "Die anzuzeigenden Abteilungen.";
19
+
20
+/**
21
+ * Legends
22
+ */
23
+$GLOBALS['TL_LANG']['tl_module']['team_legend']         = 'Team-Einstellungen';
0 24
new file mode 100644
... ...
@@ -0,0 +1,25 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+$GLOBALS['TL_LANG']['REF']['divisions']['management'] = 'Management / Marketing';
12
+$GLOBALS['TL_LANG']['REF']['divisions']['representatives'] = 'Sales representatives';
13
+$GLOBALS['TL_LANG']['REF']['divisions']['office'] = 'Phone sales/office';
14
+$GLOBALS['TL_LANG']['REF']['divisions']['sales'] = 'Sales';
15
+$GLOBALS['TL_LANG']['REF']['divisions']['administration'] = 'Administration';
16
+$GLOBALS['TL_LANG']['REF']['divisions']['accounting'] = 'Bookkeeping';
17
+$GLOBALS['TL_LANG']['REF']['divisions']['tasting'] = 'Wine tasting';
18
+$GLOBALS['TL_LANG']['REF']['divisions']['warehouse'] = 'Warehouse/dispatch';
19
+$GLOBALS['TL_LANG']['REF']['divisions']['bottling'] = 'Filling technology';
20
+$GLOBALS['TL_LANG']['REF']['divisions']['cellar'] = 'Cellar technology';
21
+$GLOBALS['TL_LANG']['REF']['divisions']['logistics'] = 'Delivery';
22
+$GLOBALS['TL_LANG']['REF']['divisions']['spirits'] = 'Premium schnapps';
23
+$GLOBALS['TL_LANG']['REF']['divisions']['facility_management'] = 'Cleaning';
24
+
25
+$GLOBALS['TL_LANG']['MSC']['divisions_filter'] = 'Department';
0 26
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<xliff version="1.1">
3
+  <file>
4
+    <body>
5
+      <trans-unit id="FMD.team_list.0">
6
+        <source>Team List</source>
7
+      </trans-unit>
8
+      <trans-unit id="FMD.team_list.1">
9
+        <source>Outputs a list of team members</source>
10
+      </trans-unit>
11
+    </body>
12
+  </file>
13
+</xliff>
0 14
new file mode 100644
... ...
@@ -0,0 +1,13 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+$GLOBALS['TL_LANG']['MOD']['eSM_team'] = array('Team','Verwaltung der Teamseite');
12
+$GLOBALS['TL_LANG']['FMD']['teamlist'] = array('Teamübersicht','Teammitglieder auflisten');
13
+$GLOBALS['TL_LANG']['FMD']['team'] = 'Team';
0 14
new file mode 100644
... ...
@@ -0,0 +1,50 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'][0] = "Vorname";
16
+$GLOBALS['TL_LANG']['tl_eSM_team']['firstname'][1] = "Der Vorname des Teammitglieds.";
17
+$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'][0] = "Nachname";
18
+$GLOBALS['TL_LANG']['tl_eSM_team']['lastname'][1] = "Der Nachname des Teammitglieds.";
19
+$GLOBALS['TL_LANG']['tl_eSM_team']['position'][0] = "Position";
20
+$GLOBALS['TL_LANG']['tl_eSM_team']['position'][1] = "Die Position der Person im Team/Firma.";
21
+$GLOBALS['TL_LANG']['tl_eSM_team']['division'][0] = "Abteilung";
22
+$GLOBALS['TL_LANG']['tl_eSM_team']['division'][1] = "Die Abteilung zu welcher das Teammitglied gehört.";
23
+$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'][0] = "Bild";
24
+$GLOBALS['TL_LANG']['tl_eSM_team']['singleSRC'][1] = "Das Portraibild der Person.";
25
+$GLOBALS['TL_LANG']['tl_eSM_team']['published'][0] = "Veröffentlicht";
26
+$GLOBALS['TL_LANG']['tl_eSM_team']['published'][1] = "Das Teammitglied wird in der Ausgabe angezeigt.";
27
+
28
+/**
29
+ * Legends
30
+ */
31
+$GLOBALS['TL_LANG']['tl_eSM_team']['title_legend']      = 'Grundeinstellungen';
32
+$GLOBALS['TL_LANG']['tl_eSM_team']['company_legend']    = 'Aufgabenbereich im Unternehmen';
33
+$GLOBALS['TL_LANG']['tl_eSM_team']['picture_legend']    = 'Bilddefinition';
34
+$GLOBALS['TL_LANG']['tl_eSM_team']['publish_legend']    = 'Veröffentlichungseinstellungen';
35
+
36
+/**
37
+ * Buttons
38
+ */
39
+$GLOBALS['TL_LANG']['tl_eSM_team']['new']               = array('Neues Teammitglied', 'Ein neues Teammitglied hinzufügen');
40
+$GLOBALS['TL_LANG']['tl_eSM_team']['toggle']            = array('Mitglied aktiv/inaktiv', 'Teammitglied ID %s aktiv/inaktiv schalten');
41
+$GLOBALS['TL_LANG']['tl_eSM_team']['show']              = array('Teammitglieddetails', 'Details des Teammitglieds ID %s anzeigen');
42
+$GLOBALS['TL_LANG']['tl_eSM_team']['edit']              = array('Teammitglied bearbeiten', 'Teammitglied ID %s bearbeiten');
43
+$GLOBALS['TL_LANG']['tl_eSM_team']['copy']              = array('Teammitglied duplizieren', 'Teammitglied ID %s duplizieren');
44
+$GLOBALS['TL_LANG']['tl_eSM_team']['delete']            = array('Teammitglied löschen', 'Teammitglied ID %s löschen');
45
+
46
+/**
47
+ * Misc
48
+ */
49
+
50
+$GLOBALS['TL_LANG']['tl_eSM_team']['includeTemplatesJQuery'] = "Das <em>%s</em>-Template muss im Seitenlayout eingebunden sein.";
0 51
\ No newline at end of file
1 52
new file mode 100644
... ...
@@ -0,0 +1,30 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title'][0] = "Team category";
16
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title'][1] = "Category title of the team";
17
+
18
+/**
19
+ * Legends
20
+ */
21
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['title_legend']      = 'Base settings';
22
+
23
+/**
24
+ * Buttons
25
+ */
26
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['new']               = array('Neue Team-Kategorie', 'Eine neue Team-Kategorie hinzufügen');
27
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['show']              = array('Team-Kategoriedetails', 'Details der Team-Kategorie ID %s anzeigen');
28
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['edit']              = array('Team-Kategorie bearbeiten', 'Team-Kategorie ID %s bearbeiten');
29
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['copy']              = array('Team-Kategorie duplizieren', 'Team-Kategorie ID %s duplizieren');
30
+$GLOBALS['TL_LANG']['tl_eSM_team_group']['delete']            = array('Team-Kategorie löschen', 'Team-Kategorie ID %s löschen');
0 31
\ No newline at end of file
1 32
new file mode 100644
... ...
@@ -0,0 +1,23 @@
1
+<?php
2
+
3
+/**
4
+ * TeamList for Contao
5
+ *
6
+ * Copyright (c) 2016 Benjamin Roth
7
+ *
8
+ * @license LGPL-3.0+
9
+ */
10
+
11
+
12
+/**
13
+ * Fields
14
+ */
15
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_group'][0] = "Team-Kategorie";
16
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_group'][1] = "Die anzuzeigende Team-Kategorie.";
17
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_divisions'][0] = "Abteilungen";
18
+$GLOBALS['TL_LANG']['tl_module']['eSM_team_divisions'][1] = "Die anzuzeigenden Abteilungen.";
19
+
20
+/**
21
+ * Legends
22
+ */
23
+$GLOBALS['TL_LANG']['tl_module']['team_legend']         = 'Team-Einstellungen';
0 24
new file mode 100644
... ...
@@ -0,0 +1,5 @@
1
+<?php $this->extend('block_unsearchable'); ?>
2
+
3
+<?php $this->block('content'); ?>
4
+  <p>Put your content here.</p>
5
+<?php $this->endblock(); ?>
0 6
new file mode 100644
... ...
@@ -0,0 +1,21 @@
1
+<?php
2
+
3
+declare(strict_types=1);
4
+
5
+namespace App\Controller\FrontendModule;
6
+
7
+use Contao\CoreBundle\Controller\FrontendModule\AbstractFrontendModuleController;
8
+use Contao\CoreBundle\DependencyInjection\Attribute\AsFrontendModule;
9
+use Contao\ModuleModel;
10
+use Contao\Template;
11
+use Symfony\Component\HttpFoundation\Request;
12
+use Symfony\Component\HttpFoundation\Response;
13
+
14
+#[AsFrontendModule(category: "miscellaneous")]
15
+class TeamListController extends AbstractFrontendModuleController
16
+{
17
+    protected function getResponse(Template $template, ModuleModel $model, Request $request): Response
18
+    {
19
+        return $template->getResponse();
20
+    }
21
+}