Home / Admin / PHP-snippet: registratie lessen verwerken en AJAX endpoint
Duplicate Snippet

Embed Snippet on Your Site

PHP-snippet: registratie lessen verwerken en AJAX endpoint

Code Preview
php
<?php
// Configuratie
function get_parameters_36(): array {
    return [
        "target_page_slug" => "lesrooster-evenemententeam-2025",
        "tablepress_table_id" => 36
    ];
}
/**
 * Probeer een (Nederlandse) datum-string te parsen naar een DateTime in Europe/Amsterdam.
 * Retourneert DateTime of false als parsing mislukt.
 */
function etb_parse_datum_to_datetime($datum) {
    $tz = new DateTimeZone('Europe/Amsterdam');
    $s = trim((string)$datum);
    $s = preg_replace(
        '/^\s*(?:maandag|dinsdag|woensdag|donderdag|vrijdag|zaterdag|zondag|ma|di|wo|do|vr|za|zo)\.?[\s,:-]*/i',
        '',
        $s
    );
    $months = [
        'januari'=>'January','februari'=>'February','maart'=>'March','april'=>'April','mei'=>'May','juni'=>'June',
        'juli'=>'July','augustus'=>'August','september'=>'September','oktober'=>'October','november'=>'November','december'=>'December',
        'jan'=>'January','feb'=>'February','mrt'=>'March','apr'=>'April','jun'=>'June','jul'=>'July','aug'=>'August',
        'sep'=>'September','sept'=>'September','okt'=>'October','nov'=>'November','dec'=>'December'
    ];
    foreach ($months as $nl => $en) {
        $s = preg_replace('/\b' . preg_quote($nl, '/') . '\b/i', $en, $s);
    }
    $ts = strtotime($s);
    if ($ts !== false && $ts > 0) {
        $dt = new DateTime('@' . $ts);
        $dt->setTimezone($tz);
        return $dt;
    }
    $formats = ['d-m-Y','d/m/Y','d F Y','j F Y','d M Y','j M Y','Y-m-d','d-m'];
    foreach ($formats as $fmt) {
        $d = DateTime::createFromFormat($fmt, $s, $tz);
        if ($d !== false) return $d;
    }
    if (preg_match('/(\d{1,2})\D+(\d{1,2})(?:\D+(\d{2,4}))?/', $s, $m)) {
        $day = intval($m[1]);
        $mon = intval($m[2]);
        $yr  = isset($m[3]) && $m[3] !== '' ? intval($m[3]) : intval(date('Y'));
        if ($yr < 100) $yr += 2000;
        try {
            return new DateTime(sprintf('%04d-%02d-%02d', $yr, $mon, $day), $tz);
        } catch (Exception $e) {}
    }
    return false;
}
// AJAX registratie verwerken
add_action('wp_ajax_registreer_lesrooster', function() {
    check_ajax_referer('lesrooster_registratie', 'nonce');
    if (!is_user_logged_in()) wp_send_json_error('Niet ingelogd');
    $row_index = intval($_POST['row_index'] ?? -1);
    if ($row_index < 1) wp_send_json_error('Ongeldige rij');
    $user = wp_get_current_user();
    $full_name = trim($user->first_name . ' ' . $user->last_name);
    if (empty($full_name)) $full_name = $user->display_name;
    $username = esc_html($full_name);
    $table_id = get_parameters_36()['tablepress_table_id']; 
    $table = TablePress::$model_table->load($table_id, true);
    if (is_wp_error($table)) wp_send_json_error('Tabel niet gevonden');
    $col_opg = 2; // Kolom 3 = Opgegeven
    $row = $table['data'][$row_index] ?? null;
    if (!$row) wp_send_json_error('Rij niet gevonden');
    $current = trim($row[$col_opg] ?? '');
    $table['data'][$row_index][$col_opg] = $current === '' ? $username : $current . "\n" . $username;
    TablePress::$model_table->save($table);
    $datum_raw = strip_tags(trim($row[0] ?? ''));
    $dt = etb_parse_datum_to_datetime($datum_raw);
    if (!$dt) wp_send_json_error("Ongeldige datum: $datum_raw");
    $dagen = ['zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'];
    $maanden = [1=>'januari','februari','maart','april','mei','juni','juli','augustus','september','oktober','november','december'];
    $dagnaam = ucfirst($dagen[(int)$dt->format('w')]);
    $volledige_datum = $dagnaam . ' ' . $dt->format('j') . ' ' . $maanden[(int)$dt->format('n')] . ' ' . $dt->format('Y');
    $to = $user->user_email;
    $ccs = ['[email protected]','[email protected]'];
    $subject = "Bevestiging registratie voor $volledige_datum";
    // Mailtekst inclusief tijd en locatie
    $message = "Beste $username,\n\n";
    $message .= "Je bent succesvol geregistreerd voor de lesavond op $volledige_datum van 19:30 tot 22:00 uur.\n";
    $message .= "Locatie: 't Web, Zuringveld 1, 4847 KS Teteringen.\n\n";
    $message .= "📅 Voeg dit evenement toe aan je agenda met het bijgevoegde bestand (dubbelklik op 'lesavond.ics').\n\n";
    $message .= "Bedankt voor je aanmelding!\n\n";
    $message .= "Met vriendelijke groet,\nLedensecretariaat EHBO Evenemententeam Breda";
    // ICS-bestand vereenvoudigd
    $upload_dir = wp_upload_dir();
    $ics_file = $upload_dir['basedir'] . '/lesavond-' . uniqid() . '.ics';
    $event_location = "'t Web, Zuringveld 1, 4847 KS Teteringen";
    $start = clone $dt; $start->setTime(19,30,0);
    $end   = clone $dt; $end->setTime(22,0,0);
    $ics_content = "BEGIN:VCALENDAR\r\n";
    $ics_content .= "VERSION:2.0\r\n";
    $ics_content .= "PRODID:-//ETB Evenemententeam Breda//NL\r\n";
    $ics_content .= "CALSCALE:GREGORIAN\r\n";
    $ics_content .= "BEGIN:VEVENT\r\n";
    $ics_content .= "UID:" . uniqid() . "@etb-evenemententeam.nl\r\n";
    $ics_content .= "DTSTAMP:" . gmdate('Ymd\THis\Z') . "\r\n";
    $ics_content .= "DTSTART;TZID=Europe/Amsterdam:" . $start->format('Ymd\THis') . "\r\n";
    $ics_content .= "DTEND;TZID=Europe/Amsterdam:"   . $end->format('Ymd\THis') . "\r\n";
    $ics_content .= "SUMMARY:Lesavond EHBO\r\n";
    $ics_content .= "DESCRIPTION:Lesavond EHBO\r\n";
    $ics_content .= "LOCATION:" . addslashes($event_location) . "\r\n";
    $ics_content .= "END:VEVENT\r\n";
    $ics_content .= "END:VCALENDAR\r\n";
    file_put_contents($ics_file, $ics_content);
    $headers = [
        'Cc: ' . implode(',', $ccs),
        'Content-Type: text/plain; charset=UTF-8'
    ];
    wp_mail($to, $subject, $message, $headers, [$ics_file]);
    if(file_exists($ics_file)) @unlink($ics_file);
    wp_send_json_success($table['data'][$row_index][$col_opg]);
});
// JS en nonce
add_action('wp_enqueue_scripts', function() {
    $params = get_parameters_36();
    if (!is_page($params['target_page_slug'])) return;
    wp_enqueue_script(
        'lesrooster-registratie',
        get_stylesheet_directory_uri() . '/js/lesrooster-registratie.js',
        ['jquery'],
        '1.0',
        true
    );
    wp_localize_script('lesrooster-registratie', 'lesrooster_ajax', [
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('lesrooster_registratie')
    ]);
});

Comments

Add a Comment