Benjamin Roth authored on15/07/2024 12:08:31
Showing4 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,66 @@
1
+<?php
2
+
3
+/**
4
+ * This file is part of contao-weinanlieferung-bundle.
5
+ *
6
+ * (c) vonRotenberg
7
+ *
8
+ * @license commercial
9
+ */
10
+
11
+use Contao\DC_Table;
12
+use Contao\DataContainer;
13
+
14
+\Contao\System::loadLanguageFile('default');
15
+
16
+$GLOBALS['TL_DCA']['tl_vr_wa_slotassistant'] =
17
+    [
18
+
19
+        // Config
20
+        'config' =>
21
+            [
22
+                'dataContainer' => DC_Table::class,
23
+                'sql'           =>
24
+                    [
25
+                        'keys' =>
26
+                            [
27
+                                'id' => 'primary',
28
+                            ]
29
+                    ]
30
+            ],
31
+
32
+        // Fields
33
+        'fields' =>
34
+            [
35
+                'id'        => [
36
+                    'sql' => "int(10) unsigned NOT NULL auto_increment"
37
+                ],
38
+                'tstamp'    => [
39
+                    'sql' => "int(10) unsigned NOT NULL default '0'"
40
+                ],
41
+                'timeframe' => [
42
+                    'inputType' => 'multiColumnWizard',
43
+                    'eval' => [
44
+                        'minCount' => 1,
45
+                        'columnFields' =>
46
+                        [
47
+                            'sorte' =>
48
+                                [
49
+                                    'label' => $GLOBALS['TL_LANG']['MSC']['wa_sorte'],
50
+                                    'inputType' => 'select',
51
+                                    'foreignKey'   => 'tl_vr_wa_rebsorte.title',
52
+                                    'eval' => ['style' => 'width:350px', 'mandatory' => true, 'chosen' =>true, 'includeBlankOption' => true]
53
+                                ],
54
+                            'leseart' =>
55
+                                [
56
+                                    'label' => $GLOBALS['TL_LANG']['MSC']['wa_leseart'],
57
+                                    'inputType' => 'select',
58
+                                    'foreignKey'   => 'tl_vr_wa_leseart.title',
59
+                                    'eval' => ['style' => 'width:350px', 'mandatory' => true, 'chosen' =>true, 'includeBlankOption' => true]
60
+                                ]
61
+                        ]
62
+                    ],
63
+                    'sql'       => 'blob NULL'
64
+                ]
65
+            ]
66
+    ];
0 67
new file mode 100644
... ...
@@ -0,0 +1,19 @@
1
+<?xml version="1.0" ?>
2
+<xliff version="1.1">
3
+    <file datatype="php" source-language="en" target-language="de">
4
+        <body>
5
+            <trans-unit id="wa_slotassistant.base_legend">
6
+                <source>Base settings</source>
7
+                <target>Grundeinstellungen</target>
8
+            </trans-unit>
9
+            <trans-unit id="wa_slotassistant.time_legend">
10
+                <source>Timeframe</source>
11
+                <target>Zeitraum</target>
12
+            </trans-unit>
13
+            <trans-unit id="wa_slotassistant.slot_legend">
14
+                <source>Slot settings</source>
15
+                <target>Slot-Einstellungen</target>
16
+            </trans-unit>
17
+        </body>
18
+    </file>
19
+</xliff>
... ...
@@ -24,6 +24,9 @@
24 24
                             {% if not field.widget.hasErrors() and field.help is defined and field.help|length %}
25 25
                                 <p class="tl_help tl_tip">{{ field.help }}</p>
26 26
                             {% endif %}
27
+                            {% if field.widget.updateMode is defined %}
28
+                                {{ field.widget.updateMode|raw }}
29
+                            {% endif %}
27 30
                         </div>
28 31
                     {% endfor %}
29 32
                 </fieldset>
... ...
@@ -12,20 +12,29 @@ declare(strict_types=1);
12 12
 
13 13
 namespace vonRotenberg\WeinanlieferungBundle\Controller\Backend;
14 14
 
15
+use Contao\Ajax;
16
+use Contao\Backend;
17
+use Contao\BackendTemplate;
15 18
 use Contao\Config;
19
+use Contao\Controller;
16 20
 use Contao\CoreBundle\Controller\AbstractController;
17 21
 use Contao\CoreBundle\Csrf\ContaoCsrfTokenManager;
18 22
 use Contao\Date;
23
+use Contao\DC_File;
19 24
 use Contao\Environment;
