1
<?php
2
defined('ABSPATH') || exit;
3
require_once __DIR__ . '/elementor-widget-base.php';
4
if (!class_exists('FRESH_OO_Property_Facts_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Property_Facts_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-property-facts'; }
7
public function get_title(): string { return 'onOffice Eckdaten'; }
8
public function get_icon(): string { return 'eicon-info-box'; }
9
public function get_keywords(): array { return ['onoffice','eckdaten','facts','zimmer','wohnfläche']; }
10
protected function register_controls(): void {
11
$this->start_controls_section('content',['label'=>'Eckdaten']);
12
$this->add_control('preset',['label'=>'Automatische Auswahl','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'smart','options'=>['smart'=>'Intelligent nach Objektart','standard'=>'Wohnfläche · Zimmer · Schlafen · Bad','compact'=>'Wohnfläche · Zimmer · Baujahr','manual'=>'Eigene Felder']]);
13
$r=new \Elementor\Repeater();
14
$r->add_control('field',['label'=>'Feld','type'=>\Elementor\Controls_Manager::SELECT2,'options'=>$this->field_options(true),'label_block'=>true]);
15
$r->add_control('label',['label'=>'Label','type'=>\Elementor\Controls_Manager::TEXT]);
16
$r->add_control('icon',['label'=>'Icon','type'=>\Elementor\Controls_Manager::ICONS]);
17
$this->add_control('items',['label'=>'Eigene Eckdaten','type'=>\Elementor\Controls_Manager::REPEATER,'fields'=>$r->get_controls(),'condition'=>['preset'=>'manual'],'title_field'=>'{{{ label || field }}}']);
18
$this->add_control('show_labels',['label'=>'Labels anzeigen','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
19
$this->add_control('hide_zero',['label'=>'0-Werte ausblenden','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
20
$this->add_control('layout_mode',['label'=>'Darstellung','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'cards','options'=>['cards'=>'Karten','minimal'=>'Minimal','value_top'=>'Wert groß oben'],'prefix_class'=>'fresh-oo-facts--']);
21
$this->end_controls_section();
22
$this->start_controls_section('layout',['label'=>'Layout']);
23
$this->add_responsive_control('columns',['label'=>'Spalten','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'4','tablet_default'=>'2','mobile_default'=>'2','options'=>['1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6'],'selectors'=>['{{WRAPPER}} .fresh-oo-facts'=>'grid-template-columns:repeat({{VALUE}},minmax(0,1fr));']]);
24
$this->add_responsive_control('align',['label'=>'Ausrichtung','type'=>\Elementor\Controls_Manager::CHOOSE,'options'=>['flex-start'=>['title'=>'Links','icon'=>'eicon-text-align-left'],'center'=>['title'=>'Mitte','icon'=>'eicon-text-align-center'],'flex-end'=>['title'=>'Rechts','icon'=>'eicon-text-align-right']],'default'=>'flex-start','selectors'=>['{{WRAPPER}} .fresh-oo-facts__item'=>'justify-content:{{VALUE}};']]);
25
$this->add_responsive_control('gap',['label'=>'Abstand','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>0,'max'=>60]],'default'=>['size'=>14],'selectors'=>['{{WRAPPER}} .fresh-oo-facts'=>'gap:{{SIZE}}{{UNIT}};']]);
26
$this->end_controls_section();
27
$this->start_controls_section('style',['label'=>'Styling','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
28
$this->add_common_card_style_controls('item','{{WRAPPER}} .fresh-oo-facts__item');
29
$this->add_control('icon_color',['label'=>'Icon','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-facts__icon'=>'color:{{VALUE}};']]);
30
$this->add_responsive_control('icon_size',['label'=>'Icon-Größe','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>10,'max'=>80]],'selectors'=>['{{WRAPPER}} .fresh-oo-facts__icon svg'=>'width:{{SIZE}}{{UNIT}};height:{{SIZE}}{{UNIT}};']]);
31
$this->add_control('label_color',['label'=>'Label','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-facts__label'=>'color:{{VALUE}};']]);
32
$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'label_typo','selector'=>'{{WRAPPER}} .fresh-oo-facts__label']);
33
$this->add_control('value_color',['label'=>'Wert','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-facts__value'=>'color:{{VALUE}};']]);
34
$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'value_typo','selector'=>'{{WRAPPER}} .fresh-oo-facts__value']);
35
$this->end_controls_section();
36
}
37
private function presets(string $preset): array {
38
$icons=['oo_wohnflaeche'=>'fas fa-ruler-combined','oo_grundstuecksflaeche'=>'fas fa-vector-square','oo_anzahl_zimmer'=>'far fa-square','oo_anzahl_schlafzimmer'=>'fas fa-bed','oo_anzahl_badezimmer'=>'fas fa-bath','oo_baujahr'=>'fas fa-calendar-alt','oo_etagen_zahl'=>'fas fa-layer-group'];
39
if($preset==='compact')$keys=['oo_wohnflaeche','oo_anzahl_zimmer','oo_baujahr'];
40
elseif($preset==='standard')$keys=['oo_wohnflaeche','oo_anzahl_zimmer','oo_anzahl_schlafzimmer','oo_anzahl_badezimmer'];
41
else {
42
$obj=$this->object_type();
43
$keys=str_contains($obj,'haus')?['oo_wohnflaeche','oo_grundstuecksflaeche','oo_anzahl_zimmer','oo_anzahl_badezimmer']:['oo_wohnflaeche','oo_anzahl_zimmer','oo_anzahl_schlafzimmer','oo_anzahl_badezimmer'];
44
}
45
$defs=$this->field_definitions();$out=[];foreach($keys as $k)$out[]=['field'=>$k,'label'=>$defs[$k][0]??$k,'icon'=>['value'=>$icons[$k]??'fas fa-circle','library'=>'fa-solid']];return $out;
46
}
47
protected function render(): void {
48
$s=$this->get_settings_for_display();$items=($s['preset']??'smart')==='manual'?($s['items']??[]):$this->presets((string)($s['preset']??'smart'));$defs=$this->field_definitions();$out=[];
49
foreach($items as $item){$k=(string)($item['field']??'');if(!$k)continue;$v=$this->meta($k);if(!$this->meaningful_value($v,$k,($s['hide_zero']??'yes')==='yes'))continue;$out[]=[$item,$this->pretty_value($v,$k),trim((string)($item['label']??''))?:($defs[$k][0]??$k)];}
50
if(!$out){$this->editor_empty('Keine passenden Eckdaten vorhanden.');return;}
51
echo '<div class="fresh-oo-facts">';foreach($out as [$item,$value,$label]){echo '<div class="fresh-oo-facts__item">';$this->render_selected_icon($item['icon']??[],'fresh-oo-facts__icon');echo '<div class="fresh-oo-facts__text">';if(($s['show_labels']??'yes')==='yes')echo '<span class="fresh-oo-facts__label">'.esc_html($label).'</span>';echo '<span class="fresh-oo-facts__value">'.esc_html($value).'</span></div></div>';}echo '</div>';
52
}
53
}
54
}
55