OpenNIT

Quelltext des aktuellen Standes

Fassung 1.1.1

class-shortcodes.php

13 KB
<?php

if (!defined('ABSPATH')) {
    exit;
}

/**
 * WordPress Shortcodes für das OpenNIT
 *
 * Shortcodes:
 *   [opennit_loan_devices]  – Alles-in-einem: Meine Leihen + Geräteliste + Anfrageformular
 *   [opennit_assets]        – Meine zugewiesenen IT-Geräte
 */
class OpenNIT_Shortcodes {

    public function register(): void {
        add_shortcode('opennit_loan_devices', [$this, 'render_loan_devices']);
        add_shortcode('opennit_assets',       [$this, 'render_my_assets']);
        add_shortcode('opennit_ticket_form',  [$this, 'render_ticket_form']);
        add_shortcode('opennit_my_tickets',   [$this, 'render_my_tickets']);
        add_shortcode('opennit_wiki',         [$this, 'render_wiki']);
    }

    // ----------------------------------------------------------------
    // [opennit_loan_devices]
    // ----------------------------------------------------------------

    public function render_loan_devices($atts = []): string {
        if (!is_user_logged_in()) {
            return '<div class="opennit-notice opennit-notice-info">Bitte melden Sie sich an, um die Leihgeräte zu sehen.</div>';
        }

        $client = new OpenNIT_ApiClient();
        $user   = wp_get_current_user();
        $email  = $user->user_email;

        // Gerätetypen, Leihen + Konfiguration laden
        $types_result   = $client->get_device_types();
        $devices_result = $client->get_loan_devices();
        $loans_result   = $client->get_my_loans($email);
        $config_result  = $client->get_config();

        $device_types = [];
        $devices      = [];
        $my_loans     = [];

        if (!is_wp_error($types_result) && !empty($types_result['types'])) {
            $device_types = $types_result['types'];
        }
        if (!is_wp_error($devices_result) && !empty($devices_result['devices'])) {
            $devices = $devices_result['devices'];
        }
        if (!is_wp_error($loans_result) && !empty($loans_result['loans'])) {
            $my_loans = $loans_result['loans'];
        }

        $texts = (!is_wp_error($config_result) ? ($config_result['texts'] ?? []) : []);

        $text_reservation_success  = $texts['reservation_success']  ?? 'Erfolgreich reserviert. Zur Abholung vereinbaren Sie bitte mit der IT-Abteilung einen Termin.';
        $text_request_success      = $texts['request_success']      ?? 'Ihre Anfrage wurde übermittelt. Die Freigabe erfolgt durch das IT-Team – Sie erhalten anschließend eine E-Mail.';
        $text_available            = $texts['available']            ?? 'Verfügbar';
        $text_contact_it           = $texts['contact_it']           ?? 'Bitte IT-Team direkt kontaktieren';
        $text_request              = $texts['request']              ?? 'Anfragen';
        $text_cancel               = $texts['cancel']               ?? 'Stornieren';
        $text_my_loans             = $texts['my_loans']             ?? 'Meine Leihen';
        $text_loan_devices         = $texts['loan_devices']         ?? 'Leihgeräte';
        $text_error_too_far_ahead  = $texts['error_too_far_ahead']  ?? 'Das gewählte Datum liegt zu weit in der Zukunft. Bitte wählen Sie einen früheren Zeitraum.';
        $text_error_too_long       = $texts['error_too_long']       ?? 'Der gewählte Zeitraum ist zu lang. Bitte wählen Sie einen kürzeren Zeitraum.';
        $max_advance_days          = (int)((!is_wp_error($config_result) ? ($config_result['max_advance_days'] ?? 90) : 90));
        $max_duration_days         = (int)((!is_wp_error($config_result) ? ($config_result['max_duration_days'] ?? 14) : 14));

        // API-Basis-URL für AJAX-Abrufe (Verfügbarkeitsprüfung)
        $api_base_url = rtrim((string)get_option('opennit_api_url', ''), '/');
        $api_token    = (string)get_option('opennit_api_token', '');

        // Nonce für AJAX
        $nonce = wp_create_nonce('opennit_nonce');

        ob_start();
        include OPENNIT_PLUGIN_DIR . 'templates/loan-devices.php';
        return ob_get_clean();
    }

    // ----------------------------------------------------------------
    // [opennit_assets]
    // ----------------------------------------------------------------

