Browse code

Attributes WIP

Benjamin Roth authored on06/08/2025 13:14:57
Showing5 changed files
... ...
@@ -95,7 +95,7 @@
95 95
                                         {% endif %}
96 96
                                     {% elseif group.type == 'option' %}
97 97
                                         <div class="checkbox form-ext-control form-ext-{{ group.multiple ? 'checkbox' : 'radio' }}">
98
-                                            <input class="form-ext-input" type="{{ group.multiple ? 'checkbox' : 'radio' }}" id="b_attribute_{{ attribute.id }}" name="{{ group.multiple ? 'attribute_'~attribute.id : 'group_'~group.id }}" value="1" {% if attribute.value %}checked{% endif %}>
98
+                                            <input class="form-ext-input" type="{{ group.multiple ? 'checkbox' : 'radio' }}" id="b_attribute_{{ attribute.id }}" name="{{ group.multiple ? 'attribute_'~attribute.id : 'group_'~group.id }}" value="{{ attribute.id }}" {% if attribute.id == attribute.value %}checked{% endif %}>
99 99
                                             <label class="form-ext-label" for="b_attribute_{{ attribute.id }}">{{ attribute.title }}</label>
100 100
                                         </div>
101 101
                                     {% endif %}
... ...
@@ -99,6 +99,40 @@
99 99
                                                 <div class="col-3 annotation">
100 100
                                                     <div class="t-label">Anmerkung des Anlieferers</div>
101 101
                                                     {{ booking.annotation }}
102
+
103
+                                                    {% if booking.attributes is defined and booking.attributes|length > 0 %}
104
+                                                        <div class="t-label">Attribute</div>
105
+                                                        <div class="attributes">
106
+                                                            {% set groups = {} %}
107
+                                                            {% for attribute in booking.attributes %}
108
+                                                                {% set group = attribute.group|default('Sonstige') %}
109
+                                                                {% if groups[group] is not defined %}
110
+                                                                    {% set groups = groups|merge({(group): []}) %}
111
+                                                                {% endif %}
112
+                                                                {% set groups = groups|merge({
113
+                                                                    (group): groups[group]|merge([{
114
+                                                                        'title': attribute.title,
115
+                                                                        'value': attribute.value
116
+                                                                    }])
117
+                                                                }) %}
118
+                                                            {% endfor %}
119
+
120
+                                                            {% for group, attributes in groups %}
121
+                                                                <div class="attribute-group">
122
+                                                                    <div class="group-title">{{ group }}</div>
123
+                                                                    {% for attribute in attributes %}
124
+                                                                        <div class="attribute-item">
125
+                                                                            {% if attribute.value %}
126
+                                                                                <strong>{{ attribute.title }}:</strong> {{ attribute.value }}
127
+                                                                            {% else %}
128
+                                                                                {{ attribute.title }}
129
+                                                                            {% endif %}
130
+                                                                        </div>
131
+                                                                    {% endfor %}
132
+                                                                </div>
133
+                                                            {% endfor %}
134
+                                                        </div>
135
+                                                    {% endif %}
102 136
                                                 </div>
103 137
                                                 <div class="col u-text-right action">
104 138
                                                     <a
... ...
@@ -29,6 +29,22 @@
29 29
   font-weight: 500;
30 30
 }
31 31
 
32
+.attribute-group {
33
+  margin-bottom: 0.5rem;
34
+}
35
+
36
+.attribute-group .group-title {
37
+  font-weight: 600;
38
+  color: #666;
39
+  margin-top: 0.5rem;
40
+  border-bottom: 1px solid #eee;
41
+}
42
+
43
+.attribute-group .attribute-item {
44
+  padding-left: 0.5rem;
45
+  margin-top: 0.2rem;
46
+}
47
+
32 48
 .u-row-striped > *:nth-child(even) {
33 49
   background-color: #fff6ef;
34 50
 }
... ...
@@ -32,6 +32,7 @@ use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungLeseartModel;
32 32
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungRebsorteModel;
33 33
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungReservationModel;
34 34
 use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungSlotsModel;
35
+use vonRotenberg\WeinanlieferungBundle\Model\WeinanlieferungAttributeModel;
35 36
 
