hook();}
return self::$instance;
}
public function hook() {
add_action('admin_menu', array($this,'register_menu'));
add_action('admin_enqueue_scripts', array($this,'enqueue_assets'));
add_action('admin_init', array($this,'handle_actions'));
add_action('admin_notices', array($this,'admin_notices'));
}
public function register_menu() {
add_menu_page('WP Multi Formular','Formulare','manage_options','wp-multi-formular',
array($this,'page_router'),'dashicons-feedback',25);
add_submenu_page('wp-multi-formular','Alle Formulare','Alle Formulare','manage_options','wp-multi-formular',array($this,'page_router'));
add_submenu_page('wp-multi-formular','Neues Formular','+ Neues Formular','manage_options','wmf-new-form',array($this,'page_builder'));
// Neue Einreichungen zaehlen fuer Badge
$new_count = 0;
$forms = get_posts(array('post_type'=>'wmf-form','post_status'=>'publish','numberposts'=>-1,'fields'=>'ids'));
foreach($forms as $fid) $new_count += wmf_count_submissions($fid,'neu');
$badge = $new_count > 0 ? ' '.intval($new_count).'' : '';
add_submenu_page('wp-multi-formular','Einreichungen','Einreichungen'.$badge,'manage_options','wmf-submissions',array($this,'page_submissions'));
}
public function page_router() {
// Einzelne Einreichung anzeigen
if(!empty($_GET['view_submission']) && !empty($_GET['form_id'])) {
$sid = intval($_GET['view_submission']);
$form_id = intval($_GET['form_id']);
require WMF_TPL.'admin/page-submission-detail.php';
return;
}
// Einreichung löschen
if(!empty($_GET['wmf_action'])&&$_GET['wmf_action']==='delete_submission'&&!empty($_GET['submission_id'])) {
if(wp_verify_nonce($_GET['_wpnonce']??'','wmf_delete_submission')) {
WMF_Submission::delete(intval($_GET['submission_id']));
$this->safe_redirect(add_query_arg('wmf_notice','deleted',admin_url('admin.php?page=wmf-submissions')));
}
}
// CSV Export
if(!empty($_GET['wmf_action'])&&$_GET['wmf_action']==='export_csv'&&!empty($_GET['form_id'])) {
WMF_Submissions_List::maybe_export(intval($_GET['form_id']));
}
// Einreichungen anzeigen
if(!empty($_GET['view_submissions'])) {
$form_id=intval($_GET['view_submissions']);
require WMF_TPL.'admin/page-submissions.php'; return;
}
// Builder (Bearbeiten)
if(!empty($_GET['edit'])) {
require WMF_TPL.'admin/page-builder.php'; return;
}
require WMF_TPL.'admin/page-forms-list.php';
}
public function page_builder() {
require WMF_TPL.'admin/page-builder.php';
}
public function page_submissions() {
// Einzelne Einreichung anzeigen
if(!empty($_GET['view_submission']) && !empty($_GET['form_id'])) {
$sid = intval($_GET['view_submission']);
$form_id = intval($_GET['form_id']);
$form = get_post($form_id);
?>
Einreichung #
aus: post_title : ''); ?>
Einreichungen
'wmf-form',
'post_status' => 'publish',
'numberposts' => -1,
'orderby' => 'date',
'order' => 'DESC',
));
if(empty($forms)): ?>
Noch keine Formulare vorhanden
Erstellen Sie zuerst ein Formular und binden Sie es auf einer Seite ein.
Formular erstellen
| Formular |
Gesamt |
Neu |
Gelesen |
Archiviert |
Letzte Einreichung |
Aktionen |
ID);
$count_new = wmf_count_submissions($form->ID, 'neu');
$count_read = wmf_count_submissions($form->ID, 'gelesen');
$count_arch = wmf_count_submissions($form->ID, 'archiviert');
global $wpdb;
$last = $wpdb->get_var($wpdb->prepare(
"SELECT created_at FROM {$wpdb->prefix}wmf_submissions WHERE form_id=%d ORDER BY created_at DESC LIMIT 1",
$form->ID
));
$view_url = add_query_arg(array('page'=>'wmf-submissions','form_id'=>$form->ID), admin_url('admin.php'));
$export_url = WMF_Submissions_List::export_url($form->ID);
?>
|
post_title); ?>
ID)); ?>
|
|
0): ?>
0
|
|
|
|
Anzeigen
0): ?>
CSV
|
window.location.href=' . wp_json_encode($url) . ';';
echo '';
exit;
}
public function handle_actions() {
// Globale Einstellungen speichern (via admin-post.php)
add_action('admin_post_wmf_save_global_settings', array($this, 'save_global_settings'));
add_action('admin_post_wmf_update_submission_status', array($this, 'update_submission_status'));
if(empty($_POST['wmf_admin_action'])||!current_user_can('manage_options')) return;
if($_POST['wmf_admin_action']==='save_form') {
check_admin_referer('wmf_save_form'); $this->save_form();
}
if($_POST['wmf_admin_action']==='delete_form'&&!empty($_POST['form_id'])) {
check_admin_referer('wmf_delete_form_'.intval($_POST['form_id']));
wp_delete_post(intval($_POST['form_id']),true);
$this->safe_redirect(add_query_arg('wmf_notice','form_deleted',admin_url('admin.php?page=wp-multi-formular')));
}
}
private function save_form() {
$form_id=intval($_POST['form_id']??0);
$title=sanitize_text_field($_POST['form_title']??'Neues Formular');
$fields_raw=stripslashes($_POST['wmf_form_fields']??'[]');
$fields=json_decode($fields_raw,true);
if(!is_array($fields)) $fields=array();
// Felder bereinigen
$clean_fields=array();
foreach($fields as $f) {
if(empty($f['id'])||empty($f['type'])) continue;
$f['name']=sanitize_key($f['name']??$f['id']);
$f['label']=sanitize_text_field($f['label']??'');
$f['placeholder']=sanitize_text_field($f['placeholder']??'');
$f['description']=sanitize_text_field($f['description']??'');
$f['required']=in_array($f['required']??'0',array('0','1'))?$f['required']:'0';
$f['width']=in_array($f['width']??'full',array('full','half','third'))?$f['width']:'full';
$clean_fields[]=$f;
}
$step_labels=array();
if(!empty($_POST['step_labels'])&&is_array($_POST['step_labels'])) {
$step_labels=array_map('sanitize_text_field',$_POST['step_labels']);
}
$data=array(
'fields' => $clean_fields,
'submit_label' => sanitize_text_field($_POST['submit_label']??'Absenden'),
'success_message' => sanitize_textarea_field($_POST['success_message']??''),
'error_message' => sanitize_textarea_field($_POST['error_message']??''),
'notify_admin' => !empty($_POST['notify_admin'])?'1':'0',
'admin_email' => sanitize_email($_POST['admin_email']??''),
'admin_subject' => sanitize_text_field($_POST['admin_subject']??''),
'admin_reply_to' => !empty($_POST['admin_reply_to'])?'1':'0',
'notify_sender' => !empty($_POST['notify_sender'])?'1':'0',
'sender_subject' => sanitize_text_field($_POST['sender_subject']??''),
'sender_message' => sanitize_textarea_field($_POST['sender_message']??''),
'from_name' => sanitize_text_field($_POST['from_name']??''),
'from_email' => sanitize_email($_POST['from_email']??''),
'save_submissions' => !empty($_POST['save_submissions'])?'1':'0',
'recaptcha_enabled' => !empty($_POST['recaptcha_enabled'])?'1':'0',
'honeypot_enabled' => !empty($_POST['honeypot_enabled'])?'1':'0',
'redirect_url' => esc_url_raw($_POST['redirect_url']??''),
'css_class' => sanitize_html_class($_POST['css_class']??''),
'multi_step' => !empty($_POST['multi_step'])?'1':'0',
'step_labels' => $step_labels,
'show_progress' => !empty($_POST['show_progress'])?'1':'0',
);
if($form_id) {
wp_update_post(array('ID'=>$form_id,'post_title'=>$title,'post_status'=>'publish'));
} else {
$form_id=wp_insert_post(array('post_type'=>'wmf-form','post_title'=>$title,'post_status'=>'publish'));
}
wmf_save_form_meta($form_id,$data);
$this->safe_redirect(add_query_arg(array('page'=>'wp-multi-formular','edit'=>$form_id,'wmf_notice'=>'saved'),admin_url('admin.php')));
}
public function admin_notices() {
$n=$_GET['wmf_notice']??'';
$msgs=array('saved'=>array('success','Formular gespeichert.'),'deleted'=>array('success','Einreichung gelöscht.'),'form_deleted'=>array('success','Formular gelöscht.'),'global_saved'=>array('success','Globale E-Mail-Einstellungen gespeichert.'));
if(isset($msgs[$n])) printf('',esc_attr($msgs[$n][0]),esc_html($msgs[$n][1]));
}
public function enqueue_assets($hook) {
$page=$_GET['page']??'';
if(!in_array($page,array('wp-multi-formular','wmf-new-form','wmf-integrations'))&&strpos($hook,'wmf')=== false) return;
wp_enqueue_style('wmf-admin',WMF_URL.'assets/css/admin.css',array(),WMF_VERSION);
wp_enqueue_script('wmf-admin',WMF_URL.'assets/js/admin.js',array('jquery','jquery-ui-sortable','jquery-ui-draggable'),WMF_VERSION,true);
wp_enqueue_style('dashicons');
wp_localize_script('wmf-admin','WMF',array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('wmf_admin'),
'fields' => $this->fields_for_js(),
'i18n' => array(
'confirm_delete' => 'Feld wirklich löschen?',
'confirm_delete_form' => 'Formular und alle Einreichungen wirklich löschen?',
'no_label' => '(kein Titel)',
'loading' => 'Lade …',
'preview' => 'Vorschau',
'close_preview' => 'Vorschau schließen',
),
));
}
public function update_submission_status() {
if(!wp_verify_nonce($_POST['_wpnonce'] ?? '', 'wmf_update_status') || !current_user_can('manage_options')) wp_die('Fehler.');
$sid = intval($_POST['submission_id'] ?? 0);
$status = sanitize_text_field($_POST['status'] ?? 'neu');
$form_id = intval($_POST['form_id'] ?? 0);
$redirect = esc_url_raw($_POST['redirect_url'] ?? admin_url('admin.php?page=wp-multi-formular'));
if($sid && in_array($status, array('neu','gelesen','archiviert'))) {
WMF_Submission::update_status($sid, $status);
}
$this->safe_redirect($redirect);
}
public function save_global_settings() {
if(!wp_verify_nonce($_POST['wmf_global_nonce'] ?? '', 'wmf_global_settings_save')) {
wp_die('Sicherheitsfehler.');
}
if(!current_user_can('manage_options')) wp_die('Keine Berechtigung.');
$settings = array(
'from_name' => sanitize_text_field($_POST['wmf_from_name'] ?? ''),
'from_email' => sanitize_email( $_POST['wmf_from_email'] ?? ''),
'smtp_enabled' => !empty($_POST['wmf_smtp_enabled']) ? '1' : '0',
'smtp_host' => sanitize_text_field($_POST['wmf_smtp_host'] ?? ''),
'smtp_port' => intval( $_POST['wmf_smtp_port'] ?? 587),
'smtp_enc' => sanitize_text_field($_POST['wmf_smtp_enc'] ?? 'tls'),
'smtp_user' => sanitize_text_field($_POST['wmf_smtp_user'] ?? ''),
'smtp_pass' => $_POST['wmf_smtp_pass'] ?? '', // Passwort nicht strippen
);
update_option('wmf_global_settings', $settings);
$this->safe_redirect(add_query_arg(array('page'=>'wmf-integrations','wmf_notice'=>'global_saved'), admin_url('admin.php')));
}
private function fields_for_js() {
$r=array();
foreach(wmf_get_fields() as $type=>$f) {
$r[]=array('type'=>$type,'label'=>$f->label,'icon'=>$f->icon,'category'=>$f->category,'defaults'=>$f->defaults());
}
return $r;
}
}