1
<?php
2
defined('ABSPATH') || exit;
3
require_once __DIR__ . '/elementor-widget-base.php';
4
if (!class_exists('FRESH_OO_Address_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Address_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-address'; }
7
public function get_title(): string { return 'onOffice Adresse'; }
8
public function get_icon(): string { return 'eicon-map-pin'; }
9
public function get_keywords(): array { return ['onoffice','adresse','ort','plz','location']; }
10
protected function register_controls(): void {
11
$this->start_controls_section('content',['label'=>'Adresse']);
12
$this->add_control('privacy',['label'=>'Ausgabe','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'city','options'=>['full'=>'Straße + Hausnummer + PLZ + Ort','street'=>'Straße ohne Hausnummer + PLZ + Ort','city'=>'PLZ + Ort','place'=>'Nur Ort / Stadtteil']]);
13
$this->add_control('layout',['label'=>'Darstellung','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'stacked','options'=>['stacked'=>'Mehrzeilig','inline'=>'Eine Zeile'],'prefix_class'=>'fresh-oo-address--']);
14
$this->add_control('separator',['label'=>'Trenner','type'=>\Elementor\Controls_Manager::TEXT,'default'=>' · ','condition'=>['layout'=>'inline']]);
15
$this->add_control('show_country',['label'=>'Land anzeigen','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'']);
16
$this->add_control('show_icon',['label'=>'Icon anzeigen','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
17
$this->add_control('icon',['label'=>'Icon','type'=>\Elementor\Controls_Manager::ICONS,'default'=>['value'=>'fas fa-map-marker-alt','library'=>'fa-solid'],'condition'=>['show_icon'=>'yes']]);
18
$this->add_control('link_map',['label'=>'Mit Karten-Suche verlinken','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'','description'=>'Verwendet nur die tatsächlich angezeigte Ortsangabe.']);
19
$this->add_control('schema',['label'=>'PostalAddress-Markup','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
20
$this->end_controls_section();
21
$this->start_controls_section('style',['label'=>'Styling','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
22
$this->add_common_card_style_controls('box','{{WRAPPER}} .fresh-oo-address');
23
$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-address'=>'justify-content:{{VALUE}};']]);
24
$this->add_responsive_control('gap',['label'=>'Icon-Abstand','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>0,'max'=>60]],'selectors'=>['{{WRAPPER}} .fresh-oo-address'=>'gap:{{SIZE}}{{UNIT}};']]);
25
$this->add_control('icon_color',['label'=>'Icon','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-address__icon'=>'color:{{VALUE}};']]);
26
$this->add_control('icon_bg',['label'=>'Icon-Hintergrund','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-address__icon'=>'background:{{VALUE}};']]);
27
$this->add_responsive_control('icon_box',['label'=>'Icon-Box','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>20,'max'=>100]],'selectors'=>['{{WRAPPER}} .fresh-oo-address__icon'=>'width:{{SIZE}}{{UNIT}};height:{{SIZE}}{{UNIT}};']]);
28
$this->add_responsive_control('icon_radius',['label'=>'Icon-Radius','type'=>\Elementor\Controls_Manager::DIMENSIONS,'selectors'=>['{{WRAPPER}} .fresh-oo-address__icon'=>'border-radius:{{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};']]);
29
$this->add_responsive_control('icon_size',['label'=>'Icon-Größe','type'=>\Elementor\Controls_Manager::SLIDER,'range'=>['px'=>['min'=>8,'max'=>70]],'selectors'=>['{{WRAPPER}} .fresh-oo-address__icon svg'=>'width:{{SIZE}}{{UNIT}};height:{{SIZE}}{{UNIT}};']]);
30
$this->add_control('text_color',['label'=>'Text','type'=>\Elementor\Controls_Manager::COLOR,'selectors'=>['{{WRAPPER}} .fresh-oo-address__text, {{WRAPPER}} .fresh-oo-address__text a'=>'color:{{VALUE}};']]);
31
$this->add_group_control(\Elementor\Group_Control_Typography::get_type(),['name'=>'typo','selector'=>'{{WRAPPER}} .fresh-oo-address__text']);
32
$this->end_controls_section();
33
}
34
protected function render(): void {
35
$s=$this->get_settings_for_display();$mode=$s['privacy']??'city';$street=trim((string)$this->meta('oo_strasse'));$nr=trim((string)$this->meta('oo_hausnummer'));$plz=trim((string)$this->meta('oo_plz'));$city=trim((string)$this->meta('oo_ort'));$country=trim((string)$this->meta('oo_land'));
36
$parts=[];if($mode==='full'&&$street!=='')$parts[]=trim($street.' '.$nr);elseif($mode==='street'&&$street!=='')$parts[]=$street;if($mode!=='place'){$loc=trim($plz.' '.$city);if($loc!=='')$parts[]=$loc;}elseif($city!=='')$parts[]=$city;if(($s['show_country']??'')==='yes'&&$country!=='')$parts[]=$country;if(!$parts){$this->editor_empty('Keine Adressdaten vorhanden.');return;}
37
$schema=($s['schema']??'yes')==='yes';$inline=($s['layout']??'stacked')==='inline';$display=$inline?implode((string)($s['separator']??' · '),$parts):'';
38
$mapQuery=$inline?$display:implode(', ',$parts);$mapUrl='https://www.google.com/maps/search/?api=1&query='.rawurlencode($mapQuery);
39
echo '<div class="fresh-oo-address"'.($schema?' itemscope itemtype="https://schema.org/PostalAddress"':'').'>';if(($s['show_icon']??'yes')==='yes')$this->render_selected_icon($s['icon']??[],'fresh-oo-address__icon');echo '<div class="fresh-oo-address__text">';$open=(($s['link_map']??'')==='yes')?'<a href="'.esc_url($mapUrl).'" target="_blank" rel="noopener noreferrer">':'';$close=(($s['link_map']??'')==='yes')?'</a>':'';
40
if($inline){echo $open.'<span>'.esc_html($display).'</span>'.$close;}else{echo $open;foreach($parts as $line)echo '<span>'.esc_html($line).'</span>';echo $close;}
41
if($schema){if(($mode==='full'||$mode==='street')&&$street!=='')echo '<meta itemprop="streetAddress" content="'.esc_attr($mode==='full'?trim($street.' '.$nr):$street).'">';if($plz!==''&&$mode!=='place')echo '<meta itemprop="postalCode" content="'.esc_attr($plz).'">';if($city!=='')echo '<meta itemprop="addressLocality" content="'.esc_attr($city).'">';if($country!=='')echo '<meta itemprop="addressCountry" content="'.esc_attr($country).'">';}
42
echo '</div></div>';
43
}
44
}
45
}
46