    public function render_my_assets($atts = []): string {
        if (!is_user_logged_in()) {
            return '<div class="opennit-notice opennit-notice-info">Bitte melden Sie sich an, um Ihre Geräte zu sehen.</div>';
        }

        $atts = is_array($atts) ? $atts : [];
        $atts = shortcode_atts(['ticket_page' => ''], $atts);

        $client = new OpenNIT_ApiClient();
        $user   = wp_get_current_user();
        $email  = $user->user_email;

        $result        = $client->get_my_assets($email);
        $config_result = $client->get_config();

        $assets = [];
        if (!is_wp_error($result) && !empty($result['assets'])) {
            $assets = $result['assets'];
        }

        $texts           = (!is_wp_error($config_result) ? ($config_result['texts'] ?? []) : []);
        $text_no_devices = $texts['no_devices'] ?? 'Ihnen sind aktuell keine Geräte zugewiesen.';
        $text_email_hint = $texts['email_hint'] ?? 'Hinweis: Ihre E-Mail-Adresse muss im IT-System hinterlegt sein, damit Geräte hier angezeigt werden.';

        // Ticket-Seiten-URL: Shortcode-Attribut hat Vorrang, dann Admin-Einstellung
        $ticket_page_url = !empty($atts['ticket_page'])
            ? esc_url($atts['ticket_page'])
            : esc_url((string)get_option('opennit_ticket_page_url', ''));

        ob_start();
        include OPENNIT_PLUGIN_DIR . 'templates/my-assets.php';
        return ob_get_clean();
    }

    // ----------------------------------------------------------------
    // [opennit_ticket_form]
    // ----------------------------------------------------------------

    public function render_ticket_form($atts = []): string {
        $client        = new OpenNIT_ApiClient();
        $config_result = $client->get_config();
        $texts         = (!is_wp_error($config_result) ? ($config_result['texts'] ?? []) : []);

        $text_form_title      = $texts['ticket_form_title']     ?? 'IT-Ticket erstellen';
        $text_submit_label    = $texts['ticket_submit_label']   ?? 'Ticket absenden';
        $text_success         = $texts['ticket_success']        ?? 'Ihr Ticket wurde erfolgreich übermittelt. Das IT-Team wird sich darum kümmern.';
        $text_login_required  = $texts['ticket_login_required'] ?? 'Bitte melden Sie sich an, um ein Ticket zu erstellen.';
        $text_subject_ph      = $texts['ticket_subject_ph']     ?? 'Kurze Beschreibung des Problems…';
        $text_desc_ph         = $texts['ticket_desc_ph']        ?? 'Beschreiben Sie das Problem so genau wie möglich…';
        $text_attachment_hint = $texts['ticket_attachment_hint']?? 'Optional: Screenshot oder Fehlerbeschreibung anhängen (max. 10 MB, Bild oder PDF).';

        if (!is_user_logged_in()) {
            return '<div class="opennit-notice opennit-notice-info">' . esc_html($text_login_required) . '</div>';
        }

        $user   = wp_get_current_user();

        $locations_result  = $client->get_ticket_locations();
        $categories_result = $client->get_ticket_categories();
        $assets_result     = $client->get_my_assets($user->user_email);

        $locations  = [];
        $categories = [];
        $my_assets  = [];
        $api_error  = '';

        if (!is_wp_error($locations_result) && !empty($locations_result['locations'])) {
            $locations = $locations_result['locations'];
        } elseif (is_wp_error($locations_result)) {
            $api_error = 'Standorte: ' . $locations_result->get_error_message()
                . ' (' . $locations_result->get_error_code() . ')';
        } elseif (!is_wp_error($locations_result) && isset($locations_result['locations']) && empty($locations_result['locations'])) {
            $api_error = 'Standorte: API antwortet mit HTTP 200, aber die Liste ist leer. '
                . 'Bitte unter Admin → Tickets → Standorte Einträge anlegen.';
        }

        if (!is_wp_error($categories_result) && !empty($categories_result['categories'])) {
            $categories = $categories_result['categories'];
        } elseif (is_wp_error($categories_result) && $api_error === '') {
            $api_error = 'Kategorien: ' . $categories_result->get_error_message()
                . ' (' . $categories_result->get_error_code() . ')';
        } elseif (!is_wp_error($categories_result) && isset($categories_result['categories']) && empty($categories_result['categories']) && $api_error === '') {
            $api_error = 'Kategorien: API antwortet mit HTTP 200, aber die Liste ist leer. '
                . 'Bitte unter Admin → Tickets → Kategorien Einträge anlegen.';
        }

        if (!is_wp_error($assets_result) && !empty($assets_result['assets'])) {
            $my_assets = $assets_result['assets'];
        }

        $user_name  = $user->display_name;
        $user_email = $user->user_email;
        $nonce      = wp_create_nonce('opennit_nonce');

        // Asset-Vorauswahl via URL-Parameter (z. B. vom "Ticket melden"-Button in [opennit_assets])
        $preselect_asset_id = isset($_GET['opennit_asset_id']) ? intval($_GET['opennit_asset_id']) : 0;

        ob_start();
        include OPENNIT_PLUGIN_DIR . 'templates/ticket-form.php';
        return ob_get_clean();
    }

