106 lines
4.0 KiB
PHP
106 lines
4.0 KiB
PHP
<?php
|
|
if (!defined('ABSPATH')) exit;
|
|
|
|
class WMF_Form_Processor {
|
|
private static $instance=null;
|
|
public static function instance() {
|
|
if(is_null(self::$instance)){self::$instance=new self();self::$instance->hook();}
|
|
return self::$instance;
|
|
}
|
|
public function hook() {
|
|
add_action('init',array($this,'maybe_process'),20);
|
|
}
|
|
public function maybe_process() {
|
|
if(empty($_POST['wmf_action'])||$_POST['wmf_action']!=='submit') return;
|
|
if(empty($_POST['wmf_form_id'])) return;
|
|
if(!session_id()) session_start();
|
|
|
|
$form_id=intval($_POST['wmf_form_id']);
|
|
if(!wp_verify_nonce($_POST['wmf_nonce']??'','wmf_submit_'.$form_id)) {
|
|
$this->fail($form_id,'Sicherheitsüberprüfung fehlgeschlagen.'); return;
|
|
}
|
|
$form=get_post($form_id);
|
|
if(!$form||$form->post_type!=='wmf-form') return;
|
|
|
|
$meta = wmf_get_form_meta($form_id);
|
|
$fields = $meta['fields']??array();
|
|
|
|
// Honeypot prüfen
|
|
if(!empty($meta['honeypot_enabled'])&&$meta['honeypot_enabled']==='1') {
|
|
if(!empty($_POST['wmf_hp_'.md5($form_id)])) { $this->ok($form_id,$meta); return; } // stille Ablehnung
|
|
}
|
|
|
|
// Werte sammeln + validieren
|
|
$values=array(); $errors=array();
|
|
foreach($fields as $field) {
|
|
$type=$field['type']??'';
|
|
$obj=wmf_get_field($type);
|
|
if(!$obj) continue;
|
|
if(in_array($type,array('html','divider'))) continue;
|
|
|
|
$raw=$_POST['wmf_fields'][$field['id']]??'';
|
|
$val=$obj->sanitize($raw,$field);
|
|
$valid=$obj->validate($val,$field);
|
|
$values[$field['id']]=$val;
|
|
if($valid!==true) $errors[$field['id']]=$valid;
|
|
}
|
|
|
|
// Datei-Uploads
|
|
$file_values=array();
|
|
if(!empty($_FILES['wmf_files'])) {
|
|
foreach($fields as $field) {
|
|
if(($field['type']??'')!=='file') continue;
|
|
$uploaded=WMF_Field_File::handle_upload($field,$form_id);
|
|
if(!empty($uploaded)) $file_values[$field['id']]=$uploaded;
|
|
// Validierung nochmal mit Upload-Ergebnis
|
|
$valid=wmf_get_field('file')->validate('',$field);
|
|
if($valid!==true&&!isset($errors[$field['id']])) $errors[$field['id']]=$valid;
|
|
}
|
|
}
|
|
|
|
if(!empty($errors)) {
|
|
$_SESSION['wmf_values_'.$form_id]=$values;
|
|
$_SESSION['wmf_errors_'.$form_id]=$errors;
|
|
wp_redirect($this->current_url()); exit;
|
|
}
|
|
|
|
// Datei-URLs in Werte mergen
|
|
foreach($file_values as $fid=>$uploads) {
|
|
$urls=array_map(fn($u)=>$u['url'],$uploads);
|
|
$values[$fid]=implode(', ',$urls);
|
|
}
|
|
|
|
// Speichern
|
|
$submission_id=null;
|
|
if(!empty($meta['save_submissions'])&&$meta['save_submissions']==='1') {
|
|
$submission_id=WMF_Submission::save($form_id,$values);
|
|
}
|
|
|
|
// E-Mails
|
|
if(!empty($meta['notify_admin'])&&$meta['notify_admin']==='1') {
|
|
WMF_Mailer::notify_admin($form_id,$meta,$fields,$values,$file_values);
|
|
}
|
|
if(!empty($meta['notify_sender'])&&$meta['notify_sender']==='1') {
|
|
WMF_Mailer::notify_sender($form_id,$meta,$fields,$values);
|
|
}
|
|
|
|
do_action('wmf_form_submitted',$form_id,$meta,$fields,$values,$submission_id);
|
|
$this->ok($form_id,$meta);
|
|
}
|
|
|
|
private function ok($form_id,$meta) {
|
|
if(!empty($meta['redirect_url'])) { wp_redirect(esc_url_raw($meta['redirect_url'])); exit; }
|
|
if(!session_id()) session_start();
|
|
$_SESSION['wmf_success_'.$form_id]=true;
|
|
wp_redirect($this->current_url()); exit;
|
|
}
|
|
private function fail($form_id,$msg) {
|
|
if(!session_id()) session_start();
|
|
$_SESSION['wmf_errors_'.$form_id]=array('_global'=>$msg);
|
|
wp_redirect($this->current_url()); exit;
|
|
}
|
|
private function current_url() {
|
|
return (is_ssl()?'https':'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
|
|
}
|
|
}
|