Files
SemapForm/php/functions.php

219 lines
6.4 KiB
PHP

<?php
require_once 'config.php';
/**
* Validate email address
*/
function validateEmail($email) {
return preg_match(EMAIL_REGEX, $email);
}
/**
* Sanitize input string
*/
function sanitizeInput($input) {
return htmlspecialchars(trim($input), ENT_QUOTES, 'UTF-8');
}
/**
* Generate XML from form data
*/
function generateXML($data) {
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$root = $xml->createElement('form_submission');
$xml->appendChild($root);
// Static data
$static = $xml->createElement('static');
$root->appendChild($static);
foreach (['name', 'lastname', 'title', 'telno', 'mail', 'apparatsname', 'subject', 'semester', 'dauerapparat'] as $field) {
if (isset($data[$field])) {
$element = $xml->createElement($field, htmlspecialchars($data[$field]));
$static->appendChild($element);
}
}
if (!empty($data['message'])) {
$messageEl = $xml->createElement('message', htmlspecialchars($data['message']));
$static->appendChild($messageEl);
}
// Books
if (isset($data['books']) && is_array($data['books'])) {
$booksNode = $xml->createElement('books');
$root->appendChild($booksNode);
foreach ($data['books'] as $book) {
$bookNode = $xml->createElement('book');
$booksNode->appendChild($bookNode);
foreach (['authorname', 'year', 'title', 'signature'] as $field) {
$value = isset($book[$field]) ? htmlspecialchars($book[$field]) : '';
$fieldNode = $xml->createElement($field, $value);
$bookNode->appendChild($fieldNode);
}
}
}
return $xml->saveXML();
}
/**
* Generate XML for ELSA form
*/
function generateELSAXML($data) {
$xml = new DOMDocument('1.0', 'UTF-8');
$xml->formatOutput = true;
$root = $xml->createElement('elsa_submission');
$xml->appendChild($root);
// General info
$generalInfo = $xml->createElement('general_info');
$root->appendChild($generalInfo);
$generalFields = ['name', 'lastname', 'title', 'mail', 'subject', 'classname',
'usage_date_from', 'usage_date_to', 'availability_date'];
foreach ($generalFields as $field) {
if (isset($data[$field])) {
$element = $xml->createElement($field, htmlspecialchars($data[$field]));
$generalInfo->appendChild($element);
}
}
if (!empty($data['message'])) {
$messageEl = $xml->createElement('message', htmlspecialchars($data['message']));
$generalInfo->appendChild($messageEl);
}
// Media sections
$mediaRoot = $xml->createElement('media');
$root->appendChild($mediaRoot);
// Add different media types (monografie, zeitschrift, herausgeber)
$mediaTypes = [
'monografien' => $data['monografien'] ?? [],
'zeitschriftenartikel' => $data['zeitschriftenartikel'] ?? [],
'herausgeberwerke' => $data['herausgeberwerke'] ?? []
];
foreach ($mediaTypes as $type => $entries) {
if (!empty($entries)) {
$section = $xml->createElement($type);
$mediaRoot->appendChild($section);
foreach ($entries as $entry) {
$entryNode = $xml->createElement('entry');
$section->appendChild($entryNode);
foreach ($entry as $key => $value) {
$fieldNode = $xml->createElement($key, htmlspecialchars($value));
$entryNode->appendChild($fieldNode);
}
}
}
}
return $xml->saveXML();
}
/**
* Send email with XML attachment
* Uses PHP's mail() function or SMTP if configured
*/
function sendEmail($subject, $xmlContent, $toEmail = null) {
$to = $toEmail ?? MAIL_TO;
$from = MAIL_FROM;
if (!MAIL_ENABLED) {
// Log instead of sending
error_log("==========================================================");
error_log("MAIL SENDING DISABLED - Would have sent:");
error_log("From: " . $from);
error_log("To: " . $to);
error_log("Subject: " . $subject);
error_log("----------------------------------------------------------");
error_log($xmlContent);
error_log("==========================================================");
return true;
}
// Try using SMTP if credentials are configured
if (SMTP_USERNAME && SMTP_PASSWORD && class_exists('PHPMailer\PHPMailer\PHPMailer')) {
return sendEmailSMTP($subject, $xmlContent, $to, $from);
}
// Fallback to PHP mail()
$headers = "From: " . $from . "\r\n";
$headers .= "Content-Type: application/xml; charset=UTF-8\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
return mail($to, $subject, $xmlContent, $headers);
}
/**
* Send email via SMTP using PHPMailer (if available)
*/
function sendEmailSMTP($subject, $xmlContent, $to, $from) {
if (!class_exists('PHPMailer\PHPMailer\PHPMailer')) {
error_log("PHPMailer not available, falling back to mail()");
return false;
}
$mail = new PHPMailer\PHPMailer\PHPMailer(true);
try {
// Server settings
$mail->isSMTP();
$mail->Host = SMTP_HOST;
$mail->SMTPAuth = true;
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;
$mail->SMTPSecure = SMTP_ENCRYPTION;
$mail->Port = SMTP_PORT;
$mail->CharSet = 'UTF-8';
// Recipients
$mail->setFrom($from);
$mail->addAddress($to);
// Content
$mail->Subject = $subject;
$mail->Body = $xmlContent;
$mail->ContentType = 'application/xml';
$mail->send();
return true;
} catch (Exception $e) {
error_log("Email sending failed: " . $mail->ErrorInfo);
return false;
}
}
/**
* Redirect to URL
*/
function redirect($url) {
header("Location: " . $url);
exit;
}
/**
* Get POST value with default
*/
function post($key, $default = '') {
return isset($_POST[$key]) ? sanitizeInput($_POST[$key]) : $default;
}
/**
* Get all POST values matching a pattern (for arrays)
*/
function postArray($key) {
return isset($_POST[$key]) && is_array($_POST[$key]) ?
array_map('sanitizeInput', $_POST[$key]) : [];
}