<?php
/**
* Concrete Elementor Dynamic Tag for onOffice post meta.
*
* IMPORTANT: This file is required only from the
* `elementor/dynamic_tags/register` hook, after Elementor's classes exist.
*/
defined('ABSPATH') || exit;
final class FRESH_OO_Elementor_Field_Tag extends \Elementor\Core\DynamicTags\Data_Tag {
public function get_name(): string {
// Keep this name forever: existing Elementor templates serialize it.
return 'fresh-oo-field';
}
public function get_title(): string {
return 'onOffice Feld';
}
public function get_group(): string {
return 'site';
}
public function get_categories(): array {
return [\Elementor\Modules\DynamicTags\Module::TEXT_CATEGORY];
}
protected function register_controls(): void {
$options = [];
foreach (FRESH_OnOffice_Field_Registry::field_definitions() as $key => $info) {
$options[$key] = $info[0] . ' (' . $key . ')';
}
$this->add_control('field', [
'label' => 'Feld',
'type' => \Elementor\Controls_Manager::SELECT,
'options' => $options,
'default' => 'oo_kaufpreis',
]);
$this->add_control('format', [
'label' => 'Formatierung',
'type' => \Elementor\Controls_Manager::SELECT,
'options' => [
'raw' => 'Smart / automatisch',
'price' => 'Preis (€)',
'sqm' => 'Fläche (m²)',
'number' => 'Zahl',
'yesno' => 'Ja / Nein',
],
'default' => 'raw',
]);
$this->add_control('fallback', [
'label' => 'Fallback',
'type' => \Elementor\Controls_Manager::TEXT,
'default' => '',
]);
}
public function get_value(array $options = []) {
$settings = $this->get_settings_for_display();
$field = isset($settings['field']) ? sanitize_key((string)$settings['field']) : '';
$format = isset($settings['format']) ? (string)$settings['format'] : 'raw';
$fallback = isset($settings['fallback']) ? (string)$settings['fallback'] : '';
if ($field === '' || !array_key_exists($field, FRESH_OnOffice_Field_Registry::field_definitions())) {
return $fallback;
}
$post_id = get_the_ID();
if (!$post_id) {
global $post;
$post_id = ($post instanceof WP_Post) ? (int)$post->ID : 0;
}
if (!$post_id) return $fallback;
$value = get_post_meta($post_id, $field, true);
if ($value === '' || $value === null) return $fallback;
if (is_array($value)) {
$value = implode(', ', array_map(static function ($item) {
return is_scalar($item) ? (string)$item : '';
}, $value));
}
if ($format === 'price' && is_numeric($value)) {
return number_format_i18n((float)$value, 0) . ' €';
}
if ($format === 'sqm' && is_numeric($value)) {
$decimals = ((float)$value == (int)$value) ? 0 : 1;
return number_format_i18n((float)$value, $decimals) . ' m²';
}
if ($format === 'number' && is_numeric($value)) {
$decimals = ((float)$value == (int)$value) ? 0 : 1;
return number_format_i18n((float)$value, $decimals);
}
if ($format === 'yesno') {
return filter_var($value, FILTER_VALIDATE_BOOLEAN) || (string)$value === '1' ? 'Ja' : 'Nein';
}
if ($format === 'raw' && is_numeric($value)) {
$definitions = FRESH_OnOffice_Field_Registry::field_definitions();
$type = $definitions[$field][1] ?? '';
if ($type === 'number') {
$number = (float)$value;
if ((float)(int)$number === $number) return (string)(int)$number;
return rtrim(rtrim(number_format($number, 2, '.', ''), '0'), '.');
}
}
return is_scalar($value) ? (string)$value : $fallback;
}
}