36 37
 /**
37 38
  * @Route("contao/weinanlieferung/buchungsliste", name=WeinanlieferungBookingsController::class, defaults={"_scope" = "backend"})
... ...
@@ -265,6 +266,52 @@ class WeinanlieferungBookingsController extends AbstractController
265 266
                         $unitLabel = $Unit->title;
266 267
                     }
267 268
 
269
+                    // Process attribute values if available
270
+                    $formattedAttributes = [];
271
+                    if (!empty($booking->attribute_values)) {
272
+                        try {
273
+                            $attributeValues = json_decode($booking->attribute_values, true);
274
+                            if (is_array($attributeValues) && !empty($attributeValues)) {
275
+                                foreach ($attributeValues as $attributeId => $value) {
276
+                                    // Get attribute information
277
+                                    $attribute = WeinanlieferungAttributeModel::findByPk($attributeId);
278
+                                    if ($attribute === null) {
279
+                                        continue;
280
+                                    }
281
+
282
+                                    // Get the group information
283
+                                    $group = $attribute->getRelated('pid');
284
+                                    $groupTitle = $group !== null ? $group->title : '';
285
+                                    $groupType = $group !== null ? $group->type : 'text';
286
+
287
+                                    // Format based on group type
288
+                                    $attributeTitle = $attribute->title;
289
+
290
+                                    if ($groupType === 'option') {
291
+                                        // For option type, the value is either true (selected) or false (not selected)
292
+                                        if ($value === true || $value === 'true' || $value === '1' || $value === 1) {
293
+                                            $formattedAttributes[] = [
294
+                                                'title' => $attributeTitle,
295
+                                                'value' => '',  // Don't show value for option attributes
296
+                                                'group' => $groupTitle
297
+                                            ];
298
+                                        }
299
+                                    } else {
300
+                                        // Text type or fallback
301
+                                        $formattedValue = is_array($value) ? implode(', ', $value) : $value;
302
+                                        $formattedAttributes[] = [
303
+                                            'title' => $attributeTitle,
304
+                                            'value' => $formattedValue,
305
+                                            'group' => $groupTitle
306
+                                        ];
307
+                                    }
308
+                                }
309
+                            }
310
+                        } catch (\Exception $e) {
311
+                            // Silently fail
312
+                        }
313
+                    }
314
+
268 315
                     $arrData['days'][$day->dayBegin][$Slot->pid]['times'][$Slot->time]['items'][] = array_merge($booking->row(), [
269 316
                         'sorte'              => $arrSorten,
270 317
                         'ernteart' => $arrErnteart,
... ...
@@ -272,7 +319,8 @@ class WeinanlieferungBookingsController extends AbstractController
272 319
                         'slot'  => $Slot->row(),
273 320
                         'unit' => $unitLabel,
274 321
                         'standort' => $strStandort,
275
-                        'member' => $booking->getRelated('uid') !== null ? $booking->getRelated('uid')->row() : null
322
+                        'member' => $booking->getRelated('uid') !== null ? $booking->getRelated('uid')->row() : null,
323
+                        'attributes' => $formattedAttributes
276 324
                     ]);
277 325
                 }
278 326
             }
... ...
@@ -621,6 +621,7 @@ class SlotAjaxController extends AbstractController
621 621
                             $attributeKey = 'attribute_' . $attribute->id;
622 622
                             $groupId = $attributeToGroupMap[$attribute->id];
623 623
                             $groupType = $groupTypeMap[$groupId];
624
+                            $groupKey = 'group_' . $groupId;
624 625
 
625 626
                             if ($groupType === 'text') {
626 627
                                 // For text attributes, store the text value
... ...
@@ -629,11 +630,16 @@ class SlotAjaxController extends AbstractController
629 630
                                     $groupHasValue[$groupId] = true;
630 631
                                 }
631 632
                             } else if ($groupType === 'option') {
632
-                                // For option attributes, store true if selected
633
+                                // For option attributes with multiple values (checkboxes)
633 634
                                 if (Input::post($attributeKey)) {
634 635
                                     $attributeValues[$attribute->id] = true;
635 636
                                     $groupHasValue[$groupId] = true;
636 637
                                 }
638
+                                // For option attributes with single value (radio buttons)
639
+                                else if (Input::post($groupKey) == $attribute->id) {
640
+                                    $attributeValues[$attribute->id] = true;
641
+                                    $groupHasValue[$groupId] = true;
642
+                                }
637 643
                             }
638 644
                         }
639 645
 
... ...
@@ -803,6 +809,7 @@ class SlotAjaxController extends AbstractController
803 809
                             $attributeKey = 'attribute_' . $attribute->id;
804 810
                             $groupId = $attributeToGroupMap[$attribute->id];
805 811
                             $groupType = $groupTypeMap[$groupId];
812
+                            $groupKey = 'group_' . $groupId;
806 813
 
807 814
                             if ($groupType === 'text') {
808 815
                                 // For text attributes, store the text value
... ...
@@ -811,11 +818,16 @@ class SlotAjaxController extends AbstractController
811 818
                                     $groupHasValue[$groupId] = true;
812 819
                                 }
813 820
                             } else if ($groupType === 'option') {
814
-                                // For option attributes, store true if selected
821
+                                // For option attributes with multiple values (checkboxes)
815 822
                                 if (Input::post($attributeKey)) {
816 823
                                     $attributeValues[$attribute->id] = true;
817 824
                                     $groupHasValue[$groupId] = true;
818 825
                                 }
826
+                                // For option attributes with single value (radio buttons)
827
+                                else if (Input::post($groupKey) == $attribute->id) {
828
+                                    $attributeValues[$attribute->id] = true;
829
+                                    $groupHasValue[$groupId] = true;
830
+                                }
819 831
                             }
820 832
                         }
821 833