    // ----------------------------------------------------------------
    // [opennit_wiki] / [opennit_wiki topic="5"]
    // ----------------------------------------------------------------

    public function render_wiki($atts = []): string {
        $atts          = shortcode_atts(['topic' => ''], is_array($atts) ? $atts : []);
        $wiki          = new OpenNIT_Wiki();
        $client        = new OpenNIT_ApiClient();
        $config_result = $client->get_config();
        $texts         = (!is_wp_error($config_result) ? ($config_result['texts'] ?? []) : []);

        $text_wiki_empty           = $texts['wiki_empty']           ?? 'Keine Themen verfügbar.';
        $text_wiki_no_pages        = $texts['wiki_no_pages']        ?? 'Dieses Thema enthält noch keine Seiten.';
        $text_wiki_subtopics_label = $texts['wiki_subtopics_label'] ?? 'Unterthemen';
        $text_wiki_pages_label     = $texts['wiki_pages_label']     ?? 'Seiten';
        $text_wiki_back_label      = $texts['wiki_back_label']      ?? 'Übersicht';

        // URL-Parameter: Topic und optional Einzel-Seite
        $topic_id = isset($_GET['opennit_topic']) ? (int)$_GET['opennit_topic'] : (int)$atts['topic'];
        $page_id  = isset($_GET['opennit_page'])  ? (int)$_GET['opennit_page']  : 0;

        $current_page = null;
        $topic_data   = [];
        $sub_topics   = [];
        $topics       = [];

        if ($topic_id > 0) {
            $topic_result  = $wiki->get_topic_pages($topic_id);
            $topics_result = $wiki->get_topics();

            if (is_wp_error($topic_result)) {
                return '<div class="opennit-wiki-error">' . esc_html($topic_result->get_error_message()) . '</div>';
            }

            $all_topics = !is_wp_error($topics_result) ? ($topics_result['topics'] ?? []) : [];
            $sub_topics = array_values(array_filter(
                $all_topics,
                fn($t) => (int)($t['parent_id'] ?? -999) === $topic_id
            ));

            $topic_data = $topic_result;

            if ($page_id > 0) {
                // Einzel-Seite anzeigen
                foreach ($topic_result['pages'] ?? [] as $p) {
                    if ((int)$p['id'] === $page_id) {
                        $current_page = $p;
                        break;
                    }
                }
                $mode = 'page';
            } else {
                $mode = 'topic';
            }
        } else {
            $topics_result = $wiki->get_topics();

            if (is_wp_error($topics_result)) {
                return '<div class="opennit-wiki-error">' . esc_html($topics_result->get_error_message()) . '</div>';
            }

            $mode   = 'index';
            $topics = $topics_result['topics'] ?? [];
        }

        $root_topic_id = (int)$atts['topic']; // 0 = globale Wiki, >0 = fixierter Einstieg

        ob_start();
        include OPENNIT_PLUGIN_DIR . 'templates/wiki.php';
        return ob_get_clean();
    }

    // ----------------------------------------------------------------
    // [opennit_my_tickets]
    // ----------------------------------------------------------------

    public function render_my_tickets($atts = []): string {
        $client        = new OpenNIT_ApiClient();
        $config_result = $client->get_config();
        $texts         = (!is_wp_error($config_result) ? ($config_result['texts'] ?? []) : []);

        $text_my_title    = $texts['ticket_my_title']    ?? 'Meine Tickets';
        $text_no_tickets  = $texts['ticket_no_tickets']  ?? 'Sie haben noch keine Tickets erstellt.';
        $text_login_required = $texts['ticket_login_required'] ?? 'Bitte melden Sie sich an, um Ihre Tickets zu sehen.';

        if (!is_user_logged_in()) {
            return '<div class="opennit-notice opennit-notice-info">' . esc_html($text_login_required) . '</div>';
        }

        $user    = wp_get_current_user();
        $email   = $user->user_email;
        $result  = $client->get_my_tickets($email, 15);

        $tickets = [];
        if (!is_wp_error($result) && !empty($result['tickets'])) {
            $tickets = $result['tickets'];
        }

        ob_start();
        include OPENNIT_PLUGIN_DIR . 'templates/my-tickets.php';
        return ob_get_clean();
    }
}