1
<?php
2
defined('ABSPATH') || exit;
3
require_once __DIR__ . '/elementor-widget-base.php';
4
if (!class_exists('FRESH_OO_Energy_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Energy_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-energy'; }
7
public function get_title(): string { return 'onOffice Energieausweis'; }
8
public function get_icon(): string { return 'eicon-meter'; }
9
protected function register_controls(): void {
10
$this->start_controls_section('content',['label'=>'Energie']);
11
$this->add_control('title',['label'=>'Überschrift','type'=>\Elementor\Controls_Manager::TEXT,'default'=>'Energieausweis']);
12
$this->add_control('layout_mode',['label'=>'Darstellung','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'full','options'=>['full'=>'Skala + Kennwert + Details','compact'=>'Kompakt','scale'=>'Nur Skala'],'prefix_class'=>'fresh-oo-energy--']);
13
$this->add_control('show_marker',['label'=>'Kennwert-Marker anzeigen','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
14
$this->add_control('class_field',['label'=>'Klassenfeld','type'=>\Elementor\Controls_Manager::SELECT2,'options'=>$this->field_options(true),'default'=>'oo_energyclass']);
15
$this->add_control('consumption_field',['label'=>'Verbrauch / Bedarf','type'=>\Elementor\Controls_Manager::SELECT2,'options'=>$this->field_options(true),'default'=>'oo_energieverbrauchskennwert']);
16
$this->end_controls_section();
17
$this->start_controls_section('style_box',['label'=>'Box','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);$this->add_common_card_style_controls('box','{{WRAPPER}} .fresh-oo-energy');$this->add_control('title_color',['label'=>'Titel','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-energy__title'=>'color:{{VALUE}};']]);$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'title_typo','selector'=>'{{WRAPPER}} .fresh-oo-energy__title']);$this->add_control('accent_color',['label'=>'Marker-Farbe','type'=>\Elementor\Controls_Manager::COLOR,'default'=>'#17211d','selectors'=>['{{WRAPPER}} .fresh-oo-energy'=>'--fresh-oo-energy-marker:{{VALUE}};']]);$this->end_controls_section();
18
$this->start_controls_section('style_value',['label'=>'Kennwert','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);$this->add_control('value_color',['label'=>'Farbe','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-energy__metric-value'=>'color:{{VALUE}};']]);$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'value_typo','selector'=>'{{WRAPPER}} .fresh-oo-energy__metric-value']);$this->end_controls_section();
19
$this->start_controls_section('style_details',['label'=>'Details','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);$this->add_responsive_control('details_columns',['label'=>'Detail-Spalten','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'2','tablet_default'=>'2','mobile_default'=>'1','options'=>['1'=>'1','2'=>'2'],'selectors'=>['{{WRAPPER}} .fresh-oo-energy__details'=>'grid-template-columns:repeat({{VALUE}},minmax(0,1fr));']]);$this->add_responsive_control('details_gap',['label'=>'Detail-Abstand','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>0,'max'=>60]],'selectors'=>['{{WRAPPER}} .fresh-oo-energy__details'=>'column-gap:{{SIZE}}{{UNIT}};']]);$this->add_control('label_color',['label'=>'Labels','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-energy__detail dt'=>'color:{{VALUE}};']]);$this->add_control('detail_value_color',['label'=>'Werte','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-energy__detail dd'=>'color:{{VALUE}};']]);$this->end_controls_section();
20
}
21
private function class_from_value(float $v): string { return $v<30?'A+':($v<50?'A':($v<75?'B':($v<100?'C':($v<130?'D':($v<160?'E':($v<200?'F':($v<250?'G':'H'))))))); }
22
protected function render(): void {
23
$s = $this->get_settings_for_display();
24
25
$consRaw = $this->meta((string) ($s['consumption_field'] ?? 'oo_energieverbrauchskennwert'));
26
$cons = is_numeric($consRaw) ? (float) $consRaw : 0.0;
27
$class = strtoupper(trim((string) $this->meta((string) ($s['class_field'] ?? 'oo_energyclass'))));
28
if ($class === '' && $cons > 0) {
29
$class = $this->class_from_value($cons);
30
}
31
32
// Energieausweis-spezifische Daten strikt getrennt von allgemeinen Objektdaten behandeln.
33
// Insbesondere darf das normale Objekt-Baujahr nicht als Ersatz für das Baujahr
34
// des Energieausweises verwendet werden.
35
$details = [
36
['Ausweistyp', $this->meta('oo_energieausweistyp'), 'text'],
37
['Energieträger', $this->meta('oo_energietraeger'), 'text'],
38
['Baujahr', $this->meta('oo_energieausweisbaujahr'), 'year'],
39
['Gültig bis', $this->meta('oo_energieausweis_gueltig_bis'), 'date'],
40
];
41
42
// Werte zuerst formatieren und erst danach entscheiden, ob sie dargestellt werden.
43
// So verschwinden Platzhalter wie 0, 0000-00-00 oder andere Werte, die nach
44
// der Formatierung leer sind, vollständig mitsamt ihrer Zeile.
45
$renderDetails = [];
46
foreach ($details as [$label, $value, $format]) {
47
if (!$this->meaningful_value($value)) {
48
continue;
49
}
50
$pretty = trim((string) $this->pretty_value($value, '', $format));
51
if ($pretty === '' || $pretty === '0') {
52
continue;
53
}
54
$renderDetails[] = [$label, $pretty];
55
}
56
57
$has = $cons > 0 || $class !== '' || !empty($renderDetails);
58
if (!$has) {
59
$this->editor_empty('Keine Energieausweis-Daten vorhanden.');
60
return;
61
}
62
63
$mode = $s['layout_mode'] ?? 'full';
64
echo '<section class="fresh-oo-energy" aria-label="Energieausweis">';
65
if (trim((string) ($s['title'] ?? '')) !== '') {
66
echo '<h3 class="fresh-oo-energy__title">' . esc_html($s['title']) . '</h3>';
67
}
68
69
if ($mode !== 'scale' && $cons > 0) {
70
echo '<div class="fresh-oo-energy__metric"><span class="fresh-oo-energy__metric-value">' . esc_html($this->format_number($cons, 1)) . '</span><span class="fresh-oo-energy__metric-unit">kWh/(m²·a)</span>' . ($class !== '' ? '<span class="fresh-oo-energy__metric-class">Klasse ' . esc_html($class) . '</span>' : '') . '</div>';
71
}
72
73
// Die farbige Skala ist nur sinnvoll, wenn eine Klasse ermittelt werden konnte.
74
if ($class !== '') {
75
echo '<div class="fresh-oo-energy__scale" aria-label="Energieeffizienzklasse ' . esc_attr($class) . '">';
76
foreach (['A+', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] as $c) {
77
$active = $class === $c ? ' is-active' : '';
78
echo '<span class="fresh-oo-energy__class fresh-oo-energy__class--' . esc_attr(strtolower(str_replace('+', 'plus', $c))) . $active . '"><b>' . esc_html($c) . '</b></span>';
79
}
80
echo '</div>';
81
82
if (($s['show_marker'] ?? 'yes') === 'yes' && $cons > 0) {
83
$pct = min(100, max(0, ($cons / 250) * 100));
84
echo '<div class="fresh-oo-energy__marker-track" aria-hidden="true"><span style="left:' . esc_attr((string) $pct) . '%"></span></div>';
85
}
86
}
87
88
if ($mode === 'full' && (!empty($renderDetails) || $class !== '')) {
89
echo '<dl class="fresh-oo-energy__details">';
90
foreach ($renderDetails as [$label, $pretty]) {
91
echo '<div class="fresh-oo-energy__detail"><dt>' . esc_html($label) . '</dt><dd>' . esc_html($pretty) . '</dd></div>';
92
}
93
if ($class !== '') {
94
echo '<div class="fresh-oo-energy__detail"><dt>Energieklasse</dt><dd><strong>' . esc_html($class) . '</strong></dd></div>';
95
}
96
echo '</dl>';
97
}
98
99
echo '</section>';
100
}
101
}
102
}
103