1
<?php
2
defined('ABSPATH') || exit;
3
require_once __DIR__ . '/elementor-widget-base.php';
4
if (!class_exists('FRESH_OO_Detail_Table_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Detail_Table_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-detail-table'; }
7
public function get_title(): string { return 'onOffice Detailtabelle'; }
8
public function get_icon(): string { return 'eicon-table'; }
9
protected function register_controls(): void {
10
$this->start_controls_section('content',['label'=>'Detailtabelle']);
11
$this->add_control('mode',['label'=>'Feldmodus','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'smart','options'=>['smart'=>'Intelligent automatisch','manual'=>'Eigene Felder']]);
12
$r=new \Elementor\Repeater();$r->add_control('section',['label'=>'Gruppe','type'=>\Elementor\Controls_Manager::TEXT,'default'=>'Details']);$r->add_control('field',['label'=>'Feld','type'=>\Elementor\Controls_Manager::SELECT2,'options'=>$this->field_options(true),'label_block'=>true]);$r->add_control('label',['label'=>'Label','type'=>\Elementor\Controls_Manager::TEXT]);$r->add_control('format',['label'=>'Format','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'auto','options'=>['auto'=>'Automatisch','text'=>'Text','integer'=>'Ganzzahl','number'=>'Zahl','year'=>'Jahr','date'=>'Datum','price'=>'Preis','area'=>'Fläche','energy'=>'Energie','boolean'=>'Ja / Nein']]);
13
$this->add_control('rows',['label'=>'Zeilen','type'=>\Elementor\Controls_Manager::REPEATER,'fields'=>$r->get_controls(),'condition'=>['mode'=>'manual'],'title_field'=>'{{{ section }}} · {{{ label || field }}}']);
14
$this->add_control('hide_empty',['label'=>'Leere Werte ausblenden','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);$this->add_control('hide_zero',['label'=>'Sinnlose 0-Werte ausblenden','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);$this->add_control('section_tag',['label'=>'Gruppen-Überschrift','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'h3','options'=>['h2'=>'H2','h3'=>'H3','h4'=>'H4','div'=>'DIV']]);
15
$this->end_controls_section();
16
$this->start_controls_section('layout',['label'=>'Layout']);
17
$this->add_responsive_control('section_columns',['label'=>'Gruppen-Spalten','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'1','tablet_default'=>'1','mobile_default'=>'1','options'=>['1'=>'1','2'=>'2'],'selectors'=>['{{WRAPPER}} .fresh-oo-detail'=>'grid-template-columns:repeat({{VALUE}},minmax(0,1fr));']]);
18
$this->add_control('style_mode',['label'=>'Zeilenstil','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'lines','options'=>['lines'=>'Linien','cards'=>'Karten','clean'=>'Minimal'],'prefix_class'=>'fresh-oo-detail--']);
19
$this->add_responsive_control('label_width',['label'=>'Label-Breite','type'=>\Elementor\Controls_Manager::SLIDER,'size_units'=>['%'],'range'=>['%'=>['min'=>25,'max'=>75]],'default'=>['unit'=>'%','size'=>48],'selectors'=>['{{WRAPPER}} .fresh-oo-detail__label'=>'flex-basis:{{SIZE}}%;']]);
20
$this->end_controls_section();
21
$this->start_controls_section('style',['label'=>'Styling','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
22
$this->add_control('heading_color',['label'=>'Gruppenüberschrift','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-detail__heading'=>'color:{{VALUE}};']]);$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'heading_typo','selector'=>'{{WRAPPER}} .fresh-oo-detail__heading']);$this->add_control('label_color',['label'=>'Labels','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-detail__label'=>'color:{{VALUE}};']]);$this->add_control('value_color',['label'=>'Werte','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-detail__value'=>'color:{{VALUE}};']]);$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'row_typo','selector'=>'{{WRAPPER}} .fresh-oo-detail__row']);$this->add_control('divider_color',['label'=>'Trennlinie','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-detail__row'=>'border-color:{{VALUE}};']]);
23
$this->end_controls_section();
24
}
25
private function smart_rows(): array {
26
$rows=[
27
['Kategorie','oo_objektart','Objektart'],['Kategorie','oo_objekttyp','Objekttyp'],['Kategorie','oo_vermarktungsart','Vermarktungsart'],['Kategorie','oo_nutzungsart','Nutzungsart'],
28
['Preise',$this->is_rental()?'oo_kaltmiete':'oo_kaufpreis',$this->is_rental()?'Kaltmiete':'Kaufpreis'],
29
['Preise','oo_warmmiete','Warmmiete'],['Preise','oo_hausgeld','Hausgeld'],['Preise','oo_aussen_courtage','Provision'],
30
['Flächen','oo_wohnflaeche','Wohnfläche'],['Flächen','oo_nutzflaeche','Nutzfläche'],['Flächen','oo_grundstuecksflaeche','Grundstück'],
31
['Räume','oo_anzahl_zimmer','Zimmer'],['Räume','oo_anzahl_schlafzimmer','Schlafzimmer'],['Räume','oo_anzahl_badezimmer','Bäder'],
32
['Gebäude','oo_baujahr','Baujahr'],['Gebäude','oo_etagen_zahl','Etagen'],['Gebäude','oo_zustand','Zustand'],['Gebäude','oo_verfuegbar_ab','Verfügbar ab'],
33
['Adresse','oo_plz','PLZ'],['Adresse','oo_ort','Ort'],
34
];
35
if($this->is_rental())$rows=array_values(array_filter($rows,fn($r)=>$r[1]!=='oo_hausgeld'));
36
return array_map(fn($r)=>['section'=>$r[0],'field'=>$r[1],'label'=>$r[2],'format'=>'auto'],$rows);
37
}
38
protected function render(): void {
39
$s=$this->get_settings_for_display();$rows=($s['mode']??'smart')==='smart'?$this->smart_rows():($s['rows']??[]);$groups=[];$defs=$this->field_definitions();
40
foreach($rows as $row){$k=(string)($row['field']??'');if(!$k)continue;$v=$this->meta($k);$hideZero=($s['hide_zero']??'yes')==='yes';if(($s['hide_empty']??'yes')==='yes'&&!$this->meaningful_value($v,$k,$hideZero))continue;if($hideZero&&!$this->meaningful_value($v,$k,true))continue;$fmt=($row['format']??'auto')==='auto'?$this->inferred_format($k):(string)$row['format'];$display=$this->pretty_value($v,$k,$fmt);if($display==='')continue;$section=trim((string)($row['section']??''))?:'Details';$groups[$section][]=[$row,$display,trim((string)($row['label']??''))?:($defs[$k][0]??$k)];}
41
if(!$groups){$this->editor_empty('Keine Detaildaten vorhanden.');return;}$tag=in_array($s['section_tag']??'h3',['h2','h3','h4','div'],true)?$s['section_tag']:'h3';echo '<div class="fresh-oo-detail">';foreach($groups as $section=>$items){echo '<section class="fresh-oo-detail__section"><'.$tag.' class="fresh-oo-detail__heading">'.esc_html($section).'</'.$tag.'><dl class="fresh-oo-detail__list">';foreach($items as [$row,$display,$label])echo '<div class="fresh-oo-detail__row"><dt class="fresh-oo-detail__label">'.esc_html($label).'</dt><dd class="fresh-oo-detail__value">'.esc_html($display).'</dd></div>';echo '</dl></section>';}echo '</div>';
42
}
43
}
44
}
45