Quelltext des aktuellen Standes
<?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();
}
}