1
<?php
2
defined('ABSPATH') || exit;
3
4
if (!class_exists('FRESH_OO_Estates_Map_Widget') && class_exists('FRESH_OO_Widget_Base')) {
5
class FRESH_OO_Estates_Map_Widget extends FRESH_OO_Widget_Base {
6
public function get_name(): string { return 'fresh-oo-estates-map'; }
7
public function get_title(): string { return 'onOffice Immobilienkarte'; }
8
public function get_icon(): string { return 'eicon-map-pin'; }
9
public function get_keywords(): array { return ['onoffice','karte','map','archiv','suche','marker']; }
10
public function get_style_depends(): array { return ['fresh-oo-toolkit','fresh-oo-maps']; }
11
12
protected function register_controls(): void {
13
$this->start_controls_section('content',['label'=>'Immobilienkarte']);
14
$this->add_control('provider',['label'=>'Kartenanbieter','type'=>\Elementor\Controls_Manager::SELECT,'default'=>'auto','options'=>['auto'=>'onOffice-Einstellung übernehmen','osm'=>'OpenStreetMap','google-maps'=>'Google Maps']]);
15
$this->add_control('limit',['label'=>'Max. Immobilien','type'=>\Elementor\Controls_Manager::NUMBER,'default'=>100,'min'=>1,'max'=>500]);
16
$this->add_control('respect_visibility',['label'=>'onOffice Kartenfreigabe beachten','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
17
$this->add_control('show_price',['label'=>'Preis im Popup','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
18
$this->add_control('show_location',['label'=>'Ort im Popup','type'=>\Elementor\Controls_Manager::SWITCHER,'default'=>'yes']);
19
$this->end_controls_section();
20
21
$this->start_controls_section('style_map',['label'=>'Karte','tab'=>\Elementor\Controls_Manager::TAB_STYLE]);
22
$this->add_responsive_control('height',['label'=>'Höhe','type'=>\Elementor\Controls_Manager::SLIDER,'size_units'=>['px','vh'],'range'=>['px'=>['min'=>220,'max'=>1000],'vh'=>['min'=>20,'max'=>100]],'default'=>['size'=>560,'unit'=>'px'],'selectors'=>['{{WRAPPER}} .fresh-oo-map__canvas'=>'height:{{SIZE}}{{UNIT}};']]);
23
$this->add_responsive_control('radius',['label'=>'Eckenradius','type'=>\Elementor\Controls_Manager::DIMENSIONS,'size_units'=>['px','%'],'selectors'=>['{{WRAPPER}} .fresh-oo-map__canvas'=>'border-radius:{{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};']]);
24
$this->add_group_control(\Elementor\Group_Control_Border::get_type(),['name'=>'border','selector'=>'{{WRAPPER}} .fresh-oo-map__canvas']);
25
$this->add_group_control(\Elementor\Group_Control_Box_Shadow::get_type(),['name'=>'shadow','selector'=>'{{WRAPPER}} .fresh-oo-map__canvas']);
26
$this->end_controls_section();
27
}
28
29
private function provider(array $s): string {
30
$provider = (string)($s['provider'] ?? 'auto');
31
if ($provider === 'auto') $provider = (string)get_option('onoffice-maps-mapprovider','osm');
32
if ($provider === 'google-maps' && trim((string)get_option('onoffice-settings-googlemaps-key','')) === '') $provider = 'osm';
33
return in_array($provider,['osm','google-maps'],true) ? $provider : 'osm';
34
}
35
private function enqueue_provider(string $provider): void {
36
if ($provider === 'google-maps' && wp_script_is('google-maps','registered')) wp_enqueue_script('google-maps');
37
else { if (wp_style_is('leaflet-style','registered')) wp_enqueue_style('leaflet-style'); if (wp_script_is('leaflet-script','registered')) wp_enqueue_script('leaflet-script'); }
38
wp_enqueue_style('fresh-oo-maps'); wp_enqueue_script('fresh-oo-maps');
39
}
40
private function price_for(int $post_id): string {
41
$marketing = strtolower(trim((string)get_post_meta($post_id,'oo_vermarktungsart',true)));
42
$keys = (str_contains($marketing,'miet') || str_contains($marketing,'pacht')) ? ['oo_kaltmiete','oo_nettokaltmiete','oo_warmmiete','oo_pacht'] : ['oo_kaufpreis'];
43
foreach ($keys as $key) { $v=get_post_meta($post_id,$key,true); if (is_numeric($v) && (float)$v>0) return number_format_i18n((float)$v,0).' €'; }
44
return '';
45
}
46
47
protected function render(): void {
48
$s=$this->get_settings_for_display(); $provider=$this->provider($s); $this->enqueue_provider($provider);
49
$q=new \WP_Query(['post_type'=>FRESH_OnOffice_Elementor_Bridge::CPT,'post_status'=>'publish','posts_per_page'=>max(1,min(500,(int)($s['limit']??100))),'fields'=>'ids','no_found_rows'=>true,'orderby'=>'date','order'=>'DESC']);
50
$items=[];
51
foreach($q->posts as $post_id){
52
$lat=(float)get_post_meta($post_id,'oo_breitengrad',true); $lng=(float)get_post_meta($post_id,'oo_laengengrad',true); if($lat==0.0||$lng==0.0)continue;
53
if(($s['respect_visibility']??'yes')==='yes'){
54
$show=get_post_meta($post_id,'oo_showgooglemap',true); $virt=get_post_meta($post_id,'oo_virtualaddress',true);
55
if(($show!==''&&!$this->is_truthy($show))||$this->is_truthy($virt))continue;
56
}
57
$items[]=['lat'=>$lat,'lng'=>$lng,'title'=>get_the_title($post_id),'url'=>get_permalink($post_id),'location'=>trim((string)get_post_meta($post_id,'oo_plz',true).' '.(string)get_post_meta($post_id,'oo_ort',true)),'price'=>$this->price_for((int)$post_id)];
58
}
59
if(!$items){$this->editor_empty('Noch keine veröffentlichten Immobilien mit Kartenkoordinaten vorhanden. Nach dem nächsten onOffice-Sync erneut prüfen.');return;}
60
$id='fresh-oo-map-'.$this->get_id();
61
$json=wp_json_encode($items,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
62
printf('<div class="fresh-oo-map fresh-oo-map--multi"><div id="%s" class="fresh-oo-map__canvas" data-fresh-oo-map="1" data-provider="%s" data-items="%s" data-show-price="%s" data-show-location="%s" role="region" aria-label="Immobilienkarte"></div></div>',esc_attr($id),esc_attr($provider),esc_attr($json),($s['show_price']??'yes')==='yes'?'1':'0',($s['show_location']??'yes')==='yes'?'1':'0');
63
}
64
}
65
}
66