25
+use Contao\FileTree;
20 26
 use Contao\FrontendUser;
21 27
 use Contao\Image;
22 28
 use Contao\Input;
23 29
 use Contao\SelectMenu;
24 30
 use Contao\StringUtil;
25 31
 use Contao\System;
32
+use Contao\TextArea;
26 33
 use Contao\TextField;
34
+use Contao\Upload;
27 35
 use Contao\Widget;
28 36
 use Doctrine\DBAL\Connection;
37
+use MenAtWork\MultiColumnWizardBundle\Contao\Widgets\MultiColumnWizard;
29 38
 use Symfony\Component\HttpFoundation\RequestStack;
30 39
 use Symfony\Component\HttpFoundation\Response;
31 40
 use Symfony\Component\Routing\Annotation\Route;
... ...
@@ -68,17 +77,34 @@ class WeinanlieferungSlotAssistantController extends AbstractController
68 77
 
69 78
     public function __invoke(): Response
70 79
     {
80
+        // Handle ajax request
81
+        if ($_POST && Environment::get('isAjaxRequest'))
82
+        {
83
+            $this->objAjax = new Ajax(Input::post('action'));
84
+            $this->objAjax->executePreActions();
85
+        }
86
+
71 87
         $GLOBALS['TL_CSS']['cirrus'] = 'bundles/vonrotenbergweinanlieferung/css/backend.css|static';
72 88
         $arrData = [
73 89
             'request_token' => $this->tokenManager->getDefaultTokenValue(),
74 90
             'ref'           => $this->request->attributes->get('_contao_referer_id')
75 91
         ];
76 92
         System::loadLanguageFile('default');
93
+        System::loadLanguageFile('wa_slotassistant');
94
+        Controller::loadDataContainer('tl_vr_wa_slot');
95
+        Controller::loadDataContainer('tl_vr_wa_slotassistant');
77 96
 
78 97
 //        dump($this->getWidgets());
79 98
 
80 99
         $arrData['fields'] = $this->getWidgets();
81 100
 
101
+        // AJAX request
102
+        if ($_POST && Environment::get('isAjaxRequest'))
103
+        {
104
+            $dc = new DC_File('tl_vr_wa_slotassistant');
105
+            $this->objAjax->executePostActions($dc);
106
+        }
107
+
82 108
         return new Response(
83 109
             $this->twig->render(
84 110
                 '@Contao_VonrotenbergWeinanlieferungBundle/be_wa_slotassistant.html.twig',
... ...
@@ -123,14 +149,95 @@ class WeinanlieferungSlotAssistantController extends AbstractController
123 149
             'time_legend' => [
124 150
                 [
125 151
                     'class'  => 'w50 wizard',
126
-                    'help'   => 'Zeitslot-Typ/Annahmestelle fest.',
152
+                    'help'   => 'Der Zeitpunkt ab wann der erste Zeitslot angelegt werden soll.',
127 153
                     'widget' => new TextField([
128 154
                         'name'       => 'date_start[1]',
129 155
                         'mandatory'  => true,
130
-                        'label'      => 'Pufferzeit in min.',
156
+                        'label'      => 'Zeitraum Beginn',
131 157
                         'rgxp'       => 'datim',
132 158
                         'datepicker' => true,
133 159
                     ])
160
+                ],
161
+                [
162
+                    'class'  => 'w50 wizard',
163
+                    'help'   => 'Der Zeitpunkt bis wann der letzte Zeitslot abgeschlossen sein muss.',
164
+                    'widget' => new TextField([
165
+                        'name'       => 'date_end[1]',
166
+                        'mandatory'  => true,
167
+                        'label'      => 'Zeitraum Ende',
168
+                        'rgxp'       => 'datim',
169
+                        'datepicker' => true,
170
+                    ])
171
+                ],
172
+                [
173
+                    'class'  => 'clr',
174
+                    'help' => 'blah',
175
+                    'widget' => new MultiColumnWizard([
176
+                        'name'       => 'timeframe',
177
+                        'minCount' => 1,
178
+                        'columnFields' =>
179
+                            [
180
+                                'sorte' =>
181
+                                    [
182
+                                'label' => $GLOBALS['TL_LANG']['MSC']['wa_sorte'],
183
+                                'inputType' => 'select',
184
+                                'foreignKey'   => 'tl_vr_wa_rebsorte.title',
185
+                                'eval' => ['style' => 'width:350px', 'mandatory' => true, 'chosen' =>true, 'includeBlankOption' => true]
186
+                                    ],
187
+                                'leseart' =>
188
+                                    [
189
+                                'label' => $GLOBALS['TL_LANG']['MSC']['wa_leseart'],
190
+                                'inputType' => 'select',
191
+                                'foreignKey'   => 'tl_vr_wa_leseart.title',
192
+                                'eval' => ['style' => 'width:350px', 'mandatory' => true, 'chosen' =>true, 'includeBlankOption' => true]
193
+                                    ]
194
+                            ]
195
+                    ])
196
+                ]
197
+            ],
198
+            'slot_legend' => [
199
+                [
200
+                    'class'  => 'w50',
201
+                    'help'   => 'Der Beginn des Zeitraums, ab wann der Slot im Vorfeld gebucht werden kann.',
202
+                    'widget' => new TextField([
203
+                        'name'      => 'bookableFrom',
204
+                        'mandatory' => true,
205
+                        'label'     => 'Buchbar ab in h',
206
+                        'rgxp'      => 'natural'
207
+                    ])
208
+                ],
209
+                [
210
+                    'class'  => 'w50',
211
+                    'help'   => 'Das Ende des Zeitraums, bis wann der Slot im Vorfeld gebucht werden kann.',
212
+                    'widget' => new TextField([
213
+                        'name'      => 'bookableTill',
214
+                        'mandatory' => true,
215
+                        'label'     => 'Buchbar bis in h',
216
+                        'rgxp'      => 'natural'
217
+                    ])
218
+                ],
219
+                [
220
+                    'class'  => 'clr',
221
+                    'help'   => 'Anmerkungen zum Zeitslot. Diese werden bei der Buchung angezeigt.',
222
+                    'widget' => new TextArea([
223
+                        'name'      => 'annotation',
224
+                        'mandatory' => true,
225
+                        'label'     => 'Anmerkungen',
226
+                        'rte'       => 'tinyMCE'
227
+                    ])
228
+                ],
229
+                [
230
+                    'class'  => 'clr',
231
+                    'help'   => 'Anmerkungen zum Zeitslot. Diese werden bei der Buchung angezeigt.',
232
+                    'widget' => new FileTree([
233
+                        'name'        => 'enclosure',
234
+                        'mandatory'   => true,
235
+                        'label'       => 'Anmerkungen',
236
+                        'multiple'    => true,
237
+                        'fieldType'   => 'checkbox',
238
+                        'filesOnly'   => true,
239
+                        'isDownloads' => true
240
+                    ])
134 241
                 ]
135 242
             ]
136 243
         ];
... ...
@@ -194,6 +301,37 @@ class WeinanlieferungSlotAssistantController extends AbstractController
194 301
                     $field['widget']->wizard = $wizard;
195 302
                 }
196 303
 
304
+                // Replace the textarea with an RTE instance
305
+                if (!empty($field['widget']->rte))
306
+                {
307
+                    list($file, $type) = explode('|', $field['widget']->rte, 2) + [null, null];
308
+
309
+                    $fileBrowserTypes = [];
310
+                    $pickerBuilder = System::getContainer()->get('contao.picker.builder');
311
+
312
+                    foreach (['file' => 'image', 'link' => 'file'] as $context => $fileBrowserType)
313
+                    {
314
+                        if ($pickerBuilder->supportsContext($context))
315
+                        {
316
+                            $fileBrowserTypes[] = $fileBrowserType;
317
+                        }
318
+                    }
319
+
320
+                    $objTemplate = new BackendTemplate('be_' . $file);
321
+                    $objTemplate->selector = 'ctrl_' . $field['widget']->id;
322
+                    $objTemplate->type = $type;
323
+                    $objTemplate->fileBrowserTypes = $fileBrowserTypes;
324
+                    $objTemplate->source = 'wa_slotassistant.' . $field['widget']->id;
325
+                    $objTemplate->readonly = (bool)($field['widget']->readonly ?? false);
326
+
327
+                    // Deprecated since Contao 4.0, to be removed in Contao 5.0
328
+                    $objTemplate->language = Backend::getTinyMceLanguage();
329
+
330
+                    $field['widget']->updateMode = $objTemplate->parse();
331
+
332
+                    unset($file, $type, $pickerBuilder, $fileBrowserTypes, $fileBrowserType);
333
+                }
334
+
197 335
                 if (Input::post('FORM_SUBMIT') == 'wa_slotassistant')
198 336
                 {
199 337
                     dump($field['widget']->validate());