diff options
Diffstat (limited to 'views/mods')
| -rw-r--r-- | views/mods/mod_revocation/page_form.phtml | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/views/mods/mod_revocation/page_form.phtml b/views/mods/mod_revocation/page_form.phtml new file mode 100644 index 0000000..daa8eff --- /dev/null +++ b/views/mods/mod_revocation/page_form.phtml @@ -0,0 +1,191 @@ +<?php + + declare(strict_types=1); + + /** + * Eigenständige Widerrufsformular-Seite (kein Popup). + * Wird von wpsgRevocation\Action::content_filter() auf der Seite + * mit der Option wpsg_page_widerrufsformular gerendert. + * + * @author: Claude + */ + + namespace wpsgRevocation; + + use wpsg_ShopController; + + $arReason = Revocation::getReasons(); + + // Vorbelegung des Kontaktfeldes für eingeloggte Kunden + $contact_email = ''; + $customer_login_id = intval(\wpsg_ShopController::getShop()->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn')); + + if ($customer_login_id > 0) { + + $oCustomer = \wpsg_customer::getInstance($customer_login_id); + $contact_email = $oCustomer->getEmail(); + + } + + // Vorbelegung über GET-Parameter (z.B. aus Verlinkung in der Bestellbestätigungsmail) + $get_order = isset($_GET['wpsg_revo_order']) ? \sanitize_text_field($_GET['wpsg_revo_order']) : ''; + $get_product = isset($_GET['wpsg_revo_product']) ? \sanitize_text_field($_GET['wpsg_revo_product']) : ''; + $get_amount = isset($_GET['wpsg_revo_amount']) ? max(1, intval($_GET['wpsg_revo_amount'])) : 1; + $get_contact = isset($_GET['wpsg_revo_contact']) ? \sanitize_email($_GET['wpsg_revo_contact']) : ''; + + if ($contact_email === '' && $get_contact !== '' && \is_email($get_contact)) $contact_email = $get_contact; + + $key = 0; + +?> + +<div class="wpsg wpsg_revocation_page"> + + <form id="wpsg_revocation_page_form" class="wpsg"> + + <div id="wpsg_revocation_page_msg"></div> + + <fieldset class="wpsg_revocation_order_product"> + + <div class="form_field"> + <div class="label"><?php echo \__('Artikel - Nr.', 'wpsgRevocation'); ?></div> + <div class="value"> + <input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][product_nr]" value="<?php echo \esc_attr($get_product); ?>" /> + </div> + </div> + + <div class="form_field"> + <div class="label"><?php echo \__('Bestellnummer / Menge', 'wpsgRevocation'); ?></div> + <div class="value"> + <input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="<?php echo \esc_attr($get_order); ?>" /> + <input type="number" min="1" name="wpsg_revocation_reason[row][<?php echo $key; ?>][amount]" value="<?php echo intval($get_amount); ?>" /> + </div> + </div> + + <div class="form_field"> + <div class="label"><?php echo \__('Widerrufsgrund', 'wpsgRevocation'); ?></div> + <div class="value"> + <select name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]" required> + <option value=""><?php echo __("Keinen Grund angeben", 'wpsgRevocation') ?></option> + <?php foreach ($arReason as $reason) { ?> + <option value="<?php echo \htmlspecialchars($reason['id']); ?>"><?php echo \htmlspecialchars($reason['text']); ?></option> + <?php } ?> + </select> + </div> + </div> + + <div class="form_field"> + <div class="label"><?php echo \__('Bemerkung', 'wpsgRevocation'); ?></div> + <div class="value"> + <textarea name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> + </div> + </div> + + </fieldset> + + <div class="form_field"> + <div class="label"><?php echo \__('Kontakt - E-Mail', 'wpsgRevocation'); ?></div> + <div class="value"> + <input type="email" required name="wpsg_revocation_reason[contact]" value="<?php echo \esc_attr($contact_email); ?>" + <?php echo (($customer_login_id > 0 && $contact_email !== '') ? 'readonly' : ''); ?> + /> + </div> + </div> + + <p class="wpsg_revocation_page_datenschutz"> + <?php echo \__('Es gelten unsere', 'wpsgRevocation'); ?> + <a href="<?php echo $GLOBALS['wpsg_sc']->getURL(wpsg_ShopController::URL_DATENSCHUTZ); ?>"><?php echo \__('Datenschutzbestimmungen', 'wpsgRevocation'); ?></a>. + </p> + + <div class="form_field wpsg_revocation_page_submit_wrap"> + <button type="submit" class="button button-primary wpsg_revocation_page_submit"><?php echo \__('Widerruf bestätigen', 'wpsgRevocation'); ?></button> + </div> + + </form> + +</div> + +<script> +(function () { + + const form = document.getElementById('wpsg_revocation_page_form'); + if (form === null) return; + + const nonce = '<?php echo \wp_create_nonce('wpsg_mod_revocation_nonce'); ?>'; + const endpoint = '<?php echo \admin_url('admin-ajax.php'); ?>?action=wpsg_mod_revocation&do=ajaxDialogSubmit'; + const msg = document.getElementById('wpsg_revocation_page_msg'); + const button = form.querySelector('.wpsg_revocation_page_submit'); + + const formDataToObject = (formData) => { + + const obj = {}; + + for (const [key, value] of formData.entries()) { + + const keys = key.split(/\[|\]/).filter(Boolean); + let current = obj; + + keys.forEach((k, i) => { + + const isLast = i === keys.length - 1; + + if (isLast) { current[k] = value; } + else { + + if (!current[k]) { current[k] = isNaN(keys[i + 1]) ? {} : []; } + current = current[k]; + + } + + }); + + } + + return obj; + + }; + + form.addEventListener('submit', event => { + + event.preventDefault(); + + msg.innerHTML = ''; + button.disabled = true; + + const form_data = formDataToObject(new FormData(form)); + + fetch(endpoint, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ nonce: nonce, form_data: form_data }) + }).then(res => res.json()).then(res => { + + button.disabled = false; + + if ((res.success ?? false) === false) { + + let html = '<ul id="wpsg_error" class="wpsg_error">'; + (res.arError ?? []).forEach(error => { html += `<li>${error}</li>`; }); + html += '</ul>'; + msg.innerHTML = html; + msg.scrollIntoView({ behavior: 'smooth', block: 'center' }); + + } else { + + form.style.display = 'none'; + msg.innerHTML = '<div class="wpsg_revocation_page_success"><?php echo \esc_js(\__('Ihr Widerruf ist bei uns eingegangen und wird nun bearbeitet.', 'wpsgRevocation')); ?></div>'; + msg.scrollIntoView({ behavior: 'smooth', block: 'center' }); + + } + + }).catch(() => { + + button.disabled = false; + msg.innerHTML = '<ul id="wpsg_error" class="wpsg_error"><li><?php echo \esc_js(\__('Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.', 'wpsgRevocation')); ?></li></ul>'; + + }); + + }); + +})(); +</script> |
