diff options
609 files changed, 6238 insertions, 2216 deletions
diff --git a/views/admin/access.phtml b/views/admin/access.phtml index b1b40c2..b203a46 100644 --- a/views/admin/access.phtml +++ b/views/admin/access.phtml @@ -2,6 +2,7 @@ /**
* Template für die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/blognetzwerk.phtml b/views/admin/blognetzwerk.phtml index 77e6c73..3cea0be 100644 --- a/views/admin/blognetzwerk.phtml +++ b/views/admin/blognetzwerk.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen in einem Blognetzwerk
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/dataprotection.phtml b/views/admin/dataprotection.phtml index 53ccc8f..7ac4e99 100644 --- a/views/admin/dataprotection.phtml +++ b/views/admin/dataprotection.phtml @@ -2,6 +2,7 @@ /**
* Template für den Admin Bereich der Datenschutzeinstellungen
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/debugInfo.phtml b/views/admin/debugInfo.phtml index 82bf55a..8f53bc4 100644 --- a/views/admin/debugInfo.phtml +++ b/views/admin/debugInfo.phtml @@ -2,6 +2,7 @@ /**
* Template für die Ausgabe der DEBUG Informationen die über die Admin Bar erreichbar sind
+ * @version 4.6.1
*/
require_once WPSG_PATH_WP.'/wp-admin/includes/plugin.php';
diff --git a/views/admin/deinstall.phtml b/views/admin/deinstall.phtml index d125124..84dd0ff 100644 --- a/views/admin/deinstall.phtml +++ b/views/admin/deinstall.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen der Deinstallation
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/emailconf.phtml b/views/admin/emailconf.phtml index 6894fc3..97b063c 100644 --- a/views/admin/emailconf.phtml +++ b/views/admin/emailconf.phtml @@ -2,6 +2,7 @@ /**
* Template für die E-Mail Konfiguration
+ * @version 4.6.1
*/
?>
@@ -59,7 +60,7 @@ <div class="form-group">
<div class="col-sm-6 control-label control-label-email-conf">
- <label><?php echo __("E-Maillogo (JPG)", 'wpsg'); ?></label>
+ <label><?php echo __("E-Maillogo (JPG, PNG, GIF)", 'wpsg'); ?></label>
</div>
<div class="col-sm-6">
<?php if(file_exists($logoPath)) { ?>
diff --git a/views/admin/extended.phtml b/views/admin/extended.phtml index d635366..1948d40 100644 --- a/views/admin/extended.phtml +++ b/views/admin/extended.phtml @@ -2,6 +2,7 @@ /**
* Template für die erweiterten Einstellungen des Shops
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/form/checkbox.phtml b/views/admin/form/checkbox.phtml index 5dcee75..bb97427 100644 --- a/views/admin/form/checkbox.phtml +++ b/views/admin/form/checkbox.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm form-checkbox <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?>">
<?php if (wpsg_isSizedString($this->view['field_config']['label'])) { $value_class = 'col-sm-6'; ?>
diff --git a/views/admin/form/emailconf.phtml b/views/admin/form/emailconf.phtml index 67b0aff..515cfa3 100644 --- a/views/admin/form/emailconf.phtml +++ b/views/admin/form/emailconf.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php echo wpsg_drawForm_AdminboxStart($this->view['field_title'], 'wpsg_email_box'); ?>
diff --git a/views/admin/form/input.phtml b/views/admin/form/input.phtml index 60482d1..ff58936 100644 --- a/views/admin/form/input.phtml +++ b/views/admin/form/input.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?>" <?php echo ((isset($this->view['field_config']['wrap_id']))?'id="'.$this->view['field_config']['wrap_id'].'" ':''); ?>>
<label class="col-sm-6 control-label" for="<?php echo $this->view['field_id']; ?>"><?php echo $this->view['field_label']; ?></label>
diff --git a/views/admin/form/input_submit.phtml b/views/admin/form/input_submit.phtml index e12cbdc..17f2bf7 100644 --- a/views/admin/form/input_submit.phtml +++ b/views/admin/form/input_submit.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm">
<label class="col-sm-6 control-label" > </label>
diff --git a/views/admin/form/link.phtml b/views/admin/form/link.phtml index 04877d8..95d7417 100644 --- a/views/admin/form/link.phtml +++ b/views/admin/form/link.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?>">
<label class="col-sm-6 control-label" for="<?php echo $this->view['field_id']; ?>"><?php echo $this->view['field_label']; ?></label>
diff --git a/views/admin/form/select.phtml b/views/admin/form/select.phtml index d29158d..9243277 100644 --- a/views/admin/form/select.phtml +++ b/views/admin/form/select.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm form-select <?php echo ((wpsg_isSizedString($this->view['field_config']['help']) || wpsg_isSizedString($this->view['field_config']['icon']))?'has-feedback':''); ?>" <?php echo ((isset($this->view['field_config']['wrap_id']))?'id="'.$this->view['field_config']['wrap_id'].'" ':''); ?>>
<label class="col-sm-6 control-label" for="<?php echo $this->view['field_id']; ?>"><?php echo $this->view['field_label']; ?></label>
@@ -62,7 +63,8 @@ <?php foreach ($v_group as $k => $v) { ?>
<option <?php
- if (wpsg_isSizedArray($this->view['field_value']))
+ // Mehrfachauswahl, auch ohne gespeicherte Werte (K80)
+ if (is_array($this->view['field_value']))
{
echo ((in_array($k, $this->view['field_value']))?'selected="selected"':'');
diff --git a/views/admin/form/text.phtml b/views/admin/form/text.phtml index 7906b5a..5d62841 100644 --- a/views/admin/form/text.phtml +++ b/views/admin/form/text.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-text form-group-sm <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?> <?php echo wpsg_getStr($this->view['field_config']['class_wrap']); ?>" <?php echo ((isset($this->view['field_config']['wrap_id']))?'id="'.$this->view['field_config']['wrap_id'].'" ':''); ?>>
<label class="col-sm-6 control-label" for=""><?php echo $this->view['field_label']; ?></label>
diff --git a/views/admin/form/textarea.phtml b/views/admin/form/textarea.phtml index 539632f..22730c3 100644 --- a/views/admin/form/textarea.phtml +++ b/views/admin/form/textarea.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm form-textarea <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?>" <?php echo ((isset($this->view['field_config']['wrap_id']))?'id="'.$this->view['field_config']['wrap_id'].'" ':''); ?>>
<?php if (wpsg_isSizedString($this->view['field_config']['fullLabel'])) { ?>
diff --git a/views/admin/form/upload.phtml b/views/admin/form/upload.phtml index 79ef440..5252bd3 100644 --- a/views/admin/form/upload.phtml +++ b/views/admin/form/upload.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="form-group form-group-sm <?php echo ((wpsg_isSizedString($this->view['field_config']['help']))?'has-feedback':''); ?>">
<label class="col-sm-6 control-label" for="<?php echo $this->view['field_id']; ?>"><?php echo $this->view['field_label']; ?></label>
diff --git a/views/admin/hilfe.phtml b/views/admin/hilfe.phtml index 4a6569c..432503e 100644 --- a/views/admin/hilfe.phtml +++ b/views/admin/hilfe.phtml @@ -3,6 +3,7 @@ /**
* Templatedatei für die Hilfe im Backend
* Normalerweise sollte hier nichts angepasst werden
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/includes.phtml b/views/admin/includes.phtml index 9dc5701..8ac5030 100644 --- a/views/admin/includes.phtml +++ b/views/admin/includes.phtml @@ -2,6 +2,7 @@ /**
* Template für den Admin Bereich der eingebundenen Bibliotheken/Styles
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/index.phtml b/views/admin/index.phtml index 19bb017..b11a1b1 100644 --- a/views/admin/index.phtml +++ b/views/admin/index.phtml @@ -3,6 +3,7 @@ /**
* Templatedatei für die Startseite/Konfiguration im Backend
* Normalerweise sollte hier nichts angepasst werden
+ * @version 4.6.1
*/
$wpsg_update_data = wpsg_get_update_data();
diff --git a/views/admin/kalkulation.phtml b/views/admin/kalkulation.phtml index c55dd22..9953fff 100644 --- a/views/admin/kalkulation.phtml +++ b/views/admin/kalkulation.phtml @@ -2,6 +2,7 @@ /**
* Template für den Admin Bereich der Preiskalkulation
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/konfiguration.phtml b/views/admin/konfiguration.phtml index b4213f9..46b22ea 100644 --- a/views/admin/konfiguration.phtml +++ b/views/admin/konfiguration.phtml @@ -2,6 +2,7 @@ /**
* Templatedatei für die Einstellungsseite im Backend
+ * @version 4.6.1
*/
?>
@@ -35,7 +36,7 @@ <p>
<?php echo wpsg_translate(
- __('Die Version der Datenbank stimmt nicht mit der installierten Version überein!<br />Bitte klicken Sie auf <a href="#1#">Aktualisieren</a> Produkte etc. werden dabei nicht gelöscht.', 'wpsg'),
+ __('Die Version der Datenbank stimmt nicht mit der installierten Version überein!<br />Bitte klicken Sie auf <a href="#1#">Aktualisieren</a>. Produkte etc. werden dabei nicht gelöscht.', 'wpsg'),
wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&subaction=allgemein&do=update&submit=1&noheader=1', 'wpsg-admin-db-update')
); ?>
</p>
diff --git a/views/admin/kundendaten.phtml b/views/admin/kundendaten.phtml index 901fa60..d0fb3f2 100644 --- a/views/admin/kundendaten.phtml +++ b/views/admin/kundendaten.phtml @@ -2,6 +2,7 @@ /**
* Template für die Verwaltung der Kundendaten
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/kundendaten_codeinfo.phtml b/views/admin/kundendaten_codeinfo.phtml index 322f36a..a74427b 100644 --- a/views/admin/kundendaten_codeinfo.phtml +++ b/views/admin/kundendaten_codeinfo.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird bei den Kundenvariablen angezeigt und zeigt den Code für benutzerdefinierte Kundenvariablen an
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/kundendaten_tab1.phtml b/views/admin/kundendaten_tab1.phtml index 81900b2..e68450e 100644 --- a/views/admin/kundendaten_tab1.phtml +++ b/views/admin/kundendaten_tab1.phtml @@ -2,6 +2,7 @@ /**
* Template für den ersten Karteireiter der Kundendaten
+ * @version 4.6.1
*/
$arSelect = array(
diff --git a/views/admin/kundendaten_tab2.phtml b/views/admin/kundendaten_tab2.phtml index 0f9cdba..553a6c4 100644 --- a/views/admin/kundendaten_tab2.phtml +++ b/views/admin/kundendaten_tab2.phtml @@ -2,6 +2,7 @@ /**
* Template für die erweiteren Kundendaten
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/kundendaten_tab3.phtml b/views/admin/kundendaten_tab3.phtml index c47ee1c..bb0e641 100644 --- a/views/admin/kundendaten_tab3.phtml +++ b/views/admin/kundendaten_tab3.phtml @@ -2,6 +2,7 @@ /**
* Template für die Kundenvoreinstellungen im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/laender.phtml b/views/admin/laender.phtml index 76ebe2e..285a624 100644 --- a/views/admin/laender.phtml +++ b/views/admin/laender.phtml @@ -2,6 +2,7 @@ /**
* Template für die Länderverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/laender_edit.phtml b/views/admin/laender_edit.phtml index 97e09b7..f3c1ffd 100644 --- a/views/admin/laender_edit.phtml +++ b/views/admin/laender_edit.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<form id="wpsg_land_edit_form_edit" class="form-horizontal">
<?php if (wpsg_isSizedInt($this->view['land']['id'])) { ?>
diff --git a/views/admin/laender_list.phtml b/views/admin/laender_list.phtml index b92ca25..38f6c26 100644 --- a/views/admin/laender_list.phtml +++ b/views/admin/laender_list.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ /** Liste der Länder im Backend */ diff --git a/views/admin/licence.phtml b/views/admin/licence.phtml index 1c1cae0..01a8d21 100644 --- a/views/admin/licence.phtml +++ b/views/admin/licence.phtml @@ -2,6 +2,7 @@ /**
* Template für den Update-Zugang
+ * @version 4.6.1
*/
$wpsg_update_data = wpsg_get_update_data();
diff --git a/views/admin/loadsavesettings.phtml b/views/admin/loadsavesettings.phtml index 868c9e6..4c8add9 100644 --- a/views/admin/loadsavesettings.phtml +++ b/views/admin/loadsavesettings.phtml @@ -2,6 +2,7 @@ /**
* Template für den Menüpunkt "Backup/Restore"
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/migratemwst.phtml b/views/admin/migratemwst.phtml index 8267059..ef2e12b 100644 --- a/views/admin/migratemwst.phtml +++ b/views/admin/migratemwst.phtml @@ -2,6 +2,7 @@ /**
* Template für die Migration der alten MwSt. Sätze in die Länder
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/module.phtml b/views/admin/module.phtml index 6bba22f..6d7c781 100644 --- a/views/admin/module.phtml +++ b/views/admin/module.phtml @@ -3,6 +3,7 @@ /**
* Templatedatei für die Modulseite des Backend
* Sollte nicht angepasst werden
+ * @version 4.6.1
*/
$wpsg_update_data = wpsg_get_update_data();
@@ -53,7 +54,13 @@ <br />
- <?php if (!isset($wpsg_update_data['modulinfo'][$_REQUEST['modul']]) || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['demo_active'] === true || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['active'] === true || $wpsg_update_data['modulinfo'][$_REQUEST['modul']]['free'] === true) { ?>
+ <?php if (wpsg_module_key_missing($this->arAllModule[$_REQUEST['modul']], $this->bLicence)) { ?>
+
+ <?php echo wpsg_drawForm_TextStart(); ?>
+ <span class="wpsg_error"><?php echo esc_html__('Nur in Pro und Enterprise: Das Modul braucht einen Aktivierungsschlüssel.', 'wpsg'); ?></span>
+ <?php echo wpsg_drawForm_TextEnd(__('Modul aktiviert', 'wpsg')); ?>
+
+ <?php } else if (!isset($wpsg_update_data['modulinfo'][$_REQUEST['modul']]) || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['demo_active'] === true || @$wpsg_update_data['modulinfo'][$_REQUEST['modul']]['active'] === true || $wpsg_update_data['modulinfo'][$_REQUEST['modul']]['free'] === true) { ?>
<?php if (($this->arAllModule[$_REQUEST['modul']]->plugin_module??false) !== true) { ?>
<?php $modul_install = $this->get_option($_REQUEST['modul'], $this->view['global']); ?>
@@ -165,7 +172,7 @@ </form>
<?php } ?>
- <?php if ($this->get_option($_REQUEST['modul'], $this->view['global']) > 0) { ?>
+ <?php if ($this->get_option($_REQUEST['modul'], $this->view['global']) > 0 && isset($this->arModule[$_REQUEST['modul']])) { ?>
<?php echo $this->arModule[$_REQUEST['modul']]->settings_edit(); ?>
<?php } ?>
diff --git a/views/admin/modulelist.phtml b/views/admin/modulelist.phtml index 59750bd..4b6dc66 100644 --- a/views/admin/modulelist.phtml +++ b/views/admin/modulelist.phtml @@ -3,6 +3,7 @@ /**
* Template für die Liste der Module
* wird in der Modulverwaltungsübersicht und beim Update-Zugang verwendet
+ * @version 4.6.1
*/
$wpsg_update_data = wpsg_get_update_data();
@@ -158,7 +159,7 @@ <?php echo __('Mit einem Update-Zugang (Pro- oder Enterprise-Edition) machst du aus deinem wpShopGermany mehr.', 'wpsg'); ?><br /><br />
<?php echo __('Du erhältst neben kostenlosem Support (per Mail oder Forum, 1 Jahr Updates frei) auch die Möglichkeit, die Vielzahl der zusätzlich erhältlichen wpShopGermany Module zu nutzen.', 'wpsg'); ?>
- <a href="https://shop.maennchen1.de/produkt/wpshopgermany4-lizenzkey/" target="_blank"><?php echo __('wpShopGermany im Shop ansehen', 'wpsg'); ?></a>
+ <a href="https://shop.maennchen1.de/produkt/wpshopgermany-update-zugang/" target="_blank"><?php echo __('wpShopGermany im Shop ansehen', 'wpsg'); ?></a>
<?php } ?>
diff --git a/views/admin/musterwiderruf.pdf.phtml b/views/admin/musterwiderruf.pdf.phtml index 9eac0f3..15cc16c 100644 --- a/views/admin/musterwiderruf.pdf.phtml +++ b/views/admin/musterwiderruf.pdf.phtml @@ -2,6 +2,7 @@ /**
* Template für die PDF Rechnung
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/admin/news.phtml b/views/admin/news.phtml index e08aea3..6097272 100644 --- a/views/admin/news.phtml +++ b/views/admin/news.phtml @@ -2,6 +2,7 @@ /**
* Template für den Karteireiter "News" der Konfiguration
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/pager.phtml b/views/admin/pager.phtml index b60a03f..2f55fc5 100644 --- a/views/admin/pager.phtml +++ b/views/admin/pager.phtml @@ -2,6 +2,7 @@ /**
* Template für die Pager im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/path.phtml b/views/admin/path.phtml index 63fb129..ea24829 100644 --- a/views/admin/path.phtml +++ b/views/admin/path.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen der Pfade im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/presentation.phtml b/views/admin/presentation.phtml index 9860b1d..5036578 100644 --- a/views/admin/presentation.phtml +++ b/views/admin/presentation.phtml @@ -2,6 +2,7 @@ /**
* Template für die Darstellungsoptionen des Shops
+ * @version 4.6.1
*/
?>
@@ -27,6 +28,30 @@ </div>
<div class="panel-body">
+ <?php $arCustomClassicCss = \wpsg\ThemeStyle::getCustomClassicFiles(); ?>
+
+ <?php echo wpsg_drawForm_Select(\wpsg\ThemeStyle::OPTION, esc_html__('Darstellung der Shopseiten', 'wpsg'), [
+ \wpsg\ThemeStyle::MODE_CLASSIC => esc_html__('Klassisch', 'wpsg'),
+ \wpsg\ThemeStyle::MODE_THEME => esc_html__('An das Theme angepasst', 'wpsg')
+ ], \wpsg\ThemeStyle::getMode(), ['help' => \wpsg\ThemeStyle::OPTION]); ?>
+
+ <?php if (sizeof($arCustomClassicCss) > 0 && !\wpsg\ThemeStyle::isThemeMode()) { ?>
+ <div class="form-group form-group-sm">
+ <div class="col-sm-6 col-sm-offset-6">
+ <div class="alert alert-warning wpsg_style_mode_hint">
+ <p><?php echo sprintf(
+ /* translators: %s: Pfade der eigenen Stildateien */
+ esc_html__('Der Shop lädt eigene Stildateien: %s. In der Darstellung „An das Theme angepasst“ werden sie nicht mehr geladen. Zurückschalten auf „Klassisch“ geht jederzeit.', 'wpsg'),
+ implode(', ', array_map(function($file) { return '<code>'.esc_html(\wpsg\ThemeStyle::shortPath($file)).'</code>'; }, $arCustomClassicCss))
+ ); ?></p>
+ <label><input type="checkbox" name="wpsg_style_mode_confirm" value="1" /> <?php echo esc_html__('Verstanden, eigene Stildateien nicht mehr laden', 'wpsg'); ?></label>
+ </div>
+ </div>
+ </div>
+ <?php } ?>
+
+ <br />
+
<?php echo wpsg_drawForm_Select('wpsg_form_validation', __('Formular Validierung', 'wpsg'), array(
'0' => __('Serverseitig', 'wpsg'),
'1' => __('Serverseitig + Javascript V1', 'wpsg'),
@@ -65,4 +90,19 @@ <p class="submit"><input type="submit" value="<?php echo __('Einstellungen speichern', 'wpsg'); ?>" class="button-primary" id="submit" name="submit" /></p>
</form>
+
+ <?php /* Versionen der eigenen Vorlagen (Punkt 5 Theme-Kompatibilität) */ $arOverrides = \wpsg\TemplateVersion::findOverrides(); ?>
+ <div class="panel panel-default wpsg_template_versions_panel">
+ <div class="panel-heading clearfix">
+ <h3 class="panel-title"><?php echo esc_html__('Eigene Vorlagen', 'wpsg'); ?></h3>
+ </div>
+ <div class="panel-body">
+ <?php if (sizeof($arOverrides) === 0) { ?>
+ <p><?php echo esc_html__('Der Shop nutzt nur die Vorlagen des Plugins.', 'wpsg'); ?></p>
+ <?php } else { ?>
+ <p><?php echo esc_html__('Diese Vorlagen lädt der Shop aus dem Theme, dem Child-Theme oder uploads/wpsg/user_views/ statt aus dem Plugin. Ist die eigene Fassung älter, fehlen dort neue Funktionen und Korrekturen.', 'wpsg'); ?></p>
+ <?php echo \wpsg\TemplateVersion::renderTable($arOverrides); ?>
+ <?php } ?>
+ </div>
+ </div>
</div>
\ No newline at end of file diff --git a/views/admin/seiten.phtml b/views/admin/seiten.phtml index 0b694de..f1cc4ea 100644 --- a/views/admin/seiten.phtml +++ b/views/admin/seiten.phtml @@ -2,6 +2,7 @@ /**
* Template für die verwaltung der Seiten im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/shopdata.phtml b/views/admin/shopdata.phtml index 3523408..74dd456 100644 --- a/views/admin/shopdata.phtml +++ b/views/admin/shopdata.phtml @@ -2,6 +2,7 @@ /**
* Template für die allgemeinen Shopdaten
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/ueber.phtml b/views/admin/ueber.phtml index fc22d69..e5db10c 100644 --- a/views/admin/ueber.phtml +++ b/views/admin/ueber.phtml @@ -2,6 +2,7 @@ /**
* Template für den Karteireiter "Über" der Konfiguration
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/versandzonen.phtml b/views/admin/versandzonen.phtml index 76c41e9..788f35a 100644 --- a/views/admin/versandzonen.phtml +++ b/views/admin/versandzonen.phtml @@ -2,6 +2,7 @@ /**
* Template für die Verwaltung der Versandzonen
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/versandzonen_list.phtml b/views/admin/versandzonen_list.phtml index 55f7ea5..591da3b 100644 --- a/views/admin/versandzonen_list.phtml +++ b/views/admin/versandzonen_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Versandzonen
+ * @version 4.6.1
*/
$arShipping = $this->arShippingAll;
diff --git a/views/admin/widerrufsbelehrung.phtml b/views/admin/widerrufsbelehrung.phtml index 2eeff7c..ead536d 100644 --- a/views/admin/widerrufsbelehrung.phtml +++ b/views/admin/widerrufsbelehrung.phtml @@ -2,6 +2,7 @@ /**
* Template für die Eingabe der Widerrufsbelehrung im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/admin/wpml.phtml b/views/admin/wpml.phtml index d48042b..e2d8303 100644 --- a/views/admin/wpml.phtml +++ b/views/admin/wpml.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 01.06.2017
* Time: 13:53
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/blocks/customer-account.phtml b/views/blocks/customer-account.phtml new file mode 100644 index 0000000..ee5b5a0 --- /dev/null +++ b/views/blocks/customer-account.phtml @@ -0,0 +1,15 @@ +<?php + + /** + * Block „Kundenkonto“: Link zum Profil; dort meldet sich der Kunde an oder sieht sein Konto + * + * Gleich für alle Besucher, damit die Seite cachebar bleibt. + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arBlock = $this->view['wpsg_block']; + +?> +<a class="wpsg-customer-account__link" href="<?php echo esc_url($arBlock['url']); ?>"><?php echo esc_html($arBlock['label']); ?></a> diff --git a/views/blocks/mini-cart.phtml b/views/blocks/mini-cart.phtml new file mode 100644 index 0000000..3f94518 --- /dev/null +++ b/views/blocks/mini-cart.phtml @@ -0,0 +1,33 @@ +<?php + + /** + * Block „Mini-Warenkorb“: Link zum Warenkorb mit Anzahl und Summe + * + * Die Seite enthält den leeren Zustand; den Inhalt von .wpsg-mini-cart__content tauscht der Browser gegen den des + * Besuchers aus (blocks/mini-cart.js). Die Klasse muss deshalb in eigenen Fassungen erhalten bleiben. + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arBlock = $this->view['wpsg_block']; + +?> +<a class="wpsg-mini-cart__link" href="<?php echo esc_url($arBlock['url']); ?>"> + <?php if ($arBlock['label'] !== '') { ?> + <span class="wpsg-mini-cart__label"><?php echo esc_html($arBlock['label']); ?></span> + <?php } ?> + <span class="wpsg-mini-cart__content"> + <?php /* Leer ohne Zahl: Die Seite springt sonst beim Nachladen von „0 Artikel“ auf die richtige Zahl */ ?> + <?php if ($arBlock['count'] > 0) { ?> + <?php /* Die Zahl als eigenes Element: Themes können daraus eine Kurzform wie „(1)“ bilden */ ?> + <span class="wpsg-mini-cart__count"><?php echo str_replace('%s', '<span class="wpsg-mini-cart__number">'.esc_html(number_format_i18n(intval($arBlock['count']))).'</span>', esc_html( + /* translators: %s: Anzahl der Artikel im Warenkorb */ + _n('%s Artikel', '%s Artikel', intval($arBlock['count']), 'wpsg') + )); ?></span> + <?php if ($arBlock['showSum']) { ?> + <span class="wpsg-mini-cart__sum"><?php echo wpsg_price_html($arBlock['sum'], 'mini_cart'); ?></span> + <?php } ?> + <?php } ?> + </span> +</a> diff --git a/views/blocks/product-list.phtml b/views/blocks/product-list.phtml new file mode 100644 index 0000000..feb186f --- /dev/null +++ b/views/blocks/product-list.phtml @@ -0,0 +1,85 @@ +<?php + + /** + * Block „Produktliste“: Produkte als Kacheln mit Preisangaben + * + * Standard ist der Link „Zum Produkt“. Den Knopf „In den Warenkorb“ zeigt die Liste nur, wenn er am Block eingeschaltet + * ist und das Produkt in der Liste gekauft werden darf ($p['buy'], \wpsg\Blocks::canBuyInList(), in eigenen Vorlagen + * auch wpsg_buy_in_list()). Mit Produktfilter auf der Seite sagt die Statuszeile die Anzahl an. + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arBlock = $this->view['wpsg_block']; + $currency = $this->get_option('wpsg_currency'); + $hint_id = \wpsg\Blocks::kleinunternehmerHintID(); + +?> +<?php if ($arBlock['bFilter']??false) { ?> +<p class="wpsg-product-list__count" role="status"><?php if ($arBlock['bFiltered']) echo esc_html(sprintf(_n('%d Produkt gefunden', '%d Produkte gefunden', sizeof($arBlock['arProducts']), 'wpsg'), sizeof($arBlock['arProducts']))); ?></p> +<?php } ?> +<?php if (sizeof($arBlock['arProducts']) === 0) { ?> +<p class="wpsg-product-list__empty"><?php echo esc_html((($arBlock['bFiltered']??false)?__('Keine Produkte für diese Filter.', 'wpsg'):__('Keine Produkte gefunden.', 'wpsg'))); ?></p> +<?php } else { ?> +<ul class="wpsg-product-list__items"> + <?php foreach ($arBlock['arProducts'] as $p) { $oProduct = $p['oProduct']; $product_id = intval($oProduct->id); $name = $oProduct->getProductName(); ?> + <li class="wpsg-product-list__item"> + + <?php if ($arBlock['showImage']) { $attachment_id = $this->imagehandler->getAttachmentID($product_id); ?> + <a class="wpsg-product-list__image" href="<?php echo esc_url($p['url']); ?>" tabindex="-1" aria-hidden="true"> + <?php if (wpsg_isSizedInt($attachment_id)) echo wp_get_attachment_image($attachment_id, 'medium', false, ['alt' => '']); ?> + </a> + <?php } ?> + + <?php /* Etiketten am Bild, nur im Modus „neu“ (Punkt 8.15) */ if (\wpsg\ThemeStyle::isThemeMode()) echo \wpsg\ProductPage::labels($oProduct, floatval($oProduct->getPrice($product_id))); ?> + + <?php $h = 'h'.intval($arBlock['titleLevel']??3); ?><<?php echo $h; ?> class="wpsg-product-list__title"><a href="<?php echo esc_url($p['url']); ?>"><?php echo esc_html($name); ?></a></<?php echo $h; ?>> + + <?php /* Sterne nur mit dem Modul Produktbewertungen, aus freigegebenen Bewertungen */ if ($this->hasMod('wpsg_mod_reviews')) echo $this->callMod('wpsg_mod_reviews', 'renderSummary', [$product_id, 'wpsg-product-list__rating']); ?> + + <?php if ($this->canDisplayPrice()) { $price = $oProduct->getPrice($product_id); ?> + <div class="wpsg-product-list__price"> + <?php if ($this->hasMod('wpsg_mod_productvariants') && $this->callMod('wpsg_mod_productvariants', 'isVariantsProduct', [$product_id])) { ?> + <?php echo wpsg_translate(esc_html__('ab #1#', 'wpsg'), wpsg_price_html($price, 'list')); ?> + <?php } else { ?> + <?php echo wpsg_price_html($price, 'list'); ?> + <?php } ?> + </div> + <?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?> + <div class="wpsg-product-list__baseprice"><?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$price, $oProduct->__get('fmenge'), $product_id]); ?></div> + <?php } ?> + <div class="wpsg-product-list__taxnote wpsg_produkt_preishinweis"><?php echo \wpsg\Blocks::priceNote($oProduct, $hint_id); ?></div> + <?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?> + <div class="wpsg-product-list__deliverytime"> + <?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', [$oProduct->getProductKey()])) { ?> + <?php echo esc_html((string)$this->callMod('wpsg_mod_deliverytime', 'displayStoreText', [$oProduct->getProductKey()])); ?> + <?php } else { $strDelay = (string)$this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', [$oProduct->getProductKey()]); ?> + <?php if ($strDelay !== '') { echo esc_html($strDelay); } else { ?> + <?php echo esc_html__('Lieferzeit:', 'wpsg'); ?> <?php echo wp_kses_post((string)$this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', [$oProduct->getProductKey()])); ?> + <?php } ?> + <?php } ?> + </div> + <?php } ?> + <?php } else { ?> + <div class="wpsg-product-list__price"><?php echo esc_html__('Preise nur für eingeloggte Benutzer', 'wpsg'); ?></div> + <?php } ?> + + <div class="wpsg-product-list__action"> + <?php if ($p['buy']) { ?> + <form method="post" action="<?php echo esc_url($this->getCurrentURL()); ?>"> + <input type="hidden" name="wpsg[produkt_id]" value="<?php echo esc_attr((string)$product_id); ?>" /> + <input type="hidden" name="wpsg[menge]" value="1" /> + <input type="hidden" name="myReferer" value="<?php echo esc_attr($this->getCurrentURL()); ?>" /> + <button type="submit" name="wpsg[submit]" value="1" class="wpsg_button wpsg_add_basket<?php echo wpsg_button_class(); ?>"><?php echo esc_html(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></button> + </form> + <?php } else { ?> + <a class="wpsg_button<?php echo wpsg_button_class(); ?>" href="<?php echo esc_url($p['url']); ?>"><?php echo esc_html(wpsg_button_text('to_product', __('Zum Produkt', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></a> + <?php } ?> + </div> + + </li> + <?php } ?> +</ul> +<?php echo \wpsg\Blocks::kleinunternehmerHint($hint_id); ?> +<?php } ?> diff --git a/views/blocks/product-price.phtml b/views/blocks/product-price.phtml new file mode 100644 index 0000000..24b856c --- /dev/null +++ b/views/blocks/product-price.phtml @@ -0,0 +1,47 @@ +<?php + + /** + * Block „Produktpreis“: Preisangaben eines Produktartikels in einer Abfrage-Schleife (Kategorie-Vorlage) + * + * Wie eine Kachel der Produktliste ohne Bild und Titel; Bild und Titel kommen aus der Beitragsvorlage. + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arBlock = $this->view['wpsg_block']; + $oProduct = $arBlock['oProduct']; + $product_id = intval($oProduct->id); + $name = $oProduct->getProductName(); + $hint_id = \wpsg\Blocks::kleinunternehmerHintID('price-'.$product_id); + +?> +<?php if ($this->canDisplayPrice()) { $price = $oProduct->getPrice($product_id); ?> +<div class="wpsg-product-list__price"> + <?php if ($this->hasMod('wpsg_mod_productvariants') && $this->callMod('wpsg_mod_productvariants', 'isVariantsProduct', [$product_id])) { ?> + <?php echo wpsg_translate(esc_html__('ab #1#', 'wpsg'), wpsg_price_html($price, 'list')); ?> + <?php } else { ?> + <?php echo wpsg_price_html($price, 'list'); ?> + <?php } ?> +</div> +<?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?> +<div class="wpsg-product-list__baseprice"><?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$price, $oProduct->__get('fmenge'), $product_id]); ?></div> +<?php } ?> +<div class="wpsg-product-list__taxnote wpsg_produkt_preishinweis"><?php echo \wpsg\Blocks::priceNote($oProduct, $hint_id); ?></div> +<?php echo \wpsg\Blocks::kleinunternehmerHint($hint_id); ?> +<?php } else { ?> +<div class="wpsg-product-list__price"><?php echo esc_html__('Preise nur für eingeloggte Benutzer', 'wpsg'); ?></div> +<?php } ?> + +<div class="wpsg-product-list__action"> + <?php if ($arBlock['buy']) { ?> + <form method="post" action="<?php echo esc_url($this->getCurrentURL()); ?>"> + <input type="hidden" name="wpsg[produkt_id]" value="<?php echo esc_attr((string)$product_id); ?>" /> + <input type="hidden" name="wpsg[menge]" value="1" /> + <input type="hidden" name="myReferer" value="<?php echo esc_attr($this->getCurrentURL()); ?>" /> + <button type="submit" name="wpsg[submit]" value="1" class="wpsg_button wpsg_add_basket<?php echo wpsg_button_class(); ?>"><?php echo esc_html(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></button> + </form> + <?php } else { ?> + <a class="wpsg_button<?php echo wpsg_button_class(); ?>" href="<?php echo esc_url($arBlock['url']); ?>"><?php echo esc_html(wpsg_button_text('to_product', __('Zum Produkt', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></a> + <?php } ?> +</div> diff --git a/views/css/admin.css b/views/css/admin.css index 9b8ab4b..df7f4cc 100644 --- a/views/css/admin.css +++ b/views/css/admin.css @@ -260,6 +260,7 @@ .addedit_templateV3 .form-control-feedback:hover { cursor: pointer; }
.addedit_templateV3 .form-control-feedback { z-index: 99999; }
.addedit_templateV3 .form-control-feedback:hover { }
+.addedit_templateV3 { min-width:1000px; }
.addedit_templateV3 .postbox { border-radius: 3px; }
.addedit_templateV3 .postbox .inside { padding-bottom: 0; }
.addedit_templateV3 .col-sm-6 { width: 100% !important; margin-left: 0 !important; }
diff --git a/views/css/frontend.css b/views/css/frontend.css index c64bc52..91360bc 100644 --- a/views/css/frontend.css +++ b/views/css/frontend.css @@ -17,7 +17,7 @@ .wpsg_error { border-color:#DD3D36; }
.wpsg { }
.wpsg h2 { }
-.wpsg_checkout label.wpsg_error { background-color:white; }
+.wpsg_checkout label.wpsg_error { background-color:white; }
label.wpsg_error { position:absolute; right:2px; top:-2px; color:#DD3D36; }
input.wpsg_error { border-color:red !important; border:1px solid red; }
.wpsg_spacer { width:100%; height:1px; background-color:#EAEAEA; margin-bottom:1rem; }
@@ -25,34 +25,35 @@ input.wpsg_error { border-color:red !important; border:1px solid red; } .wpsg_upper { vertical-align:top; font-size:60%; }
.wpsg {
- select.wpsg_checkout { padding:0.75em 1em; }
+ select.wpsg_checkout { padding-block:0.75em; padding-left:1em; height:auto; }
input.wpsg_checkout { padding:0.75em 1em; }
textarea#wpsg_checkout_comment { padding:0.75em 1em; font-family:inherit; }
}
/* GARAN Label */
-.wpsg_product_garan_wrap { padding:5px 0; margin-bottom:2rem; font-family:'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
- .wpsg_product_garan { border:1px solid black; display:inline-block; padding:5px 50px 5px 5px; position:relative; height:30px; white-space:nowrap; cursor:pointer; text-decoration:none;
+.wpsg_product_garan_wrap { all:revert; padding:5px 0; margin-bottom:2rem; font-family:'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
+ * { all:revert; }
+ .wpsg_product_garan { border:1px solid black; display:inline-block; padding:5px 50px 5px 5px; position:relative; height:30px; white-space:nowrap; cursor:pointer; text-decoration:none; color:black;
& > .years { font-size:30px; height:30px; line-height:30px; font-weight:bold; padding-right:35px; position:relative; border-right:1px solid black;
- &:after { position:absolute; right:10px; bottom:8px; content:' '; width:16px; height:16px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; }
+ &:after { position:absolute; right:10px; bottom:8px; content:' '; width:16px; height:16px; background-image:url('../gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; }
}
& > .title { padding-left:5px; font-size:22px; font-weight:bold; padding-right:20px; position:relative;
- &:after { position:absolute; right:0; bottom:2px; content:' '; width:16px; height:16px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_checkmark.svg'); background-size:contain; background-repeat:no-repeat; }
+ &:after { position:absolute; right:0; bottom:2px; content:' '; width:16px; height:16px; background-image:url('../gfx/garan/garan_checkmark.svg'); background-size:contain; background-repeat:no-repeat; }
}
- &:after { position:absolute; right:5px; top:0; content:' '; width:28px; height:40px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; }
- & > .tooltip { position:absolute; opacity:0; pointer-events:none; top:40px; left:-1px; padding:5px 5px 5px 0; transition:all 0.5s;
+ &:after { position:absolute; right:5px; top:0; content:' '; width:28px; height:40px; background-image:url('../gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; }
+ & > .tooltip { position:absolute; opacity:0; pointer-events:none; top:40px; left:-1px; padding:5px 5px 5px 0; transition:opacity 0.5s;
& > .inner { width:300px; min-height:300px; display:flex; flex-direction:column; gap:5px; background-color:white; padding:5px; border:1px solid black;
& > .border { border:1px solid black; display:flex; flex-direction:column; padding:5px;
.top { width:100%; border-bottom:2px solid black; padding-bottom:5px; position:relative;
& > .title { font-size:50px; font-weight:bold; padding-right:40px; position:relative; display:inline-block; line-height:50px; letter-spacing:1px;
- &:after { position:absolute; right:0; bottom:5px; content:' '; width:32px; height:32px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_checkmark.svg'); background-size:contain; background-position:right bottom; background-repeat:no-repeat; }
+ &:after { position:absolute; right:0; bottom:5px; content:' '; width:32px; height:32px; background-image:url('../gfx/garan/garan_checkmark.svg'); background-size:contain; background-position:right bottom; background-repeat:no-repeat; }
}
- &:after { position:absolute; right:0; top:-11px; content:' '; width:36px; height:51px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; }
+ &:after { position:absolute; right:0; top:-11px; content:' '; width:36px; height:51px; background-image:url('../gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; }
}
& > .flexline { display:flex; justify-content:space-between; gap:5px; align-items:flex-start; padding:5px 0; font-size:16px; }
& > .line { display:flex; justify-content:space-between; gap:5px; align-items:flex-end; padding:5px 0;
& > .years { font-size:85px; height:85px; line-height:85px; font-weight:bold; padding-right:60px; position:relative;
- &:after { position:absolute; right:10px; bottom:8px; content:' '; width:35px; height:35px; background-image:url('/wp-content/plugins/wpshopgermany-free/views/gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; }
+ &:after { position:absolute; right:10px; bottom:8px; content:' '; width:35px; height:35px; background-image:url('../gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; }
}
& > img { transform:translateY(-8px); }
}
@@ -63,7 +64,10 @@ input.wpsg_error { border-color:red !important; border:1px solid red; } }
}
}
- &:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; }
+ &:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; } + /* Auch per Tastaturfokus und nach dem ersten Tipp (K69, frontend.js); Escape blendet aus */ + &:focus-visible > .tooltip, &.is-open > .tooltip { opacity:1; pointer-events:all; z-index:1; } + &.is-dismissed > .tooltip { opacity:0; pointer-events:none; }
}
}
@@ -100,16 +104,17 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .inner, html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .flexline { line-height:1.2; }
html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .trans_wrap { line-height:1.4; }
html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max-width:none; height:auto; margin:0; border:0; box-shadow:none; }
-
+
/* Basket Widget */
-.wpsg_basket_widget .wpshopgermany_linktokasse { float:right; margin-top:1rem; }
+.wpsg_basket_widget .wpshopgermany_linktokasse { float:right; margin-top:1rem; }
/* Basket */
.basket_product_wrap {}
.basket_product_wrap .basket_product_row { display:flex; align-items:baseline; border-bottom:1px solid #EAEAEA; padding-bottom:1em; margin-bottom:1em; }
.basket_product_wrap .basket_product_row .product_shortdesc { margin-top:0.5em; }
.basket_product_wrap .basket_product_row .productimage { max-width:150px; padding-right:0.75em; }
-.basket_product_wrap .basket_product_row .product_content { width:100%; display:flex; flex-direction:column; justify-content:space-between; }
+.basket_product_wrap .basket_product_row .productimage img { max-width:100%; height:auto; }
+.basket_product_wrap .basket_product_row .product_content { width:100%; min-width:0; display:flex; flex-direction:column; justify-content:space-between; }
.basket_product_wrap .basket_product_row .product_action { display:flex; width:100%; justify-content:space-between; align-items:center; }
.basket_product_wrap .basket_product_row .product_action .amount { width:100px; padding-right:40px; position:relative; margin-top:0.5em; margin-bottom:0.5em; text-align:center;}
.basket_product_wrap .basket_product_row .product_action .amount .wpsg_basket_removelink { -webkit-box-shadow:none; box-shadow:none; text-decoration:none; border:0px !important; position:absolute; display:flex; right:5px; top:50%; margin-top:-8px; height:16px; width:16px; }
@@ -117,7 +122,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .basket_product_wrap .basket_product_row .product_action .price { width: 39%; display:inline-block; text-align:right; }
.basket_product_wrap .basket_product_row .product_action .price_total { width: 39%; display:inline-block; font-weight:bold; text-align:right; }
.basket_product_wrap .basket_product_row .product_info { display:flex; width:100%; justify-content:space-between; align-items:center; margin-bottom:0.25rem; }
-.basket_product_wrap .basket_product_row .product_upload { }
+.basket_product_wrap .basket_product_row .product_upload { }
.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target { margin-left:15px; flex-grow:1; }
.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target ul { margin:0px; }
.basket_product_wrap .basket_product_row .product_upload .wpsg_mod_orderupload_target li { display:flex; justify-content:space-between; }
@@ -158,13 +163,15 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max /* .glyphicon {width:20px !important; text-decoration:none; position:relative; display:inline-block; font-family:'Glyphicons Halflings'; line-height:1rem;} */
.wpsg_basket .wpsg_checkoutbutton { float:right; padding:0.75em 1em; }
-.wpsg_basket .set_land { padding:0.75em 1em; }
-.wpsg_basket .set_shipping { padding:0.75em 1em; }
+.wpsg_basket .set_land { padding-block:0.75em; padding-left:1em; height:auto; }
+.wpsg_basket .set_shipping { padding-block:0.75em; padding-left:1em; height:auto; }
.wpsg_basket .wpsg_cell_gesamtsumme_value { font-weight:bold; }
.wpsg_basket input.amount { padding:0.75em 0.25em; }
+.basket_product_wrap .basket_product_row .product_action input.amount { width:100%; box-sizing:border-box; }
.wpsg_checkout2 .wpsg_overviewbutton,
.wpsg_checkout2 .wpsg_checkoutbutton,
.wpsg_overview .garan_label_wrap { text-align:center; padding:1rem 0; }
+.wpsg_overview .garan_label_wrap img { max-width:100%; height:auto; }
.wpsg_overview .wpsg_orderbutton,
.wpsg_overview .wpsg_checkoutbutton,
.wpsg_overview .garan_label_popup_confirm { text-align:center; padding:0.75em 1.5em; cursor:pointer; }
@@ -185,8 +192,8 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_checkout .wpsg_checkoutblock input.wpsg_input_text,
.wpsg_checkout .wpsg_checkoutblock input[type="tel"],
.wpsg_checkout .wpsg_checkoutblock input[type="fax"],
-.wpsg_checkout .wpsg_checkoutblock input[type="text"],
-.wpsg_checkout .wpsg_checkoutblock input[type="number"],
+.wpsg_checkout .wpsg_checkoutblock input[type="text"],
+.wpsg_checkout .wpsg_checkoutblock input[type="number"],
.wpsg_checkout .wpsg_checkoutblock input[type="password"] { margin-bottom:5px; box-sizing:border-box; width:100%; }
.wpsg_checkout .wpsg_checkoutblock input[type="checkbox"] { width:auto; margin-right:5px; }
.wpsg_checkout .wpsg_checkoutblock select { box-sizing:border-box; width:100%; margin-bottom:5px; }
@@ -202,8 +209,8 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock, .wpsg_checkout #wpsg_shipping_streetnr.wpsg_checkoutblock { display:flex; flex-direction:row; width:100%; }
.wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock .street, .wpsg_checkout #wpsg_shipping_streetnr.wpsg_checkoutblock .street { flex-grow:1; padding-right:15px; }
.wpsg_checkout #wpsg_streetnr.wpsg_checkoutblock .nr input, .wpsg_checkout #wpsg_shipping_streetnr.wpsg_checkoutblock .nr input {width: 100%;}
-
- /* Checkout2 */
+
+ /* Checkout2 */
.shippay_wrap { margin-top:40px; width:100%; font-family:Arial; padding-right:10px; }
.wpsg_payment .wpsg_payment_textwrap { margin-top:40px; }
.shippay_wrap .shippay_item_wrap { position:relative; border-top:1px solid #DFDFDF; cursor:pointer; padding-left:8px; }
@@ -252,7 +259,8 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_overview .wpsg_table_wrap .overview_product_row { display:flex; align-items:baseline; border-bottom:1px solid #EAEAEA; padding-bottom:1em; margin-bottom:1em; }
.wpsg_overview .wpsg_table_wrap .overview_product_row .product_shortdesc { margin-top:0.5em; }
.wpsg_overview .wpsg_table_wrap .overview_product_row .productimage { max-width:150px; padding-right:0.75em; }
-.wpsg_overview .wpsg_table_wrap .overview_product_row .product_content { width:100%; display:flex; flex-direction:column; justify-content:space-between; }
+.wpsg_overview .wpsg_table_wrap .overview_product_row .productimage img { max-width:100%; height:auto; }
+.wpsg_overview .wpsg_table_wrap .overview_product_row .product_content { width:100%; min-width:0; display:flex; flex-direction:column; justify-content:space-between; }
.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action { display:flex; width:100%; justify-content:space-between; align-items:center; }
.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .amount { width:80px; margin-top:0.5em; margin-bottom:0.5em; text-align:center;}
.wpsg_overview .wpsg_table_wrap .overview_product_row .product_action .title { width: 60%; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; }
@@ -289,6 +297,17 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max /* Bestellvariablen */
.wpsg_checkout .wpsg_mod_ordervars_field { display:inline; }
+/* Kontonavigation */
+.wpsg-account-nav { margin:0 0 2em; border-bottom:1px solid #DDDDDD; container-type:inline-size; }
+.wpsg-account-nav__list { display:flex; flex-wrap:wrap; gap:0 1.5em; margin:0; padding:0; list-style:none; }
+.wpsg-account-nav__item { margin:0; }
+.wpsg-account-nav__item--logout { margin-left:auto; }
+.wpsg-account-nav__link { display:inline-block; padding:0.6em 0; text-decoration:none; }
+.wpsg-account-nav__link:hover { text-decoration:underline; }
+.wpsg-account-nav__link[aria-current="page"] { font-weight:700; text-decoration:underline; text-decoration-thickness:3px; text-underline-offset:0.4em; }
+/* Schmal bricht die Navigation um; Abmelden läuft dann mit statt allein rechts */
+@container (max-width:36em) { .wpsg-account-nav__item--logout { margin-left:0; } }
+
/* Profilseite */
.wpsg_profil .wpsg_pwdvergessen_link { line-height:30px; }
.wpsg_profil .wpsg_mod_kundenverwaltung_login, .wpsg_checkout .wpsg_mod_kundenverwaltung_login { float:right; }
@@ -322,13 +341,19 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_produktattribute_value { display:inline-block; }
/* Bestellansicht */
-.wpsg_mod_kundenverwaltung_order .wpsg_mod_kundenverwaltung_producttable { margin-top:1rem; margin-bottom:2rem; }
-.wpsg_mod_kundenverwaltung_order {
- table { width:100%;
- td, th { text-align:left; }
- }
- .wpsg_box { border-bottom:1px solid black; padding-bottom:1rem; margin-bottom:1rem; }
-}
+/* Kundenkonto „Bestellungen“: je Bestellung eine Karte, Positionen aufklappbar (K135) */
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order { border:1px solid var(--wpsg-color-line, rgba(127,127,127,.35)); border-radius:var(--wpsg-radius, 4px); padding:1em 1.25em; margin:0 0 1em; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__head { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:baseline; gap:.25em 1em; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__title { margin:0; font-size:1.15em; font-weight:700; line-height:1.4; }
+.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__sum, .col_price) { white-space:nowrap; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__sum { font-size:1.1em; font-weight:700; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__meta { margin:.25em 0 0; font-size:var(--wpsg-font-size-small, .875em); opacity:var(--wpsg-muted-opacity, .75); }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__items { margin-top:.75em; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__items > summary { cursor:pointer; font-size:var(--wpsg-font-size-small, .875em); }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__items table { width:100%; margin:.5em 0 0; border-collapse:collapse; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__items td { padding:.5em 0; border-top:1px solid var(--wpsg-color-line-soft, rgba(127,127,127,.2)); vertical-align:top; text-align:left; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__items td.col_price { padding-left:1em; text-align:right; }
+.wpsg_mod_kundenverwaltung_order .wpsg-account-order__detail { display:block; font-size:var(--wpsg-font-size-small, .875em); opacity:var(--wpsg-muted-opacity, .85); }
/* Trusted Shops Integration */
.wpsg_checkout label[for="wpsg_mod_trustedshops_set"] { margin:1rem 0 1rem 0; display:block; }
@@ -338,7 +363,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_autodebit label { width:100%; line-height:36px; }
.wpsg_mod_autodebit input { float:right; margin-bottom:3px; }
-/* Versandadresse */
+/* Versandadresse */
.wpsg_checkout .wpsg_mod_shippingadress { margin-bottom:1rem; }
/* Produkttemplate */
@@ -350,7 +375,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .product_wrap .productdetails .oldprice { text-decoration:line-through; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productview_price { font-weight:bold; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_produkt_shortdescription { margin-top:0.75em; margin-bottom:0.75em; }
-.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_only_store { margin-top:0.75em; margin-bottom:0.75em; }
+.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_only_store { margin-top:0.75em; margin-bottom:0.75em; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvariants_product_wrap { margin-top:0.75em; margin-bottom:0.75em; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvariants_product_wrap select { width:100%; box-sizing:border-box; padding:0.75em; line-height:1.5em; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_informationarea { margin-top:1.5em; margin-bottom:1.5em; }
@@ -363,20 +388,21 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvars_check { display:flex; align-items:center; gap:0.5em; font-weight:normal; cursor:pointer; }
.wpsg_productform .wpsg_mod_productvars_check input[type="checkbox"] { flex:0 0 auto; margin:0; }
.wpsg_productform .wpsg_mod_productvars .wpsg_required { color:#b3261e; margin-left:0.15em; }
-.wpsg_productform .wpsg_produkt_wrapper label { font-weight:bold; }
+.wpsg_productform .wpsg_produkt_wrapper label { font-weight:bold; }
+.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea { margin-top:1rem; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="text"] { box-sizing:border-box; padding:0.7em; line-height:1.5em; font-size:1rem; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="submit"] { font-family:inherit; cursor:pointer; float:right; box-sizing: border-box; padding:0.25rem 1rem; line-height:1.5em; font-size:inherit; border:1px solid black; }
.wpsg_productform .wpsg_product_layer { position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.25); padding:0.75em; margin:-0.75em; box-sizing:content-box; }
.wpsg_productform .wpsg_product_layer img { position:absolute; left:50%; margin-left:-8px; top:50%; margin-top:-5px; }
.wpsg_productform .wpsg_produkt_produktbilder { max-width:200px; }
.wpsg_productform label {
- color: #333;
- display: block;
- font-weight: 800;
- margin-bottom: 0.5em;
+ color: #333;
+ display: block;
+ font-weight: 800;
+ margin-bottom: 0.5em;
}
.wpsg_product_deliverytime_holiday { height:50px; padding:10px; width:50%; float:right; border:1px solid #ff0000; }
-.wpsg_produkt_add_basket_wrapper { display:flex; align-items:stretch; justify-content:flex-start; gap:1rem;
+.wpsg_produkt_add_basket_wrapper { display:flex; flex-wrap:wrap; align-items:stretch; justify-content:flex-start; gap:1rem;
& > *, & > label { margin:0; }
& > label { display:flex; align-items:center; }
}
@@ -395,26 +421,25 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_productform .sto_carousel .right { position:absolute; right:0px; top:0px; height:95px; line-height:95px; width:20px; display:block; text-align:right; font-size:2rem; }
@media (max-width:400px) {
-
+
.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="text"] { width:28%; }
.wpsg_productform .wpsg_produkt_wrapper .wpsg_product_buttonarea input[type="submit"] { width:68%; }
-
+
/* Produktdetailansicht */
- .wpsg_productform .wpsg_produkt_shortdescription { display:none; }
.wpsg_productform .wpsg_mod_produktindex_stock { margin:10px 0; }
.wpsg_productform .wpsg_mod_produktindex_stock label { margin-bottom:0em; float:left; margin-right:10px; }
-
+
/* Produktübersicht */
.wpsg_mod_productindex_order span{ float:left; }
.wpsg_mod_productindex .wpsg_mod_productindex_viewselect { margin-top:6px !important; }
.wpsg_mod_productindex .wpsg_mod_productindex_order { width:90%; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product { width:45% !important; }
.wpsg_mod_productindex_grid img { max-width:100%; height:auto; }
- .wpsg_mod_productindex .wpsg_mod_productindex_order select { width:65%; margin: 2px 0 0 10px; height:20px; }
+ .wpsg_mod_productindex .wpsg_mod_productindex_order select { width:65%; margin: 2px 0 0 10px; height:20px; }
.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom .wpsg_mod_productindex_order { display:none }
.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom .wpsg_mod_productindex_viewselect { display:none}
.wpsg_mod_productindex .wpsg_mod_productindex_toolbar_bottom { border-top:0px !important; }
-
+
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_title { font-size:1.5em; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos,
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_produktindex_stock,
@@ -422,7 +447,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button { border:1px solid #ccc; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button a { font-size:1.2em; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productview_price { font-size:1.2em; }
-
+
.wpsg_mod_productindex_list .wpsg_mod_productindex_product { width:100% !important; }
.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos,
.wpsg_mod_productindex_list .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_produktindex_stock,
@@ -438,6 +463,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_progress { display:none; }
.wpsg_basket .product_name .product_shortdesc { display:none; }
.wpsg_basket .basket_product_row .product_info{ display:none; }
+ .wpsg_basket .basket_sum_wrap .basket_sum_row { flex-wrap:wrap; }
.wpsg_basket .basket_sum_wrap .title2 { width:60%; }
.wpsg_basket .basket_sum_wrap .value,
.wpsg_basket .basket_sum_wrap .sum { width:40%; }
@@ -446,7 +472,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max /* Checkout */
.wpsg_checkout .wpsg_button { width:100%; margin:0 0 10px 0; }
.wpsg_checkout2 .wpsg_button { width:100%; margin:0 0 10px 0; }
-
+
/* Overview */
.wpsg_overview .wpsg_checkoutbutton,
.wpsg_overview .wpsg_orderbutton { width:100%; margin: 0 0 10px 0; }
@@ -459,14 +485,16 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max @media (max-width:600px) {
+ .basket_product_wrap .basket_product_row .productimage,
+ .wpsg_overview .wpsg_table_wrap .overview_product_row .productimage { max-width:80px; }
.wpsg_productform .wpsg_productimages { width:100%; }
.wpsg_productform .wpsg_produkt_produktbilder { max-width:100%; }
-
+
}
@media (max-width:900px) {
-
-
+
+
}
/* Varianten */
@@ -525,7 +553,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max #wpsg_calc_layer #customerquestion_ok_button { width:100%; }
#wpsg_calc_layer .country { clear:both; margin-top:20px; }
#wpsg_calc_layer .country h2 { font-size:22px; font-weight:normal; width:150px; float:left; line-height:28px; }
-#wpsg_calc_layer .country select { width:350px; font-size:22px; height:auto; float:left; margin-top:10px; }
+#wpsg_calc_layer .country select { width:350px; font-size:22px; height:auto; float:left; margin-top:10px; }
#wpsg_calc_layer input[type="radio"] { height:auto; margin-right:10px; }
#wpsg_calc_layer .button_wrap { width:100%; clear:both; padding-top:20px; }
#wpsg_calc_layer input[type="submit"] { float:right; padding-left:50px; padding-right:50px; }
@@ -561,10 +589,18 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_request_requestpage .wpsg_checkout_typ_3 input { margin-right: 5px; width: auto; }
.wpsg_mod_request_requestpage input[type="text"],
.wpsg_mod_request_requestpage select { width:100%; height:30px; margin-top:5px; margin-bottom:5px;}
+.wpsg_mod_request_requestpage .wpsg_cell_amount input[type="text"] { box-sizing:border-box; width:4em; max-width:100%; }
+.wpsg_mod_request_requestpage .wpsg_commentblock textarea { box-sizing:border-box; width:100%; height:150px; padding:0.75em 1em; font-family:inherit; }
.wpsg_mod_request_requestpage h2 { margin-top:2rem; margin-bottom:1rem; }
.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock { display:flex; flex-direction:row; width:100%; }
.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock .street { flex-grow:1; padding-right:15px; }
.wpsg_mod_request_requestpage #wpsg_streetnr.wpsg_checkoutblock .nr input { width:75px; }
+.wpsg_mod_request_requestpage input, .wpsg_mod_request_requestpage select, .wpsg_mod_request_requestpage textarea { box-sizing:border-box; }
+@media (max-width:400px) {
+ .wpsg_mod_request_requestpage .wpsg_cell_amount, .wpsg_mod_request_requestpage .wpsg_cell_sumprice { width:auto; }
+ .wpsg_mod_request_requestpage thead th { font-size:0.8em; hyphens:auto; }
+ .wpsg_mod_request_requestpage table { display:block; overflow-x:auto; }
+}
.requestlist_ajax_wrap { padding-bottom:2rem; }
.wpsg_progress { padding:0px; margin:0px; width:100%; margin-bottom:100px; margin-top:30px; }
@@ -572,7 +608,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_progress span.step { width:25%; display:block; float:left; list-style:none; position:relative; }
.wpsg_progress span.step > .text { margin-top:30px; text-align:center; width:100%; display:block; }
.wpsg_progress span.step > .dot { position:absolute; z-index:2; background-color:#C5C5C5; width:20px; height:20px; left:50%; top:0%; margin-left:-14px; margin-top:-4px; border-radius:10px; }
-.wpsg_progress span.step:before { border:1px solid #C5C5C5; position:absolute; z-index:2; left:50%; margin-left:-20px; text-align:center; line-height:40px; background-color:#F2F2F2; content:" "; display:block; width:30px; height:30px; border-radius:25px; margin-top:-10px; }
+.wpsg_progress span.step:before { border:1px solid #C5C5C5; position:absolute; z-index:2; left:50%; margin-left:-20px; text-align:center; line-height:40px; background-color:#F2F2F2; content:" "; display:block; width:30px; height:30px; border-radius:25px; margin-top:-10px; }
.wpsg_progress span.step1:before { content:""; }
.wpsg_progress span.step2:before { content:""; }
.wpsg_progress span.step3:before { content:""; }
@@ -583,12 +619,12 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_progress span.done > .dot {background-color:#F2F2F2; }
.wpsg_progress span.current:after,
.wpsg_progress span.done:after { content:" "; background-color:#C5C5C5; width:100%; height:10px; display:block; top:0px; position:absolute; }
-.wpsg_progress span.current:after { width:50%; }
-
+.wpsg_progress span.current:after { width:50%; }
+
/* Modul "CrowdFunding" */
.wpsg_mod_funding_progress .wpsg_mod_funding_state { border:1px solid #C5C5C5; margin-bottom:1rem; box-sizing:border-box; width:100%; height:25px; line-height:25px; }
-.wpsg_mod_funding_progress .wpsg_mod_funding_state > .bar { width:90%; float:left; height:100%; display:table; }
-.wpsg_mod_funding_progress .wpsg_mod_funding_state > .bar > .value { background-color:#484C51; height:100%; width:0%; }
+.wpsg_mod_funding_progress .wpsg_mod_funding_state > .bar { width:90%; float:left; height:100%; display:table; }
+.wpsg_mod_funding_progress .wpsg_mod_funding_state > .bar > .value { background-color:#484C51; height:100%; width:0%; }
.wpsg_mod_funding_progress .wpsg_mod_funding_state > .value { width:10%; height:100%; border-left:1px solid #C5C5C5; float:right; text-align:center; }
/* Modul "Produktansichten" */
@@ -604,7 +640,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_productview-order { font-size:14px; color:#9B9B9B; }
.wpsg_mod_productview-order .glyphicon { margin-left:10px; margin-right:5px; }
.wpsg_mod_productview-order strong { color:#29556E; font-weight:bold; float:right; }
-.wpsg_mod_productview_image { position:relative; }
+.wpsg_mod_productview_image { position:relative; }
.wpsg_mod_productview_image img { max-width:100%; height:auto; border:1px solid #E4F3F8; }
.wpsg_productview_pager { width:100%; border-top:1px solid #E4F3F8; border-bottom:1px solid #E4F3F8; margin-bottom:25px; margin-top:10px; padding-top:25px; padding-bottom:25px; text-align:center; }
.wpsg_productview_pager .wpsg_productview_pager_wrap { display:inline-block; margin:auto; }
@@ -616,10 +652,10 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_description { color:#436980; line-height:20px; font-size:14px; margin-bottom:5px; }
.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button { left:50%; margin-left:-90px; width:180px; position:absolute; bottom:0px; white-space:nowrap; padding:5px 25px 5px 25px; border:1px solid #A6DAE8; font-weight:bold; text-transform:uppercase; color:#29556E; }
.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button:hover { text-decoration:none; background-color:#29556E; color:#FFFFFF; }
-.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button .fa { margin-left:10px; }
+.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_button .fa { margin-left:10px; }
.wpsg_productview_product .wpsg_mod_productview_go { display:none; position:absolute; left:0px; top:0px; width:100%; height:100%; background-color:rgba(228, 243, 248, 0.75); text-align:center; }
.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap { color:#0F303F; width:100%; position:absolute; left:50%; margin-left:-50%; top:30%; font-size:20px; line-height:125%; font-weight:bold; }
-.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_oldprice,
+.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_oldprice,
.product_wrap .productdetails .oldprice { text-decoration:line-through; }
.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_current { color:red; }
.wpsg_productview_product .wpsg_mod_productview_go .wpsg_mod_productview_tax_wrap { color:#565656; width:100%; position:absolute; left:50%; margin-left:-50%; top:60%; font-size:14px; line-height:125%; }
@@ -629,7 +665,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_productview_product_grid .wpsg_mod_productview_name h2 { margin-top:0px; }
.wpsg_mod_productview_loading { width:100%; height:100%; background-color:rgba(249, 252, 253, 0.75); position:absolute; left:0px; top:0px; }
.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range { position:relative; margin-right:16px; }
-.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range .ui-slider-handle { cursor:pointer; width:16px; height:16px; background-color:#787878; position:absolute; }
+.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range .ui-slider-handle { cursor:pointer; width:16px; height:16px; background-color:#787878; position:absolute; }
.wpsg_mod_productview_filter #wpsg_mod_productview_filter_price-range .ui-slider-bg { margin-left:16px; background-color:#E1E1E1; width:100%; height:2px; position:absolute; top:8px; }
.wpsg_mod_productview-order { position:relative; cursor:pointer; }
.wpsg_mod_productview-order-layer { position:absolute; width:100%; display:none; margin-top:5px; left:0px; z-index:1; }
@@ -642,16 +678,16 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max /* Produktübersicht */
.wpsg_mod_productview_oldprice { font-size:0.9em; color:#ff0000; text-decoration:line-through; }
.wpsg_mod_productview_newprice { font-size:1em; font-weight:bold; }
-
+
/* Dialog für Meldungen wenn nicht auf einer Shop Seite / Warenkorbmeldung BEGIN */
#wpsg_ajax_layer { position:fixed; z-index:1000; left:0px; top:0px; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.75); display:flex; justify-content:center; align-items:center; }
#wpsg_ajax_layer .wpsg_ajax_message_content { background-color:#FFFFFF; padding:1.5rem; text-align:center; }
#wpsg_ajax_layer .wpsg_ajax_message_content li { list-style:none; }
@media screen and (max-width: 320px) {
-
+
#wpsg_ajax_layer .wpsg_ajax_message_content { width:300px; }
-
+
}
/* Dialog für Meldungen wenn nicht auf einer Shop Seite / Warenkorbmeldung ENDE */
@@ -665,7 +701,7 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_produkt_wrapper2 .wpsg_produkt_produktbilder img { width:230px !important; height:230px; object-fit:cover; object-position:50% 50%; max-width:none; float:left; }
.wpsg_produkt_wrapper2 .wpsg_produkt_produktbilder { width:260px; max-width:260px; }
.wpsg_produkt_wrapper2 .wpsg_productimages { margin-right:0px !important; }
-.wpsg_produkt_wrapper2 .bigimg img { margin:0 15px 15px 15px; width:100px; height:auto; float:left; }
+.wpsg_produkt_wrapper2 .bigimg img { margin:0 15px 15px 15px; width:100px; height:auto; float:left; }
/* wpsg_mod_amazon_v2 */
#AmazonPayButton_wrap { text-align:right; margin-bottom:2rem; width:100%; justify-content:flex-end; display:flex; }
@@ -696,4 +732,77 @@ html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max .wpsg_mod_prepayment_qrrechnung_left_qrcodeimg { width:240px; height:240px; }
.wpsg_mod_prepayment_qrrechnung_left_wrap { display:flex; gap:25%; }
.wpsg_mod_prepayment_qrrechnung_left_currency { display:flex; flex-direction:column; }
-.wpsg_mod_prepayment_qrrechnung_left_amount { display:flex; flex-direction:column; }
\ No newline at end of file +.wpsg_mod_prepayment_qrrechnung_left_amount { display:flex; flex-direction:column; }
+
+/* Blöcke: Produktliste, Mini-Warenkorb, Kundenkonto (seit 4.6.1, nur neue Klassen) */
+.wpsg-block-product-list .wpsg-product-list__count { margin:0 0 1rem; }
+.wpsg-block-product-list .wpsg-product-list__count:empty { display:none; }
+.wpsg-block-product-list .wpsg-product-list__items { display:grid; grid-template-columns:repeat(var(--wpsg-columns, 3), minmax(0, 1fr)); gap:2rem 1rem; list-style:none; margin:0; padding:0; }
+.wpsg-block-product-list .wpsg-product-list__item { display:flex; flex-direction:column; gap:0.5em; min-width:0; margin:0; padding:0; }
+.wpsg-block-product-list .wpsg-product-list__image img { display:block; width:100%; height:auto; }
+.wpsg-block-product-list .wpsg-product-list__title { margin:0; font-size:1em; line-height:1.3; overflow-wrap:anywhere; hyphens:auto; }
+.wpsg-block-product-list .wpsg-product-list__price, .wpsg-block-product-price .wpsg-product-list__price { font-size:1.2em; }
+.wpsg-block-product-list .wpsg-product-list__taxnote,
+.wpsg-block-product-list .wpsg-product-list__baseprice,
+.wpsg-block-product-list .wpsg-product-list__deliverytime,
+.wpsg-block-product-price .wpsg-product-list__taxnote,
+.wpsg-block-product-price .wpsg-product-list__baseprice { font-size:0.8em; }
+.wpsg-block-product-list .wpsg-product-list__action, .wpsg-block-product-price .wpsg-product-list__action { margin-top:auto; padding-top:0.5em; }
+.wpsg-block-product-list .wpsg-product-list__action form, .wpsg-block-product-price .wpsg-product-list__action form { margin:0; }
+.wpsg-block-product-list .wpsg-product-list__action .wpsg_button, .wpsg-block-product-price .wpsg-product-list__action .wpsg_button { display:block; width:100%; margin:0; text-align:center; box-sizing:border-box; }
+.wpsg-block-mini-cart .wpsg-mini-cart__link,
+.wpsg-block-customer-account .wpsg-customer-account__link { display:inline-flex; flex-wrap:wrap; align-items:baseline; gap:0.5em; }
+.wpsg-block-mini-cart .wpsg-mini-cart__content { display:inline-flex; gap:0.5em; }
+.wpsg-block-mini-cart .wpsg-mini-cart__sum { font-weight:bold; }
+@media (max-width:600px) {
+ .wpsg-block-product-list .wpsg-product-list__items { grid-template-columns:repeat(min(var(--wpsg-columns, 3), 2), minmax(0, 1fr)); }
+}
+/* Produktansichten (Modul, Vorlage seit 4.6.1, nur neue Klassen) */
+.wpsg-pv .wpsg-pv__head { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em 1rem; margin-bottom:1rem; }
+.wpsg-pv .wpsg-pv__title { flex:1 1 100%; margin:0; }
+.wpsg-pv .wpsg-pv__info { flex:1 1 auto; margin:0; font-size:0.8em; opacity:0.8; }
+.wpsg-pv .wpsg-pv__order { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; margin:0; }
+.wpsg-pv .wpsg-pv__order label { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; }
+.wpsg-pv .wpsg-pv__modes { display:flex; gap:0.75em; }
+.wpsg-pv .wpsg-pv__modes a.active { font-weight:bold; text-decoration:none; }
+.wpsg-pv .wpsg-pv__items { display:grid; grid-template-columns:repeat(var(--wpsg-columns, 4), minmax(0, 1fr)); gap:calc(1rem * 2) 1rem; list-style:none; margin:0; padding:0; }
+.wpsg-pv .wpsg-pv__item { display:flex; flex-direction:column; gap:0.5em; min-width:0; margin:0; padding:0; }
+.wpsg-pv .wpsg-pv__image img { display:block; width:100%; height:auto; }
+.wpsg-pv .wpsg-pv__body { display:flex; flex-direction:column; gap:0.35em; flex:1 1 auto; min-width:0; }
+.wpsg-pv .wpsg-pv__body > p, .wpsg-pv .wpsg-pv__description { margin:0; }
+.wpsg-pv .wpsg-pv__name { margin:0; font-size:1em; line-height:1.3; overflow-wrap:anywhere; hyphens:auto; }
+.wpsg-pv .wpsg-pv__price { font-size:1.2em; }
+.wpsg-pv .wpsg-pv__price-old { margin-left:0.5em; font-size:0.8em; opacity:0.8; }
+.wpsg-pv .wpsg-pv__detailname, .wpsg-pv .wpsg-pv__taxnote, .wpsg-pv .wpsg-pv__baseprice, .wpsg-pv .wpsg-pv__stock, .wpsg-pv .wpsg-pv__deliverytime, .wpsg-pv .wpsg-pv__weight { font-size:0.8em; opacity:0.8; }
+.wpsg-pv .wpsg-pv__description { display:none; }
+.wpsg-pv .wpsg-pv__action { display:flex; flex-direction:column; gap:0.5em; margin-top:auto; padding-top:0.5em; }
+.wpsg-pv .wpsg-pv__action form { margin:0; }
+.wpsg-pv .wpsg-pv__action .wpsg_button { display:block; width:100%; margin:0; text-align:center; box-sizing:border-box; }
+.wpsg-pv--list .wpsg-pv__items { grid-template-columns:minmax(0, 1fr); }
+.wpsg-pv--list .wpsg-pv__item { flex-direction:row; gap:1rem; padding-bottom:1rem; border-bottom:1px solid #EAEAEA; }
+.wpsg-pv--list .wpsg-pv__image { flex:0 0 min(30%, 220px); }
+.wpsg-pv--list .wpsg-pv__description { display:block; }
+.wpsg-pv--list .wpsg-pv__action .wpsg_button { display:inline-block; width:auto; }
+.wpsg-pv--list .wpsg-pv__action { flex-direction:row; flex-wrap:wrap; }
+.wpsg-pv .wpsg-pv__pager { display:flex; flex-wrap:wrap; justify-content:center; gap:0.5em; margin-top:calc(1rem * 2); }
+.wpsg-pv .wpsg-pv__pager a, .wpsg-pv .wpsg-pv__pager span { min-width:2em; padding:0.25em 0.5em; text-align:center; border:1px solid #CCCCCC; border-radius:3px; }
+.wpsg-pv .wpsg-pv__pager span[aria-current] { font-weight:bold; background-color:#F5F5F5; }
+.wpsg-pv .wpsg-pv__pager .wpsg-pv__gap { border-color:transparent; }
+.wpsg-pv.is-loading { opacity:0.5; pointer-events:none; }
+.wpsg-kuhint { margin-top:1rem; font-size:0.8em; font-style:italic; }
+.wpsg-pvf .wpsg-pvf__item { margin:0 0 1rem 0; padding:0; border:0; min-width:0; }
+.wpsg-pvf .wpsg-pvf__title { margin:0 0 0.5em 0; padding:0; font-size:1em; font-weight:bold; }
+.wpsg-pvf .wpsg-pvf__item ul { margin:0; padding-left:1.2em; }
+.wpsg-pvf .wpsg-pvf__price .wpsg-pvf__options { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; }
+.wpsg-pvf .wpsg-pvf__price label { display:flex; align-items:center; gap:0.35em; }
+.wpsg-pvf .wpsg-pvf__price input { width:7em; }
+.wpsg-pvf .wpsg-pvf__price label > span { min-width:1.75em; }
+.wpsg-pvf .wpsg-pvf__option { display:flex; align-items:center; gap:0.5em; margin:0.25em 0; }
+.wpsg-pvf .wpsg-pvf__color { display:inline-block; width:1.2em; height:1.2em; border:1px solid #CCCCCC; border-radius:3px; }
+.wpsg-pvf .wpsg-pvf__actions { display:flex; flex-wrap:wrap; align-items:center; gap:1rem; }
+
+@media (max-width:600px) {
+ .wpsg-pv .wpsg-pv__items { grid-template-columns:repeat(min(var(--wpsg-columns, 4), 2), minmax(0, 1fr)); }
+ .wpsg-pv--list .wpsg-pv__items { grid-template-columns:minmax(0, 1fr); }
+ .wpsg-pv--list .wpsg-pv__item { flex-direction:column; }
+}
diff --git a/views/css/gutenberg.css b/views/css/gutenberg.css deleted file mode 100644 index c626b70..0000000 --- a/views/css/gutenberg.css +++ /dev/null @@ -1,4 +0,0 @@ -.wp-block-wpsg-product { background-color:#C4D100; color:#003C6A; margin:-5px; padding:10px; }
-.wp-block-wpsg-product .components-base-control__field { width:100%; display:flex; justify-content:flex-start; align-items:center; margin-bottom:0; }
-.wp-block-wpsg-product .components-base-control__field label { width:150px; }
-.wp-block-wpsg-product .components-base-control+.components-base-control { margin-bottom:0; }
\ No newline at end of file diff --git a/views/css/smartcheckout.css b/views/css/smartcheckout.css index aed9849..c044545 100644 --- a/views/css/smartcheckout.css +++ b/views/css/smartcheckout.css @@ -43,6 +43,11 @@ html body.content-style-boxed .entry-content .wpsg_smartcheckout_after.alignwide .wpsg_smartcheckout .sc_layout { display:grid; grid-template-columns:minmax(0, 1fr) calc(21 * var(--sc-u, 1rem)); gap:var(--sc-gap); align-items:start; } .wpsg_smartcheckout_single .sc_layout { grid-template-columns:minmax(0, 1fr); } .wpsg_smartcheckout .sc_main { display:flex; flex-direction:column; min-width:0; } +/* Hülle der Eingaben, im Bestätigungsschritt gesperrt; ohne die Rahmen und Abstände, die Browser einem fieldset geben */ +.wpsg_smartcheckout .sc_fieldset { display:flex; flex-direction:column; min-width:0; margin:0; padding:0; border:0; } +.wpsg_smartcheckout .sc_fieldset:disabled .sc_box { opacity:0.75; } +.wpsg_smartcheckout .sc_confirm_note { margin-bottom:var(--sc-gap); padding:calc(0.9 * var(--sc-u, 1rem)); border-left:3px solid var(--sc-accent); background:var(--sc-flat); scroll-margin-top:calc(1.5 * var(--sc-u, 1rem)); } +.wpsg_smartcheckout .sc_confirm_note p { margin:calc(0.4 * var(--sc-u, 1rem)) 0 calc(0.75 * var(--sc-u, 1rem)) 0; } .wpsg_smartcheckout .sc_side { position:sticky; top:calc(1.5 * var(--sc-u, 1rem)); } .wpsg_smartcheckout_single .sc_side { position:static; } .wpsg_smartcheckout .sc_layout.sc_busy { opacity:0.6; pointer-events:none; transition:opacity 0.15s ease-out; } @@ -259,6 +264,11 @@ html body.content-style-boxed .entry-content .wpsg_smartcheckout_after.alignwide /* Zusammenfassung */ .wpsg_smartcheckout .sc_summary { position:relative; padding:calc(1.25 * var(--sc-u, 1rem)); border:1px solid var(--sc-line-soft); border-radius:var(--sc-radius); } .wpsg_smartcheckout_single .sc_side { margin-top:var(--sc-gap); } +.wpsg_smartcheckout .sc_sum_products { display:flex; flex-direction:column; gap:calc(0.3 * var(--sc-u, 1rem)); margin-bottom:calc(0.75 * var(--sc-u, 1rem)); padding-bottom:calc(0.75 * var(--sc-u, 1rem)); border-bottom:1px solid var(--sc-line-soft); font-size:calc(0.85 * var(--sc-u, 1rem)); } +.wpsg_smartcheckout .sc_sum_products:empty { display:none; } +.wpsg_smartcheckout .sc_sum_product { display:flex; justify-content:space-between; gap:var(--sc-u, 1rem); align-items:baseline; } +.wpsg_smartcheckout .sc_sum_product_name { min-width:0; overflow-wrap:anywhere; } +.wpsg_smartcheckout .sc_sum_product_price { white-space:nowrap; } .wpsg_smartcheckout .sc_sum_rows { display:flex; flex-direction:column; gap:calc(0.4 * var(--sc-u, 1rem)); } .wpsg_smartcheckout .sc_sum_row { display:flex; justify-content:space-between; gap:var(--sc-u, 1rem); align-items:baseline; font-size:calc(0.95 * var(--sc-u, 1rem)); } .wpsg_smartcheckout .sc_sum_value { white-space:nowrap; } @@ -276,13 +286,16 @@ html body.content-style-boxed .entry-content .wpsg_smartcheckout_after.alignwide /* Bestellbedingungen und AGB */ .wpsg_smartcheckout .sc_modul_conditions, -.wpsg_smartcheckout .sc_agb { margin-top:calc(1.1 * var(--sc-u, 1rem)); font-size:calc(0.85 * var(--sc-u, 1rem)); } +.wpsg_smartcheckout .sc_agb, +.wpsg_smartcheckout .wpsg-review-remind { margin-top:calc(1.1 * var(--sc-u, 1rem)); font-size:calc(0.85 * var(--sc-u, 1rem)); } .wpsg_smartcheckout .sc_modul_conditions .wpsg_agb + .wpsg_agb { margin-top:calc(0.6 * var(--sc-u, 1rem)); } /* Die Module setzen den Text als losen Textknoten ins label — Flex würde ihn zerreißen */ .wpsg_smartcheckout .sc_modul_conditions label, -.wpsg_smartcheckout .sc_agb label { display:block; position:relative; padding-left:calc(1.5 * var(--sc-u, 1rem)); cursor:pointer; } +.wpsg_smartcheckout .sc_agb label, +.wpsg_smartcheckout .wpsg-review-remind label { display:block; position:relative; padding-left:calc(1.5 * var(--sc-u, 1rem)); cursor:pointer; } .wpsg_smartcheckout .sc_modul_conditions label > input[type="checkbox"], -.wpsg_smartcheckout .sc_agb label > input[type="checkbox"] { position:absolute; left:0; top:calc(0.15 * var(--sc-u, 1rem)); margin:0; } +.wpsg_smartcheckout .sc_agb label > input[type="checkbox"], +.wpsg_smartcheckout .wpsg-review-remind label > input[type="checkbox"] { position:absolute; left:0; top:calc(0.15 * var(--sc-u, 1rem)); margin:0; } .wpsg_smartcheckout .sc_modul_conditions .wpsg_mod_ordercondition_hint { max-height:calc(9 * var(--sc-u, 1rem)); overflow-y:auto; margin-top:calc(0.5 * var(--sc-u, 1rem)); padding:calc(0.6 * var(--sc-u, 1rem)); border:1px solid var(--sc-line-soft); border-radius:var(--sc-radius); } /* Fehlerhafte Eingaben */ @@ -298,6 +311,7 @@ html body.content-style-boxed .entry-content .wpsg_smartcheckout_after.alignwide .wpsg_smartcheckout .sc_button:disabled { opacity:0.5; cursor:default; } .wpsg_smartcheckout .sc_button_secondary { padding:calc(0.5 * var(--sc-u, 1rem)) calc(0.9 * var(--sc-u, 1rem)); border-color:var(--sc-line); font-size:calc(0.9 * var(--sc-u, 1rem)); } .wpsg_smartcheckout .sc_button_order { width:100%; margin-top:calc(1.1 * var(--sc-u, 1rem)); font-weight:600; } +.wpsg_smartcheckout .sc_button_edit { width:100%; margin-top:calc(0.5 * var(--sc-u, 1rem)); } /* Ladeanzeige */ .wpsg_smartcheckout .sc_spinner { position:absolute; top:calc(1.25 * var(--sc-u, 1rem)); right:calc(1.25 * var(--sc-u, 1rem)); } diff --git a/views/css/wpsg-theme.css b/views/css/wpsg-theme.css new file mode 100644 index 0000000..df08fc8 --- /dev/null +++ b/views/css/wpsg-theme.css @@ -0,0 +1,822 @@ +@charset "UTF-8"; + +/* + * wpShopGermany, Darstellung „An das Theme angepasst“; Spezifität und Aufbau: doc/code-kommentar.md#wpsg-theme-css + * Anpassen über die Variablen --wpsg-* (Handbuch „Für Theme-Entwickler“) + */ + +/* Variablen; Farben mit Rückfall auf Astra und Kadence */ +:where(:root) { + --wpsg-color-background: var(--wp--preset--color--base, var(--ast-global-color-5, var(--global-palette9, #ffffff))); + --wpsg-color-foreground: var(--wp--preset--color--contrast, var(--ast-global-color-3, var(--global-palette4, #111111))); + --wpsg-color-accent: var(--wp--preset--color--primary, var(--wp--preset--color--contrast, currentColor)); + --wpsg-color-line: rgba(127, 127, 127, 0.35); + --wpsg-color-line-soft: rgba(127, 127, 127, 0.2); + --wpsg-color-surface: rgba(127, 127, 127, 0.08); + --wpsg-color-overlay: rgba(0, 0, 0, 0.6); + --wpsg-color-error: #e12b2b; + --wpsg-color-success: #228732; + --wpsg-color-notice: #a66709; + --wpsg-muted-opacity: 0.7; + --wpsg-radius: 3px; + --wpsg-label-background: var(--wpsg-color-accent); + --wpsg-label-color: var(--wpsg-color-background); + --wpsg-gap: 1rem; + --wpsg-font-size-small: var(--wp--preset--font-size--small, 0.875em); + --wpsg-color-field-line: color-mix(in srgb, var(--wpsg-color-foreground) 55%, var(--wpsg-color-background)); + --wpsg-field-border: 1px solid var(--wpsg-color-field-line); + --wpsg-field-padding: 0.6em 0.75em; + --wpsg-field-background: transparent; + --wpsg-button-background: transparent; + --wpsg-button-color: inherit; + --wpsg-button-padding: 0.6em 1.2em; +} + +/* Browser ohne color-mix(): Grau, das auf hellem und dunklem Grund 3:1 erreicht */ +@supports not (color: color-mix(in srgb, red 50%, blue)) { + :where(:root) { --wpsg-color-field-line: rgba(127, 127, 127, 0.9); } +} + +/* Allgemein */ +.wpsg-flex { display:flex; } +.wpsg-align-center { align-items:center; } +.wpsg-gap-2 { gap:0.5rem; } +.wpsg_clear { clear:both; } +.wpsg_spacer { width:100%; height:1px; background-color:var(--wpsg-color-line-soft); margin-bottom:var(--wpsg-gap); } +.wpsg_noscroll { overflow:hidden; } +.wpsg_upper { vertical-align:top; font-size:60%; } +:where(.wpsg, .wpsg_mod_productindex, .wpsg_productform) :where(*, *::before, *::after) { box-sizing:border-box; } +.wpsg_required { color:var(--wpsg-color-error); font-weight:bold; } + +/* alignwide in Themes mit Inhaltskarte (Kadence content-style-boxed) */ +:where(body.content-style-boxed .entry-content .wpsg.alignwide) { margin-left:0; margin-right:0; width:auto; max-width:100%; } + +/* Meldungen: Farbe nur am Rand, der Text bleibt in der Schriftfarbe des Themes */ +[id="wpsg_error"], [id="wpsg_message"], [id="wpsg_notice"] { margin:0 0 var(--wpsg-gap) 0; padding:0; } +[id="wpsg_message"] :where(li, p), [id="wpsg_error"] :where(li, p), [id="wpsg_notice"] :where(li, p) { list-style:none; margin:0 0 0.25rem 0; padding:0.5em 0.75em; border-left:4px solid var(--wpsg-color-line); background-color:var(--wpsg-color-surface); } +[id="wpsg_message"] :where(li, p) { border-left-color:var(--wpsg-color-success); } +[id="wpsg_notice"] :where(li, p) { border-left-color:var(--wpsg-color-notice); } +[id="wpsg_error"] :where(li, p) { border-left-color:var(--wpsg-color-error); } +.wpsg_error { border-color:var(--wpsg-color-error); } +.wpsg_error:where(input), .wpsg_error:where(select), .wpsg_error:where(textarea) { border:1px solid var(--wpsg-color-error); } +.wpsg_error:where(label) { position:absolute; right:2px; top:-2px; color:var(--wpsg-color-error); } +.wpsg_checkout :where(label.wpsg_error) { background-color:var(--wpsg-color-background); } + +/* Eingabefelder: Rückfall; gestaltet das Theme sie, gewinnt es */ +:where(.wpsg, .wpsg_productform, .wpsg_mod_productindex, .wpsg_basket_widget, .wpsg_mod_kundenverwaltung_widget, #wpsg_calc_layer, .wpsg-pv, .wpsg-pvf) :where(input[type="text"], input[type="email"], input[type="tel"], input[type="number"], input[type="password"], input[type="date"], input[type="search"], input:not([type]), select, textarea) { + font:inherit; + color:inherit; + padding:var(--wpsg-field-padding); + border:var(--wpsg-field-border); + border-radius:var(--wpsg-radius); + background-color:var(--wpsg-field-background); + max-width:100%; +} +:where(.wpsg, .wpsg_productform, .wpsg_mod_productindex, .wpsg_basket_widget, .wpsg_mod_kundenverwaltung_widget, #wpsg_calc_layer, .wpsg-pv, .wpsg-pvf) :where(select) { background-color:var(--wpsg-color-background); color:var(--wpsg-color-foreground); height:auto; } +:where(.wpsg, .wpsg_productform) :where(textarea) { resize:vertical; } + +/* Knöpfe: Rückfall, siehe doc/code-kommentar.md#wpsg-theme-knoepfe */ +:where(.wpsg_button, .wpsg_checkoutbutton, .wpsg_orderbutton, .wpsg_overviewbutton, .wpsg_refreshbutton, .wpsg_basketbutton, .wpsg_checkout2button, .wpsg_saveButton, .wpsg_registerButton, .wpsg_add_basket, .wpsg_add_requestlist, .wpsg_mod_request_button_refresh, .wpsg_mod_request_button_submit, .garan_label_popup_confirm):where(:not(.wp-element-button)) { + display:inline-block; + font:inherit; + line-height:1.4; + cursor:pointer; + padding:var(--wpsg-button-padding); + border:1px solid currentColor; + border-radius:var(--wpsg-radius); + background-color:var(--wpsg-button-background); + color:var(--wpsg-button-color); + text-decoration:none; +} +/* Links als Knopf mit Klassen-Spezifität gegen Resets wie a { border:0 } */ +:where(a):is(.wpsg_button, .wpsg_checkoutbutton, .wpsg_orderbutton, .wpsg_overviewbutton, .wpsg_refreshbutton, .wpsg_basketbutton, .wpsg_checkout2button, .wpsg_saveButton, .wpsg_registerButton, .wpsg_add_basket, .wpsg_add_requestlist, .wpsg_mod_request_button_refresh, .wpsg_mod_request_button_submit, .garan_label_popup_confirm):where(:not(.wp-element-button)) { display:inline-block; padding:var(--wpsg-button-padding); border:1px solid currentColor; border-radius:var(--wpsg-radius); text-decoration:none; } +.wpsg_button:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_checkoutbutton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_orderbutton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_overviewbutton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_refreshbutton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_basketbutton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_checkout2button:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_saveButton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_registerButton:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_add_basket:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_add_requestlist:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_mod_request_button_refresh:where(:not(.wp-element-button)):where(:hover, :focus-visible), .wpsg_mod_request_button_submit:where(:not(.wp-element-button)):where(:hover, :focus-visible), .garan_label_popup_confirm:where(:not(.wp-element-button)):where(:hover, :focus-visible) { background-color:var(--wpsg-color-surface); } + +/* Warenkorb-Widget */ +.wpsg_basket_widget :where(.wpshopgermany_linktokasse) { float:right; margin-top:var(--wpsg-gap); } +.wpsg_basket_widget :where(table) { width:100%; } +.wpsg_basket_widget :where(table td) { line-height:1.25rem; } +.wpsg_basket_widget :where(table .wpsg_cell_name) { padding-left:0.2rem; } +.wpsg_basket_widget :where(table .wpsg_cell_amount) { text-align:right; padding-right:0.2rem; } +.wpsg_basket_widget :where(table .wpsg_row_summary .wpsg_cell_amount) { font-weight:bold; } +.wpsg_basket_widget :where(.wpsg_tax_note) { font-size:0.75em; } + +/* Warenkorb */ +.basket_product_wrap :where(.basket_product_row) { display:flex; align-items:flex-start; gap:0.75em; border-bottom:1px solid var(--wpsg-color-line-soft); padding-bottom:1em; margin-bottom:1em; } +.basket_product_wrap :where(.basket_product_row .product_shortdesc) { margin-top:0.5em; } +.basket_product_wrap :where(.basket_product_row .productimage) { flex:0 0 auto; max-width:150px; } +.basket_product_wrap :where(.basket_product_row .productimage img), .wpsg_overview :where(.overview_product_row .productimage img) { max-width:100%; height:auto; } +.basket_product_wrap :where(.basket_product_row .product_content) { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; justify-content:space-between; } +.basket_product_wrap :where(.basket_product_row .product_action) { display:flex; flex-wrap:wrap; width:100%; justify-content:space-between; align-items:center; gap:0.25em 0.75em; } +.basket_product_wrap :where(.basket_product_row .product_action div.amount) { flex:0 0 auto; width:7.5em; padding-right:2em; position:relative; margin-top:0.5em; margin-bottom:0.5em; text-align:center; } +:where(.basket_product_wrap .basket_product_row .product_action div.amount input) { width:100%; padding-left:0.25em; padding-right:0.25em; text-align:center; } +.basket_product_wrap :where(.basket_product_row .product_action div.amount .wpsg_basket_removelink) { box-shadow:none; text-decoration:none; border:0; position:absolute; display:flex; right:5px; top:50%; margin-top:-8px; height:16px; width:16px; } +.basket_product_wrap :where(.basket_product_row .product_action .title) { flex:1 1 0%; min-width:0; margin-top:0.3em; margin-bottom:0.3em; overflow-wrap:anywhere; } +.basket_product_wrap :where(.basket_product_row .product_action .price) { flex:0 0 auto; text-align:right; } +.basket_product_wrap :where(.basket_product_row .product_action .price_total) { flex:0 0 auto; font-weight:bold; text-align:right; } +.basket_product_wrap :where(.basket_product_row .product_info) { display:flex; width:100%; justify-content:space-between; align-items:center; gap:0.75em; margin-bottom:0.25rem; } +.basket_product_wrap :where(.basket_product_row .product_upload .wpsg_mod_orderupload_target) { margin-left:15px; flex-grow:1; } +.basket_product_wrap :where(.basket_product_row .product_upload .wpsg_mod_orderupload_target ul) { margin:0; } +.basket_product_wrap :where(.basket_product_row .product_upload .wpsg_mod_orderupload_target li) { display:flex; justify-content:space-between; } +.basket_product_wrap :where(.basket_product_row .product_upload .wpsg_mod_orderupload_target li a.removeLink) { text-decoration:none; box-shadow:none; align-self:center; } +.basket_product_wrap :where(.basket_product_row .product_upload ul li) { list-style:none; } +.basket_product_wrap :where(.basket_product_row .product_info .titlep) { min-width:120px; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; } +.basket_product_wrap :where(.basket_product_row .product_info .title) { display:inline-block; margin-top:0.3em; margin-bottom:0.3em; } +.basket_product_wrap :where(.basket_product_row .product_info .valuel) { width:50%; display:inline-block; text-align:left; } +.basket_product_wrap :where(.basket_product_row .product_info .valuer) { width:50%; display:inline-block; text-align:right; } +.basket_product_wrap :where(.basket_product_row .product_info .fulll) { width:80%; display:inline-block; text-align:left; } +.basket_product_wrap :where(.basket_product_row .product_info .dummyr) { width:19%; display:inline-block; text-align:right; } +.basket_product_wrap :where(.basket_product_row .product_info .dummy) { flex-grow:1; width:90px; } +.basket_product_wrap :where(.basket_product_row .product_info .dummyp) { flex-grow:1; width:110px; } +.basket_sum_wrap :where(.basket_sum_row), .basket_sum_wrap :where(.wpsg_mod_basketteaser_row) { display:flex; width:100%; justify-content:space-between; align-items:center; gap:0.75em; } +.basket_sum_wrap :where(.basket_sum_row) :where(.title, .title2, .titlegs) { flex:1 1 auto; min-width:0; margin-top:0.3em; margin-bottom:0.3em; } +.basket_sum_wrap :where(.basket_sum_voucher .title), .basket_sum_wrap :where(.basket_sum_coupon .title) { display:flex; justify-content:flex-start; align-items:center; } +.basket_sum_wrap :where(.basket_sum_voucher .title a), .basket_sum_wrap :where(.basket_sum_coupon .title a) { margin-right:0.5rem; } +.basket_sum_wrap :where(.basket_sum_row) :where(.value, .sum, .delgs, .colgsr) { flex:0 0 auto; text-align:right; } +.basket_sum_wrap :where(.basket_sum_row) :where(.valuel, .codegsf, .codegsl, .colgsl) { text-align:left; } +.basket_sum_wrap :where(.basket_sum_row .sum) { font-weight:bold; } +.basket_sum_wrap :where(.basket_sum_row:has(.codegsl)) { flex-wrap:wrap; } +.basket_sum_wrap :where(.basket_sum_row .codegs) { flex:1 1 8em; text-align:left; } +.basket_sum_wrap :where(.basket_sum_row .codegsl) { flex:1 1 10em; min-width:0; } +:where(.basket_sum_wrap .basket_sum_row .codegsl input) { width:100%; } +.basket_sum_wrap :where(.basket_sum_row .codegsr) { flex:0 0 auto; text-align:right; } +.basket_sum_wrap :where(.wpsg_mod_basketteaser_row .valuer) { text-align:right; } +.basket_sum_wrap :where(.wpsg_mod_basketteaser_row .valuel) { text-align:left; } +.basket_sum_wrap :where(.wpsg_customerbudget_row .wpsg_customerbudget_error) { width:100%; margin:0; color:var(--wpsg-color-error); font-size:var(--wpsg-font-size-small); font-weight:bold; } +.procent_payship { display:block; font-size:0.75em; line-height:1.2; opacity:var(--wpsg-muted-opacity); margin-bottom:10px; } +.wpsg_basket :where(.wpsg_cell_gesamtsumme_value) { font-weight:bold; } +.wpsg_basket :where(.set_land), .wpsg_basket :where(.set_shipping) { max-width:100%; } +.wpsg_basket :where(.wpsg_checkoutbutton) { float:right; } +.wpsg_basket :where(.wpsg_refreshbutton), .wpsg_checkout2button, .wpsg_basketbutton { float:left; } +.wpsg_basket :where(.product_action_printshop .label) { align-self:flex-start; } +.wpsg_basket :where(.product_action_printshop .files ul li) { list-style:none; display:flex; align-items:center; justify-content:flex-end; } +.wpsg_basket :where(.product_action_printshop .files ul li img) { margin-left:5px; cursor:pointer; } + +/* Kasse und Anfrage */ +.wpsg_checkout :where(.wpsg_checkoutblock) { width:100%; clear:both; margin-bottom:2px; position:relative; } +.wpsg_checkout :where(.wpsg_checkoutblock label) { vertical-align:middle; } +.wpsg_checkout :where(.wpsg_checkoutblock) :where(input.wpsg_input_text, input[type="tel"], input[type="fax"], input[type="text"], input[type="email"], input[type="number"], input[type="password"], select) { margin-bottom:5px; width:100%; } +:where(.wpsg_checkout .wpsg_checkoutblock input[type="checkbox"]) { width:auto; margin-right:5px; } +.wpsg_checkout :where(.wpsg_checkoutblock .g-recaptcha) { float:right; margin-top:15px; } +.wpsg_checkout :where(.wpsg_mandatoryfield_hint), .wpsg_checkout2 :where(.wpsg_mandatoryfield_hint) { margin-top:var(--wpsg-gap); } +.wpsg_checkout :where(.wpsg_checkout2button) { float:right; } +/* Zurück als Link (Punkt 8.12): links, auf Höhe des Knopfs rechts */ +.wpsg-checkout__back { float:left; display:inline-block; padding:var(--wpsg-button-padding); padding-inline-start:0; color:inherit; } +/* Kasse zweispaltig (Punkt 8.10): Formular links, „Ihre Bestellung“ rechts; schmal untereinander */ +.wpsg-checkout__layout { display:grid; grid-template-columns:minmax(0, 1fr); gap:calc(var(--wpsg-gap) * 2); align-items:start; } +@media (min-width: 900px) { .wpsg-checkout__layout { grid-template-columns:minmax(0, 2fr) minmax(16rem, 1fr); } .wpsg-checkout__summary { position:sticky; top:var(--wpsg-gap); } } +.wpsg-checkout__layout > form { min-width:0; } +.wpsg-checkout__summary { padding:calc(var(--wpsg-gap) * 1.5); border:1px solid var(--wpsg-color-line); border-radius:var(--wpsg-radius); background:var(--wpsg-color-surface); } +.wpsg-checkout__summary-title { margin:0 0 0.75em; font-size:1.25em; } +.wpsg-checkout__summary-items { margin:0; padding:0; list-style:none; } +.wpsg-checkout__summary-row { display:flex; flex-wrap:wrap; justify-content:space-between; column-gap:var(--wpsg-gap); margin:0 0 0.5em; } +.wpsg-checkout__summary-row > span:last-child { margin-left:auto; white-space:nowrap; text-align:right; } +.wpsg-checkout__summary-row > span:first-child { flex:1 1 0; min-width:min-content; overflow-wrap:break-word; hyphens:manual; } +.wpsg-checkout__summary-variant, .wpsg-checkout__summary-detail { display:block; font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg-checkout__summary-row.is-muted, .wpsg-checkout__summary-tax { opacity:var(--wpsg-muted-opacity); } +.wpsg-checkout__summary-total { margin-top:0.75em; padding-top:0.75em; border-top:1px solid var(--wpsg-color-line); font-weight:700; font-size:1.1em; } +.wpsg-checkout__summary-tax { margin:0.25em 0 0; font-size:var(--wpsg-font-size-small); } +.wpsg_checkout :where(.wpsg_mod_ordervars), .wpsg_checkout :where(.wpsg_mod_shippingadress) { margin-bottom:var(--wpsg-gap); } +.wpsg_checkout :where(.wpsg_mod_ordervars_field) { display:inline; } +:where(.wpsg_checkout h2) { padding:10px 0; } +.wpsg_checkout :where(.wpsg_commentblock textarea), .wpsg :where(#wpsg_checkout_comment) { width:100%; height:150px; } +.wpsg_checkout :where(.wpsg_logout_box a) { float:right; padding:0.75em 1em; font-weight:bold; } +.wpsg_checkout :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock), .wpsg_mod_request_requestpage :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) { display:flex; flex-direction:row; width:100%; } +.wpsg_checkout :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) :where(.street), .wpsg_mod_request_requestpage :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) :where(.street) { flex-grow:1; padding-right:15px; } +.wpsg_checkout :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) :where(.nr), .wpsg_mod_request_requestpage :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) :where(.nr) { flex:0 0 6em; } +:where(.wpsg_checkout, .wpsg_mod_request_requestpage) :where(#wpsg_streetnr.wpsg_checkoutblock, #wpsg_shipping_streetnr.wpsg_checkoutblock) :where(.nr input) { width:100%; } +/* Felder paarweise (Punkt 8.11): Vorname/Name und PLZ/Ort nebeneinander, alle anderen über die ganze Breite */ +@media (min-width: 600px) { +.wpsg_checkout .wpsg_inner:has(> #wpsg_vorname, > #wpsg_postleitzahl) { display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); column-gap:var(--wpsg-gap); align-items:start; } +.wpsg_checkout .wpsg_inner:has(> #wpsg_vorname, > #wpsg_postleitzahl) > * { grid-column:1 / -1; } +.wpsg_checkout .wpsg_inner:has(> #wpsg_vorname, > #wpsg_postleitzahl) > :is(#wpsg_vorname, #wpsg_name, #wpsg_postleitzahl, #wpsg_ort) { grid-column:auto; } +} +.wpsg_checkout :where(label[for="wpsg_mod_trustedshops_set"]) { margin:var(--wpsg-gap) 0; display:block; } + +/* Versand- und Zahlungsart */ +.shippay_wrap { margin-top:2.5rem; width:100%; } +.wpsg_payment :where(.wpsg_payment_textwrap) { margin-top:2.5rem; } +.shippay_wrap :where(.shippay_item_wrap) { border-top:1px solid var(--wpsg-color-line-soft); cursor:pointer; padding-left:8px; padding-right:40px; } +.shippay_wrap :where(.shippay_item_wrap:last-child) { border-bottom:1px solid var(--wpsg-color-line-soft); } +.shippay_wrap :where(.shippay_active), .shippay_wrap :where(.shippay_item_wrap:hover) { background-color:var(--wpsg-color-surface); } +.shippay_wrap :where(.shippay_item_wrap .shippay_hint) { margin-top:-5px; padding-bottom:20px; font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.shippay_wrap :where(.shippay_active .shippay_hint) { padding-right:8px; } +.shippay_wrap :where(.shippay_active .shippay_hint .shippay_error) { color:var(--wpsg-color-error); font-weight:bold; } +.shippay_wrap :where(.shippay_item_wrap .wpsg_payship_name) { display:table-cell; vertical-align:middle; height:64px; } +.shippay_wrap :where(.shippay_active .wpsg_payship_name) { font-weight:bold; } +.shippay_wrap :where(.shippay_item_wrap .shippay_checkmark) { right:12px; top:22px; width:10px; height:18px; border:solid currentColor; border-width:0 3px 3px 0; transform:rotate(45deg); } +.shippay_wrap :where(.wpsg_payship_logo) { margin-top:-5px; padding-bottom:10px; } +.wpsg_checkout2 :where(.wpsg_overviewbutton) { float:right; } +.wpsg_checkout2 :where(.wpsg_checkoutbutton) { float:left; } +.wpsg_checkout2 :where(.wpsg_overviewbutton), .wpsg_checkout2 :where(.wpsg_checkoutbutton), .wpsg_overview :where(.garan_label_wrap) { text-align:center; } + +/* Bestellübersicht */ +.wpsg_overview :where(.wpsg_agb) { width:100%; clear:both; margin-bottom:2px; } +.wpsg_overview :where(.shippayment) { margin-top:var(--wpsg-gap); float:right; width:45%; } +.wpsg_overview :where(.anschrift) { margin-top:var(--wpsg-gap); float:left; width:55%; } +.wpsg_overview :where(.subtitle) { font-weight:bold; margin-bottom:0.5rem; } +.wpsg_overview :where(.wpsg_orderbutton) { float:right; } +.wpsg_overview :where(.wpsg_checkoutbutton) { float:left; } +.wpsg_overview :where(.wpsg_table_wrap) { margin:10px 0; } +.wpsg_overview :where(.wpsg_table_wrap table) { width:100%; } +.wpsg_overview :where(.wpsg_table_wrap) :where(.wpsg_cell_menge, .wpsg_cell_mwst) { width:100px; text-align:center; } +.wpsg_overview :where(.wpsg_table_wrap) :where(.wpsg_cell_preis, .wpsg_cell_gesamtpreis, .wpsg_cell_summe_value, .wpsg_cell_shipping_value, .wpsg_cell_payment_value, .wpsg_cell_mwst_value) { text-align:right; } +.wpsg_overview :where(.wpsg_table_wrap .wpsg_cell_gesamt_value) { text-align:right; font-weight:bold; } +.wpsg_overview :where(.wpsg_cell_weight_value, .wpsg_cell_deliverytime_value, .wpsg_mod_varianten_value) { text-align:right; } +.wpsg_overview :where(.wpsg_overview_productimage) { display:inline; padding-right:0.2rem; vertical-align:baseline; } +.wpsg_overview :where(.einvoice_input) { margin-bottom:2rem; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row) { display:flex; align-items:flex-start; gap:0.75em; border-bottom:1px solid var(--wpsg-color-line-soft); padding-bottom:1em; margin-bottom:1em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_shortdesc) { margin-top:0.5em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .productimage) { flex:0 0 auto; max-width:150px; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_content) { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; justify-content:space-between; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_action) { display:flex; flex-wrap:wrap; width:100%; justify-content:space-between; align-items:center; gap:0.25em 0.75em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_action div.amount) { width:80px; margin-top:0.5em; margin-bottom:0.5em; text-align:center; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_action .title) { flex:1 1 0%; min-width:0; margin-top:0.3em; margin-bottom:0.3em; overflow-wrap:anywhere; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_action) :where(.price, .price_total) { flex:0 0 auto; text-align:right; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_action .price_total) { font-weight:bold; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info) { display:flex; width:100%; justify-content:space-between; align-items:center; gap:0.75em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .titlep) { min-width:120px; display:inline-block; margin-top:0.3em; margin-bottom:0.3em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .title) { display:inline-block; margin-top:0.3em; margin-bottom:0.3em; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .valuel) { width:50%; display:inline-block; text-align:left; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .valuer) { width:50%; display:inline-block; text-align:right; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .fulll) { width:80%; display:inline-block; text-align:left; } +.wpsg_overview :where(.wpsg_table_wrap .overview_product_row .product_info .dummyr) { width:19%; display:inline-block; text-align:right; } +.overview_sum_wrap :where(.overview_sum_row) { display:flex; width:100%; justify-content:space-between; align-items:center; gap:0.75em; } +.overview_sum_wrap :where(.overview_sum_row) :where(.title, .title2, .titlegs) { flex:1 1 auto; min-width:0; margin-top:0.3em; margin-bottom:0.3em; } +.overview_sum_wrap :where(.overview_sum_row) :where(.value, .sum, .delgs, .codegsr, .colgsr) { flex:0 0 auto; text-align:right; } +.overview_sum_wrap :where(.overview_sum_row) :where(.valuel, .codegs, .codegsl, .colgsl) { text-align:left; } +.overview_sum_wrap :where(.overview_sum_row .sum) { font-weight:bold; } + +/* Fortschritt der Kasse */ +.wpsg_progress { display:block; padding:0; margin:30px 0 100px 0; width:100%; } +.wpsg_progress::after { content:" "; display:block; width:100%; height:10px; border:1px solid var(--wpsg-color-line); background-color:var(--wpsg-color-surface); } +.wpsg_progress :where(span.step) { width:25%; display:block; float:left; list-style:none; position:relative; } +.wpsg_progress :where(span.step > .text) { margin-top:30px; text-align:center; width:100%; display:block; } +.wpsg_progress :where(span.step > .dot) { position:absolute; z-index:2; background-color:var(--wpsg-color-line); width:20px; height:20px; left:50%; top:0; margin-left:-14px; margin-top:-4px; border-radius:10px; } +.wpsg_progress :where(span.step)::before { content:" "; display:block; position:absolute; z-index:2; left:50%; margin-left:-20px; margin-top:-10px; width:30px; height:30px; border-radius:25px; border:1px solid var(--wpsg-color-line); background-color:var(--wpsg-color-background); } +.wpsg_progress :where(span.current)::before, .wpsg_progress :where(span.done)::before { background-color:var(--wpsg-color-accent); border-color:var(--wpsg-color-accent); } +.wpsg_progress :where(span.current > .dot), .wpsg_progress :where(span.done > .dot) { background-color:var(--wpsg-color-background); } +.wpsg_progress :where(span.current)::after, .wpsg_progress :where(span.done)::after { content:" "; display:block; position:absolute; top:0; width:100%; height:10px; background-color:var(--wpsg-color-accent); opacity:0.5; } +.wpsg_progress :where(span.current)::after { width:50%; } +/* Schrittleiste „neu“ (Punkt 8.9): vier gleiche Felder, erledigt und aktuell in der Akzentfarbe */ +.wpsg-steps { margin:0 0 2em; } +.wpsg-steps__list { display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:0.5em; margin:0; padding:0; list-style:none; font-size:var(--wpsg-font-size-small); } +.wpsg-steps__step { margin:0; padding-top:0.6em; border-top:4px solid var(--wpsg-color-line); overflow-wrap:break-word; hyphens:auto; } +.wpsg-steps__step:not(.is-done):not(.is-current) { opacity:var(--wpsg-muted-opacity); } +.wpsg-steps__step:where(.is-done, .is-current) { border-top-color:var(--wpsg-color-accent); } +.wpsg-steps__step.is-current { font-weight:700; } +.wpsg-steps__step a { color:inherit; } +.wpsg-steps__number { margin-right:0.35em; } +.wpsg-steps__number::after { content:"."; } + +/* Kundenkonto */ +.wpsg-account-nav { margin:0 0 2em; border-bottom:1px solid var(--wpsg-color-line); container-type:inline-size; } +.wpsg-account-nav__list { display:flex; flex-wrap:wrap; gap:0 1.5em; margin:0; padding:0; list-style:none; } +.wpsg-account-nav__item { margin:0; } +.wpsg-account-nav__item--logout { margin-inline-start:auto; } +.wpsg-account-nav__link { display:inline-block; padding:0.6em 0; color:inherit; text-decoration:none; } +.wpsg-account-nav__link:where(:hover) { text-decoration:underline; } +.wpsg-account-nav__link:where([aria-current="page"]) { font-weight:700; text-decoration:underline; text-decoration-color:var(--wpsg-color-accent); text-decoration-thickness:3px; text-underline-offset:0.4em; } +/* Schmal bricht die Navigation um; Abmelden läuft dann mit statt allein rechts */ +@container (max-width:36em) { .wpsg-account-nav__item--logout { margin-inline-start:0; } } +.wpsg_profil :where(.wpsg_pwdvergessen_link) { line-height:30px; } +.wpsg_profil :where(.wpsg_mod_kundenverwaltung_login), .wpsg_checkout :where(.wpsg_mod_kundenverwaltung_login) { float:right; } +.wpsg_profil :where(.wpsg_saveButton) { float:right; } +[id="wpsg_pwd_info"] { width:100%; padding:1.5rem; border:1px solid var(--wpsg-color-line); border-radius:var(--wpsg-radius); background-color:var(--wpsg-color-background); color:var(--wpsg-color-foreground); } +[id="wpsg_pwd_info"] :where(ul li) { margin:10px 20px; display:block; } +.invalid { padding-left:22px; line-height:24px; color:var(--wpsg-color-error); } +.valid { padding-left:22px; line-height:24px; color:var(--wpsg-color-success); } +/* Kundenkonto „Bestellungen“: je Bestellung eine Karte, Positionen aufklappbar (K135) */ +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order) { border:1px solid var(--wpsg-color-line, rgba(127,127,127,.35)); border-radius:var(--wpsg-radius, 4px); padding:1em 1.25em; margin:0 0 1em; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__head) { display:flex; flex-wrap:wrap; justify-content:space-between; align-items:baseline; gap:.25em 1em; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__title) { margin:0; font-size:1.15em; font-weight:700; line-height:1.4; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__sum, .col_price) { white-space:nowrap; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__sum) { font-size:1.1em; font-weight:700; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__meta) { margin:.25em 0 0; font-size:var(--wpsg-font-size-small, .875em); opacity:var(--wpsg-muted-opacity, .75); } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__items) { margin-top:.75em; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__items > summary) { cursor:pointer; font-size:var(--wpsg-font-size-small, .875em); } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__items table) { width:100%; margin:.5em 0 0; border-collapse:collapse; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__items td) { padding:.5em 0; border-top:1px solid var(--wpsg-color-line-soft, rgba(127,127,127,.2)); vertical-align:top; text-align:left; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__items td.col_price) { padding-left:1em; text-align:right; } +.wpsg_mod_kundenverwaltung_order :where(.wpsg-account-order__detail) { display:block; font-size:var(--wpsg-font-size-small, .875em); opacity:var(--wpsg-muted-opacity, .85); } +:where(.wpsg_mod_kundenverwaltung_widget) :where(input[type="text"], input[type="password"]) { width:100%; margin-bottom:0.5rem; } +:where(.wpsg_mod_kundenverwaltung_widget input[type="submit"]) { float:right; } + +/* Abo-Produkte */ +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product) { border-bottom:1px solid var(--wpsg-color-line-soft); padding-bottom:15px; margin-bottom:15px; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .link_wrap) { display:inline-block; margin-left:10px; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .link_wrap)::before { content:'['; margin-right:5px; display:inline-block; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .link_wrap)::after { content:']'; margin-left:5px; display:inline-block; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product) :where(.status_activ, .duration_running) { color:var(--wpsg-color-success); } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product) :where(.status_inactiv, .duration_expired) { color:var(--wpsg-color-error); } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .duration_inextension) { color:var(--wpsg-color-notice); } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .value) { margin-left:10px; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .image) { float:left; margin-right:15px; } +.wpsg_mod_abo_order_product_wrap :where(.wpsg_mod_abo_order_product .label) { float:left; width:15rem; } + +/* Produkt */ +.wpsg_productform { position:relative; } +.wpsg_productform :where(img) { max-width:100%; height:auto; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_productimages) { float:left; margin-right:0.75em; } +.wpsg_productform :where(.wpsg_produkt_produktbilder) { max-width:200px; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_produkt_preishinweis) { font-size:0.75em; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_oldprice), .product_wrap :where(.productdetails .oldprice) { text-decoration:line-through; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productview_price) { font-weight:bold; } +/* Widerrufsdialog in den Farben des Themes (W5, K76); html body gegen wpsg_revocation.css */ +html body #wpsg_revocation_dialog .inner { background-color:var(--wpsg-color-background); color:var(--wpsg-color-foreground); --rv-field-border:var(--wpsg-field-border); } +.wpsg-product :where(.wpsg-product__breadcrumbs) { margin:0 0 var(--wpsg-gap); font-size:var(--wpsg-font-size-small); } +.wpsg-product :where(.wpsg-product__breadcrumbs ol) { display:flex; flex-wrap:wrap; gap:0.25em 0.5em; margin:0; padding:0; list-style:none; } +.wpsg-product :where(.wpsg-product__breadcrumbs li + li)::before { content:"/" / ""; margin-right:0.5em; opacity:var(--wpsg-muted-opacity); } +.wpsg-product :where(.wpsg-product__breadcrumbs a, .wpsg-product__breadcrumbs [aria-current]) { color:inherit; opacity:var(--wpsg-muted-opacity); } +.wpsg-labels { display:flex; flex-wrap:wrap; gap:0.4em; } +:where(.wpsg-label) { display:inline-block; width:fit-content; padding:0.125rem 0.625rem; border-radius:999px; background:var(--wpsg-label-background); color:var(--wpsg-label-color); font-size:var(--wpsg-font-size-small); font-weight:700; line-height:1.6; } +.wpsg-product :where(.wpsg-product__details > .wpsg-labels) { margin-bottom:0.75em; } +.wpsg-block-product-list :where(.wpsg-product-list__item) { position:relative; } +.wpsg-block-product-list :where(.wpsg-product-list__image + .wpsg-labels) { position:absolute; top:0.5em; left:0.5em; } +.wpsg-product :where(.wpsg-product__main) { display:flex; flex-wrap:wrap; align-items:flex-start; gap:calc(var(--wpsg-gap) * 2.5); } +.wpsg-product :where(.wpsg-product__media) { flex:1 1 22rem; min-width:0; float:none; margin:0; } +.wpsg-product :where(.wpsg-product__media .wpsg_produkt_produktbilder) { max-width:none; } +.wpsg-product :where(.wpsg-product__details) { flex:1 1 20rem; min-width:0; } +.wpsg-product :where(.wpsg-product__image) { display:block; } +.wpsg-product :where(.wpsg-product__image img) { display:block; width:100%; height:auto; border-radius:var(--wpsg-radius); } +.wpsg-product :where(.wpsg-product__thumbs) { display:grid; grid-template-columns:repeat(4, minmax(0, 1fr)); gap:0.75em; margin:0.75em 0 0; padding:0; list-style:none; } +.wpsg-product :where(.wpsg-product__thumb) { display:block; width:100%; padding:0; border:0; border-radius:var(--wpsg-radius); background:none; cursor:pointer; min-height:44px; } +.wpsg-product :where(.wpsg-product__thumb img) { display:block; width:100%; height:auto; aspect-ratio:1 / 1; object-fit:cover; border-radius:var(--wpsg-radius); } +.wpsg-product :where(.wpsg-product__thumb[aria-pressed="true"]) { outline:2px solid var(--wpsg-color-accent); outline-offset:2px; } +.wpsg-product :where(.wpsg-product__details .wpsg_producttitle) { margin-top:0; } +.wpsg-product :where(.wpsg-product__offer) { display:flex; flex-direction:column; gap:0.25em; margin:0.75em 0; } +.wpsg-product :where(.wpsg-product__price) { font-size:1.75em; font-weight:700; line-height:1.2; } +.wpsg-product :where(.wpsg-product__price .wpsg_mod_productview_oldprice) { margin-left:0.4em; font-size:0.6em; font-weight:400; opacity:var(--wpsg-muted-opacity); } +.wpsg-product :where(.wpsg-product__taxnote, .wpsg-product__deliverytime, .wpsg-kuhint) { font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg-product :where(.wpsg-product__deliverytime .label) { font-weight:normal; } +.wpsg_productform :where(.wpsg_produkt_wrapper) :where(.wpsg_produkt_shortdescription, .wpsg_product_only_store, .wpsg_mod_productvariants_product_wrap) { margin-top:0.75em; margin-bottom:0.75em; } +:where(.wpsg_productform .wpsg_produkt_wrapper .wpsg_mod_productvariants_product_wrap select) { width:100%; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_product_informationarea) { margin-top:1.5em; margin-bottom:1.5em; } +.wpsg_productform :where(label) { display:block; font-weight:bold; margin-bottom:0.5em; } +.wpsg_productform :where(.wpsg_mod_productvars) { display:flex; flex-direction:column; gap:0.75em; margin-top:0.75em; margin-bottom:0.75em; } +.wpsg_productform :where(.wpsg_mod_productvars_row) { display:flex; flex-direction:column; gap:0.3em; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productvars_label) { font-weight:normal; font-size:0.9em; opacity:var(--wpsg-muted-opacity); } +.wpsg_productform :where(.wpsg_mod_productvars_input) { width:100%; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_mod_productvars_check) { display:flex; align-items:center; gap:0.5em; font-weight:normal; cursor:pointer; } +:where(.wpsg_productform .wpsg_mod_productvars_check input[type="checkbox"]) { flex:0 0 auto; margin:0; } +.wpsg_productform :where(.wpsg_mod_productvars .wpsg_required) { margin-left:0.15em; } +.wpsg_productform :where(.wpsg_produkt_wrapper .wpsg_product_buttonarea) { margin-top:var(--wpsg-gap); } +.wpsg_produkt_add_basket_wrapper { display:flex; flex-wrap:wrap; align-items:stretch; justify-content:flex-start; gap:var(--wpsg-gap); } +:where(.wpsg_produkt_add_basket_wrapper > *) { margin:0; } +.wpsg_produkt_add_basket_wrapper :where(> label) { display:flex; align-items:center; margin:0; } +/* Aufbau mit Klassen-Spezifität: Feldregeln der Themes sprengen sonst die Zeile */ +.wpsg_produkt_add_basket_wrapper .wpsg_menge { width:5em; flex:0 0 auto; text-align:center; } +.wpsg-product :where(.wpsg-product__variants .wpsg_vp_field) { display:flex; flex-direction:column; gap:0.3em; } +.wpsg-product .wpsg-product__buy { align-items:flex-end; } +.wpsg-product :where(.wpsg-product__amount) { display:flex; flex-direction:column; gap:0.3em; } +.wpsg-product :where(.wpsg-product__amount > label) { margin:0; } +.wpsg-product .wpsg-product__buy .wpsg_add_basket { flex:1 1 12em; min-height:44px; } +.wpsg-product :where(.wpsg-product__after-buy) { display:flex; flex-wrap:wrap; gap:var(--wpsg-gap); margin-top:0.75em; } +.wpsg-product :where(.wpsg-product__facts) { margin:var(--wpsg-gap) 0 0; padding:var(--wpsg-gap) 0 0; list-style:none; border-top:1px solid var(--wpsg-color-line); display:flex; flex-direction:column; gap:0.25em; opacity:var(--wpsg-muted-opacity); } +.wpsg-product :where(.wpsg-product__section) { max-width:var(--wp--style--global--content-size, 46rem); margin-top:calc(var(--wpsg-gap) * 2); } +.wpsg-product :where(.wpsg-product__section-title) { margin:0 0 0.5em; } +.wpsg_productform :where(.wpsg_product_layer) { position:absolute; left:0; top:0; width:100%; height:100%; background-color:var(--wpsg-color-surface); padding:0.75em; margin:-0.75em; box-sizing:content-box; } +.wpsg_productform :where(.wpsg_product_layer img) { position:absolute; left:50%; margin-left:-8px; top:50%; margin-top:-5px; } +.wpsg_product_deliverytime_holiday { padding:10px; border-left:4px solid var(--wpsg-color-notice); background-color:var(--wpsg-color-surface); } + +/* Minigalerie */ +.wpsg_productform :where(#responsive_slider .carousel-indicators) { bottom:-45px; } +.wpsg_productform :where(#responsive_slider .carousel-indicators li) { margin-left:2.5px; margin-right:2.5px; } +.wpsg_productform :where(#responsive_slider .carousel-indicators li.active) { border-width:2px; } +.wpsg_productform :where(.sto_carousel) { position:relative; margin-bottom:45px; margin-top:46px; } +.wpsg_productform :where(.sto_carousel ul), .wpsg_productform :where(.sto_carousel li) { list-style:none; } +.wpsg_productform :where(.sto_carousel li) { float:left; margin-right:10px; } +.wpsg_productform :where(.sto_carousel li .wpsg_image_producttemplate_small) { width:93px; } +.wpsg_productform :where(.jcarousel) { position:relative; height:95px; overflow:hidden; width:515px; max-width:100%; } +.wpsg_productform :where(.jcarousel ul) { width:20000em; position:relative; list-style:none; margin:0; padding:0; } +.wpsg_productform :where(.sto_carousel) :where(.left, .right) { position:absolute; top:0; height:95px; line-height:95px; width:20px; display:block; font-size:2rem; } +.wpsg_productform :where(.sto_carousel .left) { left:0; text-align:left; } +.wpsg_productform :where(.sto_carousel .right) { right:0; text-align:right; } +.wpsg_produkt_wrapper2 :where(.wpsg_gallery_wrap ul) { width:490px; max-width:100%; padding:0; margin:0; display:flex; flex-direction:row; flex-wrap:wrap; justify-content:space-between; } +.wpsg_produkt_wrapper2 :where(.wpsg_gallery_wrap ul li) { list-style:none; padding:0; margin:0 0 30px 0; width:100px; height:100px; } +.wpsg_produkt_wrapper2 :where(.wpsg_gallery_wrap ul li > div) { width:100%; height:100%; cursor:pointer; } +.wpsg_produkt_wrapper2 :where(.wpsg_gallery_wrap ul li > div > img) { width:100%; height:100%; object-fit:cover; object-position:center center; } +.wpsg_produkt_wrapper2 :where(.wpsg_produkt_produktbilder img) { width:230px; height:230px; object-fit:cover; object-position:50% 50%; max-width:none; float:left; } +.wpsg_produkt_wrapper2 :where(.wpsg_produkt_produktbilder) { width:260px; max-width:260px; } +.wpsg_produkt_wrapper2 :where(.wpsg_productimages) { margin-right:0; } +.wpsg_produkt_wrapper2 :where(.bigimg img) { margin:0 15px 15px 15px; width:100px; height:auto; float:left; } + +/* Varianten */ +.wpsg_produkt_wrapper :where(.wpsg_vp_field) { clear:both; margin-bottom:var(--wpsg-gap); } +.wpsg_produkt_wrapper :where(.wpsg_vp_field_image) { clear:both; display:block; } +.wpsg_produkt_wrapper :where(.wpsg_vp_field_typ_radio label) { clear:both; float:left; } +.wpsg_mod_productvariants_imageselect :where(.image) { padding:10px; display:inline-block; } +.wpsg_mod_productvariants_imageselect :where(.akt) { padding:5px; border:5px solid var(--wpsg-color-line); } +.wpsg_mod_productvariants_imageselect :where(a) { text-decoration:none; } + +/* Produktattribute */ +.wpsg_cell_produktattribute_value { text-align:right; } +.wpsg_mod_produktattribute_label { display:inline-block; min-width:120px; } +.wpsg_mod_produktattribute_value { display:inline-block; } + +/* Produktansichten */ +.wpsg_productview, .wpsg_mod_productview_image { position:relative; } +.wpsg_productview_head { margin:25px 0; line-height:25px; position:relative; } +.wpsg_productview_head :where(h2.wpsg_productview_title) { margin-top:0; font-size:1.25em; font-weight:bold; } +.wpsg_productview_head :where(.wpsg_mod_productview_modeswitch) { position:absolute; right:15px; top:0; font-size:1.25em; } +.wpsg_productview_head :where(.wpsg_mod_productview_modeswitch > a) { margin-left:5px; text-decoration:none; opacity:var(--wpsg-muted-opacity); } +.wpsg_productview_head :where(.wpsg_mod_productview_modeswitch > a.active), .wpsg_productview_head :where(.wpsg_mod_productview_modeswitch > a:hover) { opacity:1; } +.wpsg_mod_productview-info, .wpsg_mod_productview-order { font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg_mod_productview-info :where(strong), .wpsg_mod_productview-order :where(strong) { font-weight:bold; } +.wpsg_mod_productview-order :where(strong) { float:right; } +.wpsg_mod_productview-order { position:relative; cursor:pointer; } +.wpsg_mod_productview-order :where(.glyphicon) { margin-left:10px; margin-right:5px; } +.wpsg_mod_productview-order-layer { width:100%; margin-top:5px; left:0; } +.wpsg_mod_productview-order-layer :where(> .inner) { margin:0 15px; border:1px solid var(--wpsg-color-line); background-color:var(--wpsg-color-background); color:var(--wpsg-color-foreground); } +.wpsg_mod_productview-order-layer :where(a) { display:block; line-height:25px; padding:5px 5px 5px 10px; text-decoration:none; } +.wpsg_mod_productview-order-layer :where(a.selected), .wpsg_mod_productview-order-layer :where(a:hover) { background-color:var(--wpsg-color-surface); } +.wpsg_mod_productview_image :where(img) { max-width:100%; height:auto; border:1px solid var(--wpsg-color-line-soft); } +.wpsg_productview_pager { width:100%; border-top:1px solid var(--wpsg-color-line-soft); border-bottom:1px solid var(--wpsg-color-line-soft); margin:10px 0 25px 0; padding:25px 0; text-align:center; } +.wpsg_productview_pager :where(.wpsg_productview_pager_wrap) { display:inline-block; margin:auto; } +.wpsg_productview_pager :where(.wpsg_productview_pager_wrap > span), .wpsg_productview_pager :where(.wpsg_productview_pager_wrap > a) { display:inline-block; width:30px; height:30px; line-height:30px; border:1px solid var(--wpsg-color-line); margin:0 15px; } +.wpsg_productview_product { padding-top:15px; padding-bottom:40px; position:relative; margin-bottom:25px; } +.wpsg_productview_product :where(.wpsg_mod_productview_bottom) { display:block; width:100%; text-align:center; } +:where(.wpsg_productview_product .wpsg_mod_productview_bottom .wpsg_mod_productview_name h2) { font-size:1em; font-weight:bold; margin-bottom:5px; } +.wpsg_productview_product :where(.wpsg_mod_productview_bottom .wpsg_mod_productview_description) { line-height:1.4; font-size:var(--wpsg-font-size-small); margin-bottom:5px; opacity:var(--wpsg-muted-opacity); } +.wpsg_productview_product :where(.wpsg_mod_productview_bottom .wpsg_mod_productview_button) { left:50%; margin-left:-90px; width:180px; position:absolute; bottom:0; white-space:nowrap; padding:5px 25px; border:1px solid var(--wpsg-color-line); font-weight:bold; text-transform:uppercase; } +.wpsg_productview_product :where(.wpsg_mod_productview_bottom .wpsg_mod_productview_button:hover) { text-decoration:none; background-color:var(--wpsg-color-surface); } +.wpsg_productview_product :where(.wpsg_mod_productview_bottom .wpsg_mod_productview_button .fa) { margin-left:10px; } +.wpsg_productview_product :where(.wpsg_mod_productview_go) { left:0; top:0; width:100%; height:100%; background-color:var(--wpsg-color-background); color:var(--wpsg-color-foreground); opacity:0.9; text-align:center; } +.wpsg_productview_product :where(.wpsg_mod_productview_go .wpsg_mod_productview_price_wrap) { width:100%; position:absolute; left:0; top:30%; font-size:1.25em; line-height:125%; font-weight:bold; } +.wpsg_productview_product :where(.wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_oldprice) { text-decoration:line-through; } +.wpsg_productview_product :where(.wpsg_mod_productview_go .wpsg_mod_productview_price_wrap .wpsg_mod_productview_current) { color:var(--wpsg-color-error); } +.wpsg_productview_product :where(.wpsg_mod_productview_go .wpsg_mod_productview_tax_wrap) { width:100%; position:absolute; left:0; top:60%; font-size:var(--wpsg-font-size-small); line-height:125%; } +.wpsg_productview_product:where(:hover) { text-decoration:none; } +.wpsg_productview_product_grid :where(.wpsg_star_wrap) { position:absolute; width:80%; left:10%; top:10%; } +:where(.wpsg_productview_product_grid .wpsg_mod_productview_name h2) { margin-top:0; } +.wpsg_mod_productview_loading { width:100%; height:100%; background-color:var(--wpsg-color-background); opacity:0.75; position:absolute; left:0; top:0; } +.wpsg_mod_productview_filter :where(#wpsg_mod_productview_filter_price-range) { position:relative; margin-right:16px; } +.wpsg_mod_productview_filter :where(#wpsg_mod_productview_filter_price-range .ui-slider-handle) { cursor:pointer; width:16px; height:16px; background-color:currentColor; position:absolute; } +.wpsg_mod_productview_filter :where(#wpsg_mod_productview_filter_price-range .ui-slider-bg) { margin-left:16px; background-color:var(--wpsg-color-line); width:100%; height:2px; position:absolute; top:8px; } + +/* Produktübersichten (im Modus „Klassisch“ in productindex.css) */ +.wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar) { display:flow-root; padding:0.5em 0.75em; border:1px solid var(--wpsg-color-line-soft); background-color:var(--wpsg-color-surface); } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar_top) { border-radius:var(--wpsg-radius) var(--wpsg-radius) 0 0; } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar_bottom) { border-radius:0 0 var(--wpsg-radius) var(--wpsg-radius); } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar ul) { list-style:none; padding:0; margin:0; float:left; clear:none; } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar .wpsg_mod_productindex_pager ul li), .wpsg_mod_productindex :where(.wpsg_mod_productindex_toolbar .wpsg_mod_productindex_pager span) { float:left; display:block; margin-left:5px; } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_order) { float:left; } +:where(.wpsg_mod_productindex .wpsg_mod_productindex_order select) { margin-bottom:3px; } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_viewselect) { float:right; margin-top:5px; } +.wpsg_mod_productindex :where(.wpsg_mod_productindex_pager) { float:right; margin-left:5px; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product), .wpsg_mod_productindex_list :where(.wpsg_mod_productindex_empty) { display:flow-root; padding:15px; border:1px solid var(--wpsg-color-line-soft); border-bottom:0; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_pic) { float:left; margin-right:15px; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content) { margin-left:115px; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button) { float:right; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos) { float:right; line-height:1.5em; text-align:right; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos div) { clear:right; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_title), .wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_title) { font-weight:bold; margin-bottom:5px; line-height:1.5em; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_title) { font-size:1.2em; } +.wpsg_mod_productindex_list :where(.wpsg_mod_productindex_price), .wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_price) { font-size:1.4em; font-weight:normal; } +.wpsg_mod_productindex_list :where(.wpsg_produkt_preishinweis), .wpsg_mod_productindex_grid :where(.wpsg_produkt_preishinweis) { font-size:0.8em; font-weight:normal; font-style:italic; } +.wpsg_mod_productindex_list :where(.wpsg_produkt_soldout), .wpsg_mod_productindex_grid :where(.wpsg_produkt_soldout) { color:var(--wpsg-color-error); } +.wpsg_mod_productindex_kuhint { line-height:125%; margin-top:20px; font-style:italic; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_productrow) { display:flex; flex-wrap:wrap; border:1px solid var(--wpsg-color-line-soft); border-bottom:0; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product) { flex:0 0 auto; width:calc(100% / var(--wpsg-columns, 4)); min-width:0; padding-bottom:50px; font-size:0.8em; } +.wpsg_mod_productindex :where(img) { max-width:100%; height:auto; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_product_inner) { margin:15px; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_pic) { text-align:center; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_pic img) { max-width:100%; height:auto; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos) { font-size:0.8em; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_title) { font-size:1em; min-height:3em; overflow-wrap:anywhere; hyphens:auto; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button) { width:100%; margin-top:15px; } +.wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_button a) { display:block; width:100%; text-align:center; } +.wpsg_mod_productindex :where(.wpsg_mod_fuellmenge_info) { font-size:0.75em; } + +/* Produktübersicht, Preise */ +.wpsg_mod_productview_oldprice { font-size:0.9em; color:var(--wpsg-color-error); text-decoration:line-through; } +.wpsg_mod_productview_newprice { font-size:1em; font-weight:bold; } + +/* Einblendungen: Kundenfrage (Firmen-/Endkunde, Land) */ +[id="wpsg_calc_layer"] { overflow:auto; text-align:center; background-color:var(--wpsg-color-overlay); } +[id="wpsg_calc_layer"] :where(.content) { width:min(700px, calc(100% - 2rem)); min-height:210px; padding:clamp(1rem, 5vw, 50px); text-align:left; color:var(--wpsg-color-foreground); border-radius:var(--wpsg-radius); background-color:var(--wpsg-color-background); } +[id="wpsg_calc_layer"] :where(.content img.loading) { position:absolute; left:50%; top:50%; margin-left:-8px; margin-top:-5px; } +:where(#wpsg_calc_layer h2) { font-size:1.375rem; line-height:1.3; margin-bottom:25px; } +:where(#wpsg_calc_layer .customertype h2, #wpsg_calc_layer .country h2) { font-weight:normal; width:150px; float:left; } +[id="wpsg_calc_layer"] :where(#customerquestion_fk), [id="wpsg_calc_layer"] :where(#customerquestion_ek) { margin-top:10px; width:200px; float:left; line-height:28px; } +[id="wpsg_calc_layer"] :where(#customerquestion_fk label), [id="wpsg_calc_layer"] :where(#customerquestion_ek label) { font-size:1.375rem; font-weight:normal; line-height:28px; } +[id="wpsg_calc_layer"] :where(#customerquestion_ok_button) { width:100%; } +[id="wpsg_calc_layer"] :where(.country) { clear:both; margin-top:20px; } +:where(#wpsg_calc_layer .country select) { width:350px; max-width:100%; font-size:1.375rem; float:left; margin-top:10px; } +:where(#wpsg_calc_layer input[type="radio"]) { height:auto; margin-right:10px; } +[id="wpsg_calc_layer"] :where(.button_wrap) { width:100%; clear:both; padding-top:20px; } +:where(#wpsg_calc_layer input[type="submit"]) { float:right; padding-left:50px; padding-right:50px; } + +/* Einblendung für Meldungen außerhalb der Shopseiten, Warenkorbmeldung */ +[id="wpsg_ajax_layer"] { background-color:var(--wpsg-color-overlay); justify-content:center; align-items:center; padding:1rem; } +[id="wpsg_ajax_layer"] :where(.wpsg_ajax_message_content) { max-width:100%; padding:1.5rem; text-align:center; color:var(--wpsg-color-foreground); border-radius:var(--wpsg-radius); background-color:var(--wpsg-color-background); } +[id="wpsg_ajax_layer"] :where(.wpsg_ajax_message_content li) { list-style:none; } +[id="TB_caption"] { height:50px; } +[id="TB_secondLine"] { font-size:14px; } + +/* Bankeinzug */ +.wpsg_mod_autodebit :where(.wpsg_mod_autodebit_field) { clear:both; } +.wpsg_mod_autodebit :where(label) { width:100%; line-height:36px; } +:where(.wpsg_mod_autodebit input) { float:right; margin-bottom:3px; } + +/* Bestellbedingungen */ +.wpsg_mod_ordercondition_hint { padding-left:18px; max-height:60px; overflow-y:scroll; } + +/* Anfrageprodukte */ +.wpsg_mod_request_requestpage :where(.wpsg_cell_action) { width:30px; text-align:center; } +.wpsg_mod_request_requestpage :where(.wpsg_cell_amount) { width:125px; } +.wpsg_mod_request_requestpage :where(.wpsg_cell_sumprice) { text-align:right; width:200px; } +.wpsg_mod_request_requestpage :where(.wpsg_cell_total_brutto), .wpsg_mod_request_requestpage :where(.wpsg_cell_total_netto) { text-align:right; } +:where(.wpsg_mod_request_requestpage .wpsg_checkout_typ_3 input) { margin-right:5px; width:auto; } +:where(.wpsg_mod_request_requestpage) :where(input[type="text"], select) { width:100%; margin-top:5px; margin-bottom:5px; } +:where(.wpsg_mod_request_requestpage .wpsg_cell_amount) :where(input[type="text"]) { box-sizing:border-box; width:4em; max-width:100%; } +.wpsg_mod_request_requestpage :where(.wpsg_commentblock textarea) { box-sizing:border-box; width:100%; height:150px; } +:where(.wpsg_mod_request_requestpage) :where(input, select, textarea) { box-sizing:border-box; } +:where(.wpsg_mod_request_requestpage h2) { margin-top:2rem; margin-bottom:var(--wpsg-gap); } +.requestlist_ajax_wrap { padding-bottom:2rem; } + +/* CrowdFunding */ +.wpsg_mod_funding_progress :where(.wpsg_mod_funding_state) { border:1px solid var(--wpsg-color-line); margin-bottom:var(--wpsg-gap); width:100%; height:25px; line-height:25px; } +.wpsg_mod_funding_progress :where(.wpsg_mod_funding_state > .bar) { width:90%; float:left; height:100%; display:table; } +.wpsg_mod_funding_progress :where(.wpsg_mod_funding_state > .bar > .value) { background-color:var(--wpsg-color-accent); height:100%; width:0%; } +.wpsg_mod_funding_progress :where(.wpsg_mod_funding_state > .value) { width:10%; height:100%; border-left:1px solid var(--wpsg-color-line); float:right; text-align:center; } + +/* Zahlungsarten */ +.wpsg_mod_wirecard_paymentType { width:50%; float:right; } +[id="wpsg_mod_wirecard_iframe"] { width:100%; height:700px; } +[id="wpsg_mod_crefopay_iframe"] { width:100%; border:0; overflow-y:hidden; } +.wrap_paypalapi_expressbutton { width:100%; padding-bottom:2rem; } +.wrap_paypalapi_expressbutton :where(img) { float:right; } +.wpsg_mod_paypalapi_button { display:inline; float:right; background:transparent; border:0; padding:0; cursor:pointer; } +.wpsg_mod_paypalapi_orderdone :where(.wpsg_mod_paypalapi_field) { clear:both; } +.wpsg_mod_paypalapi_orderdone :where(label) { width:100%; line-height:36px; } +:where(.wpsg_mod_paypalapi_orderdone) :where(input[type="text"], select) { width:65%; float:right; margin-bottom:3px; } +.wpsg_mod_paypalapi_orderdone :where(input.wpsg_mod_paypalapi_vname) { width:30%; margin-right:5%; } +.wpsg_mod_paypalapi_orderdone :where(input.wpsg_mod_paypalapi_name, select.wpsg_mod_paypalapi_month, select.wpsg_mod_paypalapi_year) { width:30%; } +:where(.wpsg_mod_paypalapi_orderdone) :where(input[type="image"], input[type="submit"]) { float:right; } +.wpsg_mod_paypalapi_orderdone :where(.wpsg_mod_paypalapi_spacer) { width:5%; float:right; text-align:center; } +[id="wpsg_ppplus"] { width:100%; } +[id="AmazonPayButton_wrap"], [id="AmazonLoginButton_wrap"] { text-align:right; margin-bottom:2rem; width:100%; justify-content:flex-end; display:flex; } +[id="AmazonPayButton_wrap"] :where(#AmazonPayButton) { width:210px; } + +/* Kreditkarte (micropayment): stellt eine Karte dar, die Farben bleiben fest */ +.micropayment_card :where(.card) { border-radius:5px; background-color:#999999; margin-bottom:var(--wpsg-gap); height:200px; width:400px; max-width:100%; position:relative; } +:where(.micropayment_card .front .number input) { width:370px; max-width:calc(100% - 30px); position:absolute; bottom:50px; left:15px; } +.micropayment_card :where(.front) :where(.name, .validthrough) { position:absolute; bottom:20px; color:#ffffff; text-shadow:1px 1px 0 #202020, -1px -1px 0 #606060; letter-spacing:2px; } +.micropayment_card :where(.front .name) { left:25px; } +.micropayment_card :where(.front .validthrough) { right:135px; } +.micropayment_card :where(.front .valid) { position:absolute; right:15px; bottom:20px; } +.micropayment_card :where(.front .chip) { left:25px; top:50px; position:absolute; width:50px; height:44px; background-image:url('../mods/mod_micropayment/gfx/chip.png'); background-repeat:no-repeat; } +.micropayment_card :where(.card .bankname) { position:absolute; left:15px; top:10px; } +.micropayment_card :where(.back .blackmagnetic) { width:100%; height:40px; background-color:#000000; position:absolute; left:0; top:55px; } +.micropayment_card :where(.back .number) { position:absolute; text-align:right; right:5px; top:5px; } +.micropayment_card :where(.back .signature) { position:absolute; left:15px; top:130px; width:250px; height:30px; background-color:#ffffff; text-align:center; line-height:30px; color:#333333; } +:where(.micropayment_card .back .sign input) { position:absolute; left:300px; width:75px; text-align:center; line-height:25px; top:135px; border:0; border-radius:0; height:25px; padding:0; } + +/* Vorkasse: QR-Codes auf der Abschlussseite */ +.wpsg_mod_prepayment_info_wrap { display:flex; justify-content:center; flex-direction:column; gap:20px; } +.wpsg_mod_prepayment_info, .wpsg_mod_prepayment_girocode, .wpsg_mod_prepayment_qrrechnung { display:flex; flex-wrap:wrap; gap:20px; border:1px solid var(--wpsg-color-line); padding:20px; } +:where(.wpsg_mod_prepayment_info, .wpsg_mod_prepayment_girocode, .wpsg_mod_prepayment_qrrechnung) :where(h4) { margin:0; } +.wpsg_mod_prepayment_info_left, .wpsg_mod_prepayment_girocode_left, .wpsg_mod_prepayment_qrrechnung_left { display:flex; flex-direction:column; } +.wpsg_mod_prepayment_info_left_qrcodeimg, .wpsg_mod_prepayment_girocode_left_qrcodeimg, .wpsg_mod_prepayment_qrrechnung_left_qrcodeimg { width:240px; height:240px; max-width:100%; background-color:#ffffff; } +.wpsg_mod_prepayment_info_left_wrap, .wpsg_mod_prepayment_girocode_left_wrap, .wpsg_mod_prepayment_qrrechnung_left_wrap { display:flex; gap:25%; } +.wpsg_mod_prepayment_info_left_currency, .wpsg_mod_prepayment_girocode_left_currency, .wpsg_mod_prepayment_qrrechnung_left_currency { display:flex; flex-direction:column; } +.wpsg_mod_prepayment_info_left_amount, .wpsg_mod_prepayment_girocode_left_amount, .wpsg_mod_prepayment_qrrechnung_left_amount { display:flex; flex-direction:column; } + +/* GARANTIE-Siegel: feste Schrift und Farben wie in frontend.css, erhöhte Spezifität */ +.wpsg_product_garan_wrap { all:revert; padding:5px 0; margin-bottom:2rem; font-family:'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; + * { all:revert; } + .wpsg_product_garan { border:1px solid black; display:inline-block; padding:5px 50px 5px 5px; position:relative; height:30px; white-space:nowrap; cursor:pointer; text-decoration:none; color:black; + & > .years { font-size:30px; height:30px; line-height:30px; font-weight:bold; padding-right:35px; position:relative; border-right:1px solid black; + &:after { position:absolute; right:10px; bottom:8px; content:' '; width:16px; height:16px; background-image:url('../gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; } + } + & > .title { padding-left:5px; font-size:22px; font-weight:bold; padding-right:20px; position:relative; + &:after { position:absolute; right:0; bottom:2px; content:' '; width:16px; height:16px; background-image:url('../gfx/garan/garan_checkmark.svg'); background-size:contain; background-repeat:no-repeat; } + } + &:after { position:absolute; right:5px; top:0; content:' '; width:28px; height:40px; background-image:url('../gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; } + & > .tooltip { position:absolute; opacity:0; pointer-events:none; top:40px; left:-1px; padding:5px 5px 5px 0; transition:opacity 0.5s; + & > .inner { width:300px; min-height:300px; display:flex; flex-direction:column; gap:5px; background-color:white; padding:5px; border:1px solid black; + & > .border { border:1px solid black; display:flex; flex-direction:column; padding:5px; + .top { width:100%; border-bottom:2px solid black; padding-bottom:5px; position:relative; + & > .title { font-size:50px; font-weight:bold; padding-right:40px; position:relative; display:inline-block; line-height:50px; letter-spacing:1px; + &:after { position:absolute; right:0; bottom:5px; content:' '; width:32px; height:32px; background-image:url('../gfx/garan/garan_checkmark.svg'); background-size:contain; background-position:right bottom; background-repeat:no-repeat; } + } + &:after { position:absolute; right:0; top:-11px; content:' '; width:36px; height:51px; background-image:url('../gfx/garan/garan_eu.svg'); background-size:contain; background-repeat:no-repeat; } + } + & > .flexline { display:flex; justify-content:space-between; gap:5px; align-items:flex-start; padding:5px 0; font-size:16px; } + & > .line { display:flex; justify-content:space-between; gap:5px; align-items:flex-end; padding:5px 0; + & > .years { font-size:85px; height:85px; line-height:85px; font-weight:bold; padding-right:60px; position:relative; + &:after { position:absolute; right:10px; bottom:8px; content:' '; width:35px; height:35px; background-image:url('../gfx/garan/garan_year.svg'); background-size:contain; background-repeat:no-repeat; } + } + & > img { transform:translateY(-8px); } + } + & > .trans_wrap { display:block; white-space:normal; text-align:justify; hyphens:auto; font-size:8px; line-height:1.4; + & > span + span:before { content:'|'; padding-right:1px; } + strong { font-weight:bold; } + } + } + } + } + &:hover > .tooltip { opacity:1; pointer-events:all; z-index:1; } + /* Auch per Tastaturfokus und nach dem ersten Tipp (K69, frontend.js); Escape blendet aus */ + &:focus-visible > .tooltip, &.is-open > .tooltip { opacity:1; pointer-events:all; z-index:1; } + &.is-dismissed > .tooltip { opacity:0; pointer-events:none; } + } +} +html body .wpsg_product_garan_wrap, +html body .wpsg_product_garan_wrap *, +html body .wpsg_product_garan_wrap *::before, +html body .wpsg_product_garan_wrap *::after { box-sizing:content-box; } +html body .wpsg_product_garan_wrap { line-height:1; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan, +html body .wpsg_product_garan_wrap a.wpsg_product_garan:hover, +html body .wpsg_product_garan_wrap a.wpsg_product_garan:focus, +html body .wpsg_product_garan_wrap a.wpsg_product_garan:visited { color:#000000; background-color:#ffffff; text-decoration:none; line-height:30px; box-shadow:none; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan * { color:inherit; text-decoration:none; letter-spacing:normal; text-transform:none; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan > .years, +html body .wpsg_product_garan_wrap a.wpsg_product_garan > .title { display:inline-block; height:30px; line-height:30px; vertical-align:top; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip, +html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .inner, +html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .flexline { line-height:1.2; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan .tooltip .trans_wrap { line-height:1.4; } +html body .wpsg_product_garan_wrap a.wpsg_product_garan img { display:block; max-width:none; height:auto; margin:0; border:0; box-shadow:none; } + +/* GARANTIE-Siegel in der Bestellübersicht */ +.wpsg_overview :where(.garan_label_wrap) { padding:var(--wpsg-gap) 0; } +.wpsg_overview :where(.garan_label_wrap img) { max-width:100%; height:auto; } +.wpsg_overview :where(.garan_label_popup) { align-items:center; justify-content:center; padding:1rem; background-color:var(--wpsg-color-overlay); } +.wpsg_overview :where(.garan_label_popup .garan_label_popup_inner) { display:flex; flex-direction:column; max-width:600px; max-height:100%; text-align:center; padding:1rem; color:var(--wpsg-color-foreground); background-color:var(--wpsg-color-background); } +.wpsg_overview :where(.garan_label_popup .garan_label_popup_image) { min-height:0; overflow-y:auto; } +.wpsg_overview :where(.garan_label_popup .garan_label_popup_image img) { max-width:100%; height:auto; } +.wpsg_overview :where(.garan_label_popup .garan_label_popup_confirm) { flex:0 0 auto; margin-top:1rem; cursor:pointer; } + +/* Blöcke: Produktliste, Mini-Warenkorb, Kundenkonto */ +.wpsg-block-product-list :where(.wpsg-product-list__count) { margin:0 0 var(--wpsg-gap); } +.wpsg-block-product-list :where(.wpsg-product-list__count:empty) { display:none; } +/* Produktkacheln: Leiste über den Kacheln, siehe doc/code-kommentar.md#wpsg-theme-kacheln */ +.wpsg-product-tiles { --wpsg-pvf-gap:var(--wp--style--block-gap, var(--wpsg-gap)); --wpsg-pvf-gap-small:var(--wp--preset--spacing--20, 0.5em); --wpsg-pvf-control:2.75em; } +.wpsg-product-tiles > .wpsg-product-list__count { margin-block:0 var(--wpsg-pvf-gap); } +.wpsg-product-tiles > .wpsg-product-list__count:empty { display:none; } +.wpsg-product-tiles > .wpsg-block-product-filter { margin-block:var(--wp--preset--spacing--40, 1rem) var(--wp--preset--spacing--60, 2rem); } +/* Gleich breite Spalten; Überschriften oben bündig, „Filtern“ unten in der letzten Spalte */ +.wpsg-product-tiles .wpsg-pvf__fields { display:grid; grid-template-columns:repeat(auto-fill, minmax(min(100%, 17rem), 1fr)); align-items:start; gap:var(--wpsg-pvf-gap); padding:var(--wp--preset--spacing--40, 1rem); border:1px solid var(--wpsg-color-line-soft); border-radius:var(--wpsg-radius); background-color:var(--wpsg-color-surface); } +.wpsg-product-tiles .wpsg-pvf__fields > * { margin:0; padding:0; border:0; min-width:0; } +.wpsg-product-tiles .wpsg-pvf__title { display:block; margin:0 0 var(--wpsg-pvf-gap-small) 0; padding:0; font-size:inherit; font-weight:600; line-height:1.3; } +.wpsg-product-tiles .wpsg-pvf__options { display:flex; flex-wrap:wrap; align-items:center; gap:var(--wpsg-pvf-gap-small) var(--wpsg-pvf-gap); min-height:var(--wpsg-pvf-control); } +.wpsg-product-tiles .wpsg-pvf__price .wpsg-pvf__options { flex-wrap:nowrap; gap:var(--wpsg-pvf-gap-small); } +.wpsg-product-tiles .wpsg-pvf__price label { display:flex; flex:0 1 auto; align-items:center; gap:var(--wpsg-pvf-gap-small); min-width:0; } +.wpsg-product-tiles .wpsg-pvf__price label > span { min-width:0; } +/* Preis über zwei Spalten, damit von, bis und EUR mit lesbaren Feldern in eine Zeile passen */ +.wpsg-product-tiles .wpsg-pvf__price { grid-column:span 2; } +.wpsg-product-tiles .wpsg-pvf__price input { flex:0 1 auto; width:9em; min-width:0; appearance:textfield; -moz-appearance:textfield; } +/* Ohne Pfeile des Zahlenfelds, sonst schneiden sie den Platzhalter ab */ +.wpsg-product-tiles .wpsg-pvf__price input::-webkit-inner-spin-button, .wpsg-product-tiles .wpsg-pvf__price input::-webkit-outer-spin-button { -webkit-appearance:none; margin:0; } +.wpsg-product-tiles .wpsg-pvf__select select { width:100%; } +.wpsg-product-tiles .wpsg-pvf__option { margin:0; } +.wpsg-product-tiles .wpsg-pvf input[type="checkbox"] { width:1.25em; height:1.25em; margin:0; } +/* Felder, Auswahllisten und Knöpfe gleich hoch */ +.wpsg-product-tiles .wpsg-pvf :is(input[type="number"], select, .wpsg-pvf__actions .wpsg_button) { box-sizing:border-box; height:var(--wpsg-pvf-control); margin:0; padding-block:0; } +.wpsg-product-tiles .wpsg-pvf .wpsg-pvf__actions .wpsg_button { display:inline-flex; align-items:center; justify-content:center; } +.wpsg-product-tiles .wpsg-pvf__actions { display:flex; flex-wrap:wrap; align-items:center; gap:var(--wpsg-pvf-gap); grid-column-end:-1; align-self:end; } +.wpsg-product-tiles .wpsg-pvf__reset[hidden] { display:none; } +/* Knopf „Filter“ (nur am Handy): umrandet, Pfeil dreht sich, Zahl der aktiven Filter */ +.wpsg-product-tiles .wpsg-pvf__summary, .wpsg-product-tiles .wpsg-pvf__toggle[open] > .wpsg-pvf__summary { box-sizing:border-box; display:inline-flex; align-items:center; gap:var(--wpsg-pvf-gap-small); min-height:var(--wpsg-pvf-control); padding:0 1.2em; border:1px solid currentColor; border-radius:var(--wpsg-radius); background:transparent; color:inherit; font-weight:600; list-style:none; cursor:pointer; } +.wpsg-product-tiles .wpsg-pvf__summary::-webkit-details-marker { display:none; } +.wpsg-product-tiles .wpsg-pvf__summary::after { content:""; width:0.45em; height:0.45em; border-right:2px solid currentColor; border-bottom:2px solid currentColor; transform:translateY(-25%) rotate(45deg); transition:transform 0.15s ease-out; } +.wpsg-product-tiles .wpsg-pvf__toggle[open] > .wpsg-pvf__summary::after { transform:translateY(25%) rotate(-135deg); } +.wpsg-product-tiles .wpsg-pvf__badge { display:inline-flex; align-items:center; justify-content:center; min-width:1.5em; padding:0 0.4em; border:1px solid currentColor; border-radius:999px; font-size:var(--wpsg-font-size-small); line-height:1.4; } +.wpsg-product-tiles .wpsg-pvf__badge[hidden] { display:none; } +.wpsg-product-tiles .wpsg-pvf__none { margin:0; } +@media (max-width:781px) { + .wpsg-product-tiles .wpsg-pvf__toggle[open] > .wpsg-pvf__fields { margin-top:var(--wpsg-pvf-gap-small); } + .wpsg-product-tiles .wpsg-pvf__fields { grid-template-columns:minmax(0, 1fr); } + /* Untereinander ohne Mindesthöhe: gleicher Abstand unter jeder Überschrift */ + .wpsg-product-tiles .wpsg-pvf__options { min-height:0; } + .wpsg-product-tiles .wpsg-pvf__price { grid-column:auto; } + /* Am Handy füllen die Felder die Zeile; eine feste Breite zählte sonst als Mindestbreite */ + /* Sehr schmal: „bis“ in die zweite Zeile, damit die Platzhalter lesbar bleiben */ + .wpsg-product-tiles .wpsg-pvf__price .wpsg-pvf__options { flex-wrap:wrap; } + .wpsg-product-tiles .wpsg-pvf__price label { flex:1 1 7em; } + .wpsg-product-tiles .wpsg-pvf__price input { flex:1 1 5em; width:0; } + .wpsg-product-tiles .wpsg-pvf__actions .wpsg_button { flex:1 1 auto; } +} +@media (min-width:782px) { + .wpsg-product-tiles .wpsg-pvf__toggle > .wpsg-pvf__summary, .wpsg-product-tiles .wpsg-pvf__toggle[open] > .wpsg-pvf__summary { display:none; } +} +.wpsg-block-product-list :where(.wpsg-product-list__items) { display:grid; grid-template-columns:repeat(var(--wpsg-columns, 3), minmax(0, 1fr)); gap:calc(var(--wpsg-gap) * 2) var(--wpsg-gap); list-style:none; margin:0; padding:0; } +.wpsg-block-product-list :where(.wpsg-product-list__item) { display:flex; flex-direction:column; gap:0.5em; min-width:0; margin:0; padding:0; } +.wpsg-block-product-list :where(.wpsg-product-list__image img) { display:block; width:100%; height:auto; } +.wpsg-block-product-list :where(.wpsg-product-list__title) { margin:0; font-size:1em; line-height:1.3; overflow-wrap:anywhere; hyphens:auto; } +.wpsg-block-product-list :where(.wpsg-product-list__price), .wpsg-block-product-price :where(.wpsg-product-list__price) { font-size:1.2em; } +.wpsg-block-product-list :where(.wpsg-product-list__taxnote, .wpsg-product-list__baseprice, .wpsg-product-list__deliverytime), .wpsg-block-product-price :where(.wpsg-product-list__taxnote, .wpsg-product-list__baseprice) { font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg-block-product-list :where(.wpsg-product-list__action), .wpsg-block-product-price :where(.wpsg-product-list__action) { margin-top:auto; padding-top:0.5em; } +.wpsg-block-product-list :where(.wpsg-product-list__action form), .wpsg-block-product-price :where(.wpsg-product-list__action form) { margin:0; } +.wpsg-block-product-list :where(.wpsg-product-list__action .wpsg_button), .wpsg-block-product-price :where(.wpsg-product-list__action .wpsg_button) { display:block; width:100%; margin:0; text-align:center; box-sizing:border-box; } +.wpsg-block-mini-cart :where(.wpsg-mini-cart__link), .wpsg-block-customer-account :where(.wpsg-customer-account__link) { display:inline-flex; flex-wrap:wrap; align-items:baseline; gap:0.5em; text-decoration:none; } +.wpsg-block-mini-cart :where(.wpsg-mini-cart__content) { display:inline-flex; gap:0.5em; } +.wpsg-block-mini-cart :where(.wpsg-mini-cart__sum) { font-weight:bold; } + +/* Produktansichten (Modul, Vorlage seit 4.6.1) */ +.wpsg-pv :where(.wpsg-pv__head) { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em var(--wpsg-gap); margin-bottom:var(--wpsg-gap); } +.wpsg-pv :where(.wpsg-pv__title) { flex:1 1 100%; margin:0; } +.wpsg-pv :where(.wpsg-pv__info) { flex:1 1 auto; margin:0; font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg-pv :where(.wpsg-pv__order) { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; margin:0; } +.wpsg-pv :where(.wpsg-pv__order label) { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; } +.wpsg-pv :where(.wpsg-pv__modes) { display:flex; gap:0.75em; } +.wpsg-pv :where(.wpsg-pv__modes a.active) { font-weight:bold; text-decoration:none; } +.wpsg-pv :where(.wpsg-pv__items) { display:grid; grid-template-columns:repeat(var(--wpsg-columns, 4), minmax(0, 1fr)); gap:calc(var(--wpsg-gap) * 2) var(--wpsg-gap); list-style:none; margin:0; padding:0; } +.wpsg-pv :where(.wpsg-pv__item) { display:flex; flex-direction:column; gap:0.5em; min-width:0; margin:0; padding:0; } +.wpsg-pv :where(.wpsg-pv__image img) { display:block; width:100%; height:auto; } +.wpsg-pv :where(.wpsg-pv__body) { display:flex; flex-direction:column; gap:0.35em; flex:1 1 auto; min-width:0; } +.wpsg-pv :where(.wpsg-pv__body > p, .wpsg-pv__description) { margin:0; } +.wpsg-pv :where(.wpsg-pv__name) { margin:0; font-size:1em; line-height:1.3; overflow-wrap:anywhere; hyphens:auto; } +.wpsg-pv :where(.wpsg-pv__price) { font-size:1.2em; } +.wpsg-pv :where(.wpsg-pv__price-old) { margin-left:0.5em; font-size:0.8em; opacity:var(--wpsg-muted-opacity); } +.wpsg-pv :where(.wpsg-pv__detailname, .wpsg-pv__taxnote, .wpsg-pv__baseprice, .wpsg-pv__stock, .wpsg-pv__deliverytime, .wpsg-pv__weight) { font-size:var(--wpsg-font-size-small); opacity:var(--wpsg-muted-opacity); } +.wpsg-pv :where(.wpsg-pv__description) { display:none; } +.wpsg-pv :where(.wpsg-pv__action) { display:flex; flex-direction:column; gap:0.5em; margin-top:auto; padding-top:0.5em; } +.wpsg-pv :where(.wpsg-pv__action form) { margin:0; } +.wpsg-pv :where(.wpsg-pv__action .wpsg_button) { display:block; width:100%; margin:0; text-align:center; box-sizing:border-box; } +.wpsg-pv--list :where(.wpsg-pv__items) { grid-template-columns:minmax(0, 1fr); } +.wpsg-pv--list :where(.wpsg-pv__item) { flex-direction:row; gap:var(--wpsg-gap); padding-bottom:var(--wpsg-gap); border-bottom:1px solid var(--wpsg-color-line-soft); } +.wpsg-pv--list :where(.wpsg-pv__image) { flex:0 0 min(30%, 220px); } +.wpsg-pv--list :where(.wpsg-pv__description) { display:block; } +.wpsg-pv--list :where(.wpsg-pv__action .wpsg_button) { display:inline-block; width:auto; } +.wpsg-pv--list :where(.wpsg-pv__action) { flex-direction:row; flex-wrap:wrap; } +.wpsg-pv :where(.wpsg-pv__pager) { display:flex; flex-wrap:wrap; justify-content:center; gap:0.5em; margin-top:calc(var(--wpsg-gap) * 2); } +.wpsg-pv :where(.wpsg-pv__pager a, .wpsg-pv__pager span) { min-width:2em; padding:0.25em 0.5em; text-align:center; border:1px solid var(--wpsg-color-line); border-radius:var(--wpsg-radius); } +.wpsg-pv :where(.wpsg-pv__pager span[aria-current]) { font-weight:bold; background-color:var(--wpsg-color-surface); } +.wpsg-pv :where(.wpsg-pv__pager .wpsg-pv__gap) { border-color:transparent; } +.wpsg-pv.is-loading { opacity:0.5; pointer-events:none; } +:where(.wpsg-kuhint) { margin-top:var(--wpsg-gap); font-size:var(--wpsg-font-size-small); font-style:italic; } +.wpsg-pvf :where(.wpsg-pvf__item) { margin:0 0 var(--wpsg-gap) 0; padding:0; border:0; min-width:0; } +.wpsg-pvf :where(.wpsg-pvf__title) { margin:0 0 0.5em 0; padding:0; font-size:1em; font-weight:bold; } +.wpsg-pvf :where(.wpsg-pvf__item ul) { margin:0; padding-left:1.2em; } +.wpsg-pvf :where(.wpsg-pvf__price .wpsg-pvf__options) { display:flex; flex-wrap:wrap; align-items:center; gap:0.5em; } +.wpsg-pvf :where(.wpsg-pvf__price label) { display:flex; align-items:center; gap:0.35em; } +.wpsg-pvf :where(.wpsg-pvf__price input) { width:7em; } +.wpsg-pvf :where(.wpsg-pvf__price label > span) { min-width:1.75em; } +.wpsg-pvf :where(.wpsg-pvf__option) { display:flex; align-items:center; gap:0.5em; margin:0.25em 0; } +.wpsg-pvf :where(.wpsg-pvf__color) { display:inline-block; width:1.2em; height:1.2em; border:1px solid var(--wpsg-color-line); border-radius:var(--wpsg-radius); } +.wpsg-pvf :where(.wpsg-pvf__actions) { display:flex; flex-wrap:wrap; align-items:center; gap:var(--wpsg-gap); } + +/* Aufbau mit Klassen-Spezifität: Ausblenden, Ein- und Überblendungen */ +.shippay_wrap .shippay_item_wrap { position:relative; } +.shippay_wrap .shippay_item_wrap input[type="radio"], +.shippay_wrap .shippay_item_wrap .shippay_hint, +.shippay_wrap .shippay_item_wrap .shippay_checkmark { display:none; } +.shippay_wrap .shippay_item_wrap .shippay_checkmark { position:absolute; } +.shippay_wrap .shippay_active .shippay_hint, +.shippay_wrap .shippay_active .shippay_checkmark { display:block; } +[id="wpsg_pwd_info"] { display:none; } +.wpsg_mod_productview-order-layer { display:none; position:absolute; z-index:1; } +.wpsg_productview_product .wpsg_mod_productview_go { display:none; position:absolute; } +.wpsg_productview_product:hover .wpsg_mod_productview_go { display:block; } +.wpsg_mod_productindex_grid .wpsg_mod_productindex_productrow > .wpsg_clear { display:none; } +[id="wpsg_calc_layer"] { position:fixed; left:0; top:0; z-index:1000; width:100%; height:100%; } +[id="wpsg_calc_layer"] .content { position:absolute; left:50%; top:50%; transform:translate(-50%, -50%); } +[id="wpsg_ajax_layer"] { position:fixed; z-index:1000; left:0; top:0; width:100%; height:100%; display:flex; } +.wpsg_overview .garan_label_popup { position:fixed; inset:0; z-index:100000; display:flex; } + +/* Schmale Breiten */ +@media (max-width:600px) { + + .wpsg-pv :where(.wpsg-pv__items) { grid-template-columns:repeat(min(var(--wpsg-columns, 4), 2), minmax(0, 1fr)); } + .wpsg-pv--list :where(.wpsg-pv__items) { grid-template-columns:minmax(0, 1fr); } + .wpsg-pv--list :where(.wpsg-pv__item) { flex-direction:column; } + + .wpsg-block-product-list :where(.wpsg-product-list__items) { grid-template-columns:repeat(min(var(--wpsg-columns, 3), 2), minmax(0, 1fr)); } + + .wpsg_mod_productindex_grid :where(.wpsg_mod_productindex_product) { width:50%; } + .wpsg_mod_productindex_list :where(.wpsg_mod_productindex_product .wpsg_mod_productindex_content) { margin-left:0; clear:both; } + .wpsg_mod_productindex :where(.wpsg_mod_productindex_order), .wpsg_mod_productindex :where(.wpsg_mod_productindex_pager), .wpsg_mod_productindex :where(.wpsg_mod_productindex_viewselect) { float:none; margin:0.25em 0; } + + .wpsg_productform :where(.wpsg_productimages) { width:100%; float:none; margin-right:0; } + .wpsg_productform :where(.wpsg_produkt_produktbilder) { max-width:100%; } + .wpsg_overview :where(.shippayment), .wpsg_overview :where(.anschrift) { float:none; width:100%; } + .basket_product_wrap :where(.basket_product_row .productimage), .wpsg_overview :where(.wpsg_table_wrap .overview_product_row .productimage) { max-width:80px; } + [id="wpsg_calc_layer"] :where(.customertype h2), [id="wpsg_calc_layer"] :where(.country h2), [id="wpsg_calc_layer"] :where(#customerquestion_fk), [id="wpsg_calc_layer"] :where(#customerquestion_ek), [id="wpsg_calc_layer"] :where(.country select) { float:none; width:100%; } + +} + +@media (max-width:400px) { + + /* Produkt */ + .wpsg_productform :where(.wpsg_mod_produktindex_stock) { margin:10px 0; } + .wpsg_produkt_add_basket_wrapper :where(.wpsg_add_basket) { flex:1 1 auto; } + + /* Warenkorb, Kasse, Übersicht */ + /* Aufbau mit Klassen-Spezifität wie oben */ + .wpsg_progress, + .wpsg_basket .product_name .product_shortdesc, + .wpsg_overview .product_name .product_shortdesc, + .wpsg_basket .basket_product_row .product_info, + .wpsg_overview .overview_product_row .product_info { display:none; } + .wpsg_basket :where(.wpsg_button), .wpsg_checkout :where(.wpsg_button), .wpsg_checkout2 :where(.wpsg_button) { width:100%; margin:0 0 10px 0; } + .wpsg_overview :where(.wpsg_checkoutbutton, .wpsg_orderbutton) { width:100%; margin:0 0 10px 0; } + + /* Anfrageliste (K119) */ + .wpsg_mod_request_requestpage :where(.wpsg_cell_amount, .wpsg_cell_sumprice) { width:auto; } + .wpsg_mod_request_requestpage :where(thead th) { font-size:0.8em; hyphens:auto; } + .wpsg_mod_request_requestpage :where(table) { display:block; overflow-x:auto; } +} diff --git a/views/js/frontend.js b/views/js/frontend.js index 98b9799..6663ea5 100644 --- a/views/js/frontend.js +++ b/views/js/frontend.js @@ -224,4 +224,133 @@ value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp));
- }
\ No newline at end of file + }
+
+ /**
+ * Bildleiste der Produktseite im Modus „neu“: zeigt das gewählte Bild groß (Punkt 8.2)
+ */
+ document.addEventListener('click', function(event) {
+
+ var thumb = event.target.closest('.wpsg-product__thumb');
+ if (!thumb) return;
+
+ var media = thumb.closest('.wpsg-product__media');
+ var index = thumb.getAttribute('data-wpsg-image');
+
+ media.querySelectorAll('.wpsg-product__image').forEach(function(image) { image.style.display = ((image.getAttribute('data-wpsg-image') === index)?'':'none'); });
+ media.querySelectorAll('.wpsg-product__thumb').forEach(function(button) { button.setAttribute('aria-pressed', ((button === thumb)?'true':'false')); });
+
+ } );
+
+ /**
+ * Brotkrumen der Produktseite im Modus „neu“: die Kategorie, von der der Besucher kam (Punkt 8.4)
+ *
+ * Der Server gibt die erste Kategorie aus, damit die Seite für Seiten-Caches gleich bleibt.
+ */
+ function wpsg_productBreadcrumbs() {
+
+ if (!document.referrer) return;
+
+ var referrer = document.referrer.split(/[?#]/)[0].replace(/\/page\/\d+\/?$/, '/').replace(/\/?$/, '/');
+
+ document.querySelectorAll('.wpsg-product__breadcrumbs[data-wpsg-trails]').forEach(function(nav) {
+
+ var trails = JSON.parse(nav.getAttribute('data-wpsg-trails'));
+ var trail = trails.find(function(t) { return (t[t.length - 1].url.replace(/\/?$/, '/') === referrer); });
+ if (!trail) return;
+
+ var list = nav.querySelector('ol');
+ list.querySelectorAll('.wpsg-product__crumb-category').forEach(function(li) { li.remove(); });
+
+ trail.forEach(function(crumb) {
+
+ var li = document.createElement('li');
+ var a = document.createElement('a');
+ li.className = 'wpsg-product__crumb-category';
+ a.href = crumb.url;
+ a.textContent = crumb.name;
+ li.appendChild(a);
+ list.insertBefore(li, list.lastElementChild);
+
+ } );
+
+ } );
+
+ } // function wpsg_productBreadcrumbs()
+
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', wpsg_productBreadcrumbs); else wpsg_productBreadcrumbs();
+
+ // Der Variantenwechsel ersetzt das Produkt per Ajax
+ jQuery(document).ajaxComplete(wpsg_productBreadcrumbs);
+
+ /**
+ * GARAN-Label (Tooltip): bleibt im Fenster, ohne verkleinert zu werden (W8)
+ *
+ * Das Label ist mit Rahmen 317 px breit; auf 320 px breiten Bildschirmen hat die Inhaltsspalte weniger. Es wird
+ * nur nach links verschoben, rechts bleiben 4 px Abstand, links notfalls keiner.
+ */
+ function wpsg_garanTooltipPosition() {
+
+ var vw = document.documentElement.clientWidth;
+
+ document.querySelectorAll('.wpsg_product_garan > .tooltip').forEach(function(tooltip) {
+
+ tooltip.style.left = '';
+
+ var rect = tooltip.getBoundingClientRect();
+ var over = rect.right - (vw - 4);
+
+ if (over > 0) tooltip.style.left = (parseFloat(getComputedStyle(tooltip).left) - Math.min(over, rect.left)) + 'px';
+
+ } );
+
+ } // function wpsg_garanTooltipPosition()
+
+ if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', wpsg_garanTooltipPosition); else wpsg_garanTooltipPosition();
+ window.addEventListener('resize', wpsg_garanTooltipPosition);
+ jQuery(document).ajaxComplete(wpsg_garanTooltipPosition);
+
+ /**
+ * GARAN-Label per Tipp und Tastatur (K69)
+ *
+ * Der erste Tipp klappt das Label auf, der zweite folgt dem Link zur EU-Seite. Maus: Darüberfahren zeigt es,
+ * Klick folgt dem Link. Tastatur: Der Fokus zeigt es (CSS :focus-visible), Enter folgt dem Link.
+ * Escape oder ein Tipp daneben schließt es.
+ */
+ var wpsg_garanPointer = '';
+
+ function wpsg_garanSet(label, open, dismissed) {
+
+ label.classList.toggle('is-open', open);
+ label.classList.toggle('is-dismissed', !!dismissed);
+ label.setAttribute('aria-expanded', ((open)?'true':'false'));
+
+ } // function wpsg_garanSet(label, open, dismissed)
+
+ document.addEventListener('pointerdown', function(event) { wpsg_garanPointer = event.pointerType; }, true);
+ document.addEventListener('keydown', function(event) {
+
+ wpsg_garanPointer = '';
+
+ if (event.key === 'Escape') document.querySelectorAll('a.wpsg_product_garan').forEach(function(label) { if (label.classList.contains('is-open') || label === document.activeElement) wpsg_garanSet(label, false, true); } );
+
+ }, true);
+
+ document.addEventListener('click', function(event) {
+
+ var label = event.target.closest('a.wpsg_product_garan');
+
+ document.querySelectorAll('a.wpsg_product_garan.is-open').forEach(function(open) { if (open !== label) wpsg_garanSet(open, false); } );
+
+ if (!label || (wpsg_garanPointer !== 'touch' && wpsg_garanPointer !== 'pen')) return;
+
+ if (!label.classList.contains('is-open')) {
+
+ event.preventDefault();
+ wpsg_garanSet(label, true);
+
+ }
+
+ } );
+
+ document.addEventListener('focusout', function(event) { if (event.target.matches && event.target.matches('a.wpsg_product_garan')) event.target.classList.remove('is-dismissed'); } );
diff --git a/views/js/index.js b/views/js/index.js deleted file mode 100644 index 7124bd0..0000000 --- a/views/js/index.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t={};function r(l){if(t[l])return t[l].exports;var n=t[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,l){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(r.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(l,n,function(t){return e[t]}.bind(null,n));return l},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=2)}([function(e,t){!function(){e.exports=this.wp.element}()},function(e,t){!function(){e.exports=this.wp.components}()},function(e,t,r){"use strict";r.r(t);var l=r(0),n=r(1);(0,wp.blocks.registerBlockType)("wpsg/product",{title:"Produkt(e)",attributes:{product:{type:"string",default:"0"},template:{type:"string",default:"standard.phtml"},hide_title:{type:"string",default:"0"}},icon:Object(l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"200",height:"200",x:"0",y:"0",version:"1.1",viewBox:"0 0 200 200",xmlSpace:"preserve"},Object(l.createElement)("path",{fill:"#C4D00C",d:"M105.023 9.465c-50.1 0-90.71 40.613-90.71 90.706 0 50.096 40.61 90.708 90.71 90.708 50.101 0 90.703-40.612 90.703-90.708.001-50.093-40.602-90.706-90.703-90.706zm-.07 157.155c-36.734 0-66.518-29.778-66.518-66.512s29.783-66.521 66.518-66.521c36.733 0 66.516 29.786 66.516 66.521 0 36.734-29.782 66.512-66.516 66.512z"}),Object(l.createElement)("path",{fill:"#153C67",d:"M102.003 142.499c0 8.349-6.771 15.122-15.122 15.122-8.349 0-15.117-6.773-15.117-15.122 0-8.346 6.769-15.114 15.117-15.114 8.35 0 15.122 6.768 15.122 15.114zM138.28 142.499c0 8.349-6.767 15.122-15.115 15.122-8.352 0-15.12-6.773-15.12-15.122 0-8.346 6.769-15.114 15.12-15.114 8.349 0 15.115 6.768 15.115 15.114zM141.306 57.846H98.975c-8.349 0-15.115 6.767-15.115 15.114 0 8.354 6.767 15.122 15.115 15.122h21.352l-2.011 6.046h-32.52l-3.953-5.864-.005-.012c-.006-.001-.009-.008-.011-.014l-8.436-12.499c-.005-.004-.005-.013-.014-.017 0-.007-.004-.01-.01-.019l-8.431-12.5c-.006-.007-.01-.011-.013-.018-.004 0-.004-.006-.012-.01l-8.432-12.498c0-.008-.009-.01-.011-.018-.003-.006-.007-.012-.01-.012L48.02 38.144c-.005-.01-.005-.015-.011-.023a15.112 15.112 0 00-12.533-6.659H20.361c-8.35 0-15.118 6.768-15.118 15.116 0 8.351 6.769 15.118 15.118 15.118h7.085l3.961 5.874 8.455 12.532 8.456 12.528v.009l8.452 12.52v.006h.002l8.46 12.532.027-.021c2.718 4.03 7.324 6.683 12.551 6.683h51.399c6.807 0 12.558-4.495 14.451-10.686l11.821-35.466c.608-1.635.938-3.403.938-5.25.001-8.345-6.766-15.111-15.113-15.111z"})),category:"layout",edit:function(e){var t=e.attributes,r=e.setAttributes,o=e.className,c=t.product,u=t.template,i=t.hide_title;return Object(l.createElement)("div",{className:o},Object(l.createElement)(n.SelectControl,{value:c,label:wpsg_block_product.label.product,onChange:function(e){r({product:e})},options:wpsg_block_product.arProductSelect}),Object(l.createElement)(n.SelectControl,{value:u,label:wpsg_block_product.label.template,onChange:function(e){r({template:e})},options:wpsg_block_product.arTemplateSelect}),Object(l.createElement)(n.SelectControl,{value:i,label:wpsg_block_product.label.hide_title,onChange:function(e){r({hide_title:e})},options:wpsg_block_product.arHideTitleSelect}))},save:function(e){return null}})}]);
\ No newline at end of file diff --git a/views/js/smartcheckout.js b/views/js/smartcheckout.js index 69099dd..9c4f4f1 100644 --- a/views/js/smartcheckout.js +++ b/views/js/smartcheckout.js @@ -46,11 +46,25 @@ queued: false, queuedUpload: null, submitting: false, + confirm: false, timer: null }; }, + computed: { + + /** + * Sind Bestellbedingungen und Bestellbutton zu sehen? Beim Bestellabschluss „Zusammenfassung vor Abschluss“ erst im Bestätigungsschritt + */ + showFinal: function() { + + return (this.state.finish !== 'confirm' || this.confirm); + + } // showFinal() + + }, + created: function() { this.syncForm(true); @@ -65,8 +79,8 @@ // Nach einem abgelehnten Bestellversuch steht der Kunde vor dem ersten Fehler if (this.state.errors.length !== 0) this.$nextTick(this.focusError); - // Das GARAN-Gewährleistungslabel erscheint wie in der klassischen Zusammenfassung beim Betreten der Seite - if (this.state.warranty && this.state.warranty.popup === true && this.state.empty !== true) this.garanPopup = true; + // Das GARAN-Gewährleistungslabel erscheint wie in der klassischen Zusammenfassung beim Betreten der Seite, mit Bestätigungsschritt erst dort + if (this.state.warranty && this.state.warranty.popup === true && this.state.empty !== true && this.state.finish !== 'confirm') this.garanPopup = true; // Die Lightbox des Gewährleistungslabels lässt sich mit Esc schließen var self = this; @@ -77,10 +91,13 @@ }); - // Zurück aus dem Seiten-Cache des Browsers (z.B. Zurück-Button nach dem Zahlungsanbieter): Layer wieder entfernen + // Zurück aus dem Seiten-Cache des Browsers (z.B. Zurück-Button nach dem Zahlungsanbieter): Layer entfernen, Eingaben wieder bearbeitbar window.addEventListener('pageshow', function(event) { - if (event.persisted) self.submitting = false; + if (!event.persisted) return; + + self.submitting = false; + self.confirm = false; }); @@ -157,7 +174,7 @@ selectChoice: function(type, id, event) { if (event && event.target && typeof event.target.closest === 'function' && event.target.closest('.sc_choice_head') !== null) return; - if (this.form[type] === id) return; + if (this.form[type] === id || this.confirm) return; this.form[type] = id; this.refresh(); @@ -242,7 +259,8 @@ var el_form = document.getElementById('wpsg_smartcheckout_form'); - if (el_form === null) return; + // Im Bestätigungsschritt sind die Eingaben gesperrt und würden ohne sie übertragen + if (el_form === null || this.confirm) return; // Dateien der direkt hochzuladenden Felder sofort sichern: der Block wird mit der nächsten Antwort neu aufgebaut var arUpload = []; @@ -338,6 +356,9 @@ self.voucherError = (result.voucherError === true); + // Mini-Warenkorb (Block) aktualisieren + document.dispatchEvent(new Event('wpsg_basket_changed')); + if (result.ok === true && action === 'voucherAdd') self.voucher = ''; if (result.state) { @@ -355,6 +376,8 @@ } + if (action === 'confirm') self.afterConfirm(result.confirm === true); + if (self.queuedUpload !== null) { var upload = self.queuedUpload; @@ -474,8 +497,75 @@ }, // focusError() /** - * Blockt das Absenden, solange der Server noch rechnet + * Prüft die Angaben und wechselt in den Bestätigungsschritt (Bestellabschluss „Zusammenfassung vor Abschluss“) + * + * Die Pflichtfelder der Eingaben prüft zuerst der Browser, Bestellbedingungen und AGB erst der Bestätigungsschritt. + */ + startConfirm: function() { + + if (this.busy) return; + + var el_fieldset = el_root.querySelector('.sc_fieldset'); + + if (el_fieldset !== null && typeof el_fieldset.reportValidity === 'function' && !el_fieldset.reportValidity()) return; + + // Eine noch ausstehende Änderung geht in derselben Anfrage mit + if (this.timer !== null) { + + window.clearTimeout(this.timer); + this.timer = null; + + } + + this.send('confirm'); + + }, // startConfirm() + + /** + * Antwort auf startConfirm(): bei bestandener Prüfung Eingaben sperren, sonst zum ersten Fehler + */ + afterConfirm: function(bConfirm) { + + var self = this; + + if (!bConfirm) { + + this.$nextTick(this.focusError); + + return; + + } + + this.confirm = true; + + // Das GARAN-Gewährleistungslabel erscheint wie in der klassischen Zusammenfassung + if (this.state.warranty && this.state.warranty.popup === true && this.garanConfirmed !== true) this.garanPopup = true; + + this.$nextTick(function() { + + var el_note = el_root.querySelector('.sc_confirm_note'); + + if (el_note !== null) el_note.scrollIntoView({ behavior: 'smooth', block: 'start' }); + + }); + + }, // afterConfirm(bConfirm) + + /** + * Verlässt den Bestätigungsschritt, die Eingaben sind wieder bearbeitbar */ + editConfirm: function() { + + this.confirm = false; + + this.$nextTick(function() { + + el_root.scrollIntoView({ behavior: 'smooth', block: 'start' }); + + }); + + }, // editConfirm() + /** * Berechnet neu, wenn sich eine Eingabe in einem Block der Module ändert (z.B. Lieferadresse, Produktvariablen) * @@ -695,6 +785,20 @@ } + /* + * Gesperrte Felder würden nicht übertragen. Der Browser stellt die Formulardaten erst nach diesem Ereignis + * zusammen, deshalb hier direkt im DOM freigeben und nicht über Vue (das aktualisiert erst später). + */ + if (this.confirm) { + + el_root.querySelectorAll('fieldset.sc_fieldset').forEach(function(el) { + + el.disabled = false; + + }); + + } + // Ab hier wird tatsächlich bestellt: Layer über die Seite, bis der Browser die nächste Seite lädt this.submitting = true; diff --git a/views/js/wpsg-block-product.js b/views/js/wpsg-block-product.js deleted file mode 100644 index 7124bd0..0000000 --- a/views/js/wpsg-block-product.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){var t={};function r(l){if(t[l])return t[l].exports;var n=t[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,r),n.l=!0,n.exports}r.m=e,r.c=t,r.d=function(e,t,l){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:l})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var l=Object.create(null);if(r.r(l),Object.defineProperty(l,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)r.d(l,n,function(t){return e[t]}.bind(null,n));return l},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=2)}([function(e,t){!function(){e.exports=this.wp.element}()},function(e,t){!function(){e.exports=this.wp.components}()},function(e,t,r){"use strict";r.r(t);var l=r(0),n=r(1);(0,wp.blocks.registerBlockType)("wpsg/product",{title:"Produkt(e)",attributes:{product:{type:"string",default:"0"},template:{type:"string",default:"standard.phtml"},hide_title:{type:"string",default:"0"}},icon:Object(l.createElement)("svg",{xmlns:"http://www.w3.org/2000/svg",width:"200",height:"200",x:"0",y:"0",version:"1.1",viewBox:"0 0 200 200",xmlSpace:"preserve"},Object(l.createElement)("path",{fill:"#C4D00C",d:"M105.023 9.465c-50.1 0-90.71 40.613-90.71 90.706 0 50.096 40.61 90.708 90.71 90.708 50.101 0 90.703-40.612 90.703-90.708.001-50.093-40.602-90.706-90.703-90.706zm-.07 157.155c-36.734 0-66.518-29.778-66.518-66.512s29.783-66.521 66.518-66.521c36.733 0 66.516 29.786 66.516 66.521 0 36.734-29.782 66.512-66.516 66.512z"}),Object(l.createElement)("path",{fill:"#153C67",d:"M102.003 142.499c0 8.349-6.771 15.122-15.122 15.122-8.349 0-15.117-6.773-15.117-15.122 0-8.346 6.769-15.114 15.117-15.114 8.35 0 15.122 6.768 15.122 15.114zM138.28 142.499c0 8.349-6.767 15.122-15.115 15.122-8.352 0-15.12-6.773-15.12-15.122 0-8.346 6.769-15.114 15.12-15.114 8.349 0 15.115 6.768 15.115 15.114zM141.306 57.846H98.975c-8.349 0-15.115 6.767-15.115 15.114 0 8.354 6.767 15.122 15.115 15.122h21.352l-2.011 6.046h-32.52l-3.953-5.864-.005-.012c-.006-.001-.009-.008-.011-.014l-8.436-12.499c-.005-.004-.005-.013-.014-.017 0-.007-.004-.01-.01-.019l-8.431-12.5c-.006-.007-.01-.011-.013-.018-.004 0-.004-.006-.012-.01l-8.432-12.498c0-.008-.009-.01-.011-.018-.003-.006-.007-.012-.01-.012L48.02 38.144c-.005-.01-.005-.015-.011-.023a15.112 15.112 0 00-12.533-6.659H20.361c-8.35 0-15.118 6.768-15.118 15.116 0 8.351 6.769 15.118 15.118 15.118h7.085l3.961 5.874 8.455 12.532 8.456 12.528v.009l8.452 12.52v.006h.002l8.46 12.532.027-.021c2.718 4.03 7.324 6.683 12.551 6.683h51.399c6.807 0 12.558-4.495 14.451-10.686l11.821-35.466c.608-1.635.938-3.403.938-5.25.001-8.345-6.766-15.111-15.113-15.111z"})),category:"layout",edit:function(e){var t=e.attributes,r=e.setAttributes,o=e.className,c=t.product,u=t.template,i=t.hide_title;return Object(l.createElement)("div",{className:o},Object(l.createElement)(n.SelectControl,{value:c,label:wpsg_block_product.label.product,onChange:function(e){r({product:e})},options:wpsg_block_product.arProductSelect}),Object(l.createElement)(n.SelectControl,{value:u,label:wpsg_block_product.label.template,onChange:function(e){r({template:e})},options:wpsg_block_product.arTemplateSelect}),Object(l.createElement)(n.SelectControl,{value:i,label:wpsg_block_product.label.hide_title,onChange:function(e){r({hide_title:e})},options:wpsg_block_product.arHideTitleSelect}))},save:function(e){return null}})}]);
\ No newline at end of file diff --git a/views/mailtemplates/adminmail.phtml b/views/mailtemplates/adminmail.phtml index 6b029ca..88dd300 100644 --- a/views/mailtemplates/adminmail.phtml +++ b/views/mailtemplates/adminmail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die bei einer neuen Bestellung an den Admin geht
+ * @version 4.6.1
*/
$this->htmlMail = false;
@@ -65,7 +66,7 @@ <?php echo wpsg_pad_right(__('Kundennummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['knr']; ?>
<?php echo wpsg_pad_right(__('Bestellnummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['onr']; ?>
-<?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo date("d.m.Y H:i:s", $this->view['basket']['checkout']['datum']); ?>
+<?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo wp_date("d.m.Y H:i:s", intval($this->view['basket']['checkout']['datum'])); ?>
<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
diff --git a/views/mailtemplates/html/adminmail.phtml b/views/mailtemplates/html/adminmail.phtml index ca3da26..385828b 100644 --- a/views/mailtemplates/html/adminmail.phtml +++ b/views/mailtemplates/html/adminmail.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/* Wichtig, da die Module sonst kein HTML zurückgeben */
$this->htmlMail = true;
diff --git a/views/mailtemplates/html/customer.phtml b/views/mailtemplates/html/customer.phtml index 68dba26..ee5c27c 100644 --- a/views/mailtemplates/html/customer.phtml +++ b/views/mailtemplates/html/customer.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
$oCustomer = wpsg_customer::getInstance(intval($this->view['basket']['checkout']['k_id']));
@@ -144,7 +145,7 @@ </tr>
<tr>
<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Bestelldatum', 'wpsg'); ?>:</td>
- <td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo date("d.m.Y H:i:s", $this->view['basket']['checkout']['datum']); ?></td>
+ <td style="padding:2px; line-height:100%; vertical-align:middle;" class="col1"><?php echo wp_date("d.m.Y H:i:s", intval($this->view['basket']['checkout']['datum'])); ?></td>
</tr>
<tr>
<td style="padding:2px; line-height:100%; vertical-align:middle;" class="col0"><?php echo __('Rechnungsbetrag', 'wpsg'); ?>:</td>
diff --git a/views/mailtemplates/html/html_foot.phtml b/views/mailtemplates/html/html_foot.phtml index ddd2b90..49638c3 100644 --- a/views/mailtemplates/html/html_foot.phtml +++ b/views/mailtemplates/html/html_foot.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
</td>
<td> </td>
</tr>
diff --git a/views/mailtemplates/html/html_head.phtml b/views/mailtemplates/html/html_head.phtml index 225795f..eafdaea 100644 --- a/views/mailtemplates/html/html_head.phtml +++ b/views/mailtemplates/html/html_head.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
diff --git a/views/mailtemplates/html/kundenmail.phtml b/views/mailtemplates/html/kundenmail.phtml index fd8204f..ba3b1ff 100644 --- a/views/mailtemplates/html/kundenmail.phtml +++ b/views/mailtemplates/html/kundenmail.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/* Wichtig, da die Module sonst kein HTML zurückgeben */
$this->htmlMail = true;
@@ -34,15 +35,13 @@ <?php $this->CallMods('kundenmail_afteragb', array(&$this->view['basket']['checkout']['o_id'])); ?>
+<?php if (wpsg_isSizedString($this->get_option("wpsg_ps_mailwiderruf"))) { ?>
<h3><?php echo __("Widerrufsbelehrung", "wpsg"); ?></h3>
-<?php if (wpsg_isSizedString($this->get_option("wpsg_ps_mailwiderruf"))) { ?>
<p><?php echo nl2br($this->get_option("wpsg_ps_mailwiderruf")); ?></p>
-<?php } else { ?>
-<?php echo __("...hier steht der Text zum Widerrufsrecht...", "wpsg"); ?>
-<?php } ?>
<h3><?php echo __("Ende der Widerrufsbelehrung", "wpsg"); ?></h3>
+<?php } ?>
<p><?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?></p>
diff --git a/views/mailtemplates/html/logo.phtml b/views/mailtemplates/html/logo.phtml index bbd3b1d..1bd0d51 100644 --- a/views/mailtemplates/html/logo.phtml +++ b/views/mailtemplates/html/logo.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<style>
.email-logo { padding-bottom: 10px; }
.email-logo-watermark { position:absolute; top:10%; left:0; right:0; display:flex; justify-content:center; align-items:center; }
diff --git a/views/mailtemplates/html/order.phtml b/views/mailtemplates/html/order.phtml index b024ec8..2e78479 100644 --- a/views/mailtemplates/html/order.phtml +++ b/views/mailtemplates/html/order.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/** @var wpsg_order $oOrder */
$oOrder = $this->view['oOrder'];
diff --git a/views/mailtemplates/html/reminder.phtml b/views/mailtemplates/html/reminder.phtml index 25caafd..0ee4a73 100644 --- a/views/mailtemplates/html/reminder.phtml +++ b/views/mailtemplates/html/reminder.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mailtemplates/html/status.phtml b/views/mailtemplates/html/status.phtml index c7699a5..773d4bc 100644 --- a/views/mailtemplates/html/status.phtml +++ b/views/mailtemplates/html/status.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird für die HTML Mail bei einer Statusänderung verwendet
+ * @version 4.6.1
*/
/* Wichtig, da die Module sonst kein HTML zurückgeben */
diff --git a/views/mailtemplates/kundenmail.phtml b/views/mailtemplates/kundenmail.phtml index 340e2e6..d0908d2 100644 --- a/views/mailtemplates/kundenmail.phtml +++ b/views/mailtemplates/kundenmail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die bei einer neuen Bestellung an den Kunde geht
+ * @version 4.6.1
*/
$this->htmlMail = false;
@@ -67,7 +68,7 @@ <?php echo wpsg_pad_right(__('Kundennummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['knr']; ?>
<?php echo wpsg_pad_right(__('Bestellnummer', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['onr']; ?>
-<?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo date("d.m.Y H:i:s", $this->view['basket']['checkout']['datum']); ?>
+<?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo wp_date("d.m.Y H:i:s", intval($this->view['basket']['checkout']['datum'])); ?>
<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto'], $this->get_option('wpsg_currency')); ?>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
@@ -100,15 +101,13 @@ <?php echo $this->getURL(wpsg_ShopController::URL_AGB); ?>
<?php $this->CallMods('kundenmail_afteragb', array(&$this->view['basket']['checkout']['o_id'])); ?>
+<?php if (trim($this->get_option("wpsg_ps_mailwiderruf")) != "") { ?>
-- <?php echo __("Widerrufsbelehrung", "wpsg"); ?> --
-<?php if (trim($this->get_option("wpsg_ps_mailwiderruf")) != "") { ?>
<?php echo $this->get_option("wpsg_ps_mailwiderruf"); ?>
-<?php } else { ?>
-<?php echo __("...hier steht der Text zum Widerrufsrecht...", "wpsg"); ?>
-<?php } ?>
-- <?php echo __("Ende der Widerrufsbelehrung", "wpsg"); ?> --
+<?php } ?>
<?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?>
diff --git a/views/mailtemplates/order.phtml b/views/mailtemplates/order.phtml index 40f5803..8e0ea6b 100644 --- a/views/mailtemplates/order.phtml +++ b/views/mailtemplates/order.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/** @var wpsg_order $oOrder */
$oOrder = $this->view['oOrder'];
diff --git a/views/mailtemplates/reminder.phtml b/views/mailtemplates/reminder.phtml index 8870f6a..a215774 100644 --- a/views/mailtemplates/reminder.phtml +++ b/views/mailtemplates/reminder.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mailtemplates/status.phtml b/views/mailtemplates/status.phtml index 490de01..7ba8f79 100644 --- a/views/mailtemplates/status.phtml +++ b/views/mailtemplates/status.phtml @@ -16,6 +16,7 @@ * Abo aktiv = 600
* offene Abokündigung = 610
* Abo gekündigt = 620
+ * @version 4.6.1
*/
$this->htmlMail = false;
diff --git a/views/mods/mod_abo/admin_setcapabilities.phtml b/views/mods/mod_abo/admin_setcapabilities.phtml index 90a5992..f843da9 100644 --- a/views/mods/mod_abo/admin_setcapabilities.phtml +++ b/views/mods/mod_abo/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_abo/basket_row.phtml b/views/mods/mod_abo/basket_row.phtml index dfe5581..6a4e098 100644 --- a/views/mods/mod_abo/basket_row.phtml +++ b/views/mods/mod_abo/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Abo Verlängerung im Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/index.phtml b/views/mods/mod_abo/index.phtml index 3e8bc85..ae29ed2 100644 --- a/views/mods/mod_abo/index.phtml +++ b/views/mods/mod_abo/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Übersicht der Abonnements
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/mail_admin_stoprenewal.phtml b/views/mods/mod_abo/mail_admin_stoprenewal.phtml index 4bda001..6d0ce55 100644 --- a/views/mods/mod_abo/mail_admin_stoprenewal.phtml +++ b/views/mods/mod_abo/mail_admin_stoprenewal.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die der Admin bekommt wenn ein Kunde ein Abo im Frontend anhalten möchte (Text)
+ * @version 4.6.1
*/
?><?php echo __('Hallo Administrator,', 'wpsg'); ?>
diff --git a/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml b/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml index 538e322..5fdad45 100644 --- a/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml +++ b/views/mods/mod_abo/mail_admin_stoprenewal_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die der Admin bekommt wenn ein Kunde ein Abo im Frontend anhalten möchte (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');7
diff --git a/views/mods/mod_abo/mail_autoinformation.phtml b/views/mods/mod_abo/mail_autoinformation.phtml index 07c8c80..48d14ee 100644 --- a/views/mods/mod_abo/mail_autoinformation.phtml +++ b/views/mods/mod_abo/mail_autoinformation.phtml @@ -2,6 +2,7 @@ /**
* Template für die Informationsmail an den Kunden wenn ein Abo automatisch verlängert werden soll
+ * @version 4.6.1
*/
/** @var wpsg_product $oProduct */
diff --git a/views/mods/mod_abo/mail_autoinformation_html.phtml b/views/mods/mod_abo/mail_autoinformation_html.phtml index c2be38d..33c3360 100644 --- a/views/mods/mod_abo/mail_autoinformation_html.phtml +++ b/views/mods/mod_abo/mail_autoinformation_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Informationsmail an den Kunden wenn ein Abo automatisch verlängert werden soll
+ * @version 4.6.1
*/
?><p><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,</p>
diff --git a/views/mods/mod_abo/mail_expiration.phtml b/views/mods/mod_abo/mail_expiration.phtml index a5b11df..3af9670 100644 --- a/views/mods/mod_abo/mail_expiration.phtml +++ b/views/mods/mod_abo/mail_expiration.phtml @@ -2,6 +2,7 @@ /**
* Mail die beim Auslauf eines Abos versendet wird
+ * @version 4.6.1
*/
?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
diff --git a/views/mods/mod_abo/mail_expiration_html.phtml b/views/mods/mod_abo/mail_expiration_html.phtml index f64e364..3ad9566 100644 --- a/views/mods/mod_abo/mail_expiration_html.phtml +++ b/views/mods/mod_abo/mail_expiration_html.phtml @@ -2,6 +2,7 @@ /**
* Mail die beim Auslauf eines Abos versendet wird (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_abo/mail_firstbuy.phtml b/views/mods/mod_abo/mail_firstbuy.phtml index df59a1d..dd4710e 100644 --- a/views/mods/mod_abo/mail_firstbuy.phtml +++ b/views/mods/mod_abo/mail_firstbuy.phtml @@ -2,6 +2,7 @@ /**
* Mailtemplate, welches beim erstmaligen Kauf eines Abos versendet wird
+ * @version 4.6.1
*/
?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
diff --git a/views/mods/mod_abo/mail_firstbuy_html.phtml b/views/mods/mod_abo/mail_firstbuy_html.phtml index 20c807b..4cffa1c 100644 --- a/views/mods/mod_abo/mail_firstbuy_html.phtml +++ b/views/mods/mod_abo/mail_firstbuy_html.phtml @@ -2,6 +2,7 @@ /**
* Mailtemplate, welches beim erstmaligen Kauf eines Abos versendet wird (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_abo/mail_rebuy.phtml b/views/mods/mod_abo/mail_rebuy.phtml index 4d6e28c..d2af6c4 100644 --- a/views/mods/mod_abo/mail_rebuy.phtml +++ b/views/mods/mod_abo/mail_rebuy.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden wenn ein Abo verlängert wurde
+ * @version 4.6.1
*/
?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
diff --git a/views/mods/mod_abo/mail_rebuy_html.phtml b/views/mods/mod_abo/mail_rebuy_html.phtml index 773b114..ae39e60 100644 --- a/views/mods/mod_abo/mail_rebuy_html.phtml +++ b/views/mods/mod_abo/mail_rebuy_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden wenn ein Abo verlängert wurde (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_abo/mail_row.phtml b/views/mods/mod_abo/mail_row.phtml index 6f039c9..b1c22b0 100644 --- a/views/mods/mod_abo/mail_row.phtml +++ b/views/mods/mod_abo/mail_row.phtml @@ -2,6 +2,7 @@ /**
* Mit diesem Template kann die Zeile eines Produktes im Mailtemplate erweitert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/mail_row_html.phtml b/views/mods/mod_abo/mail_row_html.phtml index 3409b71..e4f29ea 100644 --- a/views/mods/mod_abo/mail_row_html.phtml +++ b/views/mods/mod_abo/mail_row_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Zeile eines Abo Produktes im HTML Template
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_abo/mail_storno.phtml b/views/mods/mod_abo/mail_storno.phtml index 5ca7b65..388f33f 100644 --- a/views/mods/mod_abo/mail_storno.phtml +++ b/views/mods/mod_abo/mail_storno.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden wenn ein Abo storniert wurde
+ * @version 4.6.1
*/
?><?php echo __('Hallo', 'wpsg'); ?> <?php echo wpsg_hspc($this->view['customer']['vname']); ?> <?php echo wpsg_hspc($this->view['customer']['name']); ?>,
diff --git a/views/mods/mod_abo/mail_storno_html.phtml b/views/mods/mod_abo/mail_storno_html.phtml index 06cea78..e04055e 100644 --- a/views/mods/mod_abo/mail_storno_html.phtml +++ b/views/mods/mod_abo/mail_storno_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden wenn ein Abo storniert wurde (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_abo/order_view.phtml b/views/mods/mod_abo/order_view.phtml index 1390101..7a07d19 100644 --- a/views/mods/mod_abo/order_view.phtml +++ b/views/mods/mod_abo/order_view.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige des Abo Statuses in der Hauptbestellung
+ * @version 4.6.1
*/
$view = $this->view['wpsg_mod_abo'];
diff --git a/views/mods/mod_abo/order_view_base.phtml b/views/mods/mod_abo/order_view_base.phtml index 3ce1172..9763ff1 100644 --- a/views/mods/mod_abo/order_view_base.phtml +++ b/views/mods/mod_abo/order_view_base.phtml @@ -2,6 +2,7 @@ /**
* Integration einer Abo-Verlängerung in die Bestellansicht im Backend (Abo Produkt)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/order_view_row.phtml b/views/mods/mod_abo/order_view_row.phtml index d286572..17adec0 100644 --- a/views/mods/mod_abo/order_view_row.phtml +++ b/views/mods/mod_abo/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Integration einer Abo Verlängerung in die Bestellansicht im Backend (Abo-Verlängerungen)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/overview_row.phtml b/views/mods/mod_abo/overview_row.phtml index 8dc1742..61cc9ab 100644 --- a/views/mods/mod_abo/overview_row.phtml +++ b/views/mods/mod_abo/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Abo-Verlängerung im Overview
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/page_abo.phtml b/views/mods/mod_abo/page_abo.phtml index 3ab2f98..123f6e5 100644 --- a/views/mods/mod_abo/page_abo.phtml +++ b/views/mods/mod_abo/page_abo.phtml @@ -2,6 +2,7 @@ /**
* Template für die Übersichtsseite der Abonnements im Frontend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_abo/produkt_addedit_content.phtml b/views/mods/mod_abo/produkt_addedit_content.phtml index e06f94a..aa41d8b 100644 --- a/views/mods/mod_abo/produkt_addedit_content.phtml +++ b/views/mods/mod_abo/produkt_addedit_content.phtml @@ -2,6 +2,7 @@ /**
* Integriert die Abo-Einstellungen in das Produkt
+ * @version 4.6.1
*/
$arPaymentSelect = [
diff --git a/views/mods/mod_abo/settings_edit.phtml b/views/mods/mod_abo/settings_edit.phtml index 44e0208..110e14a 100644 --- a/views/mods/mod_abo/settings_edit.phtml +++ b/views/mods/mod_abo/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Abo Moduls
+ * @version 4.6.1
*/
$arPaymentSelect = [
diff --git a/views/mods/mod_addressvalidation/addressvalidation.js b/views/mods/mod_addressvalidation/addressvalidation.js index b74aa5b..089788b 100644 --- a/views/mods/mod_addressvalidation/addressvalidation.js +++ b/views/mods/mod_addressvalidation/addressvalidation.js @@ -1,82 +1,351 @@ /**
- * Globale Funktionen zur Adressvalidation
+ * Adressvalidierung im Browser
+ * Fragt wpsg_mod_addressvalidation::ajaxValidate() im Shop an, der API-Key bleibt auf dem Server
+ * Die Konfiguration (ajaxurl, action, nonce, labelApply, labelProposal) setzt wpsg_mod_addressvalidation::wpsg_enqueue_scripts()
*/
-function validateAddressBind(data) {
- jQuery(data.PLZ).on("input", function () {
- validateAddress(data);
- });
- jQuery(data.Ort).on("input", function () {
- validateAddress(data);
- });
- jQuery(data.Strasse).on("input", function () {
- validateAddress(data);
- });
- jQuery(data.Land).on("input", function () {
- validateAddress(data);
+/** Verzögerung, damit mehrere geänderte Felder nur eine Anfrage auslösen (ms) */
+var wpsg_mod_addressvalidation_delay = 400;
+
+/**
+ * Selektoren der Adressfelder je Adresse
+ * Klassische Kasse, OnePage, Profil und Registrierung (#strasse …) sowie SmartCheckout (#wpsg_sc_strasse …)
+ * Die Lieferanschrift (#shipping_…) ist in beiden gleich
+ */
+var wpsg_mod_addressvalidation_fields = [
+ {
+ type: 'billing',
+ strasse: '#strasse, #wpsg_sc_strasse',
+ nr: '#nr, #wpsg_sc_nr',
+ plz: '#plz, #wpsg_sc_plz',
+ ort: '#ort, #wpsg_sc_ort',
+ land: '#wpsg_land, #wpsg_sc_land'
+ },
+ {
+ type: 'shipping',
+ strasse: '#shipping_strasse',
+ nr: '#shipping_nr',
+ plz: '#shipping_plz',
+ ort: '#shipping_ort',
+ land: '#shipping_land'
+ }
+];
+
+/**
+ * Liefert das erste vorhandene Feld zu einem Schlüssel (strasse, nr, plz, ort, land)
+ *
+ * @param oFields
+ * @param strKey
+ * @return jQuery
+ */
+function wpsg_mod_addressvalidation_getField(oFields, strKey) {
+
+ return jQuery(oFields[strKey]).first();
+
+} // function wpsg_mod_addressvalidation_getField(oFields, strKey)
+
+/**
+ * Bindet die Prüfung an die Felder einer Adresse
+ * Über document, damit auch Felder greifen, die erst später erzeugt werden (SmartCheckout baut sie mit Vue auf)
+ *
+ * @param oFields Selektoren der Felder (strasse, nr, plz, ort, land) und type ('billing' oder 'shipping')
+ */
+function wpsg_mod_addressvalidation_bind(oFields) {
+
+ var oTimer = null;
+
+ jQuery(document).on('change', [oFields.strasse, oFields.nr, oFields.plz, oFields.ort, oFields.land].join(', '), function() {
+
+ window.clearTimeout(oTimer);
+
+ oTimer = window.setTimeout(function() {
+
+ wpsg_mod_addressvalidation_check(oFields);
+
+ }, wpsg_mod_addressvalidation_delay);
+
});
-}
-
-// Adress-Validation
-function validateAddress(data) {
- var
- plz,
- ort,
- strasse,
- astr1,
- land = 'de',
- rw;
- plz = jQuery(data.PLZ).val();
- ort = jQuery(data.Ort).val();
- strasse = jQuery(data.Strasse).val();
- nr = jQuery(data.Nr).val();
- if (nr !== undefined) {
- strasse = strasse + ' ' + nr;
+
+} // function wpsg_mod_addressvalidation_bind(oFields)
+
+/**
+ * Liefert das Element für die Meldung einer Adresse und legt es bei Bedarf direkt hinter dem Land an
+ * (ohne Land hinter Ort bzw. PLZ)
+ *
+ * @param oFields
+ * @return jQuery
+ */
+function wpsg_mod_addressvalidation_getMessage(oFields) {
+
+ var strClass = 'wpsg_mod_addressvalidation_message_' + oFields.type;
+ var oMessage = jQuery('.' + strClass);
+
+ if (oMessage.length) return oMessage;
+
+ oMessage = jQuery('<div class="wpsg_mod_addressvalidation_message ' + strClass + '" role="status"></div>').css({
+ 'margin': '0 0 1rem 0',
+ 'padding': '3px 0 3px 8px'
+ }).hide();
+
+ var arAnchor = ['land', 'ort', 'plz'];
+
+ for (var i = 0; i < arAnchor.length; i ++) {
+
+ var oField = wpsg_mod_addressvalidation_getField(oFields, arAnchor[i]);
+
+ if (oField.length) {
+
+ // SmartCheckout: Die Felder liegen in einem Grid, die Meldung belegt dort eine eigene Zeile über die volle Breite
+ var oBlock = oField.closest('.sc_field');
+
+ if (oBlock.length) {
+
+ oMessage.css({ 'grid-column': '1 / -1', 'margin': '0' });
+
+ } else {
+
+ oBlock = oField.closest('.wpsg_checkoutblock');
+
+ }
+
+ ((oBlock.length)?oBlock:oField).after(oMessage);
+
+ break;
+
+ }
+
}
- land = jQuery(data.Land + ' option:selected').val();
- land = jQuery(data.Land + ' option:selected').attr('data-land');
- astr1 = localStorage.getItem(data.StorageKey);
- if ((plz.length > 3) && (ort.length > 3) && (strasse.length > 3) &&
- (astr1 != (strasse + plz + ort + land)))
- {
+ return oMessage;
+
+} // function wpsg_mod_addressvalidation_getMessage(oFields)
+
+/**
+ * Setzt den Wert eines Feldes und meldet die Änderung, damit auch Vue (SmartCheckout) den Wert übernimmt
+ *
+ * @param oField
+ * @param strValue
+ */
+function wpsg_mod_addressvalidation_setValue(oField, strValue) {
+
+ if (!oField.length) return;
+
+ var el = oField[0];
+
+ el.value = strValue;
+ el.dispatchEvent(new Event('input', { bubbles: true }));
+ el.dispatchEvent(new Event('change', { bubbles: true }));
+
+} // function wpsg_mod_addressvalidation_setValue(oField, strValue)
+
+/**
+ * Übernimmt den Vorschlag des Dienstes in die Felder einer Adresse
+ *
+ * @param oFields
+ * @param oProposal strasse, nr, plz, ort
+ */
+function wpsg_mod_addressvalidation_apply(oFields, oProposal) {
+
+ var oNr = wpsg_mod_addressvalidation_getField(oFields, 'nr');
+ var strStrasse = oProposal.strasse;
+
+ // Ohne eigenes Feld für die Hausnummer gehört sie zur Straße
+ if (oNr.length) {
+
+ wpsg_mod_addressvalidation_setValue(oNr, oProposal.nr);
+
+ } else if (oProposal.nr !== '') {
+
+ strStrasse = strStrasse + ' ' + oProposal.nr;
- astr1 = strasse + plz + ort + land;
- localStorage.setItem(data.StorageKey, astr1);
- jQuery.ajax({
- url: 'http://api.address-validator.net/api/verify',
- type: 'POST',
- data: { StreetAddress: strasse,
- City: ort,
- PostalCode: plz,
- //State: State,
- CountryCode: land,
- //Locale: land,
- APIKey: data.Key},
- dataType: 'json',
- success: function (json) {
- // check API result
- if (typeof(json.status) != "undefined") {
- status = json.status;
- formattedaddress = json.formattedaddress;
- if (json.status === 'VALID') {
-
-
- } else if ((json.status === 'INVALID') || (json.status === 'SUSPECT')) {
-
- alert(data.MsgTeil1 + '-Validation fehlerhaft. Bitte Straße, Hausnummer, PLZ, Ort und Land überprüfen.');
-
- } else {
-
- alert('Adress-Validation Serverproblem: ' + json.status);
-
- }
- }
-
- }
- });
-
}
-}
+ wpsg_mod_addressvalidation_setValue(wpsg_mod_addressvalidation_getField(oFields, 'strasse'), strStrasse);
+ wpsg_mod_addressvalidation_setValue(wpsg_mod_addressvalidation_getField(oFields, 'plz'), oProposal.plz);
+ wpsg_mod_addressvalidation_setValue(wpsg_mod_addressvalidation_getField(oFields, 'ort'), oProposal.ort);
+
+} // function wpsg_mod_addressvalidation_apply(oFields, oProposal)
+
+/**
+ * Baut die Zeile mit dem Vorschlag des Dienstes, Werte, die von der Eingabe abweichen, sind fett
+ *
+ * @param oFields
+ * @param oData eingegebene Werte (strasse, nr, plz, ort)
+ * @param oProposal vorgeschlagene Werte (strasse, nr, plz, ort)
+ * @return jQuery
+ */
+function wpsg_mod_addressvalidation_renderProposal(oFields, oData, oProposal) {
+
+ var oLine = jQuery('<div class="wpsg_mod_addressvalidation_proposal"></div>').css('margin-top', '4px');
+ var bNr = (wpsg_mod_addressvalidation_getField(oFields, 'nr').length > 0);
+
+ var normalize = function(strValue) {
+
+ return jQuery.trim(String(strValue || '')).replace(/\s+/g, ' ').toLowerCase();
+
+ };
+
+ var addValue = function(strValue, strInput) {
+
+ oLine.append(jQuery((normalize(strValue) !== normalize(strInput))?'<strong></strong>':'<span></span>').text(strValue));
+
+ };
+
+ oLine.append(jQuery('<span></span>').text(wpsg_mod_addressvalidation.labelProposal + ' '));
+
+ // Ohne eigenes Feld für die Hausnummer steht sie in der Eingabe mit in der Straße
+ if (bNr) {
+
+ addValue(oProposal.strasse, oData.strasse);
+
+ if (oProposal.nr !== '') {
+
+ oLine.append(' ');
+ addValue(oProposal.nr, oData.nr);
+
+ }
+
+ } else {
+
+ addValue(jQuery.trim(oProposal.strasse + ' ' + oProposal.nr), oData.strasse);
+
+ }
+
+ oLine.append(', ');
+ addValue(oProposal.plz, oData.plz);
+ oLine.append(' ');
+ addValue(oProposal.ort, oData.ort);
+
+ return oLine;
+
+} // function wpsg_mod_addressvalidation_renderProposal(oFields, oData, oProposal)
+
+/**
+ * Prüft die Adresse über den Shop und zeigt die Meldung an
+ *
+ * @param oFields
+ */
+function wpsg_mod_addressvalidation_check(oFields) {
+
+ var oStrasse = wpsg_mod_addressvalidation_getField(oFields, 'strasse');
+ var oPlz = wpsg_mod_addressvalidation_getField(oFields, 'plz');
+ var oOrt = wpsg_mod_addressvalidation_getField(oFields, 'ort');
+
+ if (!oStrasse.length || !oPlz.length || !oOrt.length) return;
+
+ var oMessage = wpsg_mod_addressvalidation_getMessage(oFields);
+
+ var oData = {
+ action: wpsg_mod_addressvalidation.action,
+ nonce: wpsg_mod_addressvalidation.nonce,
+ type: oFields.type,
+ strasse: jQuery.trim(oStrasse.val() || ''),
+ nr: jQuery.trim(wpsg_mod_addressvalidation_getField(oFields, 'nr').val() || ''),
+ plz: jQuery.trim(oPlz.val() || ''),
+ ort: jQuery.trim(oOrt.val() || ''),
+ land: wpsg_mod_addressvalidation_getField(oFields, 'land').val() || ''
+ };
+
+ // Unvollständige Adressen nicht anfragen
+ if (oData.strasse.length < 3 || oData.plz.length < 3 || oData.ort.length < 2) {
+
+ oMessage.removeData('address').hide().empty();
+
+ return;
+
+ }
+
+ var strAddress = JSON.stringify([oData.strasse, oData.nr, oData.plz, oData.ort, oData.land]);
+
+ if (oMessage.data('address') === strAddress) return;
+
+ oMessage.data('address', strAddress);
+
+ jQuery.post(wpsg_mod_addressvalidation.ajaxurl, oData).done(function(response) {
+
+ // Inzwischen wurde die Adresse erneut geändert
+ if (oMessage.data('address') !== strAddress) return;
+
+ if (!response || !response.success || !response.data.message) {
+
+ oMessage.hide().empty();
+
+ return;
+
+ }
+
+ oMessage.empty().append(jQuery('<span></span>').text(response.data.message));
+
+ if (response.data.proposal) {
+
+ var oProposal = response.data.proposal;
+
+ oMessage.append(wpsg_mod_addressvalidation_renderProposal(oFields, oData, oProposal).append(' ', jQuery('<button type="button" class="button wpsg_mod_addressvalidation_apply"></button>').text(wpsg_mod_addressvalidation.labelApply).on('click', function() {
+
+ wpsg_mod_addressvalidation_apply(oFields, oProposal);
+
+ })));
+
+ }
+
+ oMessage.css('border-left', '4px solid ' + ((response.data.blocked)?'#DD3D36':'#F0AD4E')).show();
+
+ }).fail(function() {
+
+ // Ohne Antwort beim nächsten Ändern erneut versuchen, checkCheckout() prüft beim Absenden trotzdem
+ oMessage.removeData('address').hide().empty();
+
+ });
+
+} // function wpsg_mod_addressvalidation_check(oFields)
+
+/**
+ * Prüft eine bereits ausgefüllte Adresse direkt nach dem Laden, z.B. nach einem abgewiesenen Absenden
+ * Wartet, bis die Felder vorhanden sind (SmartCheckout baut sie erst mit Vue auf)
+ *
+ * @param oFields
+ * @param nTry bisherige Versuche
+ */
+function wpsg_mod_addressvalidation_checkInitial(oFields, nTry) {
+
+ if (!wpsg_mod_addressvalidation_getField(oFields, 'strasse').length) {
+
+ if (nTry < 20) {
+
+ window.setTimeout(function() {
+
+ wpsg_mod_addressvalidation_checkInitial(oFields, nTry + 1);
+
+ }, 250);
+
+ }
+
+ return;
+
+ }
+
+ wpsg_mod_addressvalidation_check(oFields);
+
+} // function wpsg_mod_addressvalidation_checkInitial(oFields, nTry)
+
+/**
+ * Früherer Aufruf aus checkout.phtml, bleibt für angepasste Templates im Theme erhalten
+ * Die Felder werden inzwischen automatisch gebunden, der übergebene API-Key wird nicht mehr verwendet
+ *
+ * @param data
+ */
+function validateAddressBind(data) {
+
+} // function validateAddressBind(data)
+
+jQuery(document).ready(function() {
+
+ if (typeof(wpsg_mod_addressvalidation) == 'undefined') return;
+
+ for (var i = 0; i < wpsg_mod_addressvalidation_fields.length; i ++) {
+
+ wpsg_mod_addressvalidation_bind(wpsg_mod_addressvalidation_fields[i]);
+ wpsg_mod_addressvalidation_checkInitial(wpsg_mod_addressvalidation_fields[i], 0);
+ }
+});
diff --git a/views/mods/mod_addressvalidation/settings_edit.phtml b/views/mods/mod_addressvalidation/settings_edit.phtml index db047cc..6ab97a8 100644 --- a/views/mods/mod_addressvalidation/settings_edit.phtml +++ b/views/mods/mod_addressvalidation/settings_edit.phtml @@ -2,11 +2,66 @@ /**
* Template für die Einstellungen des Moduls "Adressvalidation"
+ * @version 4.6.1
*/
?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_addressvalidation_apikey', __('API-Key', 'wpsg'), $this->get_option('wpsg_mod_addressvalidation_apikey'), array('help' => 'wpsg_mod_addressvalidation_apikey')); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_addressvalidation_apikey', __('API-Key', 'wpsg'), $this->get_option('wpsg_mod_addressvalidation_apikey'), ['help' => 'wpsg_mod_addressvalidation_apikey']); ?>
+<?php echo wpsg_drawForm_Select('wpsg_mod_addressvalidation_suspect', __('Verdächtige Adressen', 'wpsg'), $this->view['wpsg_mod_addressvalidation']['arSuspect'], $this->view['wpsg_mod_addressvalidation']['suspect'], ['hint' => __('Der Dienst meldet eine Adresse als verdächtig, wenn sie gefunden wurde, aber einzelne Angaben abweichen, z. B. ein früherer Gemeindename. Mit "Nur Hinweis" geht die Bestellung durch und der Kunde sieht die vorgeschlagene Schreibweise.', 'wpsg')]); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_addressvalidation_ratelimit', __('Anfragen je Besucher (10 Minuten)', 'wpsg'), $this->view['wpsg_mod_addressvalidation']['ratelimit'], ['help' => 'wpsg_mod_addressvalidation_ratelimit']); ?>
+<?php echo wpsg_drawForm_Input('wpsg_mod_addressvalidation_daylimit', __('Anfragen je Tag (ganzer Shop)', 'wpsg'), $this->view['wpsg_mod_addressvalidation']['daylimit'], ['help' => 'wpsg_mod_addressvalidation_daylimit']); ?>
+
+<?php echo wpsg_drawForm_TextStart(); ?>
+<button type="button" class="button" id="wpsg_mod_addressvalidation_test" data-url="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_addressvalidation&do=testApiKey&noheader=1'); ?>" data-nonce="<?php echo esc_attr(wp_create_nonce('wpsg-addressvalidation-testApiKey')); ?>" data-field="#<?php echo esc_attr(wpsg_drawForm_getID('wpsg_mod_addressvalidation_apikey')); ?>">
+ <?php echo esc_html__('API-Key testen', 'wpsg'); ?>
+</button>
+<p id="wpsg_mod_addressvalidation_test_result"></p>
+<p class="description"><?php echo esc_html__('Die Testanfrage verbraucht beim Dienst ein Guthaben.', 'wpsg'); ?></p>
+<?php echo wpsg_drawForm_TextEnd(__('Verbindungstest', 'wpsg'), ['noP' => true]); ?>
<a class="button-primary" id="button-google" target="popup" href="http://www.address-validator.net/address-online-verification-api.html" onclick="window.open('', 'popup', 'width=500;height=200,resizable=yes,menubar=yes')">
- <?php echo __('Schlüssel anfordern', 'wpsg'); ?>
-</a>
\ No newline at end of file + <?php echo esc_html__('Schlüssel anfordern', 'wpsg'); ?>
+</a>
+
+<script type="text/javascript">/* <![CDATA[ */
+
+ jQuery(document).ready(function() {
+
+ jQuery('#wpsg_mod_addressvalidation_test').on('click', function() {
+
+ var oButton = jQuery(this);
+ var oResult = jQuery('#wpsg_mod_addressvalidation_test_result');
+
+ oButton.prop('disabled', true);
+ oResult.removeClass('text-success text-danger').text('<?php echo esc_js(__('Prüfe API-Key …', 'wpsg')); ?>');
+
+ jQuery.post(oButton.data('url'), {
+ apikey: jQuery(oButton.data('field')).val(),
+ wpsg_nonce: oButton.data('nonce')
+ }).done(function(response) {
+
+ oResult.addClass((response.success)?'text-success':'text-danger').text(response.data.message);
+
+ }).fail(function(xhr) {
+
+ var strMessage = '<?php echo esc_js(__('Die Prüfung ist fehlgeschlagen.', 'wpsg')); ?>';
+
+ if (xhr.responseJSON && xhr.responseJSON.data && xhr.responseJSON.data.message) {
+
+ strMessage = xhr.responseJSON.data.message;
+
+ }
+
+ oResult.addClass('text-danger').text(strMessage);
+
+ }).always(function() {
+
+ oButton.prop('disabled', false);
+
+ });
+
+ });
+
+ });
+
+/* ]]> */</script>
\ No newline at end of file diff --git a/views/mods/mod_amazon/basket_inner_prebutton.phtml b/views/mods/mod_amazon/basket_inner_prebutton.phtml index 5a1afcf..f68de8c 100644 --- a/views/mods/mod_amazon/basket_inner_prebutton.phtml +++ b/views/mods/mod_amazon/basket_inner_prebutton.phtml @@ -1,139 +1,17 @@ <?php
- /**
- * Template für die Integration von "Bezahlen mit Amazon" in den Warenkorb
- */
+ /**
+ * Button "Amazon Pay" im Warenkorb
+ *
+ * Den Button zeichnet checkout.js von Amazon in das Element #AmazonPayButton, die Konfiguration bindet
+ * wpsg_mod_amazon::basket_inner_prebutton() ein.
+ * @version 4.6.1
+ */
-?>
-
-<div id="LoginWithAmazon"></div>
-
-<div class="wpsg_amazonhandler" id="addressBookWidgetDiv"></div>
-<div class="wpsg_amazonhandler" id="walletWidgetDiv"></div>
-
-<style type="text/css">
-
- #addressBookWidgetDiv{ width:auto; height:228px; margin:15px 0; }
- #walletWidgetDiv { width:100%; height:228px; margin:15px 0; }
- #walletWidgetDiv iframe,
- #addressBookWidgetDiv iframe { max-width:100%; border:0px !important; }
- #LoginWithAmazon { float:right; }
- .wpsg_mod_paypalapi_button_wrap { float:left; }
-
-</style>
-
-<input type="hidden" name="amazon[OrderReference]" id="wpsg_mod_amazon_OrderReference" value="" />
-
-<div class="wpsg_clear"></div>
-
-<script>
-
- var authRequest;
-
- OffAmazonPayments.Button('LoginWithAmazon', '<?php echo $this->get_option('wpsg_mod_amazon_seller_id'); ?>', {
-
- type: "PwA",
- color: "Gold",
- size: "small",
- language: "de-DE",
-
- authorization: function() {
-
- loginOptions = {
- scope: "profile payments:widget payments:shipping_address payments:billing_address",
- popup: true
- };
-
- authRequest = amazon.Login.authorize(loginOptions, "<?php echo $this->view['wpsg_mod_amazon']['redirectURL']; ?>");
-
- },
-
- onError: function(error) {
-
- //console.log("Login: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
- alert("Login: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
-
- }
-
- } );
-
- <?php if (wpsg_isSizedString($this->view['wpsg_mod_amazon']['amazon_last_authorization_reference_id']) && $this->view['basket']['checkout']['payment'] == 3140) { ?>
-
- jQuery(document).ready(function() {
-
- jQuery('.wpsg_checkoutbutton').hide();
- jQuery('.wpsg_amazonhandler').show();
- jQuery('#LoginWithAmazon').hide();
-
- new OffAmazonPayments.Widgets.AddressBook( {
-
- sellerId: '<?php echo $this->get_option('wpsg_mod_amazon_seller_id'); ?>',
-
- onOrderReferenceCreate: function(orderReference) {
-
- var oID = orderReference.getAmazonOrderReferenceId();
+ if (!defined('ABSPATH')) exit;
- jQuery('#wpsg_mod_amazon_OrderReference').val(oID);
- jQuery('.wpsg_checkoutbutton').show();
-
- },
-
- onAddressSelect: function(orderReference) {
-
- // Replace the following code with the action that you want to perform
- // after the address is selected.
- // The amazonOrderReferenceId can be used to retrieve
- // the address details by calling the GetOrderReferenceDetails
- // operation. If rendering the AddressBook and Wallet widgets on the
- // same page, you should wait for this event before you render the
- // Wallet widget for the first time.
- // The Wallet widget will re-render itself on all subsequent
- // onAddressSelect events, without any action from you. It is not
- // recommended that you explicitly refresh it.
-
- new OffAmazonPayments.Widgets.Wallet({
-
- sellerId: '<?php echo $this->get_option('wpsg_mod_amazon_seller_id'); ?>',
-
- onPaymentSelect: function(orderReference) {
-
- // Replace this code with the action that you want to perform
- // after the payment method is selected.
-
- },
-
- design: {
-
- designMode: 'responsive'
-
- },
-
- onError: function(error) {
-
- alert("Wallet: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
-
- }
-
- }).bind("walletWidgetDiv");
-
- },
-
- design: {
-
- designMode: 'responsive'
-
- },
-
- onError: function(error) {
-
- alert("Payment: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
-
- }
-
- } ).bind("addressBookWidgetDiv");
-
- });
-
- <?php } ?>
+?>
-</script>
\ No newline at end of file +<div id="AmazonPayButton_wrap">
+ <div id="AmazonPayButton"></div>
+</div>
diff --git a/views/mods/mod_amazon/gfx/black/logo_black_100x25.png b/views/mods/mod_amazon/gfx/black/logo_black_100x25.png Binary files differdeleted file mode 100644 index 47b9f60..0000000 --- a/views/mods/mod_amazon/gfx/black/logo_black_100x25.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/black/logo_black_130x45.png b/views/mods/mod_amazon/gfx/black/logo_black_130x45.png Binary files differdeleted file mode 100644 index ae6a6c8..0000000 --- a/views/mods/mod_amazon/gfx/black/logo_black_130x45.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/black/logo_black_296x60.png b/views/mods/mod_amazon/gfx/black/logo_black_296x60.png Binary files differdeleted file mode 100644 index 6e31c55..0000000 --- a/views/mods/mod_amazon/gfx/black/logo_black_296x60.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/gold/logo_gold_100x25.png b/views/mods/mod_amazon/gfx/gold/logo_gold_100x25.png Binary files differdeleted file mode 100644 index bb16b5b..0000000 --- a/views/mods/mod_amazon/gfx/gold/logo_gold_100x25.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/gold/logo_gold_130x45.png b/views/mods/mod_amazon/gfx/gold/logo_gold_130x45.png Binary files differdeleted file mode 100644 index 3634935..0000000 --- a/views/mods/mod_amazon/gfx/gold/logo_gold_130x45.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/gold/logo_gold_296x60.png b/views/mods/mod_amazon/gfx/gold/logo_gold_296x60.png Binary files differdeleted file mode 100644 index b9a2987..0000000 --- a/views/mods/mod_amazon/gfx/gold/logo_gold_296x60.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/grey/logo_grey_100x25.png b/views/mods/mod_amazon/gfx/grey/logo_grey_100x25.png Binary files differdeleted file mode 100644 index 8f751d6..0000000 --- a/views/mods/mod_amazon/gfx/grey/logo_grey_100x25.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/grey/logo_grey_130x45.png b/views/mods/mod_amazon/gfx/grey/logo_grey_130x45.png Binary files differdeleted file mode 100644 index 8a34705..0000000 --- a/views/mods/mod_amazon/gfx/grey/logo_grey_130x45.png +++ /dev/null diff --git a/views/mods/mod_amazon/gfx/grey/logo_grey_296x60.png b/views/mods/mod_amazon/gfx/grey/logo_grey_296x60.png Binary files differdeleted file mode 100644 index edd225d..0000000 --- a/views/mods/mod_amazon/gfx/grey/logo_grey_296x60.png +++ /dev/null diff --git a/views/mods/mod_amazon/order_done.phtml b/views/mods/mod_amazon/order_done.phtml index 80665c9..9aedbda 100644 --- a/views/mods/mod_amazon/order_done.phtml +++ b/views/mods/mod_amazon/order_done.phtml @@ -1,122 +1,74 @@ <?php
/**
- * Integration der Zahlung über Amazon in den Bestellabschluss
+ * Wird nach dem Bestellabschluss mit der Zahlungsart AmazonPay angezeigt
+ *
+ * Zustände (wpsg_mod_amazon::order_done()):
+ * - redirect: Der Kunde hat sich im Warenkorb bei Amazon angemeldet und bestätigt die Zahlung über den Link
+ * - button: Button "Amazon Pay", den checkout.js in #wpsg_mod_amazon_button zeichnet
+ * - pending: Die Zahlung wurde bestätigt, der Betrag wird noch eingezogen
+ * - done: Die Zahlung ist verbucht
+ * - error: Der Button konnte nicht erzeugt werden
+ *
+ * Mit "autostart" startet die Zahlung nach einer Sekunde von selbst (Weiterleitung bzw. amazon.Pay.initCheckout(),
+ * eingebunden von wpsg_mod_amazon::enqueueButton()); Link und Button bleiben als Rückfall stehen.
+ * @version 4.6.1
*/
+ if (!defined('ABSPATH')) exit;
+
+ $arView = $this->view['wpsg_mod_amazon'];
+ $state = (string)($arView['state']??'');
+ $bAutostart = (($arView['autostart']??false) === true);
+
?>
-<?php if ($this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE) { ?>
+<?php if ($state === 'redirect') { ?>
-<p><?php echo __('Zahlung wurde erfolgreich mit AmazonPay abgewickelt.', 'wpsg'); ?></p>
+ <p><?php echo esc_html__('Bitte bestätigen Sie die Zahlung bei Amazon Pay.', 'wpsg'); ?></p>
-<?php } else if ($this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE_PAST) { ?>
+ <p>
+ <a class="button" href="<?php echo esc_url($arView['payURL']); ?>"><?php echo esc_html__('Jetzt mit AmazonPay bezahlen', 'wpsg'); ?></a>
+ </p>
-<p><?php echo __('Zahlung wurde bereits erfolgreich mit AmazonPay abgewickelt.', 'wpsg'); ?></p>
+ <?php if ($bAutostart) { ?>
-<?php } else if ($this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE_START || $this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE_GO) { ?>
+ <script>
-<p><?php echo __('Zahlung mittels der folgenden Zahlungsoption abschließen','wpsg'); ?></p>
+ window.setTimeout(function() {
-<div id="PayWithAmazon" style="<?php echo (($this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE_GO)?'display:none':''); ?>"></div>
+ location.href = <?php echo wp_json_encode($arView['payURL']); ?>;
-<script type="text/javascript">
-
- var authRequest;
+ }, 1000);
- OffAmazonPayments.Button('PayWithAmazon', '<?php echo $this->get_option('wpsg_mod_amazon_seller_id'); ?>', {
-
- type: "PwA",
- color: "Gold",
- size: "small",
- language: "de-DE",
+ </script>
- authorization: function() {
-
- loginOptions = {
- scope: "profile payments:widget payments:shipping_address payments:billing_address",
- popup: true
- };
-
- authRequest = amazon.Login.authorize(loginOptions, "<?php echo $this->view['wpsg_mod_amazon']['redirectURL']; ?>");
-
- },
+ <?php } ?>
- onError: function(error) {
-
- console.log("Login: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
-
- }
-
- } );
+<?php } else if ($state === 'button') { ?>
- var autoRun = setInterval(function(){
+ <?php if ($bAutostart) { ?>
- if (jQuery('#PayWithAmazon img').length > 0) {
+ <p><?php echo esc_html__('Sie werden gleich zu Amazon Pay weitergeleitet. Falls nicht, klicken Sie bitte auf den Button.', 'wpsg'); ?></p>
- //setTimeout(function(){ jQuery('#PayWithAmazon img').click(); }, 1000);
- clearInterval(autoRun);
-
- }
+ <?php } else { ?>
- }, 100);
+ <p><?php echo esc_html__('Um den Betrag mit AmazonPay zu bezahlen, klicken Sie bitte auf den Button.', 'wpsg'); ?></p>
-</script>
-
-<?php } ?>
+ <?php } ?>
+
+ <div id="wpsg_mod_amazon_button" style="max-width:300px;"></div>
+
+<?php } else if ($state === 'pending') { ?>
+
+ <p><?php echo esc_html__('Die Zahlung wurde bei Amazon Pay bestätigt und wird gerade abgeschlossen. Sie erhalten eine Nachricht, sobald die Zahlung eingegangen ist.', 'wpsg'); ?></p>
-<?php if ($this->view['wpsg_mod_amazon']['state'] === wpsg_mod_amazon::ORDER_DONE_GO) { ?>
-
-<form id="wpsg_mod_amazon_paymentForm" method="POST" action="<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon', 'return'); ?>">
-
- <input type="hidden" name="order_id" value="<?php echo $_REQUEST['order_id']; ?>" />
- <input type="hidden" name="wpsg_done" value="<?php echo $_REQUEST['wpsg_done']; ?>" />
- <input type="hidden" name="amazon[OrderReference]" id="wpsg_mod_amazon_OrderReference" value="" />
-
- <div id="walletWidgetDiv"></div><br />
-
- <input type="submit" class="wpsg_button" name="submit" value="<?php echo __('Zahlung durchführen', 'wpsg'); ?>" id="wpsg_mod_amazon_doPayment" style="display:none;" />
- <div class="wpsg_clear"></div>
-
-</form>
-
-<script>
-
- jQuery('#walletWidgetDiv').show();
-
- new OffAmazonPayments.Widgets.Wallet( {
-
- sellerId: '<?php echo $this->get_option('wpsg_mod_amazon_seller_id'); ?>',
-
- onOrderReferenceCreate: function(orderReference) {
-
- jQuery('#wpsg_mod_amazon_OrderReference').val(orderReference.getAmazonOrderReferenceId());
- jQuery('#wpsg_mod_amazon_doPayment').show();
-
- },
-
- onPaymentSelect: function(orderReference) {
-
- // Replace this code with the action that you want to perform
- // after the payment method is selected.
-
- },
-
- design: {
-
- designMode: 'responsive'
-
- },
-
- onError: function(error) {
-
- jQuery('#wpsg_mod_amazon_paymentForm').hide();
- jQuery('#PayWithAmazon').show();
-
-
- }
-
- } ).bind("walletWidgetDiv");
-
-</script>
-<?php } ?>
\ No newline at end of file +<?php } else if ($state === 'done') { ?>
+
+ <p><?php echo esc_html__('Die Zahlung wurde bereits mit AmazonPay abgeschlossen.', 'wpsg'); ?></p>
+
+<?php } else if ($state === 'error') { ?>
+
+ <p><?php echo esc_html__('Die Zahlung mit AmazonPay ist derzeit nicht möglich. Bitte wenden Sie sich an den Shopbetreiber.', 'wpsg'); ?></p>
+
+<?php } ?>
diff --git a/views/mods/mod_amazon/order_view_afterpayment.phtml b/views/mods/mod_amazon/order_view_afterpayment.phtml index 5033df6..043edad 100644 --- a/views/mods/mod_amazon/order_view_afterpayment.phtml +++ b/views/mods/mod_amazon/order_view_afterpayment.phtml @@ -1,24 +1,93 @@ <?php
/**
- * Template für die Integration der Amazon Zahlungsart in die Bestellverwaltung
+ * Template für die Integration der Zahlungsart AmazonPay in die Bestellverwaltung
+ * @version 4.6.1
*/
- /** @var wpsg_order $oOrder */
- $oOrder = $this->view['oOrder'];
+ if (!defined('ABSPATH')) exit;
- $amazon_capture_id = $oOrder->getMeta('amazon_capture_id');
- $amazon_refund_id = $oOrder->getMeta('amazon_refund_id');
+ $arView = $this->view['wpsg_mod_amazon'];
+ $oOrder = $arView['oOrder'];
+
+ $strState = (string)$oOrder->getMeta(wpsg_mod_amazon::META_STATE);
+ $strChargeId = (string)$oOrder->getMeta(wpsg_mod_amazon::META_CHARGE);
+ $strRefundId = (string)$oOrder->getMeta(wpsg_mod_amazon::META_REFUND);
+ $strRefundState = (string)$oOrder->getMeta(wpsg_mod_amazon::META_REFUND_STATE);
+
+ // Farbe des Status: eingezogen bzw. erstattet grün, offen gelb, abgelehnt rot
+ $arStateClass = [
+ 'Captured' => 'success',
+ 'Completed' => 'success',
+ 'Refunded' => 'success',
+ 'AuthorizationInitiated' => 'warning',
+ 'Authorized' => 'warning',
+ 'CaptureInitiated' => 'warning',
+ 'RefundInitiated' => 'warning',
+ 'Open' => 'warning',
+ 'Declined' => 'danger',
+ 'Canceled' => 'danger'
+ ];
+
+ $strBadge = '<span class="label label-%s" style="font-size:12px;">%s</span>';
+
+ $strRefreshURL = wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'edit_id' => $oOrder->getId(), 'do' => 'refresh', 'mod' => 'wpsg_mod_amazon'], ['noheader' => '1']);
+ $strRefundURL = wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'edit_id' => $oOrder->getId(), 'do' => 'refund', 'mod' => 'wpsg_mod_amazon'], ['noheader' => '1']);
?>
-<?php if (wpsg_isSizedString($amazon_refund_id)) { ?>
+<?php if ($arView['bLegacy']) { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Schnittstelle', 'wpsg'), esc_html__('Frühere Anbindung (Login and Pay / MWS), Erstattungen bitte in der Seller Central', 'wpsg')); ?>
+
+ <?php foreach (['amazon_order_reference_id' => __('Amazon-Referenznummer', 'wpsg'), 'amazon_capture_id' => __('Capture ID', 'wpsg'), 'amazon_refund_id' => __('Refund ID', 'wpsg')] as $meta_key => $meta_label) { ?>
+
+ <?php if ((string)$oOrder->getMeta($meta_key) !== '') { ?>
+
+ <?php echo wpsg_drawForm_Text($meta_label, '<code>'.esc_html($oOrder->getMeta($meta_key)).'</code>'); ?>
+
+ <?php } ?>
+
+ <?php } ?>
+
+<?php } else if ($strChargeId !== '' || (string)$oOrder->getMeta(wpsg_mod_amazon::META_SESSION) !== '') { ?>
+
+ <?php
+
+ $strStateHTML = sprintf($strBadge, esc_attr($arStateClass[$strState]??'default'), (($strState !== '')?esc_html($strState):esc_html__('Unbekannt', 'wpsg')));
+ $strStateHTML .= ' <a class="btn btn-default btn-xs" href="'.esc_url($strRefreshURL).'"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> '.esc_html__('Status Aktualisieren', 'wpsg').'</a>';
+
+ if ($arView['bRefundable']) {
+
+ $strStateHTML .= ' <a class="btn btn-default btn-xs" href="'.esc_url($strRefundURL).'" onclick="return confirm('.esc_attr(wp_json_encode(__('Soll der Betrag wirklich über Amazon Pay erstattet werden?', 'wpsg'))).');"><span class="glyphicon glyphicon-share-alt" aria-hidden="true"></span> '.esc_html__('Erstatten', 'wpsg').'</a>';
+
+ }
+
+ ?>
+
+ <?php echo wpsg_drawForm_Text(__('AmazonPay Status', 'wpsg'), $strStateHTML); ?>
+
+ <?php if ((string)$oOrder->getMeta(wpsg_mod_amazon::META_ENV) === wpsg_mod_amazon::ENV_SANDBOX) { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Umgebung', 'wpsg'), sprintf($strBadge, 'warning', esc_html__('Sandbox (Testbetrieb)', 'wpsg'))); ?>
+
+ <?php } ?>
+
+ <?php foreach ([wpsg_mod_amazon::META_CHARGE_PERMISSION => __('Amazon-Referenznummer', 'wpsg'), wpsg_mod_amazon::META_CHARGE => __('Charge ID', 'wpsg'), wpsg_mod_amazon::META_SESSION => __('Checkout Session ID', 'wpsg')] as $meta_key => $meta_label) { ?>
+
+ <?php if ((string)$oOrder->getMeta($meta_key) !== '') { ?>
+
+ <?php echo wpsg_drawForm_Text($meta_label, '<code>'.esc_html($oOrder->getMeta($meta_key)).'</code>'); ?>
+
+ <?php } ?>
- <?php echo wpsg_drawForm_Input(false, __('Refund ID', 'wpsg'), $amazon_refund_id, ['readonly' => true]); ?>
+ <?php } ?>
-<?php } else if (wpsg_isSizedString($amazon_capture_id)) { ?>
+ <?php if ($strRefundId !== '') { ?>
- <?php echo wpsg_drawForm_Input(false, __('Capture ID', 'wpsg'), $amazon_capture_id, ['readonly' => true]); ?>
+ <?php echo wpsg_drawForm_Text(__('Refund ID', 'wpsg'), '<code>'.esc_html($strRefundId).'</code>'); ?>
+ <?php echo wpsg_drawForm_Text(__('Erstattungsstatus', 'wpsg'), sprintf($strBadge, esc_attr($arStateClass[$strRefundState]??'default'), (($strRefundState !== '')?esc_html($strRefundState):esc_html__('Unbekannt', 'wpsg')))); ?>
-<?php }
+ <?php } ?>
+<?php } ?>
diff --git a/views/mods/mod_amazon/settings_edit.phtml b/views/mods/mod_amazon/settings_edit.phtml index 827c68f..790d3cb 100644 --- a/views/mods/mod_amazon/settings_edit.phtml +++ b/views/mods/mod_amazon/settings_edit.phtml @@ -1,32 +1,150 @@ <?php
/**
- * Einstellungen des Moduls "AmazonPay"
+ * Templatedatei für die Einstellungen des Moduls AmazonPay (Amazon Pay Checkout v2)
+ *
+ * Live-System und Sandbox haben je eigene Zugangsdaten, der Umschalter "Aktive Umgebung" legt fest, welche der
+ * Shop für neue Zahlungen verwendet.
+ * @version 4.6.1
*/
+ if (!defined('ABSPATH')) exit;
+
+ $arView = $this->view['wpsg_mod_amazon'];
+ $bSandbox = (bool)$arView['bSandbox'];
+
+ $arStornoStatus = (array)$this->get_option('wpsg_mod_amazon_stornostate');
+
+ // Anmeldung für Amazon-Pay-Händler, führt direkt in den Amazon-Pay-Bereich der Seller Central
+ $strSellerCentralURL = 'https://pay.amazon.de/signin';
+
+ $strBadge = '<span class="label label-%s" style="font-size:12px;">%s</span>';
+
+ $arEnvLabel = [
+ wpsg_mod_amazon::ENV_LIVE => __('Zugangsdaten Live-System', 'wpsg'),
+ wpsg_mod_amazon::ENV_SANDBOX => __('Zugangsdaten Sandbox (Testbetrieb)', 'wpsg')
+ ];
+
+ if ($bSandbox) {
+
+ $strMode = sprintf($strBadge, 'warning', esc_html__('Sandbox (Testbetrieb)', 'wpsg'));
+
+ } else {
+
+ $strMode = sprintf($strBadge, 'success', esc_html__('Live', 'wpsg'));
+
+ }
+
?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_seller_id', __('Seller ID / Verkäufer-ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_seller_id'), array('help' => 'wpsg_mod_amazon_seller_id')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_mws_access_key_id', __('Access Key ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_mws_access_key_id'), array('help' => 'wpsg_mod_amazon_mws_access_key_id')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_mws_access_key', __('Secret Access Key', 'wpsg'), $this->get_option('wpsg_mod_amazon_mws_access_key'), array('help' => 'wpsg_mod_amazon_mws_access_key')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_lwa_client_id', __('Login with Amazon Client ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_lwa_client_id'), array('help' => 'wpsg_mod_amazon_lwa_client_id')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_lwa_client_secret', __('Login with Amazon Client Secret', 'wpsg'), $this->get_option('wpsg_mod_amazon_lwa_client_secret'), array('help' => 'wpsg_mod_amazon_lwa_client_secret')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_sandbox', __('Sandbox Modus', 'wpsg'), $this->get_option('wpsg_mod_amazon_sandbox'), array('help' => 'wpsg_mod_amazon_sandbox')); ?>
+<?php if ($arView['bLegacyCredentials']) { ?>
+
+ <div class="wpsg_hinweis">
+ <?php echo esc_html__('AmazonPay arbeitet jetzt mit Amazon Pay Checkout v2. Die Zugangsdaten der früheren Anbindung (MWS Access Key, Login with Amazon) werden nicht mehr verwendet. Erzeugen Sie in der Seller Central unter "Integration → Integration Central" einen API-Schlüssel und tragen Sie Client-ID/Store-ID, Public Key ID und den privaten Schlüssel unten ein. Bis dahin wird AmazonPay im Shop nicht angeboten.', 'wpsg'); ?>
+ </div>
+
+<?php } ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Umgebung', 'wpsg'), 'wpsg_mod_amazon_environment'); ?>
+
+ <?php echo wpsg_drawForm_Select('wpsg_mod_amazon_sandbox', __('Aktive Umgebung', 'wpsg'), ['0' => __('Live-System', 'wpsg'), '1' => __('Sandbox (Testbetrieb)', 'wpsg')], (($bSandbox)?'1':'0'), ['help' => 'wpsg_mod_amazon_sandbox', 'hint' => esc_html__('Neue Zahlungen laufen über die Zugangsdaten der aktiven Umgebung. In der Sandbox werden keine echten Zahlungen ausgeführt. Bestehende Zahlungen fragt der Shop weiterhin in der Umgebung ab, in der sie angelegt wurden.', 'wpsg')]); ?>
+ <?php echo wpsg_drawForm_Text(__('Neue Zahlungen über', 'wpsg'), $strMode); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php foreach ($arView['arEnv'] as $env => $arEnv) { ?>
+
+ <?php
+
+ $arStatus = (array)$arEnv['arStatus'];
+ $arFields = $arEnv['arFields'];
+ $bActive = ($env === (($bSandbox)?wpsg_mod_amazon::ENV_SANDBOX:wpsg_mod_amazon::ENV_LIVE));
+
+ if (!$arEnv['bConfigured']) {
+
+ $strConnection = sprintf($strBadge, 'default', esc_html__('Keine vollständigen Zugangsdaten hinterlegt', 'wpsg'));
+
+ } else if (!isset($arStatus['time'])) {
+
+ $strConnection = sprintf($strBadge, 'default', esc_html__('Noch nicht geprüft, bitte speichern', 'wpsg'));
+
+ } else if (($arStatus['connected']??false) === true) {
+
+ $strConnection = sprintf($strBadge, 'success', esc_html__('Verbindung erfolgreich', 'wpsg'));
+
+ } else {
+
+ $strConnection = sprintf($strBadge, 'danger', esc_html__('Anmeldung fehlgeschlagen', 'wpsg'));
+
+ if ((string)($arStatus['message']??'') !== '') $strConnection .= '<br /><small class="text-danger">'.esc_html($arStatus['message']).'</small>';
+
+ }
+
+ if ($bActive) $strConnection .= ' '.sprintf($strBadge, 'info', esc_html__('aktiv', 'wpsg'));
+
+ $strKey = sprintf($strBadge, (($arEnv['bKey'])?'success':'danger'), (($arEnv['bKey'])?esc_html__('Hinterlegt', 'wpsg'):esc_html__('Fehlt', 'wpsg')));
+
+ ?>
+
+ <?php wpsg_drawForm_AdminboxStart($arEnvLabel[$env], 'wpsg_mod_amazon_credentials_'.$env); ?>
+
+ <?php echo wpsg_drawForm_Text(__('Verbindung', 'wpsg'), $strConnection); ?>
+ <?php echo wpsg_drawForm_Text(__('Privater Schlüssel', 'wpsg'), $strKey); ?>
+
+ <?php if (isset($arStatus['time'])) { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Zuletzt geprüft', 'wpsg'), esc_html(wpsg_formatTimestamp($arStatus['time']))); ?>
+
+ <?php } ?>
+
+ <?php if ($arEnv['bKeyMismatch']) { ?>
+
+ <div class="wpsg_hinweis"><?php echo esc_html((($env === wpsg_mod_amazon::ENV_SANDBOX)?__('Die Public Key ID beginnt mit "LIVE-" und gehört zum Live-System. Amazon nimmt sie in der Sandbox nicht an.', 'wpsg'):__('Die Public Key ID beginnt mit "SANDBOX-" und gehört zur Sandbox. Amazon nimmt sie im Live-System nicht an.', 'wpsg'))); ?></div>
+
+ <?php } ?>
+
+ <?php echo wpsg_drawForm_Input($arFields['seller_id']['name'], __('Händler-ID (Merchant ID)', 'wpsg'), $arFields['seller_id']['value'], ['help' => 'wpsg_mod_amazon_seller_id']); ?>
+ <?php echo wpsg_drawForm_Input($arFields['store_id']['name'], __('Client-ID/Store-ID', 'wpsg'), $arFields['store_id']['value'], ['help' => 'wpsg_mod_amazon_store_id', 'hint' => esc_html__('Beginnt mit "amzn1.application-oa2-client.". Das "Client Secret" daneben wird nicht benötigt.', 'wpsg')]); ?>
+ <?php echo wpsg_drawForm_Input($arFields['public_key_id']['name'], __('Public Key ID', 'wpsg'), $arFields['public_key_id']['value'], ['help' => 'wpsg_mod_amazon_public_key_id', 'hint' => wpsg_translate(__('Händler-ID, Client-ID/Store-ID und API-Schlüssel finden bzw. erzeugen Sie in der <a target="_blank" href="#1#">Seller Central</a> unter "Integration → Integration Central".', 'wpsg'), esc_url($strSellerCentralURL))]); ?>
+ <?php echo wpsg_drawForm_Upload($arFields['private_key']['name'], __('Privater Schlüssel (.pem Datei)', 'wpsg'), false, '50', '100000', ['accept' => '.pem', 'help' => 'wpsg_mod_amazon_private_key']); ?>
+
+ <?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php } ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Zahlungsart im Shop', 'wpsg'), 'wpsg_mod_amazon_payment'); ?>
+
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_aktiv', __('Zahlungsart für neue Bestellungen aktiv', 'wpsg'), $this->get_option('wpsg_mod_amazon_aktiv'), ['help' => 'wpsg_shippay_activ']); ?>
+ <?php echo wpsg_drawForm_Input('wpsg_mod_amazon_name', __('Name der Zahlungsart', 'wpsg'), $this->get_option('wpsg_mod_amazon_name'), ['help' => 'wpsg_mod_amazon_name']); ?>
+ <?php echo wpsg_drawForm_Textarea('wpsg_mod_amazon_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_amazon_hint'), ['help' => 'wpsg_shippay_hint']); ?>
+ <?php echo wpsg_drawForm_Input('wpsg_mod_amazon_gebuehr', __('Gebühr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_amazon_gebuehr'), true), ['help' => 'wpsg_shippay_gebuehr', 'unit' => $this->get_option('wpsg_currency').' / %']); ?>
+ <?php echo wpsg_drawForm_Select('wpsg_mod_amazon_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_amazon_mwst'), ['help' => 'wpsg_mod_amazon_mwst']); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Zahlungsablauf', 'wpsg'), 'wpsg_mod_amazon_process'); ?>
+
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_basket', __('Button im Warenkorb anzeigen', 'wpsg'), $this->get_option('wpsg_mod_amazon_basket'), ['help' => 'wpsg_mod_amazon_basket']); ?>
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_autostart', __('Zahlung nach dem Bestellabschluss direkt starten', 'wpsg'), $this->get_option('wpsg_mod_amazon_autostart'), ['help' => 'wpsg_mod_amazon_autostart']); ?>
+ <?php echo wpsg_drawForm_Select('wpsg_mod_amazon_buttoncolor', __('Farbe des Buttons', 'wpsg'), $arView['arButtonColors'], $this->get_option('wpsg_mod_amazon_buttoncolor'), ['help' => 'wpsg_mod_amazon_buttoncolor']); ?>
+ <?php echo wpsg_drawForm_Input('wpsg_mod_amazon_subject', __('Betreff (Auf Abrechnungen für Verkäufer sichtbar)', 'wpsg'), $this->get_option('wpsg_mod_amazon_subject'), ['help' => 'wpsg_mod_amazon_subject']); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Zahlungsbenachrichtigungen (IPN)', 'wpsg'), 'wpsg_mod_amazon_ipn'); ?>
+
+ <?php echo wpsg_drawForm_Input('', __('IPN URL', 'wpsg'), $arView['ipnURL'], ['readonly' => true, 'help' => 'wpsg_mod_amazon_ipn_url', 'hint' => esc_html__('Tragen Sie diese URL in der Seller Central unter "Integration → Integration Central → IPN-Einstellungen" ein. Amazon meldet darüber Zahlungen, die erst später eingezogen werden, und den Stand von Erstattungen. Die URL muss per HTTPS von außen erreichbar sein.', 'wpsg')]); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
-<br />
+<?php wpsg_drawForm_AdminboxStart(__('Erstattung bei Statuswechsel', 'wpsg'), 'wpsg_mod_amazon_storno'); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_aktiv', __('Zahlungsart für neue Bestellungen aktiv', 'wpsg'), $this->get_option('wpsg_mod_amazon_aktiv')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_name', __('Name der Zahlungsart', 'wpsg'), $this->get_option('wpsg_mod_amazon_name'), array('help' => 'wpsg_mod_amazon_name')); ?>
-<?php echo wpsg_drawForm_Textarea('wpsg_mod_amazon_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_amazon_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_subject', __('Betreff (Auf Abrechnungen für Verkäufer sichtbar)', 'wpsg'), $this->get_option('wpsg_mod_amazon_subject'), array('help' => 'wpsg_mod_amazon_subject')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_basket', __('Button in Warenkorb integrieren', 'wpsg'), $this->get_option('wpsg_mod_amazon_basket'), array('help' => 'wpsg_mod_amazon_basket')); ?>
+ <p class="text-muted"><?php echo esc_html__('Wechselt eine mit AmazonPay bezahlte Bestellung in einen der markierten Status, wird der Betrag automatisch über Amazon Pay erstattet.', 'wpsg'); ?></p>
-<br />
+ <?php foreach ($this->arStatus as $status_id => $status_label) { ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_gebuehr', __('Gebühr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_amazon_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_amazon_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_amazon_mwst'), array('help' => 'wpsg_mod_amazon_mwst')); ?>
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_stornostate['.$status_id.']', esc_html($status_label), ($arStornoStatus[$status_id]??'0')); ?>
-<br />
+ <?php } ?>
-<?php echo wpsg_drawForm_Input('', __('Händler URL', 'wpsg'), $this->view['ipnURL'], array('readonly' => true)); ?>
-<?php echo wpsg_drawForm_Input('', __('JavaScript Origin', 'wpsg'), $this->view['jsOrigin'], array('readonly' => true)); ?>
\ No newline at end of file +<?php wpsg_drawForm_AdminboxEnd(); ?>
diff --git a/views/mods/mod_amazon_v2/basket_inner_prebutton.phtml b/views/mods/mod_amazon_v2/basket_inner_prebutton.phtml deleted file mode 100644 index e65c569..0000000 --- a/views/mods/mod_amazon_v2/basket_inner_prebutton.phtml +++ /dev/null @@ -1,44 +0,0 @@ -<?php
-
- /**
- * Template für die Integration von "Bezahlen mit Amazon" in den Warenkorb
- */
-
- $view = $this->view['wpsg_mod_amazon'];
-
- // https://amazonpaycheckoutintegrationguide.s3.amazonaws.com/amazon-pay-checkout/introduction.html
-
-?>
-
-<?php if ($this->get_option('wpsg_mod_amazon_v2_login') === '1') { ?>
-
- <?php $this->render(WPSG_PATH_VIEW.'/mods/mod_amazon_v2/basket_inner_prebutton_widget.phtml'); ?>
-
-<?php } else { ?>
-
- <script src="https://static-eu.payments-amazon.com/checkout.js"></script>
-
- <div id="AmazonPayButton_wrap">
- <div id="AmazonPayButton"></div>
- </div>
-
- <script>
-
- amazon.Pay.renderButton('#AmazonPayButton', {
- merchantId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>',
- ledgerCurrency: 'EUR',
- sandbox: <?php echo (($this->get_option('wpsg_mod_amazon_v2_sandbox') === '1')?'true':'false'); ?>,
- checkoutLanguage: 'de_DE',
- productType: 'PayAndShip',
- placement: 'Cart',
- buttonColor: 'Gold',
- createCheckoutSessionConfig: {
- payloadJSON: '<?php echo $view['payload']; ?>',
- signature: '<?php echo $view['signature']; ?>',
- publicKeyId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_public_key_id'); ?>'
- }
- });
-
- </script>
-
-<?php } ?>
diff --git a/views/mods/mod_amazon_v2/basket_inner_prebutton_widget.phtml b/views/mods/mod_amazon_v2/basket_inner_prebutton_widget.phtml deleted file mode 100644 index 85359cf..0000000 --- a/views/mods/mod_amazon_v2/basket_inner_prebutton_widget.phtml +++ /dev/null @@ -1,133 +0,0 @@ -<?php
-
- /**
- *
- */
-
-?>
-
-<script async="async" src="https://static-eu.payments-amazon.com/OffAmazonPayments/de/sandbox/lpa/js/Widgets.js"></script>
-
-<div id="AmazonLoginButton_wrap">
- <div id="AmazonLoginButton"></div>
-</div>
-
-<div id="addressBookWidgetDiv"></div>
-<div id="walletWidgetDiv"></div>
-
-<input type="text" name="amazon[OrderReference]" id="wpsg_mod_amazon_OrderReference" value="" />
-
-<script>
-
- window.onAmazonLoginReady = function() {
-
- amazon.Login.setClientId('<?php echo $this->get_option('wpsg_mod_amazon_v2_store_id'); ?>');
-
- };
-
- window.onAmazonPaymentsReady = function() {
-
- var authRequest;
-
- OffAmazonPayments.Button('AmazonLoginButton', '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>', {
-
- type: 'PwA',
- color: 'Gold',
- size: 'small',
- language: 'de-DE',
-
- authorization: function() {
-
- loginOptions = {
- scope: "profile payments:widget payments:shipping_address payments:billing_address",
- popup: true
- };
-
- authRequest = amazon.Login.authorize (loginOptions, '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon_v2', 'login', [], true) ?>');
-
- }
- });
-
- <?php if (isset($_SESSION['wpsg_mod_amazon_v2_access_token'])) { ?>
-
- new OffAmazonPayments.Widgets.AddressBook({
- sellerId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>',
- scope: 'profile payments:widget payments:shipping_address payments:billing_address',
- onOrderReferenceCreate: function(orderReference) {
-
- var oID = orderReference.getAmazonOrderReferenceId();
-
- jQuery('#wpsg_mod_amazon_OrderReference').val(oID);
-
- },
- onAddressSelect: function(orderReference) {
- // Replace the following code with the action that you want
- // to perform after the address is selected. The
- // amazonOrderReferenceId can be used to retrieve the address
- // details by calling the GetOrderReferenceDetails operation.
- },
- design: {
- designMode: 'responsive'
- },
- onReady: function(orderReference) {
- // Enter code here you want to be executed
- // when the AddressBook widget has been rendered.
- },
-
- onError: function(error) {
-
- console.log(error);
-
- // Your error handling code.
- // During development you can use the following
- // code to view error messages:
- // console.log(error.getErrorCode() + ': ' + error.getErrorMessage());
- // See "Handling Errors" for more information.
- }
- }).bind("addressBookWidgetDiv");
-
- new OffAmazonPayments.Widgets.Wallet({
- sellerId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>',
- onPaymentSelect: function(orderReference) {
-
- // Replace this code with the action that you want to perform
- // after the payment method is selected.
-
- },
- design: {
- designMode: 'responsive'
- },
- onError: function(error) {
- alert("Wallet: Es ist folgender Fehler aufgetreten: " + error.getErrorCode() + ' - ' + error.getErrorMessage());
- }
- }).bind("walletWidgetDiv");
-
- <?php } ?>
-
- }
-
-</script>
-
-<style>
-
- #addressBookWidgetDiv {
- min-width: 300px;
- width: 100%;
- max-width: 900px;
- min-height: 228px;
- height: 240px;
- max-height: 400px;
- margin-bottom:2rem;
- }
-
- #walletWidgetDiv {
- min-width: 300px;
- width: 100%;
- max-width: 900px;
- min-height: 228px;
- height: 240px;
- max-height: 400px;
- margin-bottom:2rem;
- }
-
-</style>
\ No newline at end of file diff --git a/views/mods/mod_amazon_v2/gfx/logo_100x25.png b/views/mods/mod_amazon_v2/gfx/logo_100x25.png Binary files differdeleted file mode 100644 index bb16b5b..0000000 --- a/views/mods/mod_amazon_v2/gfx/logo_100x25.png +++ /dev/null diff --git a/views/mods/mod_amazon_v2/order_done.phtml b/views/mods/mod_amazon_v2/order_done.phtml deleted file mode 100644 index ba16642..0000000 --- a/views/mods/mod_amazon_v2/order_done.phtml +++ /dev/null @@ -1,54 +0,0 @@ -<?php
-
- /**
- * Template, welches bei Bestellungen mit Amazon Pay nach der Bestellung angezeigt wird
- */
-
- $view = $this->view['wpsg_mod_amazon_v2'];
-
- // https://pay.amazon.de/help/JE5KSJW4SFH2UM8
- // https://developer.amazon.com/de/docs/eu/amazon-pay-onetime/sca-upgrade.html?ld=NSGoogle
- // https://sellercentral.amazon.com/forums/t/what-is-the-amazonorderreferenceid/286349/2
-
-?>
-
-<?php if ($view['state'] === 'Completed') { ?>
-
- <p><?php echo __('Bestellung wurde mit Amazon Payment bezahlt.', 'wpsg'); ?></p>
-
-<?php } else if ($view['state'] === 'Unpayed') { ?>
-
- <script src="https://static-eu.payments-amazon.com/checkout.js"></script>
-
- <div id="AmazonPayButton"></div>
-
- <script>
-
- amazon.Pay.renderButton('#AmazonPayButton', {
- merchantId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>',
- ledgerCurrency: 'EUR',
- sandbox: <?php echo (($this->get_option('wpsg_mod_amazon_v2_sandbox') === '1')?'true':'false'); ?>,
- checkoutLanguage: 'de_DE',
- productType: 'PayAndShip',
- placement: 'Cart',
- buttonColor: 'Gold',
- createCheckoutSessionConfig: {
- payloadJSON: '<?php echo $view['payload']; ?>',
- signature: '<?php echo $view['signature']; ?>',
- publicKeyId: '<?php echo $this->get_option('wpsg_mod_amazon_v2_public_key_id'); ?>'
- }
- });
-
- </script>
-
-<?php } else if ($view['state'] === 'Open') { ?>
-
- <p><?php echo __('Zahlen Sie Ihre Bestellung jetzt mit AmazonPay, indem sie auf folgenden Button klicken.', 'wpsg'); ?></p>
-
-
- <a href="<?php echo $view['payURL']; ?>" title="<?php echo __('Jetzt mit AmazonPay bezahlen', 'wpsg'); ?>">
- <img src="<?php echo $this->getRessourceURL('mods/mod_amazon_v2/gfx/logo_100x25.png'); ?>" alt="<?php echo __('Jetzt mit AmazonPay bezahlen', 'wpsg'); ?>" />
- </a>
-
-
-<?php } ?>
diff --git a/views/mods/mod_amazon_v2/order_view_afterpayment.phtml b/views/mods/mod_amazon_v2/order_view_afterpayment.phtml deleted file mode 100644 index 940bc5c..0000000 --- a/views/mods/mod_amazon_v2/order_view_afterpayment.phtml +++ /dev/null @@ -1,75 +0,0 @@ -<?php
-
- /**
- * Template für die Integration von AmazonPay in die Bestellverwaltung
- */
-
- $view = $this->view['wpsg_mod_amazon_v2'];
-
-?>
-
- <?php if (wpsg_isSizedString($view['referenceID'])) { ?>
- <?php echo wpsg_drawForm_Input(false, __('Amazon-Referenznummer', 'wpsg'), wpsg_getStr($view['referenceID']), ['readonly' => true]); ?>
- <?php } ?>
-
- <?php if (wpsg_isSizedString($view['sesion_id'])) { ?>
- <?php echo wpsg_drawForm_Input(false, __('Session ID', 'wpsg'), wpsg_getStr($view['sesion_id']), ['readonly' => true]); ?>
- <?php } ?>
-
- <?php if (wpsg_isSizedString($view['chargeId'])) { ?>
- <?php echo wpsg_drawForm_Input(false, __('Charge ID', 'wpsg'), wpsg_getStr($view['chargeId']), ['readonly' => true]); ?>
- <?php } ?>
-
- <?php if (wpsg_isSizedString($view['refundId'])) { ?>
- <?php echo wpsg_drawForm_Input(false, __('Refund ID', 'wpsg'), wpsg_getStr($view['refundId']), ['readonly' => true]); ?>
- <?php } ?>
-
- <div class="form-group form-group-text form-group-sm">
- <label class="col-sm-6 control-label" for=""><?php echo __('Status', 'wpsg'); ?> [<a href="<?php
-
- echo wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'mod' => 'wpsg_mod_amazon_v2', 'do' => 'update', 'edit_id' => $this->view['oOrder']->getId()], ['noheader' => '1']);
-
- ?>"><?php echo __('Status Aktualisieren', 'wpsg'); ?></a>]</label>
- <div class="col-sm-6">
- <div class="wpsg_field_wrap">
- <p class="form-control-static">
-
- <?php echo wpsg_translate(__('#1#', 'wpsg'), $view['state']); ?>
-
- </p>
- </div>
- </div>
- </div>
-
- <?php if (wpsg_isSizedString($view['chargeId']) && !wpsg_isSizedString($view['refundId'])) { ?>
-
- <br />
-
- <?php echo wpsg_drawForm_TextStart(); ?>
-
- <a href="<?php echo wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'mod' => 'wpsg_mod_amazon_v2', 'do' => 'refund', 'edit_id' => $this->view['oOrder']->getId()], ['noheader' => '1']); ?>" class="button">
- <?php echo __('Zurückzahlen', 'wpsg'); ?>
- </a>
-
- <?php echo wpsg_drawForm_TextEnd(); ?>
-
- <?php } else if (wpsg_isSizedString($view['refundId'])) { ?>
-
- <div class="form-group form-group-text form-group-sm">
- <label class="col-sm-6 control-label" for=""><?php echo __('Erstattungsstatus', 'wpsg'); ?> [<a href="<?php
-
- echo wpsg_admin_url('Order', 'view', ['action' => 'ajax', 'mod' => 'wpsg_mod_amazon_v2', 'do' => 'updateRefund', 'edit_id' => $this->view['oOrder']->getId()], ['noheader' => '1']);
-
- ?>"><?php echo __('Status Aktualisieren', 'wpsg'); ?></a>]</label>
- <div class="col-sm-6">
- <div class="wpsg_field_wrap">
- <p class="form-control-static">
-
- <?php echo wpsg_translate(__('#1#', 'wpsg'), $view['refundState']); ?>
-
- </p>
- </div>
- </div>
- </div>
-
- <?php } ?>
diff --git a/views/mods/mod_amazon_v2/overview_button.phtml b/views/mods/mod_amazon_v2/overview_button.phtml deleted file mode 100644 index 8f2c96c..0000000 --- a/views/mods/mod_amazon_v2/overview_button.phtml +++ /dev/null @@ -1,47 +0,0 @@ -<?php
-
- /**
- *
- */
-
-?>
-
-<script async="async" src="https://static-eu.payments-amazon.com/OffAmazonPayments/de/sandbox/lpa/js/Widgets.js"></script>
-
-<div id="buy-now">JETZT kaufen</div>
-
-<script>
-
- var sellerId = '<?php echo $this->get_option('wpsg_mod_amazon_v2_seller_id'); ?>';
- var id = '<?php echo $_SESSION['wpsg_mod_amazon_v2_amazonCheckoutSessionId']; ?>';
- var buyNowBtn = document.getElementById("buy-now");
-
- buyNowBtn.addEventListener('click', function () {
-
- OffAmazonPayments.initConfirmationFlow(sellerId, id, function(confirmationFlow) {
-
- placeOrder(confirmationFlow);
-
- });
-
- });
-
- function placeOrder(confirmationFlow) {
-
- jQuery.ajax({
- url: '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_amazon_v2', 'placeOrder', [], true) ?>',
-success: function (data) {
-confirmationFlow.success(); // continue Amazon Pay hosted site
-},
-error: function (data) { // called on ajax error and timeout
-confirmationFlow.error(); // abort Amazon Pay initConfirmationFlow
-// you might want to add additional error handling
-},
-timeout: "your timeout value" //specify your timeout value (for example, 3000)
-//If the ajax request takes longer than this timeout (in ms), the error callback
-//will be called
-});
-
- }
-
-</script>
\ No newline at end of file diff --git a/views/mods/mod_amazon_v2/settings_edit.phtml b/views/mods/mod_amazon_v2/settings_edit.phtml deleted file mode 100644 index da9b3a6..0000000 --- a/views/mods/mod_amazon_v2/settings_edit.phtml +++ /dev/null @@ -1,47 +0,0 @@ -<?php
-
- /**
- * Einstellungen des Moduls "AmazonPay"
- */
-
-?>
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_seller_id', __('Händler-ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_seller_id'), array('help' => 'wpsg_mod_amazon_v2_seller_id')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_store_id', __('Store ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_store_id'), []); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_public_key_id', __('ID des öffentlichen Schlüssels / Public Key ID', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_public_key_id'), []); ?>
-<?php echo wpsg_drawForm_Upload('wpsg_mod_amazon_v2_private_key', __('Privater Schlüssel (.pem Datei)', 'wpsg')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_v2_sandbox', __('Sandbox Modus', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_sandbox'), array('help' => 'wpsg_mod_amazon_v2_sandbox')); ?>
-
-<script>
-
- jQuery('#wpsg_mod_amazon_v2_login').on('click', function() {
-
- if (jQuery(this).prop('checked')) {
-
- jQuery('#wpsg_mod_amazon_v2_login_1').show();
-
- } else {
-
- jQuery('#wpsg_mod_amazon_v2_login_1').hide();
-
- }
-
- });
-
-</script>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_amazon_v2_aktiv', __('Zahlungsart für neue Bestellungen aktiv', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_aktiv')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_name', __('Name der Zahlungsart', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_name'), array('help' => 'wpsg_mod_amazon_v2_name')); ?>
-<?php echo wpsg_drawForm_Textarea('wpsg_mod_amazon_v2_hint', __('Hinweistext', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_hint'), array('help' => 'wpsg_shippay_hint')); ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_subject', __('Betreff (Auf Abrechnungen für Verkäufer sichtbar)', 'wpsg'), $this->get_option('wpsg_mod_amazon_v2_subject'), array('help' => 'wpsg_mod_amazon_v2_subject')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Input('wpsg_mod_amazon_v2_gebuehr', __('Gebühr/Rabatt', 'wpsg'), wpsg_ff($this->get_option('wpsg_mod_amazon_v2_gebuehr'), true), array('unit' => $this->get_option('wpsg_currency').' / %', 'help' => 'wpsg_shippay_gebuehr')); ?>
-<?php echo wpsg_drawForm_Select('wpsg_mod_amazon_v2_mwst', __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option('wpsg_mod_amazon_v2_mwst'), array('help' => 'wpsg_mod_amazon_v2_mwst')); ?>
-
diff --git a/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml b/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml index 486d43a..310934c 100644 --- a/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml +++ b/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung.phtml @@ -1,151 +1,122 @@ -<?php echo __("Auftragsbestätigung", "wpsg"); ?>
-
-<?php echo __("Vielen Dank für Ihre Bestellung. Sie erhalten hiermit die Auftragsbestätigung mit allen wichtigen Informationen zu Ihrer Bestellung.", "wpsg"); ?>
-
-----------------------------------------------------------------------------
-
-<?php if ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', array('k_id' => $this->view['data']['k_id'], 'o_id' => $this->view['data']['id']))) { ?>
-<?php echo __('Rechnungsadresse:', 'wpsg'); ?>
-
-<?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?>
-<?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?>
-<?php echo wpsg_pad_right(__('Straße', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>
-<?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?>
-<?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
-<?php echo wpsg_pad_right(__('USt.IdNr.', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['ustidnr']; ?>
-<?php } ?>
-
-<?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['plz']; ?> <?php echo $this->view['basket']['checkout']['ort']; ?>
-<?php echo wpsg_pad_right(__('Telefon', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['tel']; ?>
-<?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?>
-<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>
-
-<?php echo __('Lieferadresse:', 'wpsg'); ?>
-
-<?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_firma']; ?>
-<?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?>
-<?php echo wpsg_pad_right(__('Straße', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_strasse']; ?>
-<?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_plz']; ?> <?php echo $this->view['basket']['checkout']['shipping_ort']; ?>
-
-<?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['shipping_land']; ?>
-
-<?php } else { ?>
-<?php echo __('Rechnungs- /Lieferadresse:', 'wpsg'); ?>
-
-<?php echo wpsg_pad_right(__('Firma', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['firma']; ?>
-<?php echo wpsg_pad_right(__('Name', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['vname']; ?> <?php echo $this->view['basket']['checkout']['name']; ?>
-<?php echo wpsg_pad_right(__('Straße', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['strasse'].rtrim(' '.wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>
-<?php echo wpsg_pad_right(__('Land', 'wpsg').':', 35); ?><?php echo $this->db->fetchOne("SELECT `name` FROM `".WPSG_TBL_LAND."` WHERE `id` = '".wpsg_q($this->view['basket']['checkout']['land'])."' "); ?>
-<?php if (trim($this->view['basket']['checkout']['ustidnr']) != "") { ?>
-<?php echo wpsg_pad_right(__('USt.IdNr.', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['ustidnr']; ?>
-<?php } ?>
-
-<?php echo wpsg_pad_right(__('Ort', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['plz']; ?> <?php echo $this->view['basket']['checkout']['ort']; ?>
-<?php echo wpsg_pad_right(__('Telefon', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['tel']; ?>
-<?php echo wpsg_pad_right(__('Fax', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['fax']; ?>
-<?php echo wpsg_pad_right(__('E-Mail Adresse', 'wpsg').':', 35); ?><?php echo $this->view['basket']['checkout']['email']; ?>
-<?php } ?>
-
-<?php echo wpsg_pad_right(__('Kundennummer', 'wpsg').':', 35); ?><?php echo $this->view['customer']['knr']; ?>
-<?php echo wpsg_pad_right(__('Bestellnummer', 'wpsg').':', 35); ?><?php echo $this->view['order']['onr']; ?>
-<?php echo wpsg_pad_right(__('Bestelldatum', 'wpsg').':', 35); ?><?php echo date("d.m.Y H:i:s", strtotime($this->view['order']['cdate'])); ?>
-<?php echo wpsg_pad_right(__('Rechnungsbetrag', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')); ?>
-<?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
-<?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?>
-<?php } else { ?>
-<?php echo wpsg_pad_right(__('Steueranteil', 'wpsg').':', 35); ?><?php echo wpsg_ff($this->view['basket']['sum']['mwst'], $this->get_option('wpsg_currency')); ?>
-<?php } ?>
-
-<?php echo wpsg_pad_right(__('Versandart', 'wpsg').':', 35); ?><?php echo $this->arShipping[$this->view['basket']['checkout']['shipping']]['name']; ?>
-<?php echo wpsg_pad_right(__('Zahlungsart', 'wpsg').':', 35); ?><?php echo $this->arPayment[$this->view['basket']['checkout']['payment']]['name']; ?>
-<?php $this->callMods('mail_payment'); ?>
-
-<?php if ($this->view['auftrag_note'] != '') { ?>
-<?php echo wpsg_pad_right(__('Kommentar Auftragsbestätigung', 'wpsg').':', 35); ?>
-<?php echo $this->view['auftrag_note'] ?>
-<?php }?>
-
-
-<?php echo __('Bestellung', 'wpsg'); ?>:
-<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { $prod_col = 25; } else { $prod_col = 35; } ?>
-
-<?php echo wpsg_pad_right(__('Pos', 'wpsg'), 5); ?>
-<?php echo wpsg_pad_right(__('Produkt', 'wpsg'), $prod_col); ?>
-<?php echo wpsg_pad_left(__('Stückpreis', 'wpsg').' ', 15); ?>
-<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-<?php echo wpsg_pad_left(__('MwSt.', 'wpsg').' ', 10); ?>
-<?php } ?>
-<?php echo wpsg_pad_right(__('Anzahl', 'wpsg'), 6); ?>
-<?php echo wpsg_pad_left(__('Summe', 'wpsg'), 15); ?>
-----------------------------------------------------------------------------
-<?php $i = 0; foreach ((array)$this->view['basket']['produkte'] as $p) { $i ++; ?>
-<?php echo wpsg_pad_right($i.'.', 5); ?>
-<?php echo wpsg_pad_right($p['name'], $prod_col); ?>
-<?php echo wpsg_pad_left(wpsg_ff($p['preis'], $this->get_option('wpsg_currency')).' ', 15); ?>
-<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-<?php echo wpsg_pad_left(wpsg_ff($p['mwst_value'], '%').' ', 10); ?>
-<?php } ?>
-<?php echo wpsg_pad_left($p['menge'], 6); ?>
-<?php echo wpsg_pad_left(wpsg_ff($p['preis'] * $p['menge'], $this->get_option('wpsg_currency')), 15); ?>
-<?php $this->callMods('mail_row', array($i, $p)); ?>
-<?php } ?>
-<?php if (isset($this->view['basket']['gs'])) { ?>
-<?php echo wpsg_pad_right(($i + 1).'.', 5); ?>
-<?php echo wpsg_pad_right(wpsg_translate(__('Gutschein (#1#)', 'wpsg'), $this->view['basket']['gs']['code']), $prod_col); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['gs']['value'], (($this->view['basket']['gs']['calc'] == 'w')?$this->get_option('wpsg_currency'):'%')).' ', 15); ?>
-<?php if (sizeof($this->view['basket']['mwst']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { ?>
-<?php echo wpsg_pad_left(__('anteilig', 'wpsg').' ', 10); ?>
-<?php } ?>
-<?php echo wpsg_pad_left('1', 6); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['gs']['value'], $this->get_option('wpsg_currency')), 15); ?>
-<?php } ?>
- <?php echo wpsg_pad_right(__('Zwischensumme:', 'wpsg'), 40); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis'], $this->get_option('wpsg_currency')), 31); ?>
-<?php if ($this->view['basket']['sum']['preis_shipping'] != 0 || $this->get_option('wpsg_hideemptyshipping') != '1') { ?>
- <?php echo wpsg_pad_right(__('Versandkosten', 'wpsg'), 40); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->arShipping[$this->view['basket']['checkout']['shipping']]['mwst_value']??0,'% '), 10); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_shipping'], $this->get_option('wpsg_currency')), 21); ?>
-<?php } ?>
-<?php if ($this->view['basket']['sum']['preis_payment'] != 0 || $this->get_option('wpsg_hideemptypayment') != '1') { ?>
- <?php echo wpsg_pad_right(__('Zahlungsart', 'wpsg'), 40); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->arPayment[$this->view['basket']['checkout']['payment']]['mwst_value']??0,'% '), 10); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_payment'], $this->get_option('wpsg_currency')), 21); ?>
-<?php } ?>
-<?php //wpsg_debug($this->view['basket']['mwst']) ?>
-<?php if ($this->get_option('wpsg_kleinunternehmer') == '1') { ?>
-<?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?>
-<?php } else { ?>
-<?php foreach ($this->view['basket']['mwst'] as $mwst_id => $mwst) { ?>
-<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
- <?php echo wpsg_pad_right(wpsg_translate(__('zuzüglich MwSt. (#1#)', 'wpsg'), $mwst['name']), 47); ?>
-<?php } else { ?>
- <?php echo wpsg_pad_right(wpsg_translate(__('darin enthaltenes MwSt. (#1#)', 'wpsg'), $mwst['name']), 47); ?>
-<?php } ?>
-<?php echo wpsg_pad_left(wpsg_ff($mwst['sum'], $this->get_option('wpsg_currency')), 24); ?>
-<?php } ?>
-<?php }?>
-<?php echo wpsg_pad_left(' ', 61); ?>---------------
- <?php echo wpsg_pad_right(__('Gesamtpreis', 'wpsg'), 37); ?>
-<?php echo wpsg_pad_left(wpsg_ff($this->view['basket']['sum']['preis_gesamt_brutto'], $this->get_option('wpsg_currency')), 34); ?>
-
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
-
-<?php echo __('Wir bedanken uns für Ihre Bestellung.', 'wpsg'); ?>
-
-<?php echo __('Es gelten unsere Allgemeinen Geschäftsbedingungen (AGB).', 'wpsg'); ?>
-
-<?php echo $this->getURL(wpsg_ShopController::URL_AGB); ?>
-
- -- <?php echo __("Widerrufsbelehrung", "wpsg"); ?> --
-
-<?php if (trim($this->get_option("wpsg_ps_mailwiderruf")) != "") { ?>
-<?php echo $this->get_option("wpsg_ps_mailwiderruf"); ?>
-<?php } else { ?>
-<?php echo __("...hier steht der Text zum Widerrufsrecht...", "wpsg"); ?>
-<?php } ?>
-
--- <?php echo __("Ende der Widerrufsbelehrung", "wpsg"); ?> --
-
-<?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?>
-
-<?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?>
\ No newline at end of file +<?php
+
+ /**
+ * Textmail der Auftragsbestätigung an den Kunden
+ *
+ * Die Zeilenumbrüche werden ausdrücklich ausgegeben, weil PHP einen Zeilenumbruch direkt nach dem
+ * schließenden PHP-Tag verschluckt. Den Warenkorb liefert der Baustein mailtemplates/order.phtml des Kerns.
+ * @version 4.6.1
+ */
+
+ // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Textmail ohne HTML-Kontext, HTML-Escaping würde den Text verfälschen
+
+ $this->htmlMail = false;
+
+ /** @var wpsg_order $oOrder */
+ $oOrder = $this->view['oOrder'];
+ $oCustomer = $oOrder->getCustomer();
+
+ $arCheckout = $this->view['basket']['checkout'];
+ $strCurrency = $this->get_option('wpsg_currency');
+ $strNote = (string)($this->view['auftrag_note']??'');
+ $strComment = (string)($arCheckout['comment']??'');
+ $strRevocation = trim((string)$this->get_option('wpsg_ps_mailwiderruf'));
+
+ $bShippingAdress = ($this->hasMod('wpsg_mod_shippingadress') && $this->callMod('wpsg_mod_shippingadress', 'check_different_shippingadress', [$oOrder->k_id, $oOrder->getId()]));
+
+ /**
+ * Eine Zeile "Bezeichnung: Wert"
+ */
+ $line = function($strLabel, $strValue) {
+
+ return wpsg_pad_right($strLabel.':', 35).$strValue."\n";
+
+ };
+
+ echo __('Auftragsbestätigung', 'wpsg')."\n\n";
+ echo __('Vielen Dank für Ihre Bestellung. Sie erhalten hiermit die Auftragsbestätigung mit allen wichtigen Informationen zu Ihrer Bestellung.', 'wpsg')."\n\n";
+ echo str_repeat('-', 76)."\n\n";
+
+ echo (($bShippingAdress)?__('Rechnungsadresse:', 'wpsg'):__('Rechnungs- /Lieferadresse:', 'wpsg'))."\n\n";
+
+ echo $line(__('Firma', 'wpsg'), $oOrder->getInvoiceCompany());
+ echo $line(__('Name', 'wpsg'), trim($oOrder->getInvoiceFirstName().' '.$oOrder->getInvoiceName()));
+ echo $line(__('Straße', 'wpsg'), $oOrder->getInvoiceStreet());
+ echo $line(__('Ort', 'wpsg'), trim($oOrder->getInvoiceZip().' '.$oOrder->getInvoiceCity()));
+ echo $line(__('Land', 'wpsg'), $oOrder->getInvoiceCountryName());
+
+ if (trim((string)($arCheckout['ustidnr']??'')) !== '') echo $line(__('USt.IdNr.', 'wpsg'), $arCheckout['ustidnr']);
+
+ echo $line(__('Telefon', 'wpsg'), $oOrder->getInvoicePhone());
+ echo $line(__('Fax', 'wpsg'), $oOrder->getInvoiceFax());
+ echo $line(__('E-Mail Adresse', 'wpsg'), $oCustomer->getEMail());
+
+ if ($bShippingAdress) {
+
+ echo "\n".__('Lieferadresse:', 'wpsg')."\n\n";
+
+ echo $line(__('Firma', 'wpsg'), $oOrder->getShippingCompany());
+ echo $line(__('Name', 'wpsg'), trim($oOrder->getShippingFirstName().' '.$oOrder->getShippingName()));
+ echo $line(__('Straße', 'wpsg'), trim($oOrder->getShippingStreet()));
+ echo $line(__('Ort', 'wpsg'), trim($oOrder->getShippingZip().' '.$oOrder->getShippingCity()));
+ echo $line(__('Land', 'wpsg'), $oOrder->getShippingCountryName());
+
+ }
+
+ echo "\n";
+ echo $line(__('Kundennummer', 'wpsg'), $oCustomer->knr);
+ echo $line(__('Bestellnummer', 'wpsg'), $oOrder->getNr());
+ echo $line(__('Bestelldatum', 'wpsg'), wp_date('d.m.Y H:i:s', intval($this->view['basket']['checkout']['datum']??0)));
+ echo $line(__('Rechnungsbetrag', 'wpsg'), wpsg_ff($this->view['basket']['arCalculation']['sum']['topay_brutto']??0, $strCurrency));
+
+ if ($this->get_option('wpsg_kleinunternehmer') == '1') {
+
+ echo $this->get_option('wpsg_kleinunternehmer_text')."\n";
+
+ } else {
+
+ echo $line(__('Steueranteil', 'wpsg'), wpsg_ff($this->view['basket']['sum']['mwst']??0, $strCurrency));
+
+ }
+
+ echo "\n";
+ echo $line(__('Versandart', 'wpsg'), $oOrder->getShippingLabel());
+
+ $this->callMods('mail_shipping');
+
+ echo $line(__('Zahlungsart', 'wpsg'), $oOrder->getPaymentLabel());
+
+ $this->callMods('mail_payment');
+
+ if ($strNote !== '') {
+
+ echo "\n".__('Kommentar Auftragsbestätigung', 'wpsg').":\n";
+ echo $strNote."\n";
+
+ }
+
+ echo "\n".__('Bestellung', 'wpsg').":\n";
+
+ // Positionen, Versand, Zahlungsart, Steuern, Gesamtpreis und mail_aftercalculation der Module
+ $this->render(WPSG_PATH_VIEW.'/mailtemplates/order.phtml');
+
+ if ($strComment !== '') {
+
+ echo "\n".__('Bestellkommentar', 'wpsg').': '.$strComment."\n";
+
+ }
+
+ echo "\n".__('Wir bedanken uns für Ihre Bestellung.', 'wpsg')."\n\n";
+ echo __('Es gelten unsere Allgemeinen Geschäftsbedingungen (AGB).', 'wpsg')."\n\n";
+ echo $this->getURL(wpsg_ShopController::URL_AGB)."\n\n";
+
+ if ($strRevocation !== '') {
+
+ echo '-- '.__('Widerrufsbelehrung', 'wpsg')." --\n\n";
+ echo $strRevocation."\n\n";
+ echo '-- '.__('Ende der Widerrufsbelehrung', 'wpsg')." --\n\n";
+
+ }
+
+ echo __('Mit freundlichen Grüßen', 'wpsg')."\n\n";
+ echo __($this->get_option('wpsg_shopdata_name'), 'wpsg').' - '.__('Team', 'wpsg');
diff --git a/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml b/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml index 5983aec..3202f0f 100644 --- a/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml +++ b/views/mods/mod_auftragsbestaetigung/auftragsbestaetigung_html.phtml @@ -1,51 +1,57 @@ -<?php
+<?php
+
+ /**
+ * HTML-Mail der Auftragsbestätigung an den Kunden
+ * @version 4.6.1
+ */
/* Wichtig, da die Module sonst kein HTML zurückgeben */
$this->htmlMail = true;
- include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
+ include(WPSG_PATH_VIEW.'mailtemplates/html/logo.phtml');
+
+ $strNote = (string)($this->view['auftrag_note']??'');
+ $strComment = (string)($this->view['basket']['checkout']['comment']??'');
+ $strRevocation = (string)$this->get_option('wpsg_ps_mailwiderruf');
?><?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/html_head.phtml'); ?>
-<h1><?php echo __("Auftragsbestätigung", "wpsg"); ?></h1>
-
-<p><?php echo __("Vielen Dank für Ihre Bestellung. Sie erhalten hiermit die Auftragsbestätigung mit allen wichtigen Informationen zu Ihrer Bestellung.", "wpsg"); ?></p>
+<h1><?php echo esc_html__('Auftragsbestätigung', 'wpsg'); ?></h1>
+
+<p><?php echo esc_html__('Vielen Dank für Ihre Bestellung. Sie erhalten hiermit die Auftragsbestätigung mit allen wichtigen Informationen zu Ihrer Bestellung.', 'wpsg'); ?></p>
-<?php if (wpsg_isSizedString($this->view['auftrag_note'])) { ?>
-<h2><?php echo __('Kommentar Auftragsbestätigung', 'wpsg'); ?></h2>
-<p><?php echo $this->view['auftrag_note'] ?></p>
-<?php }?>
+<?php if ($strNote !== '') { ?>
+<h2><?php echo esc_html__('Kommentar Auftragsbestätigung', 'wpsg'); ?></h2>
+<p><?php echo nl2br(esc_html($strNote)); ?></p>
+<?php } ?>
<?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/customer.phtml'); ?>
-<h2><?php echo __('Warenkorb', 'wpsg'); ?>:</h2>
+<h2><?php echo esc_html__('Warenkorb', 'wpsg'); ?>:</h2>
-<?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml'); ?>
+<?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/order.phtml'); ?>
-<?php $this->callMods('mail_aftercalculation', array(&$this->view['order']['id'])); ?>
+<?php $this->callMods('mail_aftercalculation', [&$this->view['order']['id']]); ?>
-<?php if (wpsg_isSizedString($this->view['basket']['checkout']['comment'])) { ?>
-<h2><?php echo __('Bestellkommentar', 'wpsg') ?></h2>
-<p><?php echo $this->view['basket']['checkout']['comment'] ?></p>
+<?php if ($strComment !== '') { ?>
+<h2><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></h2>
+<p><?php echo nl2br(esc_html($strComment)); ?></p>
<?php } ?>
<br />
-<p><?php echo __('Wir bedanken uns für Ihre Bestellung.', 'wpsg'); ?></p>
+<p><?php echo esc_html__('Wir bedanken uns für Ihre Bestellung.', 'wpsg'); ?></p>
+
+<p><?php echo wp_kses_post(wpsg_translate(__('Es gelten unsere <a href="#1#">Allgemeinen Geschäftsbedingungen</a> (<a href="#1#">AGB</a>).', 'wpsg'), esc_url($this->getURL(wpsg_ShopController::URL_AGB)))); ?></p>
+
+<?php if ($strRevocation !== '') { ?>
+<h3><?php echo esc_html__('Widerrufsbelehrung', 'wpsg'); ?></h3>
-<p><?php echo wpsg_translate(__('Es gelten unsere <a href="#1#">Allgemeinen Geschäftsbedingungen</a> (<a href="#1#">AGB</a>).', 'wpsg'), $this->getURL(wpsg_ShopController::URL_AGB)); ?></p>
-
-<h3><?php echo __("Widerrufsbelehrung", "wpsg"); ?></h3>
+<p><?php echo wp_kses_post($strRevocation); ?></p>
-<?php if (wpsg_isSizedString($this->get_option("wpsg_ps_mailwiderruf"))) { ?>
-<p><?php echo $this->get_option("wpsg_ps_mailwiderruf"); ?></p>
-<?php } else { ?>
-<?php echo __("...hier steht der Text zum Widerrufsrecht...", "wpsg"); ?>
+<h3><?php echo esc_html__('Ende der Widerrufsbelehrung', 'wpsg'); ?></h3>
<?php } ?>
-
-<h3><?php echo __("Ende der Widerrufsbelehrung", "wpsg"); ?></h3>
-<p><?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?></p>
-<p><?php echo __($this->get_option('wpsg_shopdata_name'), 'wpsg'); ?> - <?php echo __('Team', 'wpsg'); ?></p>
+<p><?php echo esc_html__('Mit freundlichen Grüßen', 'wpsg'); ?></p>
+<p><?php echo esc_html(__($this->get_option('wpsg_shopdata_name'), 'wpsg')); ?> - <?php echo esc_html__('Team', 'wpsg'); ?></p>
<?php $this->render(WPSG_PATH_VIEW.'/mailtemplates/html/html_foot.phtml'); ?>
-
\ No newline at end of file diff --git a/views/mods/mod_auftragsbestaetigung/order_view.phtml b/views/mods/mod_auftragsbestaetigung/order_view.phtml index c792085..69c7e16 100644 --- a/views/mods/mod_auftragsbestaetigung/order_view.phtml +++ b/views/mods/mod_auftragsbestaetigung/order_view.phtml @@ -1,53 +1,50 @@ -<script type="text/javascript">
-
- jQuery(document).ready(function() {
-
- jQuery(".handlediv").bind("click", function() {
- if (jQuery(this.parentNode).hasClass("closed"))
- {
-
- jQuery.cookie("wpsg_ab_field", "0", { expires: 999999 } );
-
- }
- else
- {
-
- jQuery.cookie("wpsg_ab_field", "1", { expires: 999999 } );
-
- }
- } );
-
- if (jQuery.cookie("wpsg_ab_field") == "1")
- {
-
- jQuery("#wpsg_ab_postbox").removeClass("closed");
- }
-
- } );
-
-</script>
+<?php
+ /**
+ * Formular zum Senden der Auftragsbestätigung in der Bestellansicht
+ * @version 4.6.1
+ */
+
+ $order_id = (int)($this->view['data']['id']??0);
+ $bCanSetStatus = (($this->view['wpsg_mod_auftragsbestaetigung']['canSetStatus']??false) === true);
+ $bSetStatus = (($this->view['wpsg_mod_auftragsbestaetigung']['setstatus']??true) === true);
+
+?>
<?php echo wpsg_drawForm_AdminboxStart(__('Auftragsbestätigung', 'wpsg')); ?>
-
- <div class="inside">
+
+ <div class="inside">
<div class="inside" style="padding:5px;">
-
+
<p>
- <?php echo __('Die Auftragsbestätigung bestätigt dem Kunden die erfolgreiche Erfassung des Auftrages. Abweichungen vom Auftrag können mittels des Textfeldes mitgesendet werden.', 'wpsg'); ?>
- <?php echo __('Der Status ändert sich automatisch auf "Auftrag akzeptiert".', 'wpsg'); ?>
+ <?php echo esc_html__('Die Auftragsbestätigung bestätigt dem Kunden die erfolgreiche Erfassung des Auftrages. Abweichungen vom Auftrag können mittels des Textfeldes mitgesendet werden.', 'wpsg'); ?>
+ <?php if (!$bCanSetStatus) { ?>
+ <?php echo esc_html__('Der Status der Bestellung bleibt beim Senden erhalten.', 'wpsg'); ?>
+ <?php } ?>
</p>
-
+
<br />
-
- <form method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_auftragsbestaetigung&edit_id=<?php echo $this->view['data']['id']; ?>&noheader=1">
+
+ <form method="post" action="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&action=ajax&mod=wpsg_mod_auftragsbestaetigung&edit_id='.$order_id.'&noheader=1'); ?>">
+ <?php wp_nonce_field('wpsg-auftragsbestaetigung-order_ajax-'.$order_id); ?>
<div style="padding-left:5px;">
<textarea style="width:100%;" class="wpsg_order_view_auftragsbestaetigung" name="auftrag_note"></textarea>
</div>
- <input class="button" style="float:right; margin-right:10px;" type="submit" value="<?php echo __('Senden', 'wpsg'); ?>" /><br />
+ <?php if ($bCanSetStatus) { ?>
+ <div style="padding-left:5px;">
+ <input type="hidden" name="wpsg_mod_auftragsbestaetigung_setstatus" value="0" />
+ <label>
+ <input type="checkbox" name="wpsg_mod_auftragsbestaetigung_setstatus" value="1" <?php echo (($bSetStatus)?'checked="checked"':''); ?> />
+ <?php echo esc_html__('Status auf "Auftrag akzeptiert" setzen', 'wpsg'); ?>
+ </label>
+ </div>
+ <?php } else { ?>
+ <input type="hidden" name="wpsg_mod_auftragsbestaetigung_setstatus" value="0" />
+ <?php } ?>
+ <input class="button" style="float:right; margin-right:10px;" type="submit" value="<?php echo esc_attr__('Senden', 'wpsg'); ?>" /><br />
<input type="hidden" name="mod_auftragbestaetigung" value="1"/>
</form>
-
+
</div>
</div>
-
+
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
\ No newline at end of file diff --git a/views/mods/mod_auftragsbestaetigung/settings_edit.phtml b/views/mods/mod_auftragsbestaetigung/settings_edit.phtml new file mode 100644 index 0000000..c3a236a --- /dev/null +++ b/views/mods/mod_auftragsbestaetigung/settings_edit.phtml @@ -0,0 +1,9 @@ +<?php + + /** + * Template für die Einstellungen des Moduls "Auftragsbestätigung" + * @version 4.6.1 + */ + +?> +<?php echo wpsg_drawForm_Checkbox('wpsg_mod_auftragsbestaetigung_setstatus', __('Status beim Senden auf "Auftrag akzeptiert" setzen', 'wpsg'), $this->view['wpsg_mod_auftragsbestaetigung']['setstatus'], ['help' => 'wpsg_mod_auftragsbestaetigung_setstatus']); ?>
\ No newline at end of file diff --git a/views/mods/mod_autodebit/mail.phtml b/views/mods/mod_autodebit/mail.phtml index bec996e..0a9971b 100644 --- a/views/mods/mod_autodebit/mail.phtml +++ b/views/mods/mod_autodebit/mail.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template integriert sich in die E-Mails für Kunden und Admin und zeigt die Bankdaten für das Modul "Bankeinzug" an
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_autodebit/mail_html.phtml b/views/mods/mod_autodebit/mail_html.phtml index d08970f..6597945 100644 --- a/views/mods/mod_autodebit/mail_html.phtml +++ b/views/mods/mod_autodebit/mail_html.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template integriert sich in die E-Mails für Kunden und Admin und zeigt die Bankdaten für das Modul "Bankeinzug" an
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_autodebit/order_done.phtml b/views/mods/mod_autodebit/order_done.phtml index ed8c4e3..1a7b996 100644 --- a/views/mods/mod_autodebit/order_done.phtml +++ b/views/mods/mod_autodebit/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template wird nach Bestellabschluss für Zahlungsart "Bankeinzug angezeigt"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_autodebit/order_view_afterpayment.phtml b/views/mods/mod_autodebit/order_view_afterpayment.phtml index 5bdae60..b52f253 100644 --- a/views/mods/mod_autodebit/order_view_afterpayment.phtml +++ b/views/mods/mod_autodebit/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Das Template wird in der Bestellansicht eingebunden und zeigt die Kontodaten des Kunden an, die er während der Bestellung angegeben hat
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_autodebit/paymenthint.phtml b/views/mods/mod_autodebit/paymenthint.phtml index 6f17260..5d09361 100644 --- a/views/mods/mod_autodebit/paymenthint.phtml +++ b/views/mods/mod_autodebit/paymenthint.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Kundeneingaben für das Modul "Bankeinzug" in den Checkout2
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_autodebit/settings_edit.phtml b/views/mods/mod_autodebit/settings_edit.phtml index 7acf981..ffb3ce2 100644 --- a/views/mods/mod_autodebit/settings_edit.phtml +++ b/views/mods/mod_autodebit/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "Bankeinzug"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_basketteaser/basket_row.phtml b/views/mods/mod_basketteaser/basket_row.phtml index d752c5e..811b6f2 100644 --- a/views/mods/mod_basketteaser/basket_row.phtml +++ b/views/mods/mod_basketteaser/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Warenkorbteaserprodukte innerhalb des Warenkorbs
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml b/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml index d10b900..35a817a 100644 --- a/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_basketteaser/produkt_addedit_sidebar.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration des Warenkorbteaser Moduls in die Produktverwaltung
* Sollte nicht verändert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_basketteaser/settings_edit.phtml b/views/mods/mod_basketteaser/settings_edit.phtml index feca673..d85b43b 100644 --- a/views/mods/mod_basketteaser/settings_edit.phtml +++ b/views/mods/mod_basketteaser/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Warenkorbteaser Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_campaigns/campaign_addedit.phtml b/views/mods/mod_campaigns/campaign_addedit.phtml index 179208f..e31b24f 100644 --- a/views/mods/mod_campaigns/campaign_addedit.phtml +++ b/views/mods/mod_campaigns/campaign_addedit.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ $data = $this->view['campaign_data']; $templates = isset($this->view['campaign_templates']) && is_array($this->view['campaign_templates']) ? $this->view['campaign_templates'] : array(); $assignedTemplateId = isset($data['assigned_template_id']) ? intval($data['assigned_template_id']) : 0; @@ -165,13 +166,6 @@ remove_filter('the_editor', 'qtrans_modifyRichEditor'); remove_filter('the_editor', 'wpautop'); - if ($this->view['data']->status == '1') - { - - add_filter('tiny_mce_before_init', 'wpng_tiny_mce_before_init'); - - } - add_filter('mce_buttons', 'wpng_tinymce_button'); add_filter('mce_external_plugins', 'wpng_tinymce_plugin'); add_filter('admin_head','wpng_ShowTinyMCE'); diff --git a/views/mods/mod_campaigns/campaign_index.phtml b/views/mods/mod_campaigns/campaign_index.phtml index 089ad3d..24fb1ec 100644 --- a/views/mods/mod_campaigns/campaign_index.phtml +++ b/views/mods/mod_campaigns/campaign_index.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ $list = $this->view['mod_campaigns']; ?> <div class="wrap wpng_campaign_index"> diff --git a/views/mods/mod_campaigns/conditions_fields.phtml b/views/mods/mod_campaigns/conditions_fields.phtml index d122b05..fd53957 100644 --- a/views/mods/mod_campaigns/conditions_fields.phtml +++ b/views/mods/mod_campaigns/conditions_fields.phtml @@ -5,6 +5,7 @@ * Erwartet $this->view['condition_options'] (id => label je Feld) und * $this->view['condition_values'] (Feld => array('operator','value')). * Wird von campaign_addedit.phtml und template_addedit.phtml eingebunden. + * @version 4.6.1 */ $opts = (isset($this->view['condition_options']) && is_array($this->view['condition_options'])) ? $this->view['condition_options'] : array(); diff --git a/views/mods/mod_campaigns/template_addedit.phtml b/views/mods/mod_campaigns/template_addedit.phtml index f46400b..62a9b39 100644 --- a/views/mods/mod_campaigns/template_addedit.phtml +++ b/views/mods/mod_campaigns/template_addedit.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ $data = $this->view['template_data']; $campaigns = isset($this->view['template_campaigns']) && is_array($this->view['template_campaigns']) ? $this->view['template_campaigns'] : array(); $triggerEventOptions = isset($this->view['template_trigger_event_options']) && is_array($this->view['template_trigger_event_options']) ? $this->view['template_trigger_event_options'] : array(); diff --git a/views/mods/mod_campaigns/template_index.phtml b/views/mods/mod_campaigns/template_index.phtml index 515a11c..4c6fdab 100644 --- a/views/mods/mod_campaigns/template_index.phtml +++ b/views/mods/mod_campaigns/template_index.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ $list = $this->view['mod_campaign_templates']; ?> <div class="wrap wpng_template_index"> diff --git a/views/mods/mod_coverletter/coverletter_pdf.phtml b/views/mods/mod_coverletter/coverletter_pdf.phtml index 21b9511..a3e9793 100644 --- a/views/mods/mod_coverletter/coverletter_pdf.phtml +++ b/views/mods/mod_coverletter/coverletter_pdf.phtml @@ -1,44 +1,49 @@ <?php
/**
- * FPDF Template für die Generierung des Lieferscheins
+ * FPDF Template für die Generierung des Anschreibens
+ * @version 4.6.1
*/
-
+
+ if (!defined('ABSPATH')) exit;
+
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
require_once WPSG_PATH_LIB.'FPDI_2.2.0/autoload.php';
require_once WPSG_PATH_LIB.'wpsg_fpdf.class.php';
-
+
global $absender_left, $absender_top, $adress_left, $adress_top, $dndata_left, $dndata_top;
-
+
if (!function_exists('addCoverLetterPage')) {
-
+
function addCoverLetterPage($shop, $pdf) {
-
+
global $absender_left, $absender_top, $adress_left, $adress_top, $dndata_left, $dndata_top;
-
+
$rdata_left = 0;
$pdf->AddPage();
-
- if (file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_bp.pdf")) {
-
- $pdf->setSourceFile($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_bp.pdf");
+
+ if (file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_bp.pdf')) {
+
+ $pdf->setSourceFile($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_bp.pdf');
$tplidx = $pdf->importPage(1, '/MediaBox');
$pdf->useTemplate($tplidx, 0, 0, 210);
-
- } else if (file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_bp.jpg")) {
-
- $pdf->image($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_bp.jpg", 0, 0, 210, 297, 'jpg');
-
+
+ } else if (file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_bp.jpg')) {
+
+ $pdf->image($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_bp.jpg', 0, 0, 210, 297, 'jpg');
+
}
- if (file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_logo.jpg")) {
+ $arLogoSize = ((file_exists($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_logo.jpg'))?getimagesize($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_logo.jpg'):false);
+
+ if (is_array($arLogoSize)) {
- list($width, $height, $type, $attr) = getimagesize($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_logo.jpg");
+ [$width, $height] = $arLogoSize;
// Umrechnung von Inch zu Pixel
$wPix = (25.4 * $width) / 96;
$hPix = (25.4 * $height) / 96;
-
+
$alpha = wpsg_logo_alpha($shop->get_option('wpsg_mod_coverletter_logo_transparency'));
/*
@@ -48,100 +53,97 @@ if(isset($logo_pos) && $logo_pos === "center") { $abscissa = 105 - ($wPix / 2); }
if(isset($logo_pos) && $logo_pos === "right") { $abscissa = 210 - $wPix; }
*/
-
+
$logox = intval($shop->get_option('wpsg_mod_coverletter_logo_x'));
$logoy = intval($shop->get_option('wpsg_mod_coverletter_logo_y'));
$pdf->SetAlpha($alpha);
- $pdf->image($shop->callMod('wpsg_mod_coverletter', 'getFilePath', array(''))."wpsg_coverletter_logo.jpg", $logox, $logoy, $wPix, $hPix);
+ $pdf->image($shop->callMod('wpsg_mod_coverletter', 'getFilePath', ['']).'wpsg_coverletter_logo.jpg', $logox, $logoy, $wPix, $hPix);
$pdf->SetAlpha(1);
}
-
+
// Adresse des Kunden
$pdf->SetFont('Arial', '', 12);
- $pdf->Text($adress_left, $adress_top, $shop->view['data']['company']);
- $pdf->Text($adress_left, $adress_top + 5, $shop->view['data']['firstname'].' '.$shop->view['data']['name']);
- $pdf->Text($adress_left, $adress_top + 10, $shop->view['data']['street'].' '.$shop->view['data']['hnr']);
- $pdf->Text($adress_left, $adress_top + 15, $shop->view['data']['zip'].' '.$shop->view['data']['city']);
- $pdf->Text($adress_left, $adress_top + 20, $shop->view['data']['country']);
-
+ $pdf->Text($adress_left, $adress_top, ($shop->view['data']['company']??''));
+ $pdf->Text($adress_left, $adress_top + 5, ($shop->view['data']['firstname']??'').' '.($shop->view['data']['name']??''));
+ $pdf->Text($adress_left, $adress_top + 10, ($shop->view['data']['street']??'').' '.($shop->view['data']['hnr']??''));
+ $pdf->Text($adress_left, $adress_top + 15, ($shop->view['data']['zip']??'').' '.($shop->view['data']['city']??''));
+ $pdf->Text($adress_left, $adress_top + 20, ($shop->view['data']['country']??''));
+
// Daten
$pdf->SetFont('Arial', 'B', 16);
- $pdf->Text($dndata_left, $dndata_top, $shop->view['title']);
+ $pdf->Text($dndata_left, $dndata_top, ($shop->view['title']??''));
$pdf->SetFont('Arial', 'B', 9);
- $pdf->Text($dndata_left, $dndata_top + 6, $shop->view['clnr']);
+ $pdf->Text($dndata_left, $dndata_top + 6, ($shop->view['clnr']??''));
$pdf->SetFont('Arial', '', 9);
-
- $pdf->Text($rdata_left + 100, $dndata_top, __("Kunden-Nr.", "wpsg"));
- $pdf->Text($rdata_left + 100, $dndata_top + 6, (($shop->view['customer']['knr'] != '')?$shop->view['customer']['knr']:$shop->view['customer']['id']));
-
- $pdf->Text($rdata_left + 125, $dndata_top, __("Best. Nr.", "wpsg"));
- $pdf->Text($rdata_left + 125, $dndata_top + 6, ((trim($shop->view['order']['onr']) != '')?$shop->view['order']['onr']:$shop->view['order']['id']));
-
- $pdf->Text($rdata_left + 145, $dndata_top, __("Bestelldatum", "wpsg"));
- $pdf->Text($rdata_left + 145, $dndata_top + 6, wpsg_formatTimestamp(strtotime($shop->view['order']['cdate']), true));
-
- $pdf->Text($rdata_left + 170, $dndata_top, __("Datum", "wpsg"));
+
+ $pdf->Text($rdata_left + 100, $dndata_top, __('Kunden-Nr.', 'wpsg'));
+ $pdf->Text($rdata_left + 100, $dndata_top + 6, (((string)($shop->view['customer']['knr']??'') !== '')?$shop->view['customer']['knr']:($shop->view['customer']['id']??'')));
+
+ $pdf->Text($rdata_left + 125, $dndata_top, __('Best. Nr.', 'wpsg'));
+ $pdf->Text($rdata_left + 125, $dndata_top + 6, ((trim((string)($shop->view['order']['onr']??'')) !== '')?$shop->view['order']['onr']:($shop->view['order']['id']??'')));
+
+ $pdf->Text($rdata_left + 145, $dndata_top, __('Bestelldatum', 'wpsg'));
+ $pdf->Text($rdata_left + 145, $dndata_top + 6, wpsg_formatTimestamp(strtotime((string)($shop->view['order']['cdate']??'')), true));
+
+ $pdf->Text($rdata_left + 170, $dndata_top, __('Datum', 'wpsg'));
$pdf->Text($rdata_left + 170, $dndata_top + 6, wpsg_formatTimestamp(time(), true));
-
- foreach ($shop->view['arTexts'] as $text) {
-
+
+ foreach (($shop->view['arTexts']??[]) as $text) {
+
if (isset($text['aktiv']) && $text['aktiv'] == 1) {
-
- $pdf->SetFont('Arial', 'B', ((intval($text['fontsize']) > 0)?intval($text['fontsize']):10));
- $pdf->wpsg_SetTextColor($text['color']);
- $pdf->wpsg_MultiCell($text['x'], $text['y'], 5, $text['text']);
- $pdf->wpsg_SetTextColor("#000000");
-
+
+ $pdf->SetFont('Arial', 'B', ((intval($text['fontsize']??0) > 0)?intval($text['fontsize']):10));
+ $pdf->wpsg_SetTextColor(($text['color']??''));
+ $pdf->wpsg_MultiCell(($text['x']??0), ($text['y']??0), 5, ($text['text']??''));
+ $pdf->wpsg_SetTextColor('#000000');
+
}
-
+
}
-
+
// Text
$pdf->setFont('Arial', '', 10);
- $pdf->wpsg_MultiCell($dndata_left - 1, $dndata_top + 12, 4, $shop->view['text']);
-
- }
-
+ $pdf->wpsg_MultiCell($dndata_left - 1, $dndata_top + 12, 4, ($shop->view['text']??''));
+
+ } // function addCoverLetterPage($shop, $pdf)
+
}
-
+
// Positionierung der Absenderadresszeile
- $absender_left = 25;
- $absender_top = 50;
-
- // Positionierung der Zieladress
- $adress_left = 25;
- $adress_top = 55;
-
- // Positionierund des Lieferscheinkopfes
- $dndata_left = 25;
- $dndata_top = 90;
-
+ $absender_left = 25;
+ $absender_top = 50;
+
+ // Positionierung der Zieladresse
+ $adress_left = 25;
+ $adress_top = 55;
+
+ // Positionierung des Kopfes
+ $dndata_left = 25;
+ $dndata_top = 90;
+
// Positionierung der Produktdaten
- $prod_left = 25;
- $prod_top = 105;
-
+ $prod_left = 25;
+ $prod_top = 105;
+
// Anzahl an Produkten pro Seite
- $prod_break = 10;
-
+ $prod_break = 10;
+
$pdf = new wpsg_fpdf();
$pdf->SetAutoPageBreak(true, 5);
addCoverLetterPage($this, $pdf);
- $offset += 5;
-
- ob_end_clean();
-
- if ($this->view['preview']) {
-
+ if (ob_get_level() > 0) ob_end_clean();
+
+ if ($this->view['preview']??false) {
+
$pdf->Output($this->view['filename'], 'I');
-
+
} else {
-
+
$pdf->Output($this->view['filename'], 'F');
-
- if ($this->view['output'] === true) $pdf->Output($this->view['filename'], 'I');
-
+
+ if (($this->view['output']??false) === true) $pdf->Output($this->view['filename'], 'I');
+
}
-
\ No newline at end of file diff --git a/views/mods/mod_coverletter/order_view.phtml b/views/mods/mod_coverletter/order_view.phtml index 5bfe585..33b5f86 100644 --- a/views/mods/mod_coverletter/order_view.phtml +++ b/views/mods/mod_coverletter/order_view.phtml @@ -1,92 +1,105 @@ <?php
-
+
/**
* Template für die Integration des Anschreiben Moduls in die Bestellverwaltung
+ * @version 4.6.1
*/
+ if (!defined('ABSPATH')) exit;
+
+ $order_id = (int)($this->view['data']['id']??0);
+ $arCoverLetter = (array)($this->view['mod_coverletter']['arCoverLetter']??[]);
+
+ $arShopLocations = $this->getShopLocations();
+ $arShopLocationLabels = [];
+
+ foreach ($arShopLocations as $l_id => $l) {
+
+ $arShopLocationLabels[$l_id] = $l['label'];
+ }
+
?>
-
-<?php echo wpsg_drawForm_AdminboxStart(__('Anschreiben', 'wpsg'));?>
- <?php if (sizeof($this->view['mod_coverletter']['arCoverLetter']) == 0 ) { ?>
-
- <p><?php echo __('Bisher kein Anschreiben für diese Bestellung geschrieben.', 'wpsg'); ?></p>
-
+<?php echo wpsg_drawForm_AdminboxStart(__('Anschreiben', 'wpsg')); ?>
+
+ <?php if (sizeof($arCoverLetter) === 0) { ?>
+
+ <p><?php echo esc_html__('Bisher kein Anschreiben für diese Bestellung geschrieben.', 'wpsg'); ?></p>
+
<?php } else { ?>
- <?php foreach ($this->view['mod_coverletter']['arCoverLetter'] as $a) { ?>
-
+ <?php foreach ($arCoverLetter as $a) { ?>
+
<div class="wpsg_flex wpsg_flex_justify_content_space_between">
<span>
- <?php echo wpsg_translate(__('#2#: Anschreiben ##1#', 'wpsg'), $a['id'], wpsg_formatTimestamp(strtotime($a['cdate']))); ?>: <?php echo ((strlen($a['text']) > 50)?substr($a['text'],0,50).' ...':$a['text']); ?>
+ <?php echo wpsg_hspc(wpsg_translate(__('#2#: Anschreiben ##1#', 'wpsg'), $a['id'], wpsg_formatTimestamp(strtotime($a['cdate'])))); ?>: <?php echo wpsg_hspc(((strlen($a['text']) > 50)?substr($a['text'], 0, 50).' ...':$a['text'])); ?>
</span>
- <a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_coverletter&noheader=1&action=ajax&order_id=<?php echo $a['order_id']; ?>&cl_id=<?php echo $a['id']; ?>&wpsg_mod_coverletter_get" target="_new">
- <?php echo __('Ansehen', 'wpsg'); ?>
+ <a href="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_coverletter&noheader=1&action=ajax&order_id='.intval($a['order_id']).'&cl_id='.intval($a['id']).'&wpsg_mod_coverletter_get'); ?>" target="_new">
+ <?php echo esc_html__('Ansehen', 'wpsg'); ?>
</a>
</div>
-
+
<?php } ?>
-
+
<?php } ?>
-
+
<br />
-
+
<div class="wpsg_clear"></div>
-
+
<hr />
-
- <div class="inside">
+
+ <div class="inside">
<div>
-
- <form target="_blank" method="post" action="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_coverletter&edit_id=<?php echo $this->view['data']['id']; ?>&action=ajax&noheader=1" id="wpsg_mod_coverletter_form">
- <?php $arShopLocations = $this->getShopLocations(); ?>
- <?php $arShopLocationLabels = []; foreach ($arShopLocations as $l_id => $l) $arShopLocationLabels[$l_id] = $l['label']; ?>
-
+ <form target="_blank" method="post" action="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Order&mod=wpsg_mod_coverletter&edit_id='.$order_id.'&action=ajax&noheader=1'); ?>" id="wpsg_mod_coverletter_form">
+
+ <?php wp_nonce_field('wpsg-coverletter-order_ajax-write-'.$order_id); ?>
+
<?php if (sizeof($arShopLocations) > 1) { ?>
-
+
<?php echo wpsg_drawForm_Select('target', __('Shop Adresse', 'wpsg'), $arShopLocationLabels, '1'); ?>
-
+
<?php } else { ?>
-
+
<input type="hidden" name="target" value="1" />
-
+
<?php } ?>
- <?php echo wpsg_drawForm_Textarea('text', __('Text', 'wpsg'),$this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_coverletter_text'), $this->view['data']['id']), ['noLabel' => true, 'fullLabel' => __('Text für das Anschreiben', 'wpsg'), 'style' => 'height:200px']); ?>
-
+ <?php echo wpsg_drawForm_Textarea('text', __('Text', 'wpsg'), $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_coverletter_text'), $order_id), ['noLabel' => true, 'fullLabel' => __('Text für das Anschreiben', 'wpsg'), 'style' => 'height:200px']); ?>
+
<br />
-
- <input type="submit" name="wpsg_mod_coverletter_write" value="<?php echo __("Speichern & Drucken", "wpsg"); ?>" style="float:left;" class="button button-primary" />
- <input type="submit" name="wpsg_mod_coverletter_preview" onclick="wpsg_form_refresh = false;" value="<?php echo __('Vorschau', 'wpsg'); ?>" style="float:left; margin-left:15px;" class="button" />
-
+
+ <input type="submit" name="wpsg_mod_coverletter_write" value="<?php echo esc_attr__('Speichern & Drucken', 'wpsg'); ?>" style="float:left;" class="button button-primary" />
+ <input type="submit" name="wpsg_mod_coverletter_preview" onclick="wpsg_form_refresh = false;" value="<?php echo esc_attr__('Vorschau', 'wpsg'); ?>" style="float:left; margin-left:15px;" class="button" />
+
<div class="wpsg_clear"></div>
-
+
</form>
-
+
</div>
</div>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
<script>
-
+
var wpsg_form_refresh = true;
-
+
jQuery('#wpsg_mod_coverletter_form').on('submit', function() {
-
+
if (wpsg_form_refresh) {
-
+
setTimeout(function() {
-
+
location.reload();
-
+
}, 1000);
-
+
}
wpsg_form_refresh = true;
-
- } );
-
+
+ });
+
</script>
diff --git a/views/mods/mod_coverletter/settings_edit.phtml b/views/mods/mod_coverletter/settings_edit.phtml index 400f7a7..94ef6f0 100644 --- a/views/mods/mod_coverletter/settings_edit.phtml +++ b/views/mods/mod_coverletter/settings_edit.phtml @@ -1,148 +1,163 @@ <?php
/**
- * Template für die Einstellungen des "Anschreiben" Moduls
- */
+ * Template für die Einstellungen des "Anschreiben" Moduls
+ * @version 4.6.1
+ */
+
+ if (!defined('ABSPATH')) exit;
+
+ $arTexts = $this->view['wpsg_mod_coverletter']['arTexts'];
+
+ $logo_pos = $this->get_option('wpsg_mod_coverletter_logo_position');
+ $defaultAlign = ((!isset($logo_pos) || empty($logo_pos))?'align-buttons-active':'');
+
+ $alignLeft = (($logo_pos === 'left')?'align-buttons-active':'');
+ $alignCenter = (($logo_pos === 'center')?'align-buttons-active':'');
+ $alignRight = (($logo_pos === 'right')?'align-buttons-active':'');
+
+ $logo_transparency = (($this->get_option('wpsg_mod_coverletter_logo_transparency'))?$this->get_option('wpsg_mod_coverletter_logo_transparency'):'100%');
?>
<div>
<ul class="nav nav-tabs" role="tablist">
- <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo __('Vordefinierte Textfelder', 'wpsg'); ?></a></li>
+ <li role="presentation" class="active"><a href="#tab1" aria-controls="home" role="tab" data-toggle="tab"><?php echo esc_html__('Vordefinierte Textfelder', 'wpsg'); ?></a></li>
</ul>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="tab1">
-
+
<?php echo wpsg_drawForm_TextStart(); ?>
<div style="position:relative;">
<?php if ($this->view['wpsg_mod_coverletter']['bp'] === false) { ?>
- <p><?php echo __('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
+ <p><?php echo esc_html__('Es wurde bisher kein Briefpapier hochgeladen', 'wpsg'); ?></p>
<?php } else { ?>
- <a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=getBp&noheader=1" target="_blank"><?php echo __('Derzeitiges Briefpapier', 'wpsg'); ?></a>
+ <a target="_blank" href="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=getBp&noheader=1'); ?>"><?php echo esc_html__('Derzeitiges Briefpapier', 'wpsg'); ?></a>
<?php } ?>
- <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_bp" data-wpsg-tip="mod_coverletter_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_bp"></a>
+ <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_bp" data-wpsg-tip="mod_coverletter_bp" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_bp"></a>
<input type="file" name="wpsg_mod_coverletter_bp">
- <?php $strSuffix = ''; if ($this->view['wpsg_mod_coverletter']['bp'] !== false) { $strSuffix = '
- <label>
- <input type="checkbox" name="wpsg_mod_coverletter_bp_del" value="1" /> '.__('Löschen', 'wpsg').'
- </label>';
- echo __($strSuffix);
- } ?>
+ <?php if ($this->view['wpsg_mod_coverletter']['bp'] !== false) { ?>
+ <label>
+ <input type="checkbox" name="wpsg_mod_coverletter_bp_del" value="1" /> <?php echo esc_html__('Löschen', 'wpsg'); ?>
+ </label>
+ <?php } ?>
</div>
- <?php echo wpsg_drawForm_TextEnd(__('Briefpapier (PDF/JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_coverletter_bp')); ?>
-
+ <?php echo wpsg_drawForm_TextEnd(__('Briefpapier (PDF/JPG)', 'wpsg'), ['noP' => true, 'helps' => 'wpsg_mod_coverletter_bp']); ?>
+
<hr />
-
- <?php echo wpsg_drawForm_Input('wpsg_mod_coverletter_subject', __('Betreff', 'wpsg'),$this->get_option('wpsg_mod_coverletter_subject'), ['help' => 'wpsg_mod_coverletter_subject']); ?>
+
+ <?php echo wpsg_drawForm_Input('wpsg_mod_coverletter_subject', __('Betreff', 'wpsg'), $this->get_option('wpsg_mod_coverletter_subject'), ['help' => 'wpsg_mod_coverletter_subject']); ?>
<?php echo wpsg_drawForm_Textarea('wpsg_mod_coverletter_text', __('Textvorgabe', 'wpsg'), $this->get_option('wpsg_mod_coverletter_text'), ['help' => 'wpsg_mod_coverletter_text']); ?>
-
+
<?php echo wpsg_drawForm_TextStart(); ?>
<div style="position:relative;">
<?php if ($this->view['wpsg_mod_coverletter']['logo'] === false) { ?>
- <p><?php echo __('Es wurde bisher kein Logo hochgeladen', 'wpsg'); ?></p>
+ <p><?php echo esc_html__('Es wurde bisher kein Logo hochgeladen', 'wpsg'); ?></p>
<?php } else { ?>
- <a target="_blank" href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=getLogo&noheader=1" target="_blank"><?php echo __('Derzeitiges Logo', 'wpsg'); ?></a>
+ <a target="_blank" href="<?php echo esc_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=getLogo&noheader=1'); ?>"><?php echo esc_html__('Derzeitiges Logo', 'wpsg'); ?></a>
<?php } ?>
- <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_logo" data-wpsg-tip="mod_coverletter_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_logo"></a>
+ <a class="wpsg_glyphicon_right glyphicon glyphicon-question-sign form-control-feedback" href="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_logo" data-wpsg-tip="mod_coverletter_logo" rel="?page=wpsg-Admin&subaction=loadHelp&noheader=1&field=mod_coverletter_logo"></a>
<input type="file" name="wpsg_mod_coverletter_logo">
- <?php $logo_pos = $this->get_option("wpsg_mod_coverletter_logo_position"); ?>
- <?php $defaultAlign = !isset($logo_pos) || empty($logo_pos) ? "align-buttons-active" : ""; ?>
-
- <?php $alignLeft = $logo_pos === 'left' ? "align-buttons-active" : ""; ?>
- <?php $alignCenter = $logo_pos === 'center' ? "align-buttons-active" : ""; ?>
- <?php $alignRight = $logo_pos === 'right' ? "align-buttons-active" : ""; ?>
-
- <?php $logo_transparency = $this->get_option("wpsg_mod_coverletter_logo_transparency") ?: "100%"; ?>
- <?php $strSuffix = ''; if ($this->view['wpsg_mod_coverletter']['logo'] !== false) { $strSuffix = '
+ <?php if ($this->view['wpsg_mod_coverletter']['logo'] !== false) { ?>
<div class="row"><br />
- <div class="col-md-12">
- <div class="position">
- <input type="text" style="width:45%; float:left; margin-right:10px;" data-toggle="tooltip" class="wpsg_mod_coverletter_logo_x" name="wpsg_mod_coverletter_logo_x" placeholder="'.__('X-Position', 'wpsg').'" value="'.$this->get_option('wpsg_mod_coverletter_logo_x').'" />
- <input type="text" style="width:45%;" data-toggle="tooltip" class="wpsg_mod_coverletter_logo_y" name="wpsg_mod_coverletter_logo_y" placeholder="'.__('Y-Position', 'wpsg').'" value="'.$this->get_option('wpsg_mod_coverletter_logo_y').'" />
- </div>
- </div>
+ <div class="col-md-12">
+ <div class="position">
+ <input type="text" style="width:45%; float:left; margin-right:10px;" data-toggle="tooltip" class="wpsg_mod_coverletter_logo_x" name="wpsg_mod_coverletter_logo_x" placeholder="<?php echo esc_attr__('X-Position', 'wpsg'); ?>" value="<?php echo esc_attr($this->get_option('wpsg_mod_coverletter_logo_x')); ?>" />
+ <input type="text" style="width:45%;" data-toggle="tooltip" class="wpsg_mod_coverletter_logo_y" name="wpsg_mod_coverletter_logo_y" placeholder="<?php echo esc_attr__('Y-Position', 'wpsg'); ?>" value="<?php echo esc_attr($this->get_option('wpsg_mod_coverletter_logo_y')); ?>" />
+ </div>
+ </div>
<div class="col-md-8 logo-transparency">
<label>
- <input type="text" name="wpsg_mod_coverletter_logo_transparency" value="'.$logo_transparency.'" /> '.__('Logodeckkraft', 'wpsg').'
- </label>
+ <input type="text" name="wpsg_mod_coverletter_logo_transparency" value="<?php echo esc_attr($logo_transparency); ?>" /> <?php echo esc_html__('Logodeckkraft', 'wpsg'); ?>
+ </label>
</div>
<div class="col-md-12">
<label style="margin-top:20px; ">
- <input type="checkbox" name="wpsg_mod_coverletter_logo_del" value="1" /> '.__('Löschen', 'wpsg').'
- </label>
+ <input type="checkbox" name="wpsg_mod_coverletter_logo_del" value="1" /> <?php echo esc_html__('Löschen', 'wpsg'); ?>
+ </label>
</div>
- </div>';
- echo __($strSuffix);
- } ?>
+ </div>
+ <?php } ?>
-
-
<button class="button wpsg_coverletter_preview" style="float:right; margin-right:10px;" name="wpsg_coverletter_preview" type="button">
- <?php echo __("Vorschau", "wpsg"); ?>
+ <?php echo esc_html__('Vorschau', 'wpsg'); ?>
</button>
</div>
-
- <?php echo wpsg_drawForm_TextEnd(__('Logo (JPG)', 'wpsg'), array('noP' => true, 'helps' => 'wpsg_mod_coverletter_logo')); ?>
+
+ <?php echo wpsg_drawForm_TextEnd(__('Logo (JPG)', 'wpsg'), ['noP' => true, 'helps' => 'wpsg_mod_coverletter_logo']); ?>
<hr /><br />
+ <style>
+ .wpsg_mod_coverletter_fieldtable { table-layout:fixed; width:100%; }
+ .wpsg_mod_coverletter_fieldtable > thead > tr > th,
+ .wpsg_mod_coverletter_fieldtable > tbody > tr > td { vertical-align:middle; padding:6px 5px; }
+ .wpsg_mod_coverletter_fieldtable .col_bezeichnung { width:110px; }
+ .wpsg_mod_coverletter_fieldtable .col_x,
+ .wpsg_mod_coverletter_fieldtable .col_y { width:70px; }
+ .wpsg_mod_coverletter_fieldtable .col_color { width:56px; }
+ .wpsg_mod_coverletter_fieldtable .col_groesse { width:72px; }
+ .wpsg_mod_coverletter_fieldtable .col_action { width:50px; text-align:center; }
+ .wpsg_mod_coverletter_fieldtable input[type="text"],
+ .wpsg_mod_coverletter_fieldtable select { width:100%; max-width:none; min-width:0; margin:0; }
+ .wpsg_mod_coverletter_fieldtable input.wpsg_mod_coverletter_number { text-align:right; }
+ .wpsg_mod_coverletter_fieldtable input[type="color"] { display:block; width:100%; height:30px; padding:2px; border:1px solid #8c8f94; border-radius:4px; background:#fff; cursor:pointer; }
+ .wpsg_mod_coverletter_fieldtable input[type="checkbox"] { margin:0; }
+ </style>
+
<table class="table table-body-striped wpsg_mod_coverletter_fieldtable">
<thead>
- <tr>
- <th class="col_bezeichnung"><?php echo __('Bezeichnung', 'wpsg'); ?></th>
- <th class="col_freitext"><?php echo __('Freitext', 'wpsg'); ?></th>
- <th class="col_x"><?php echo __('X', 'wpsg'); ?></th>
- <th class="col_y"><?php echo __('Y', 'wpsg'); ?></th>
- <th class="col_color"><?php echo __('Farbe', 'wpsg'); ?></th>
- <th class="col_groesse"><?php echo __('Größe', 'wpsg'); ?></th>
- <th class="col_action"></th>
- </tr>
- </thead>
- <tbody>
- <?php foreach ($this->view['wpsg_mod_coverletter']['fields'] as $f => $field_name) { ?>
<tr>
- <td><?php echo wpsg_hspc($field_name); ?></td>
- <td>
- <input type="text" style="width:100%;" name="text[<?php echo $f; ?>][text]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['text']); ?>" />
- </td>
- <td>
- <input type="text" style="width:100%;" name="text[<?php echo $f; ?>][x]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['x']); ?>" />
- </td>
- <td>
- <input type="text" style="width:100%;" name="text[<?php echo $f; ?>][y]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['y']); ?>" />
- </td>
- <td>
- <input type="text" style="width:100%;" name="text[<?php echo $f; ?>][color]" value="<?php echo wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['color']); ?>" />
- </td>
- <td>
- <select name="text[<?php echo $f; ?>][fontsize]" style="width:100%;">
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "8")?'selected="selected"':''); ?> value="8">8</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "9")?'selected="selected"':''); ?> value="9">9</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "10")?'selected="selected"':''); ?> value="10">10</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "11")?'selected="selected"':''); ?> value="11">11</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "12")?'selected="selected"':''); ?> value="12">12</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "13")?'selected="selected"':''); ?> value="13">13</option>
- <option <?php echo ((wpsg_getStr($this->view['wpsg_mod_coverletter']['arTexts'][$f]['fontsize']) == "14")?'selected="selected"':''); ?> value="14">14</option>
- </select>
- </td>
- <td>
- <input type="checkbox" title="<?php echo __('Diese Checkbox aktivieren, damit die Textzeile verwendet wird.', 'wpsg'); ?>" value="1" name="text[<?php echo $f; ?>][aktiv]" <?php echo ((wpsg_isSizedInt($this->view['wpsg_mod_coverletter']['arTexts'][$f]['aktiv']))?'checked="checked"':''); ?> />
- </td>
+ <th class="col_bezeichnung"><?php echo esc_html__('Bezeichnung', 'wpsg'); ?></th>
+ <th class="col_freitext"><?php echo esc_html__('Freitext', 'wpsg'); ?></th>
+ <th class="col_x"><?php echo esc_html__('X', 'wpsg'); ?></th>
+ <th class="col_y"><?php echo esc_html__('Y', 'wpsg'); ?></th>
+ <th class="col_color"><?php echo esc_html__('Farbe', 'wpsg'); ?></th>
+ <th class="col_groesse"><?php echo esc_html__('Größe', 'wpsg'); ?></th>
+ <th class="col_action"><?php echo esc_html__('Aktiv', 'wpsg'); ?></th>
</tr>
- <?php } ?>
+ </thead>
+ <tbody>
+ <?php foreach ($this->view['wpsg_mod_coverletter']['fields'] as $f => $field_name) { ?>
+ <?php $arText = ((is_array($arTexts[$f]??null))?$arTexts[$f]:[]); ?>
+ <tr>
+ <td><?php echo wpsg_hspc($field_name); ?></td>
+ <td>
+ <input type="text" name="text[<?php echo esc_attr($f); ?>][text]" value="<?php echo esc_attr($arText['text']??''); ?>" />
+ </td>
+ <td>
+ <input type="text" class="wpsg_mod_coverletter_number" inputmode="decimal" name="text[<?php echo esc_attr($f); ?>][x]" value="<?php echo esc_attr($arText['x']??''); ?>" />
+ </td>
+ <td>
+ <input type="text" class="wpsg_mod_coverletter_number" inputmode="decimal" name="text[<?php echo esc_attr($f); ?>][y]" value="<?php echo esc_attr($arText['y']??''); ?>" />
+ </td>
+ <td>
+ <input type="color" name="text[<?php echo esc_attr($f); ?>][color]" value="<?php echo esc_attr($arText['color']??'#000000'); ?>" />
+ </td>
+ <td>
+ <select name="text[<?php echo esc_attr($f); ?>][fontsize]">
+ <?php for ($size = 8; $size <= 14; $size++) { ?>
+ <option <?php echo (((string)($arText['fontsize']??'') === (string)$size)?'selected="selected"':''); ?> value="<?php echo esc_attr($size); ?>"><?php echo esc_html($size); ?></option>
+ <?php } ?>
+ </select>
+ </td>
+ <td class="col_action">
+ <input type="checkbox" title="<?php echo esc_attr__('Diese Checkbox aktivieren, damit die Textzeile verwendet wird.', 'wpsg'); ?>" value="1" name="text[<?php echo esc_attr($f); ?>][aktiv]" <?php echo ((is_numeric($arText['aktiv']??null) && $arText['aktiv'] > 0)?'checked="checked"':''); ?> />
+ </td>
+ </tr>
+ <?php } ?>
</tbody>
</table>
- <input class="button" onclick="if (!confirm('<?php echo __('Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!', 'wpsg'); ?>')) return false; else location.href = '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=<?php echo $_REQUEST['modul']; ?>&do=reset&noheader=1';" type="button" value="<?php echo __('Standardeinstellungen laden', 'wpsg'); ?>" />
+ <input class="button" onclick="if (!confirm('<?php echo esc_js(__('Sind Sie sich sicher? Ihre bisherigen Einstellungen gehen verloren!', 'wpsg')); ?>')) return false; else location.href = '<?php echo esc_js(wp_nonce_url(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=reset&noheader=1', 'wpsg-coverletter-reset')); ?>';" type="button" value="<?php echo esc_attr__('Standardeinstellungen laden', 'wpsg'); ?>" />
<br /><br />
<div class="info">
<p>
- <?php echo __('Die Angaben für X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?><br />
- <?php echo __('Die Farbe wird im Hexadezimalformat angegeben (#FFFFFF für weiß, #000000 für schwarz).', 'wpsg'); ?>
+ <?php echo esc_html__('Die Angaben für X (Abstand von Links) und Y (Abstand von Oben) werden in mm eingetragen.', 'wpsg'); ?>
</p>
</div>
@@ -157,40 +172,42 @@ /**
* Stellt sicher, dass immer nur ein Button der align-buttons die highlight Klasse hat
*/
- function handleLogoAlignClick(pressedEl)
- {
+ function handleLogoAlignClick(pressedEl) {
+
+ if (pressedEl.hasClass('align-buttons-active')) {
+
+ return;
- if(pressedEl.hasClass("align-buttons-active")) return;
- else
- {
+ } else {
- pressedEl.addClass("align-buttons-active");
- pressedEl[0].value = pressedEl[0].value + " selected";
+ pressedEl.addClass('align-buttons-active');
+ pressedEl[0].value = pressedEl[0].value + ' selected';
- jQuery.each($(".logo-align-button"), function(index, element) {
- if(element.classList.contains("align-buttons-active") && element !== pressedEl[0]){
+ jQuery.each(jQuery('.logo-align-button'), function(index, element) {
- var values = element.value.split(" ");
+ if (element.classList.contains('align-buttons-active') && element !== pressedEl[0]) {
+
+ var values = element.value.split(' ');
element.value = values[0];
- element.classList.remove("align-buttons-active");
+ element.classList.remove('align-buttons-active');
return false;
}
+
});
}
- } // function handleLogoAlignClick()
+ } // function handleLogoAlignClick(pressedEl)
/**
* Wird beim Klicken auf den Vorschau Button ausgelöst
*/
- function wpsg_coverletter_preview()
- {
+ function wpsg_coverletter_preview() {
- var url = "<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=orderAjax&noheader=1&wpsg_mod_coverletter_preview=1";
+ var url = <?php echo wp_json_encode(WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_coverletter&do=orderAjax&noheader=1&wpsg_mod_coverletter_preview=1'); ?>;
window.open(url, '_blank');
@@ -198,19 +215,23 @@ } // function wpsg_coverletter_preview()
-
-
jQuery(document).ready(function() {
- jQuery('#wpsg_tab').wpsg_tab( {
+ jQuery('#wpsg_tab').wpsg_tab({
'cookiename': 'wpsg_mod_coverletter_tab',
'tab2': function() {
+
jQuery('.tablink').show();
+
}
- } );
+ });
+
+ jQuery('.wpsg_coverletter_preview').click(function() {
+
+ wpsg_coverletter_preview();
- jQuery(".wpsg_coverletter_preview").click(function(){ wpsg_coverletter_preview(); });
+ });
- } );
+ });
/* ]]> */</script>
\ No newline at end of file diff --git a/views/mods/mod_creditcard/order_view_afterpayment.phtml b/views/mods/mod_creditcard/order_view_afterpayment.phtml index 168f567..96baefe 100644 --- a/views/mods/mod_creditcard/order_view_afterpayment.phtml +++ b/views/mods/mod_creditcard/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Das Template wird in der Bestellansicht eingebunden und zeigt die Kreditkartendaten des Kunden an, die er während der Bestellung angegeben hat
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_creditcard/paymenthint.phtml b/views/mods/mod_creditcard/paymenthint.phtml index 4542906..132bcbb 100644 --- a/views/mods/mod_creditcard/paymenthint.phtml +++ b/views/mods/mod_creditcard/paymenthint.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Kundeneingaben für das Modul "Kreditkarte" in den Checkout2
+ * @version 4.6.1
*/
if (!isset($this->view['error'])) $this->view['error'] = [];
diff --git a/views/mods/mod_creditcard/settings_edit.phtml b/views/mods/mod_creditcard/settings_edit.phtml index 82ebeea..a36cac0 100644 --- a/views/mods/mod_creditcard/settings_edit.phtml +++ b/views/mods/mod_creditcard/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "Kreditkarte"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_crefopay/iframe.phtml b/views/mods/mod_crefopay/iframe.phtml index 7308299..8066664 100644 --- a/views/mods/mod_crefopay/iframe.phtml +++ b/views/mods/mod_crefopay/iframe.phtml @@ -2,6 +2,7 @@ /**
* Template, welches die Zahlung über CrefoPay ermöglicht
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_crefopay/order_done.phtml b/views/mods/mod_crefopay/order_done.phtml index 78943bc..300b5bf 100644 --- a/views/mods/mod_crefopay/order_done.phtml +++ b/views/mods/mod_crefopay/order_done.phtml @@ -3,6 +3,7 @@ /**
* Template, welches die Zahlung nach der Bestellung über CrefoPay ermöglicht
* Wird von warenkorb/done.phtml eingebunden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_crefopay/order_view_afterpayment.phtml b/views/mods/mod_crefopay/order_view_afterpayment.phtml index c293b9a..65f1fc3 100644 --- a/views/mods/mod_crefopay/order_view_afterpayment.phtml +++ b/views/mods/mod_crefopay/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der CrefoPay Zahlungsart in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_crefopay/settings_edit.phtml b/views/mods/mod_crefopay/settings_edit.phtml index 3d0f8ba..37482cf 100644 --- a/views/mods/mod_crefopay/settings_edit.phtml +++ b/views/mods/mod_crefopay/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Einstellungen für das Modul "CrefoPay"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customerbudget/basket_row_end.phtml b/views/mods/mod_customerbudget/basket_row_end.phtml index 30d8a46..9f13b7c 100644 --- a/views/mods/mod_customerbudget/basket_row_end.phtml +++ b/views/mods/mod_customerbudget/basket_row_end.phtml @@ -5,6 +5,7 @@ *
* Wird über den Hook basket_row_end innerhalb des Summenblocks ausgegeben, also
* direkt unter der Auswahl der Zahlungsart - dort kann der Kunde sofort reagieren.
+ * @version 4.6.1
*/
$budget = $this->view['mod_customerbudget']['budget_formatted'];
diff --git a/views/mods/mod_customerbudget/checkout_payment.phtml b/views/mods/mod_customerbudget/checkout_payment.phtml index fa43f40..b452d3f 100644 --- a/views/mods/mod_customerbudget/checkout_payment.phtml +++ b/views/mods/mod_customerbudget/checkout_payment.phtml @@ -2,6 +2,7 @@ /**
* Guthaben innerhalb der Zahlungsart "Kundenbudget" in der Kasse
+ * @version 4.6.1
*/
$budget = $this->view['mod_customerbudget']['budget_formatted'];
diff --git a/views/mods/mod_customerbudget/customer_sidebar.phtml b/views/mods/mod_customerbudget/customer_sidebar.phtml index b4f0f7f..4fadf94 100644 --- a/views/mods/mod_customerbudget/customer_sidebar.phtml +++ b/views/mods/mod_customerbudget/customer_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Budgeterfassung innerhalb der Kundenverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customerbudget/produkt_edit_sidebar.phtml b/views/mods/mod_customerbudget/produkt_edit_sidebar.phtml index 32851c8..1130fde 100644 --- a/views/mods/mod_customerbudget/produkt_edit_sidebar.phtml +++ b/views/mods/mod_customerbudget/produkt_edit_sidebar.phtml @@ -3,6 +3,7 @@ /**
* Template für die Kennzeichnung eines Produkts als Aufladeprodukt innerhalb
* der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customerbudget/profil_budget.phtml b/views/mods/mod_customerbudget/profil_budget.phtml index 6439c1d..95c641c 100644 --- a/views/mods/mod_customerbudget/profil_budget.phtml +++ b/views/mods/mod_customerbudget/profil_budget.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige des Kundenbudgets im Kundenkonto
+ * @version 4.6.1
*/
$budget = $this->view['mod_customerbudget']['budget_formatted'];
diff --git a/views/mods/mod_customerbudget/settings_edit.phtml b/views/mods/mod_customerbudget/settings_edit.phtml index 952fd1c..3e5629e 100644 --- a/views/mods/mod_customerbudget/settings_edit.phtml +++ b/views/mods/mod_customerbudget/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Kundenbudget Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customergroup/addedit.phtml b/views/mods/mod_customergroup/addedit.phtml index 174a377..c3522e1 100644 --- a/views/mods/mod_customergroup/addedit.phtml +++ b/views/mods/mod_customergroup/addedit.phtml @@ -2,6 +2,7 @@ /**
* Template für das Anlegen und Bearbeiten einer Kundengruppe im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customergroup/admin_setcapabilities.phtml b/views/mods/mod_customergroup/admin_setcapabilities.phtml index 13e2444..8d61b5a 100644 --- a/views/mods/mod_customergroup/admin_setcapabilities.phtml +++ b/views/mods/mod_customergroup/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_customergroup/index.phtml b/views/mods/mod_customergroup/index.phtml index 51167a1..7ebe405 100644 --- a/views/mods/mod_customergroup/index.phtml +++ b/views/mods/mod_customergroup/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Kundengruppenübersicht im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_customergroup/settings_edit.phtml b/views/mods/mod_customergroup/settings_edit.phtml index 291edb3..bdfa1be 100644 --- a/views/mods/mod_customergroup/settings_edit.phtml +++ b/views/mods/mod_customergroup/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Einstellungen für das Modul "Kundengruppen"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_debitpayment/settings_edit.phtml b/views/mods/mod_debitpayment/settings_edit.phtml index 1c3d706..d369640 100644 --- a/views/mods/mod_debitpayment/settings_edit.phtml +++ b/views/mods/mod_debitpayment/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Zahlungsart "Nachnahme"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverynote/deliverymail.phtml b/views/mods/mod_deliverynote/deliverymail.phtml index fcffea2..a29eb26 100644 --- a/views/mods/mod_deliverynote/deliverymail.phtml +++ b/views/mods/mod_deliverynote/deliverymail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_deliverynote/deliverymail_html.phtml b/views/mods/mod_deliverynote/deliverymail_html.phtml index 2df62f1..f8a0d3e 100644 --- a/views/mods/mod_deliverynote/deliverymail_html.phtml +++ b/views/mods/mod_deliverynote/deliverymail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_deliverynote/deliverynote_pdf.phtml b/views/mods/mod_deliverynote/deliverynote_pdf.phtml index e08f0c8..3e92d31 100644 --- a/views/mods/mod_deliverynote/deliverynote_pdf.phtml +++ b/views/mods/mod_deliverynote/deliverynote_pdf.phtml @@ -2,6 +2,7 @@ /**
* FPDF Template für die Generierung des Lieferscheins
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/mods/mod_deliverynote/foottext_list.phtml b/views/mods/mod_deliverynote/foottext_list.phtml index c754227..76a059e 100644 --- a/views/mods/mod_deliverynote/foottext_list.phtml +++ b/views/mods/mod_deliverynote/foottext_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Fußtexte
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverynote/order_view_content.phtml b/views/mods/mod_deliverynote/order_view_content.phtml index ac586c2..c8ec69b 100644 --- a/views/mods/mod_deliverynote/order_view_content.phtml +++ b/views/mods/mod_deliverynote/order_view_content.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Lieferscheins in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverynote/order_view_row.phtml b/views/mods/mod_deliverynote/order_view_row.phtml index 567de8e..d405c63 100644 --- a/views/mods/mod_deliverynote/order_view_row.phtml +++ b/views/mods/mod_deliverynote/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktauswahl innerhalb der Bestellansicht
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverynote/settings_edit.phtml b/views/mods/mod_deliverynote/settings_edit.phtml index c4e6ff0..c0464e9 100644 --- a/views/mods/mod_deliverynote/settings_edit.phtml +++ b/views/mods/mod_deliverynote/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des "Lieferschein" Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverytime/basket_row.phtml b/views/mods/mod_deliverytime/basket_row.phtml index 2864d2b..5a6b822 100644 --- a/views/mods/mod_deliverytime/basket_row.phtml +++ b/views/mods/mod_deliverytime/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Lieferzeit in den Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverytime/mail_row.phtml b/views/mods/mod_deliverytime/mail_row.phtml index 993b4b2..35f556f 100644 --- a/views/mods/mod_deliverytime/mail_row.phtml +++ b/views/mods/mod_deliverytime/mail_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in order.phtml (Kundenmail, Adminmail, Auftragsbestätigung ...)
+ * @version 4.6.1
*/
?><?php echo wpsg_pad_right(' ', 5); ?><?php echo __('Lieferzeit', 'wpsg'); ?>: <?php echo $this->view['wpsg_mod_deliverytime']['deliverytime']; ?>
diff --git a/views/mods/mod_deliverytime/mail_row_html.phtml b/views/mods/mod_deliverytime/mail_row_html.phtml index 3bc4a92..9470ffb 100644 --- a/views/mods/mod_deliverytime/mail_row_html.phtml +++ b/views/mods/mod_deliverytime/mail_row_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in html/order.phtml (Kundenmail, Adminmail, Auftragsbestätigung ...)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverytime/overview_row.phtml b/views/mods/mod_deliverytime/overview_row.phtml index b447482..8591ed9 100644 --- a/views/mods/mod_deliverytime/overview_row.phtml +++ b/views/mods/mod_deliverytime/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Lieferzeit in die Bestellübersichtsseite
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverytime/product_bottom.phtml b/views/mods/mod_deliverytime/product_bottom.phtml index a1a7c91..643543f 100755 --- a/views/mods/mod_deliverytime/product_bottom.phtml +++ b/views/mods/mod_deliverytime/product_bottom.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml b/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml index f761c55..c8d6b28 100644 --- a/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml +++ b/views/mods/mod_deliverytime/produkt_addedit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Integration des Moduls "Lieferzeit" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_deliverytime/settings_edit.phtml b/views/mods/mod_deliverytime/settings_edit.phtml index a63bed2..5f221c6 100644 --- a/views/mods/mod_deliverytime/settings_edit.phtml +++ b/views/mods/mod_deliverytime/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Lieferzeit Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_discount/basket_top.phtml b/views/mods/mod_discount/basket_top.phtml index 049e916..465aa07 100644 --- a/views/mods/mod_discount/basket_top.phtml +++ b/views/mods/mod_discount/basket_top.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des nächsten Warenkorbrabattes über dem Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_discount/customergroup_edit.phtml b/views/mods/mod_discount/customergroup_edit.phtml index 69a6f39..76b4646 100644 --- a/views/mods/mod_discount/customergroup_edit.phtml +++ b/views/mods/mod_discount/customergroup_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Rabatts in die Kundengruppenverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_discount/productgroups_addedit_sidebar.phtml b/views/mods/mod_discount/productgroups_addedit_sidebar.phtml index b1def1a..4c029a6 100644 --- a/views/mods/mod_discount/productgroups_addedit_sidebar.phtml +++ b/views/mods/mod_discount/productgroups_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Rabattdefinition innerhalb der Einstellungen der Produktgruppe
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_discount/produkt_addedit_sidebar.phtml b/views/mods/mod_discount/produkt_addedit_sidebar.phtml index f71d0bf..c0e03e6 100644 --- a/views/mods/mod_discount/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_discount/produkt_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Rabattkonfiguration innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_discount/settings_edit.phtml b/views/mods/mod_discount/settings_edit.phtml index 248262b..6c0eeb2 100644 --- a/views/mods/mod_discount/settings_edit.phtml +++ b/views/mods/mod_discount/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Rabatt Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/cronmail.phtml b/views/mods/mod_downloadplus/cronmail.phtml index 2e56cda..03f6aa1 100644 --- a/views/mods/mod_downloadplus/cronmail.phtml +++ b/views/mods/mod_downloadplus/cronmail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die bei erfolgreicher Individualisierung an den Admin gesendet wird
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/cronmail_html.phtml b/views/mods/mod_downloadplus/cronmail_html.phtml index d38a7c8..f5bea54 100644 --- a/views/mods/mod_downloadplus/cronmail_html.phtml +++ b/views/mods/mod_downloadplus/cronmail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die bei erfolgreicher Individualisierung an den Admin gesendet wird (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_downloadplus/filelist.phtml b/views/mods/mod_downloadplus/filelist.phtml index 7cce569..2cf6fe2 100644 --- a/views/mods/mod_downloadplus/filelist.phtml +++ b/views/mods/mod_downloadplus/filelist.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Dateien im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/order_view_sidebar.phtml b/views/mods/mod_downloadplus/order_view_sidebar.phtml index c829451..f959a14 100644 --- a/views/mods/mod_downloadplus/order_view_sidebar.phtml +++ b/views/mods/mod_downloadplus/order_view_sidebar.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration des PDFDownload Moduls in die Bestellverwaltung
* sollte nicht verändert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml b/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml index 95f43dc..80a0583 100644 --- a/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml +++ b/views/mods/mod_downloadplus/order_view_sidebar_renderlist.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Produkte innerhalb der Bestellansicht, wird per Ajax neu geladen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/pdfdownloadmail.phtml b/views/mods/mod_downloadplus/pdfdownloadmail.phtml index e55ed76..705b9a7 100644 --- a/views/mods/mod_downloadplus/pdfdownloadmail.phtml +++ b/views/mods/mod_downloadplus/pdfdownloadmail.phtml @@ -2,6 +2,7 @@ /**
* Mail, die die PDF Downloads an den Kunden sendet
+ * @version 4.6.1
*/
?><?php echo wpsg_translate(__('Hallo #2# #3#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?>
diff --git a/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml b/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml index ee840b0..bf5fa1b 100644 --- a/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml +++ b/views/mods/mod_downloadplus/pdfdownloadmail_html.phtml @@ -2,6 +2,7 @@ /**
* Mail, die die PDF Downloads an den Kunden sendet (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml b/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml index 61735ee..9337766 100644 --- a/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_downloadplus/produkt_addedit_sidebar.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration des Uploadformulars im rechten Bereich
* sollte nicht verändert werden
+ * @version 4.6.1
*/
$view = $this->view['wpsg_mod_downloadplus']??[];
diff --git a/views/mods/mod_downloadplus/settings_edit.phtml b/views/mods/mod_downloadplus/settings_edit.phtml index a9728c5..9feee06 100644 --- a/views/mods/mod_downloadplus/settings_edit.phtml +++ b/views/mods/mod_downloadplus/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des PDFDownload Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadplus/settings_edit_templates.phtml b/views/mods/mod_downloadplus/settings_edit_templates.phtml index 45a8a60..a26d3ae 100644 --- a/views/mods/mod_downloadplus/settings_edit_templates.phtml +++ b/views/mods/mod_downloadplus/settings_edit_templates.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
namespace wpsg;
diff --git a/views/mods/mod_downloadprodukte/order_view_row.phtml b/views/mods/mod_downloadprodukte/order_view_row.phtml index 2a25523..a3d530d 100644 --- a/views/mods/mod_downloadprodukte/order_view_row.phtml +++ b/views/mods/mod_downloadprodukte/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Produkte in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml b/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml index 60ec0ef..f7d3469 100644 --- a/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_downloadprodukte/produkt_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird in der Produktverwaltung in der rechten Spalte verwendet
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadprodukte/produkt_edit_list.phtml b/views/mods/mod_downloadprodukte/produkt_edit_list.phtml index c0e5f32..89baa12 100644 --- a/views/mods/mod_downloadprodukte/produkt_edit_list.phtml +++ b/views/mods/mod_downloadprodukte/produkt_edit_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Dateien eines Download- Produkts
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadprodukte/settings_edit.phtml b/views/mods/mod_downloadprodukte/settings_edit.phtml index b5a5bff..d28ff82 100644 --- a/views/mods/mod_downloadprodukte/settings_edit.phtml +++ b/views/mods/mod_downloadprodukte/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Downloadprodukt Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml b/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml index ff11720..1c691b1 100644 --- a/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml +++ b/views/mods/mod_downloadprodukte/zahlung_downloadprodukt.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Mailtemplate für das DownloadProdukt
*/
diff --git a/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml b/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml index 9da2986..d787c9c 100644 --- a/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml +++ b/views/mods/mod_downloadprodukte/zahlung_downloadprodukt_html.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml'); ?>
<p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['customer']['vname']; ?> <?php echo $this->view['customer']['name']; ?></p>
diff --git a/views/mods/mod_export/fields.phtml b/views/mods/mod_export/fields.phtml index 8861505..d93840a 100644 --- a/views/mods/mod_export/fields.phtml +++ b/views/mods/mod_export/fields.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 03.11.2016
* Time: 14:12
+ * @version 4.6.1
*/
$inlineEdit_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1&profil_id='.$this->view['profil']['id'];
diff --git a/views/mods/mod_export/order_index_tab.phtml b/views/mods/mod_export/order_index_tab.phtml index c7ace13..b0a21d1 100644 --- a/views/mods/mod_export/order_index_tab.phtml +++ b/views/mods/mod_export/order_index_tab.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktexportes in die Bestellvarwaltung im unteren Bereich
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_export/product_index_tab.phtml b/views/mods/mod_export/product_index_tab.phtml index 27df2a9..4b5d7e8 100644 --- a/views/mods/mod_export/product_index_tab.phtml +++ b/views/mods/mod_export/product_index_tab.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Profilauswahl in die Produktverwaltung (Übersicht)
+ * @version 4.6.1
*/
$arProfile = $this->callMod('wpsg_mod_export', 'getProfile', array(wpsg_mod_export::TYPE_PRODUCT));
diff --git a/views/mods/mod_export/profil.phtml b/views/mods/mod_export/profil.phtml index 0c987e9..493665c 100644 --- a/views/mods/mod_export/profil.phtml +++ b/views/mods/mod_export/profil.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen eines Profils
+ * @version 4.6.1
*/
$inlineEdit_url = WPSG_URL_WP.'wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_export&do=inlinedit&noheader=1&profil_id='.$this->view['profil']['id'];
diff --git a/views/mods/mod_export/profillist.phtml b/views/mods/mod_export/profillist.phtml index c763a0e..29fe292 100644 --- a/views/mods/mod_export/profillist.phtml +++ b/views/mods/mod_export/profillist.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Profile
+ * @version 4.6.1
*/
$arProfilSelect = array();
diff --git a/views/mods/mod_export/settings_edit.phtml b/views/mods/mod_export/settings_edit.phtml index e3f6b49..369e522 100644 --- a/views/mods/mod_export/settings_edit.phtml +++ b/views/mods/mod_export/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Export Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_flexipay/order_done.phtml b/views/mods/mod_flexipay/order_done.phtml index 2899958..08864c6 100644 --- a/views/mods/mod_flexipay/order_done.phtml +++ b/views/mods/mod_flexipay/order_done.phtml @@ -2,6 +2,7 @@ /** * Template für die Bestellabschlussseite mit Flexipay + * @version 4.6.1 */ ?> diff --git a/views/mods/mod_flexipay/settings_edit.phtml b/views/mods/mod_flexipay/settings_edit.phtml index 654a1c9..db6f6af 100644 --- a/views/mods/mod_flexipay/settings_edit.phtml +++ b/views/mods/mod_flexipay/settings_edit.phtml @@ -2,6 +2,7 @@ /** * Template für die Einstellungen des FlexiPay Moduls + * @version 4.6.1 */ ?> diff --git a/views/mods/mod_freeshipping/settings_edit.phtml b/views/mods/mod_freeshipping/settings_edit.phtml index c75fc9f..281a981 100644 --- a/views/mods/mod_freeshipping/settings_edit.phtml +++ b/views/mods/mod_freeshipping/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "Versandkostenfrei"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_fuellmenge/basket_row.phtml b/views/mods/mod_fuellmenge/basket_row.phtml index db27717..3e7598d 100644 --- a/views/mods/mod_fuellmenge/basket_row.phtml +++ b/views/mods/mod_fuellmenge/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Füllmenge im Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_fuellmenge/overview_row.phtml b/views/mods/mod_fuellmenge/overview_row.phtml index f889052..0b1c7ca 100644 --- a/views/mods/mod_fuellmenge/overview_row.phtml +++ b/views/mods/mod_fuellmenge/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Füllmenge in die Bestellzusammenfassung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_fuellmenge/priceinfo.phtml b/views/mods/mod_fuellmenge/priceinfo.phtml index 35067c0..a0b3546 100644 --- a/views/mods/mod_fuellmenge/priceinfo.phtml +++ b/views/mods/mod_fuellmenge/priceinfo.phtml @@ -5,6 +5,7 @@ *
* Der Grundpreis wird wie alle Preise mit zwei Nachkommastellen formatiert, Füllmenge und
* Bezugsgröße bleiben ohne erzwungene Nachkommastellen (100 g, 1 kg).
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml b/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml index 579f9f2..4a18027 100644 --- a/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml +++ b/views/mods/mod_fuellmenge/produkt_edit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Konfiguration der Füllmenge innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
$fmenge = wpsg_tf(wpsg_getFloat($this->view['data']['fmenge']));
diff --git a/views/mods/mod_fuellmenge/settings_edit.phtml b/views/mods/mod_fuellmenge/settings_edit.phtml index 62ff582..7213b59 100644 --- a/views/mods/mod_fuellmenge/settings_edit.phtml +++ b/views/mods/mod_fuellmenge/settings_edit.phtml @@ -3,6 +3,7 @@ /**
* Template für die Einstellungen des Füllmengenmoduls
* Sollte nicht verändert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_girocheckout/order_done.phtml b/views/mods/mod_girocheckout/order_done.phtml new file mode 100644 index 0000000..1bc9c97 --- /dev/null +++ b/views/mods/mod_girocheckout/order_done.phtml @@ -0,0 +1,29 @@ +<?php
+
+ /**
+ * Nach dem Bestellabschluss mit einer Zahlart von GiroCheckout
+ * @version 4.6.1
+ */
+
+ if (!defined('ABSPATH')) exit;
+
+ $arView = $this->view['wpsg_mod_girocheckout'];
+ $bDone = (($arView['done']??'') === '1');
+ $strLink = (string)($arView['link']??'');
+ $strName = (string)($arView['name']??'');
+
+?>
+
+<?php if (!$bDone) { ?>
+
+ <p><?php echo esc_html(wpsg_translate(__('Bitte bezahlen Sie den Betrag jetzt mit #1#.', 'wpsg'), $strName)); ?></p>
+
+ <p>
+ <a class="wpsg_button wp-element-button" href="<?php echo esc_url($strLink); ?>"><?php echo esc_html(wpsg_translate(__('Jetzt mit #1# bezahlen', 'wpsg'), $strName)); ?></a>
+ </p>
+
+<?php } else { ?>
+
+ <p><?php echo esc_html(wpsg_translate(__('Die Zahlung mit #1# ist eingegangen.', 'wpsg'), $strName)); ?></p>
+
+<?php } ?>
diff --git a/views/mods/mod_girocheckout/order_view_afterpayment.phtml b/views/mods/mod_girocheckout/order_view_afterpayment.phtml new file mode 100644 index 0000000..237e82e --- /dev/null +++ b/views/mods/mod_girocheckout/order_view_afterpayment.phtml @@ -0,0 +1,72 @@ +<?php
+
+ /**
+ * GiroCheckout-Daten in der Bestellansicht
+ * @version 4.6.1
+ */
+
+ if (!defined('ABSPATH')) exit;
+
+ $arView = $this->view['wpsg_mod_girocheckout'];
+ $oOrder = $arView['oOrder'];
+ $oMod = $this->arModule['wpsg_mod_girocheckout'];
+
+ $strPaid = (string)$oOrder->getMeta(wpsg_mod_girocheckout::META_PAID);
+ $strReference = (($strPaid !== '')?$strPaid:(string)$oOrder->getMeta(wpsg_mod_girocheckout::META_REFERENCE));
+ $strResult = (string)$oOrder->getMeta(wpsg_mod_girocheckout::META_RESULT);
+ $nAmount = intval($oOrder->getMeta(wpsg_mod_girocheckout::META_AMOUNT));
+ $nRefunded = intval($oOrder->getMeta(wpsg_mod_girocheckout::META_REFUNDED));
+ $nRefundable = intval($arView['nRefundable']);
+
+ if ($strPaid !== '') {
+
+ $strState = '<span class="label label-success" style="font-size:12px;">'.esc_html($oMod->getResultLabel(4000)).'</span>';
+
+ } else if ($strResult !== '') {
+
+ $strState = '<span class="label label-warning" style="font-size:12px;">'.esc_html($oMod->getResultLabel(intval($strResult))).'</span>';
+
+ } else {
+
+ $strState = '<span class="label label-default" style="font-size:12px;">'.esc_html__('noch nicht bezahlt', 'wpsg').'</span>';
+
+ }
+
+?>
+
+<?php if ($strReference !== '') { ?>
+
+ <?php echo wpsg_drawForm_Text(__('GiroCheckout Status', 'wpsg'), $strState.' <a class="btn btn-default btn-xs" href="'.esc_url($arView['refreshURL']).'"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> '.esc_html__('Status aktualisieren', 'wpsg').'</a>'); ?>
+ <?php echo wpsg_drawForm_Text(__('GiroCheckout Referenz', 'wpsg'), '<code>'.esc_html($strReference).'</code>'); ?>
+
+ <?php if ((string)$oOrder->getMeta(wpsg_mod_girocheckout::META_BACKEND_ID) !== '') { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Transaktions-ID', 'wpsg'), '<code>'.esc_html($oOrder->getMeta(wpsg_mod_girocheckout::META_BACKEND_ID)).'</code>'); ?>
+
+ <?php } ?>
+
+ <?php if ($nAmount > 0) { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Bezahlt', 'wpsg'), esc_html(wpsg_ff($nAmount / 100, wpsg_mod_girocheckout::CURRENCY))); ?>
+
+ <?php } ?>
+
+ <?php if ($nRefunded > 0) { ?>
+
+ <?php echo wpsg_drawForm_Text(__('Erstattet', 'wpsg'), esc_html(wpsg_ff($nRefunded / 100, wpsg_mod_girocheckout::CURRENCY))); ?>
+
+ <?php } ?>
+
+ <?php if ($nRefundable > 0) { ?>
+
+ <form method="post" action="<?php echo esc_url($arView['refundURL']); ?>" onsubmit="return confirm(<?php echo esc_attr(wp_json_encode(__('Den Betrag über GiroCheckout erstatten?', 'wpsg'))); ?>);">
+
+ <?php echo wpsg_drawForm_Input('wpsg_mod_girocheckout_refund_amount', __('Erstattungsbetrag', 'wpsg'), wpsg_ff($nRefundable / 100), ['hint' => esc_html(wpsg_translate(__('Höchstens #1#', 'wpsg'), wpsg_ff($nRefundable / 100, wpsg_mod_girocheckout::CURRENCY)))]); ?>
+
+ <p><button type="submit" class="button"><?php echo esc_html__('Betrag erstatten', 'wpsg'); ?></button></p>
+
+ </form>
+
+ <?php } ?>
+
+<?php } ?>
diff --git a/views/mods/mod_girocheckout/settings_edit.phtml b/views/mods/mod_girocheckout/settings_edit.phtml new file mode 100644 index 0000000..bbf566e --- /dev/null +++ b/views/mods/mod_girocheckout/settings_edit.phtml @@ -0,0 +1,86 @@ +<?php
+
+ /**
+ * Einstellungen des Moduls GiroCheckout
+ * @version 4.6.1
+ */
+
+ if (!defined('ABSPATH')) exit;
+
+ $arView = $this->view['wpsg_mod_girocheckout'];
+ $arStatus = (array)($arView['arStatus']??[]);
+ $arStornoStatus = (array)$this->get_option('wpsg_mod_girocheckout_stornostate');
+ $oMod = $this->arModule['wpsg_mod_girocheckout'];
+
+ $strBadge = '<span class="label label-%s" style="font-size:12px;">%s</span>';
+
+?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Zugang zu GiroCheckout', 'wpsg'), 'wpsg_mod_girocheckout_access'); ?>
+
+ <?php echo wpsg_drawForm_Input('wpsg_mod_girocheckout_merchantid', __('Händler-ID', 'wpsg'), $this->get_option('wpsg_mod_girocheckout_merchantid'), ['help' => 'wpsg_mod_girocheckout_merchantid', 'hint' => wpsg_translate(__('Händler-ID, Projekt-IDs und Projektkennwörter stehen im <a target="_blank" href="#1#">GiroCockpit</a>. Jede Zahlart ist dort ein eigenes Projekt.', 'wpsg'), 'https://www.girocockpit.de/')]); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php foreach ($arView['arMethods'] as $index => $arMethod) { ?>
+
+ <?php
+
+ $bCredentials = ((string)$this->get_option('wpsg_mod_girocheckout_merchantid') !== '' && (string)$this->get_option($oMod->getMethodOptionKey($index, 'projectid')) !== '' && (string)$this->get_option($oMod->getMethodOptionKey($index, 'projectpw')) !== '');
+ $arMethodStatus = ($arStatus['methods'][$index]??null);
+
+ if (!$bCredentials) {
+
+ $strConnection = sprintf($strBadge, 'default', esc_html__('Keine Zugangsdaten hinterlegt', 'wpsg'));
+
+ } else if (!is_array($arMethodStatus)) {
+
+ $strConnection = sprintf($strBadge, 'default', esc_html__('Noch nicht geprüft, bitte speichern', 'wpsg'));
+
+ } else if ($arMethodStatus['ok'] === true) {
+
+ $strConnection = sprintf($strBadge, 'success', esc_html__('Verbindung erfolgreich', 'wpsg')).' <small class="text-muted">'.esc_html(wpsg_formatTimestamp($arStatus['time'])).'</small>';
+
+ } else {
+
+ $strConnection = sprintf($strBadge, 'danger', esc_html__('Anmeldung fehlgeschlagen', 'wpsg')).'<br /><small class="text-danger">'.esc_html($arMethodStatus['message']).'</small>';
+
+ }
+
+ $strPwHint = (((string)$this->get_option($oMod->getMethodOptionKey($index, 'projectpw')) !== '')?__('Gespeichert. Zum Ändern neu eingeben, sonst leer lassen.', 'wpsg'):'');
+
+ ?>
+
+ <?php wpsg_drawForm_AdminboxStart($arMethod['name'], 'wpsg_mod_girocheckout_method_'.$index); ?>
+
+ <?php echo wpsg_drawForm_Checkbox($oMod->getMethodOptionKey($index, 'active'), __('Aktiv', 'wpsg'), $this->get_option($oMod->getMethodOptionKey($index, 'active')), ['help' => 'wpsg_shippay_activ']); ?>
+ <?php echo wpsg_drawForm_Text(__('Verbindung', 'wpsg'), $strConnection); ?>
+ <?php echo wpsg_drawForm_Input($oMod->getMethodOptionKey($index, 'projectid'), __('Projekt-ID', 'wpsg'), $this->get_option($oMod->getMethodOptionKey($index, 'projectid')), ['help' => 'wpsg_mod_girocheckout_projectid']); ?>
+ <?php echo wpsg_drawForm_Input($oMod->getMethodOptionKey($index, 'projectpw'), __('Projektkennwort', 'wpsg'), '', ['type' => 'password', 'help' => 'wpsg_mod_girocheckout_projectpw', 'hint' => esc_html($strPwHint)]); ?>
+ <?php echo wpsg_drawForm_Input($oMod->getMethodOptionKey($index, 'name'), __('Bezeichnung', 'wpsg'), $this->get_option($oMod->getMethodOptionKey($index, 'name')), ['help' => 'wpsg_shippay_name']); ?>
+ <?php echo wpsg_drawForm_Textarea($oMod->getMethodOptionKey($index, 'hint'), __('Hinweistext', 'wpsg'), $this->get_option($oMod->getMethodOptionKey($index, 'hint')), ['help' => 'wpsg_shippay_hint']); ?>
+ <?php echo wpsg_drawForm_Input($oMod->getMethodOptionKey($index, 'fee'), __('Gebühr/Rabatt', 'wpsg'), wpsg_ff($this->get_option($oMod->getMethodOptionKey($index, 'fee')), true), ['help' => 'wpsg_shippay_gebuehr', 'unit' => $this->get_option('wpsg_currency').' / %']); ?>
+ <?php echo wpsg_drawForm_Select($oMod->getMethodOptionKey($index, 'tax_key'), __('Mehrwertsteuersatz', 'wpsg'), wpsg_tax_groups(), $this->get_option($oMod->getMethodOptionKey($index, 'tax_key')), ['help' => 'wpsg_shippay_mwst']); ?>
+
+ <?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php } ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Zahlungsablauf', 'wpsg'), 'wpsg_mod_girocheckout_process'); ?>
+
+ <?php echo wpsg_drawForm_Input('wpsg_mod_girocheckout_subject', __('Verwendungszweck', 'wpsg'), $this->get_option('wpsg_mod_girocheckout_subject'), ['help' => 'wpsg_mod_girocheckout_subject', 'hint' => esc_html__('Höchstens 27 Zeichen, längere werden gekürzt.', 'wpsg')]); ?>
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_girocheckout_autostart', __('Zahlung sofort starten', 'wpsg'), $this->get_option('wpsg_mod_girocheckout_autostart'), ['help' => 'wpsg_shippay_paystart', 'hint' => esc_html__('Leitet den Kunden direkt nach dem Bestellabschluss zur Zahlung weiter. Sonst bezahlt er über den Knopf auf der Abschlussseite oder den Link in der Bestellmail.', 'wpsg')]); ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
+
+<?php wpsg_drawForm_AdminboxStart(__('Erstattung bei Statuswechsel', 'wpsg'), 'wpsg_mod_girocheckout_storno'); ?>
+
+ <p class="text-muted"><?php echo esc_html__('Wechselt eine über GiroCheckout bezahlte Bestellung in einen der markierten Status, wird der noch nicht erstattete Betrag automatisch erstattet.', 'wpsg'); ?></p>
+
+ <?php foreach ($this->arStatus as $status_id => $status_label) { ?>
+
+ <?php echo wpsg_drawForm_Checkbox('wpsg_mod_girocheckout_stornostate['.$status_id.']', __($status_label, 'wpsg'), ($arStornoStatus[$status_id]??'0')); ?>
+
+ <?php } ?>
+
+<?php wpsg_drawForm_AdminboxEnd(); ?>
diff --git a/views/mods/mod_giropay/order_done.phtml b/views/mods/mod_giropay/order_done.phtml index 0a3e276..36947f8 100644 --- a/views/mods/mod_giropay/order_done.phtml +++ b/views/mods/mod_giropay/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige nach der Bestellung bei Auswahl einer Giropay Zahlungsart
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_giropay/settings_edit.phtml b/views/mods/mod_giropay/settings_edit.phtml index 3d44b65..b8cce61 100755 --- a/views/mods/mod_giropay/settings_edit.phtml +++ b/views/mods/mod_giropay/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "giropay"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_gutschein/add.phtml b/views/mods/mod_gutschein/add.phtml index a3c19b9..4c38e4d 100644 --- a/views/mods/mod_gutschein/add.phtml +++ b/views/mods/mod_gutschein/add.phtml @@ -2,6 +2,7 @@ /**
* Template für die Maske eines neuen Gutscheins
+ * @version 4.6.1
*/
$used = 0;
diff --git a/views/mods/mod_gutschein/admin_setcapabilities.phtml b/views/mods/mod_gutschein/admin_setcapabilities.phtml index 0f49d85..8388f80 100644 --- a/views/mods/mod_gutschein/admin_setcapabilities.phtml +++ b/views/mods/mod_gutschein/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_gutschein/basket_row_end.phtml b/views/mods/mod_gutschein/basket_row_end.phtml index 3589d52..e75ba90 100644 --- a/views/mods/mod_gutschein/basket_row_end.phtml +++ b/views/mods/mod_gutschein/basket_row_end.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Gutscheineingabe innerhalb des Warenkorbes
+ * @version 4.6.1
*/
?>
@@ -15,7 +16,7 @@ <input id="wpsg_gutschein_input" class="wpsg_gutschein_input <?php echo ((in_array("gutschein", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" name="wpsg[gutschein]" value="" />
</div>
<div class="codegsr">
- <input class="wpsg_button wpsg_gutschein_add" type="submit" name="wpsg_gutschein_add" value="<?php echo ' '.__('Einlösen', 'wpsg').' '; ?>" />
+ <input class="wpsg_button wpsg_gutschein_add<?php echo wpsg_button_class(); ?>" type="submit" name="wpsg_gutschein_add" value="<?php echo ' '.__('Einlösen', 'wpsg').' '; ?>" />
</div>
</div>
\ No newline at end of file diff --git a/views/mods/mod_gutschein/basket_row_end_coupon.phtml b/views/mods/mod_gutschein/basket_row_end_coupon.phtml index 53d8483..135ce78 100644 --- a/views/mods/mod_gutschein/basket_row_end_coupon.phtml +++ b/views/mods/mod_gutschein/basket_row_end_coupon.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 20.07.2019
* Time: 15:47
+ * @version 4.6.1
*/
$arCalculation = &$this->view['basket']['arCalculation'];
diff --git a/views/mods/mod_gutschein/import.phtml b/views/mods/mod_gutschein/import.phtml index dc3e6e9..b921482 100644 --- a/views/mods/mod_gutschein/import.phtml +++ b/views/mods/mod_gutschein/import.phtml @@ -2,6 +2,7 @@ /**
* Template für den Import von Gutscheinen über CSV Datei
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_gutschein/index.phtml b/views/mods/mod_gutschein/index.phtml index 0436ba5..71784f2 100644 --- a/views/mods/mod_gutschein/index.phtml +++ b/views/mods/mod_gutschein/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Übersicht der Gutschein
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_gutschein/mail_order_end.phtml b/views/mods/mod_gutschein/mail_order_end.phtml index f1978f9..d60a054 100644 --- a/views/mods/mod_gutschein/mail_order_end.phtml +++ b/views/mods/mod_gutschein/mail_order_end.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 31.07.2019
* Time: 17:15
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/mods/mod_gutschein/mail_order_end_html.phtml b/views/mods/mod_gutschein/mail_order_end_html.phtml index 2862c73..e1d2aec 100644 --- a/views/mods/mod_gutschein/mail_order_end_html.phtml +++ b/views/mods/mod_gutschein/mail_order_end_html.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 31.07.2019
* Time: 17:15
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/mods/mod_gutschein/overview_row_end_coupon.phtml b/views/mods/mod_gutschein/overview_row_end_coupon.phtml index 045776f..2458b91 100644 --- a/views/mods/mod_gutschein/overview_row_end_coupon.phtml +++ b/views/mods/mod_gutschein/overview_row_end_coupon.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_gutschein/settings_edit.phtml b/views/mods/mod_gutschein/settings_edit.phtml index 0a03188..35e2be3 100644 --- a/views/mods/mod_gutschein/settings_edit.phtml +++ b/views/mods/mod_gutschein/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Gutscheinmoduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_icp/order_done.phtml b/views/mods/mod_icp/order_done.phtml index 8fccf04..ba47499 100644 --- a/views/mods/mod_icp/order_done.phtml +++ b/views/mods/mod_icp/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template für die Bestellabschlussseite mit SecurePay
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_icp/settings_edit.phtml b/views/mods/mod_icp/settings_edit.phtml index c9de970..a911161 100644 --- a/views/mods/mod_icp/settings_edit.phtml +++ b/views/mods/mod_icp/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des ICP Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_klarna/order_done.phtml b/views/mods/mod_klarna/order_done.phtml index 7385448..7c8bc20 100644 --- a/views/mods/mod_klarna/order_done.phtml +++ b/views/mods/mod_klarna/order_done.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_klarna/order_view_afterpayment.phtml b/views/mods/mod_klarna/order_view_afterpayment.phtml index 032bf7e..8381500 100644 --- a/views/mods/mod_klarna/order_view_afterpayment.phtml +++ b/views/mods/mod_klarna/order_view_afterpayment.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_klarna/pay.phtml b/views/mods/mod_klarna/pay.phtml index 79661d6..f6bc899 100644 --- a/views/mods/mod_klarna/pay.phtml +++ b/views/mods/mod_klarna/pay.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_klarna/settings_edit.phtml b/views/mods/mod_klarna/settings_edit.phtml index e9c53b2..082dccc 100644 --- a/views/mods/mod_klarna/settings_edit.phtml +++ b/views/mods/mod_klarna/settings_edit.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_kundenkontakt/order_index_bottom.phtml b/views/mods/mod_kundenkontakt/order_index_bottom.phtml index c42ad3d..7fb7237 100644 --- a/views/mods/mod_kundenkontakt/order_index_bottom.phtml +++ b/views/mods/mod_kundenkontakt/order_index_bottom.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_kundenkontakt/order_view.phtml b/views/mods/mod_kundenkontakt/order_view.phtml index f0c1625..018c418 100644 --- a/views/mods/mod_kundenkontakt/order_view.phtml +++ b/views/mods/mod_kundenkontakt/order_view.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<script type="text/javascript">
jQuery(document).ready(function() {
diff --git a/views/mods/mod_kundenkontakt/settings_edit.phtml b/views/mods/mod_kundenkontakt/settings_edit.phtml index 3671d6b..6e97caf 100644 --- a/views/mods/mod_kundenkontakt/settings_edit.phtml +++ b/views/mods/mod_kundenkontakt/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Einstellungen für das Kundenkontaktmodul
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml b/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml index 781156c..6a9061f 100644 --- a/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml +++ b/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
global $template_name, $template_betreff, $absender_name, $absender_email;
diff --git a/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml b/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml index 6354b35..e6fb2df 100644 --- a/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml +++ b/views/mods/mod_kundenkontakt/templates/zahlungsaufforderung_html.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
global $template_name, $template_betreff, $absender_name, $absender_email;
diff --git a/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml b/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml index 3f15c19..8a0aed1 100644 --- a/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml +++ b/views/mods/mod_kundenkontakt/templates/zahlungserinnerung.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
global $template_name, $template_betreff, $absender_name, $absender_email;
diff --git a/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml b/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml index 90298e0..86e87b6 100644 --- a/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml +++ b/views/mods/mod_kundenkontakt/templates/zahlungserinnerung_html.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
global $template_name, $template_betreff, $absender_name, $absender_email;
diff --git a/views/mods/mod_kundenverwaltung/account_nav.phtml b/views/mods/mod_kundenverwaltung/account_nav.phtml new file mode 100644 index 0000000..45a8ea1 --- /dev/null +++ b/views/mods/mod_kundenverwaltung/account_nav.phtml @@ -0,0 +1,19 @@ +<?php + + /** + * Kontonavigation über Profil, Bestellungen und Abonnements, nur für angemeldete Kunden + * @version 4.6.1 + */ + + defined('ABSPATH') || exit; + + $arNav = $this->view['wpsg_mod_kundenverwaltung']['nav']; + +?> +<nav class="wpsg-account-nav<?php echo (($arNav['align'] !== '')?' '.esc_attr($arNav['align']):''); ?>" aria-label="<?php echo esc_attr__('Kundenkonto', 'wpsg'); ?>"> + <ul class="wpsg-account-nav__list"> + <?php foreach ($arNav['items'] as $item) { ?> + <li class="wpsg-account-nav__item wpsg-account-nav__item--<?php echo esc_attr($item['key']); ?>"><a class="wpsg-account-nav__link" href="<?php echo esc_url($item['url']); ?>"<?php if ($item['current']) { ?> aria-current="page"<?php } ?>><?php echo esc_html($item['label']); ?></a></li> + <?php } ?> + </ul> +</nav> diff --git a/views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml b/views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml index fb2df13..58351f9 100644 --- a/views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml +++ b/views/mods/mod_kundenverwaltung/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml b/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml index e66d3bc..1a6109f 100644 --- a/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml +++ b/views/mods/mod_kundenverwaltung/checkout_customer_inner.phtml @@ -3,19 +3,23 @@ /**
* Template für die Registrierung während des Checkouts
* wird von checkout.phtml eingebunden
+ * @version 4.6.1
*/
+ // Bei Registrierungspflicht oder nach einem Fehler stehen die Passwortfelder offen (K124)
+ $bOpen = ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1' || in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']));
+
?>
<label for="checkout_login" style="line-height:35px; margin-top:25px; cursor:pointer;">
<?php /* display:none, bis Option aktiv */ ?>
- <input <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'checked="checked"':''); ?> type="checkbox" id="checkout_login" value="" onclick="jQuery('#checkout_login_fields').toggle();">
+ <input <?php echo (($bOpen)?'checked="checked"':''); ?> type="checkbox" id="checkout_login" value="" onclick="jQuery('#checkout_login_fields').toggle();">
<span class="wpsg-checkbox-label">Ich möchte ein Kundenkonto anlegen.</span>
</label>
<?php /* aktiv bei Registrierungszwang - aktiv bei Fehlermeldung */ ?>
-<div id="checkout_login_fields" style="display:<?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'block':'none'); ?>;">
+<div id="checkout_login_fields" style="display:<?php echo (($bOpen)?'block':'none'); ?>;">
<div class="wpsg_checkoutblock">
- <label for="wpsg_mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
+ <label for="mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
</label>
<input class="wpsg_checkout <?php echo (($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1')?'validate[required]':''); ?> <?php echo ((in_array("mod_kundenverwaltung_pwd1", (array)$this->view['error']))?'wpsg_error':''); ?>" type="password" id="mod_kundenverwaltung_pwd1" name="wpsg[mod_kundenverwaltung][pwd1]" value="" />
diff --git a/views/mods/mod_kundenverwaltung/checkout_login.phtml b/views/mods/mod_kundenverwaltung/checkout_login.phtml index 1f16a93..252e437 100644 --- a/views/mods/mod_kundenverwaltung/checkout_login.phtml +++ b/views/mods/mod_kundenverwaltung/checkout_login.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration des Login Formulares in den Checkout
* wird von checkout.phtml eingebunden
+ * @version 4.6.1
*/
?>
@@ -38,7 +39,7 @@ <div class="wpsg_checkoutblock">
<a class="wpsg_pwdvergessen_link" href="<?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'getPwdVergessenURL'); ?>">Passwort vergessen?</a>
- <input type="submit" class="wpsg_button wpsg_mod_kundenverwaltung_login" value="<?php echo __('Login', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_login" formnovalidate />
+ <input type="submit" class="wpsg_button wpsg_mod_kundenverwaltung_login<?php echo wpsg_button_class(); ?>" value="<?php echo __('Login', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_login" formnovalidate />
</div>
<div class="wpsg_clearer"></div><br />
diff --git a/views/mods/mod_kundenverwaltung/checkout_logout.phtml b/views/mods/mod_kundenverwaltung/checkout_logout.phtml index d523874..30113e3 100644 --- a/views/mods/mod_kundenverwaltung/checkout_logout.phtml +++ b/views/mods/mod_kundenverwaltung/checkout_logout.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration des Logout Buttons in den Checkout
* wird von checkout.phtml eingebunden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/edit.phtml b/views/mods/mod_kundenverwaltung/edit.phtml index c3df1ac..37ef508 100644 --- a/views/mods/mod_kundenverwaltung/edit.phtml +++ b/views/mods/mod_kundenverwaltung/edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Bearbeitung eines Kunden im Backend
+ * @version 4.6.1
*/
$oCustomer = wpsg_customer::getInstance(intval($_REQUEST['edit_id']??0));
diff --git a/views/mods/mod_kundenverwaltung/getpwd.phtml b/views/mods/mod_kundenverwaltung/getpwd.phtml index 0a2be5d..8cf94cb 100644 --- a/views/mods/mod_kundenverwaltung/getpwd.phtml +++ b/views/mods/mod_kundenverwaltung/getpwd.phtml @@ -2,6 +2,7 @@ /**
* Template für die Seite, auf der der Kunde sein Passwort erneuern kann
+ * @version 4.6.1
*/
?>
@@ -25,7 +26,7 @@ <br />
- <input type="submit" value="<?php echo __('Passwort anfordern', 'wpsg'); ?>" class="wpsg_button wpsg_button_sendpwd" name="wpsg_mod_kundenverwaltung_sendpwd" />
+ <input type="submit" value="<?php echo __('Passwort anfordern', 'wpsg'); ?>" class="wpsg_button wpsg_button_sendpwd<?php echo wpsg_button_class(); ?>" name="wpsg_mod_kundenverwaltung_sendpwd" />
<?php $this->ClearSessionErrors(); ?>
diff --git a/views/mods/mod_kundenverwaltung/import.phtml b/views/mods/mod_kundenverwaltung/import.phtml index 8bd50df..482999d 100644 --- a/views/mods/mod_kundenverwaltung/import.phtml +++ b/views/mods/mod_kundenverwaltung/import.phtml @@ -2,6 +2,7 @@ /**
* Template für die Importmaske in der Kundenverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/index.phtml b/views/mods/mod_kundenverwaltung/index.phtml index 07ef1e7..5617307 100644 --- a/views/mods/mod_kundenverwaltung/index.phtml +++ b/views/mods/mod_kundenverwaltung/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Kundenübersichtsseite im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/index_setAccount.phtml b/views/mods/mod_kundenverwaltung/index_setAccount.phtml index 99f485b..56ba81f 100644 --- a/views/mods/mod_kundenverwaltung/index_setAccount.phtml +++ b/views/mods/mod_kundenverwaltung/index_setAccount.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für die Auswahl der Kunden für die Kundenzusammenfassung
diff --git a/views/mods/mod_kundenverwaltung/login.phtml b/views/mods/mod_kundenverwaltung/login.phtml index 1c6c44a..34229f0 100644 --- a/views/mods/mod_kundenverwaltung/login.phtml +++ b/views/mods/mod_kundenverwaltung/login.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird angezeigt, wenn z.B. auf die Profilseite zugegriffen wird und der User nicht eingelogt ist
+ * @version 4.6.1
*/
?>
@@ -43,7 +44,7 @@ <div class="wpsg_checkoutblock">
<a class="wpsg_pwdvergessen_link" href="<?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'getPwdVergessenURL'); ?>">Passwort vergessen?</a>
- <input type="submit" class="wpsg_button wpsg_mod_kundenverwaltung_login" value="<?php echo __('Login', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_login" />
+ <input type="submit" class="wpsg_button wpsg_mod_kundenverwaltung_login<?php echo wpsg_button_class(); ?>" value="<?php echo __('Login', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_login" />
</div>
<div class="wpsg_clearer"></div><br />
diff --git a/views/mods/mod_kundenverwaltung/logout.phtml b/views/mods/mod_kundenverwaltung/logout.phtml index 1ae3443..94f39e6 100644 --- a/views/mods/mod_kundenverwaltung/logout.phtml +++ b/views/mods/mod_kundenverwaltung/logout.phtml @@ -2,6 +2,7 @@ /**
* Wird angezeigt, wenn die Registrierungsseite aufgerufen wird und man bereits eingelogt ist
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/mail_activate.phtml b/views/mods/mod_kundenverwaltung/mail_activate.phtml index 1c9cc35..a4a0582 100644 --- a/views/mods/mod_kundenverwaltung/mail_activate.phtml +++ b/views/mods/mod_kundenverwaltung/mail_activate.phtml @@ -3,6 +3,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn der Status seines Accounts ändert
* und die entsprechende Option aktiviert ist
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_kundenverwaltung/mail_activate_html.phtml b/views/mods/mod_kundenverwaltung/mail_activate_html.phtml index c57c69d..16ef435 100644 --- a/views/mods/mod_kundenverwaltung/mail_activate_html.phtml +++ b/views/mods/mod_kundenverwaltung/mail_activate_html.phtml @@ -3,6 +3,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn der Status seines Accounts ändert
* und die entsprechende Option aktiviert ist (HTML)
+ * @version 4.6.1
*/
?><p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['kunde']['vname'], $this->view['kunde']['name']); ?></p>
diff --git a/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml b/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml index 0df38a1..f185dd9 100644 --- a/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml +++ b/views/mods/mod_kundenverwaltung/mail_pwdrequest.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail einer Anfrage nach einem neuen Passwort
+ * @version 4.6.1
*/
/** @var $oCustomer wpsg_customer */
diff --git a/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml b/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml index da34fce..a9b03a0 100644 --- a/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml +++ b/views/mods/mod_kundenverwaltung/mail_pwdrequest_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail einer Anfrage nach einem neuen Passwort (HTML)
+ * @version 4.6.1
*/
/** @var $oCustomer wpsg_customer */
diff --git a/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml b/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml index bf9dc9c..032e897 100644 --- a/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml +++ b/views/mods/mod_kundenverwaltung/mail_pwdsend.phtml @@ -2,6 +2,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn er die Passwort Anfrage erfolgreich bestätigt hat
+ * @version 4.6.1
*/
/** @var $oCustomer wpsg_customer */
diff --git a/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml b/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml index 486b0fe..6cf1c45 100644 --- a/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml +++ b/views/mods/mod_kundenverwaltung/mail_pwdsend_html.phtml @@ -2,6 +2,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn er die Passwort Anfrage erfolgreich bestätigt hat
+ * @version 4.6.1
*/
/** @var $oCustomer wpsg_customer */
diff --git a/views/mods/mod_kundenverwaltung/mail_register.phtml b/views/mods/mod_kundenverwaltung/mail_register.phtml index 5b5c4bd..fdb7262 100644 --- a/views/mods/mod_kundenverwaltung/mail_register.phtml +++ b/views/mods/mod_kundenverwaltung/mail_register.phtml @@ -2,6 +2,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn er die Registrierung erfolgreich beendet hat
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_kundenverwaltung/mail_register_html.phtml b/views/mods/mod_kundenverwaltung/mail_register_html.phtml index 6022e2f..93b15b5 100644 --- a/views/mods/mod_kundenverwaltung/mail_register_html.phtml +++ b/views/mods/mod_kundenverwaltung/mail_register_html.phtml @@ -2,6 +2,7 @@ /**
* Diese Mail wird an den Kunden geschickt, wenn er die Registrierung erfolgreich beendet hat (HTML)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/order.phtml b/views/mods/mod_kundenverwaltung/order.phtml index 8aa7f59..ddf7fc9 100644 --- a/views/mods/mod_kundenverwaltung/order.phtml +++ b/views/mods/mod_kundenverwaltung/order.phtml @@ -2,89 +2,76 @@ /**
* Template für die Übersichtsseite der Bestellungen im Frontend
+ * @version 4.6.1
*/
//wpsg_debug($this->view['arOrder']);
?>
-<div class="wpsg_mod_kundenverwaltung_order wpsg alignwide">
+<div class="wpsg_mod_kundenverwaltung_order wpsg">
<?php echo $this->writeFrontendMessage(); ?>
<?php if (wpsg_isSizedArray($this->view['arOrder'])) { ?>
- <?php foreach ($this->view['arOrder'] as $order) { ?>
-
- <div class="wpsg_box">
+ <?php foreach ($this->view['arOrder'] as $order) { $strSum = wpsg_ff($order['price_gesamt'], $this->get_option('wpsg_currency')); ?>
- <h2><?php echo wpsg_translate(__('Bestellung vom #1# über #2#', 'wpsg'), date('d.m.Y', strtotime($order['cdate'])), wpsg_ff($order['price_gesamt'], $this->get_option('wpsg_currency'))); ?></h2>
-
- <div class="wpsg_inner wpsg_order_<?php echo $order['id']; ?>">
- <strong><?php echo __('Bestellstatus', 'wpsg'); ?>:</strong>
- <?php echo $this->arStatus[$order['status']]; ?>
- <?php if ($this->hasMod('wpsg_mod_rechnungen')) {
+ <section class="wpsg_box wpsg-account-order wpsg_order_<?php echo intval($order['id']); ?>">
- $arInvoice = \wpsg\wpsg_invoice::findByOrderId(intval($order['id']));
-
- ?>
-
- <?php foreach ($arInvoice as $oInvoice) { ?>
-
- <?php if ($oInvoice->isInvoice()) { ?>
-
- <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnung #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
-
- <?php } else if ($oInvoice->isStorno()) { ?>
-
- <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnungskorrektur #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
+ <div class="wpsg-account-order__head">
+ <h2 class="wpsg-account-order__title"><?php echo esc_html(date('d.m.Y', strtotime($order['cdate']))); ?> · <?php echo __('Bestellnummer', 'wpsg'); ?> <?php echo esc_html((string)($order['onr']??'')); ?></h2>
+ <span class="wpsg-account-order__sum"><?php echo $strSum; ?></span>
+ </div>
- <?php } ?>
+ <p class="wpsg-account-order__meta">
+ <?php echo $this->arStatus[$order['status']]??''; ?>
+ <?php if ($this->hasMod('wpsg_mod_rechnungen')) { foreach (\wpsg\wpsg_invoice::findByOrderId(intval($order['id'])) as $oInvoice) { ?>
+ <?php if ($oInvoice->isInvoice()) { ?>
+ · <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnung #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
+ <?php } else if ($oInvoice->isStorno()) { ?>
+ · <a href="<?php echo $this->callMod('wpsg_mod_rechnungen', 'getFrontendLink', [$oInvoice->getId()]); ?>"><?php echo wpsg_translate(__('Rechnungskorrektur #1#', 'wpsg'), $oInvoice->getNr()); ?></a>
+ <?php } ?>
+ <?php } } ?>
+ </p>
- <?php } ?>
+ <details class="wpsg-account-order__items">
+ <summary><?php echo __('Bestellte Produkte', 'wpsg'); ?> (<?php echo count((array)$order['arProdukte']); ?>)</summary>
- <?php } ?>
- <br />
- <strong><?php echo __('Rechnungsbetrag', 'wpsg'); ?>:</strong> <?php echo wpsg_ff($order['price_gesamt'], $this->get_option('wpsg_currency')); ?><br />
- <strong><?php echo __('Bestellte Produkte', 'wpsg'); ?>:</strong>
-
<table class="wpsg_mod_kundenverwaltung_producttable">
- <tr>
+ <tr class="screen-reader-text">
<th class="col_name"><?php echo __('Name', 'wpsg'); ?></th>
- <th class="col_price"><?php echo __('Preis', 'wpsg'); ?></th>
- </tr>
- <?php foreach ((array)$order['arProdukte'] as $p) { ?>
- <tr>
+ <th class="col_price"><?php echo __('Preis', 'wpsg'); ?></th>
+ </tr>
+ <?php foreach ((array)$order['arProdukte'] as $p) { ?>
+ <tr>
<td class="col_name">
<span><?php echo $p['menge']??0; ?> x </span>
- <a href="<?php echo $p['url']; ?>"><?php echo $this->getProductName($this->getProduktID($p['id']), true); ?></a>
- <br /><?php echo __('Artikelnummer', 'wpsg'); ?>: <?php echo $p['anr']; ?>
+ <?php if (($p['url']??'') !== '') { ?><a href="<?php echo $p['url']; ?>"><?php echo $p['account_name']??''; ?></a><?php } else { ?><?php echo $p['account_name']??''; ?><?php } ?>
+ <span class="wpsg-account-order__detail"><?php echo __('Artikelnummer', 'wpsg'); ?>: <?php echo $p['anr']??''; ?></span>
<?php if ($this->hasMod('wpsg_mod_productvariants') && wpsg_isSizedString($p['mod_vp_varkey'])) { $arVarInfo = $this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', array($p['mod_vp_varkey'])); ?>
- <br /><?php echo __('Variante', 'wpsg'); ?>: <?php echo $arVarInfo['key']; ?>
- <?php } ?>
- <?php if ($this->hasMod('wpsg_mod_downloadplus')) { ?>
- <?php if ($this->callMod('wpsg_mod_downloadplus', 'isPDFProdukt', array($p['id'])) === true) { $arDownloads = $this->callMod('wpsg_mod_downloadplus', 'getIndivFiles', array($p['id'], $order['id'])); ?>
- <?php foreach ((array)$arDownloads as $d) { ?>
- <br /><?php echo wpsg_translate(__('Datei "#1#": ', 'wpsg'), ((strlen($d['file_out']) > 0)?$d['file_out']:$d['file'])); ?>
+ <span class="wpsg-account-order__detail"><?php echo __('Variante', 'wpsg'); ?>: <?php echo $arVarInfo['key']; ?></span>
+ <?php } ?>
+ <?php if ($this->hasMod('wpsg_mod_downloadplus') && empty($p['missing']) && $this->callMod('wpsg_mod_downloadplus', 'isPDFProdukt', array($p['id'])) === true) { ?>
+ <?php foreach ((array)$this->callMod('wpsg_mod_downloadplus', 'getIndivFiles', array($p['id'], $order['id'])) as $d) { ?>
+ <span class="wpsg-account-order__detail"><?php echo wpsg_translate(__('Datei "#1#": ', 'wpsg'), ((strlen($d['file_out']) > 0)?$d['file_out']:$d['file'])); ?>
<?php if ($d['status'] == '0') { ?>
- <?php echo __('Noch nicht geplant', 'wpsg'); ?>
+ <?php echo __('Noch nicht geplant', 'wpsg'); ?>
<?php } else if ($d['status'] == '1') { ?>
- <?php echo wpsg_translate(__('Geplant am #1#.', 'wpsg'), date('d.m.Y', strtotime($d['scheduled']))); ?>
- <?php } else if ($d['status'] == '2') { ?>
+ <?php echo wpsg_translate(__('Geplant am #1#.', 'wpsg'), date('d.m.Y', strtotime($d['scheduled']))); ?>
+ <?php } else if ($d['status'] == '2') { ?>
<?php $strURL = site_url().'?wpsg_action=wpsg_mod_downloadplus_download&hash='.$d['hash'].'&indi='.$d['indiv_id']; ?>
<?php echo wpsg_translate(__('<a href="#1#" target="blank">Download</a>', 'wpsg'), $strURL); ?>
- <?php } ?>
<?php } ?>
+ </span>
<?php } ?>
<?php } ?>
- <br />
<?php if ($this->hasMod('wpsg_mod_productvars')) { $arPV = $this->callMod('wpsg_mod_productvars', 'getAllProductVarValues', array($order['id'], $p['product_index'])); ?>
- <?php if (wpsg_isSizedArray($arPV)) { ?>
- <?php foreach ($arPV as $pv) { ?>
- <?php echo wpsg_hspc($pv['name']); ?>: <?php echo wpsg_hspc($pv['value']); ?>
+ <?php /* Etwa für eine Referenznummer, die der Kunde hier nicht sehen soll; siehe doc/einhaengepunkte.md */ $arPV = (array)\apply_filters('wpsg_account_order_productvars', (wpsg_isSizedArray($arPV)?$arPV:[]), intval($order['id']), $p['product_index']??null); ?>
+ <?php foreach ($arPV as $pv) { if (!is_array($pv)) continue; ?>
+ <span class="wpsg-account-order__detail"><?php echo wpsg_hspc($pv['name']); ?>: <?php echo wpsg_hspc($pv['value']); ?></span>
<?php } ?>
- <?php } ?>
<?php } ?>
- </td>
+ </td>
<td class="col_price">
<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { ?>
<?php echo wpsg_ff($p['preis_netto'], $this->get_option('wpsg_currency')); ?>
@@ -93,13 +80,14 @@ <?php } ?>
</td>
</tr>
- <?php \do_action('wpsg_mod_kundenverwaltung_order_after_products', $order, $p); ?>
+ <?php if (empty($p['missing'])) \do_action('wpsg_mod_kundenverwaltung_order_after_products', $order, $p); ?>
<?php } ?>
</table>
-
- </div>
- </div>
-
+
+ </details>
+
+ </section>
+
<?php } ?>
<?php } else { ?>
<p><?php echo __('Bisher keine Bestellungen durchgeführt.', 'wpsg'); ?></p>
diff --git a/views/mods/mod_kundenverwaltung/profil.phtml b/views/mods/mod_kundenverwaltung/profil.phtml index 4244f31..c11d192 100644 --- a/views/mods/mod_kundenverwaltung/profil.phtml +++ b/views/mods/mod_kundenverwaltung/profil.phtml @@ -2,6 +2,7 @@ /**
* Seite für das Profil eines Kunden
+ * @version 4.6.1
*/
?>
@@ -113,17 +114,6 @@ });
- <?php /* Copy&Paste für das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
- window.onload = function() {
-
- var email2 = document.getElementById('email2');
-
- email2.onpaste = function(e) {
-
- e.preventDefault();
-
- }
- }
</script>
@@ -209,7 +199,7 @@ <?php if ($this->view['pflicht']['emailconfirm'] == '1') { ?>
<div class="wpsg_checkoutblock">
- <label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse (Wiederholung)", "wpsg"); ?>
+ <label for="email2" class="wpsg_checkout"><?php echo __("E-Mail Adresse (Wiederholung)", "wpsg"); ?>
<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>:
</label>
<input
@@ -339,7 +329,7 @@ <div class="wpsg_clear"></div>
<div class="wpsg_checkoutblock">
- <label for="wpsg_mod_kundenverwaltung_pwd1"><?php echo __("Passwort", "wpsg"); ?>
+ <label for="wpsg_mod_kundenverwaltung_pw1"><?php echo __("Passwort", "wpsg"); ?>
<?php if ($this->get_option('wpsg_mod_kundenverwaltung_showCheckoutRegisterzwang') == '1') { ?><span class="wpsg_required">*</span><?php } ?>:
</label>
<input
@@ -385,7 +375,7 @@ <div class="wpsg_clear"></div><br />
- <input type="submit" class="wpsg_button wpsg_saveButton" id="wpsg_mod_kundenverwaltung_save" value="<?php echo __('Speichern', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_save" />
+ <input type="submit" class="wpsg_button wpsg_saveButton<?php echo wpsg_button_class(); ?>" id="wpsg_mod_kundenverwaltung_save" value="<?php echo __('Speichern', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_save" />
<?php $this->ClearSessionErrors(); ?>
diff --git a/views/mods/mod_kundenverwaltung/register.phtml b/views/mods/mod_kundenverwaltung/register.phtml index 0d93425..b69b941 100644 --- a/views/mods/mod_kundenverwaltung/register.phtml +++ b/views/mods/mod_kundenverwaltung/register.phtml @@ -2,6 +2,7 @@ /**
* Template für die Registrierungsseite
+ * @version 4.6.1
*/
?>
@@ -124,17 +125,6 @@ });
- <?php /* Copy&Paste für das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
- window.onload = function() {
-
- var email2 = document.getElementById('email2');
-
- email2.onpaste = function(e) {
-
- e.preventDefault();
-
- }
- }
</script>
@@ -462,7 +452,7 @@ <br />
- <input type="submit" class="wpsg_button wpsg_registerButton" value="<?php echo __('Registrieren', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_register" />
+ <input type="submit" class="wpsg_button wpsg_registerButton<?php echo wpsg_button_class(); ?>" value="<?php echo __('Registrieren', 'wpsg'); ?>" name="wpsg_mod_kundenverwaltung_register" />
<?php $this->ClearSessionErrors(); ?>
@@ -471,7 +461,7 @@ <script>
// DSGVO Layer Script
- document.querySelector('.layer_link').addEventListener('click', function() {
+ document.querySelector('.layer_link')?.addEventListener('click', function(event) {
const recaptcha = document.createElement("div");
const a = document.createAttribute("data-sitekey");
diff --git a/views/mods/mod_kundenverwaltung/settings_edit.phtml b/views/mods/mod_kundenverwaltung/settings_edit.phtml index 792f968..3ed291a 100644 --- a/views/mods/mod_kundenverwaltung/settings_edit.phtml +++ b/views/mods/mod_kundenverwaltung/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Kundenverwaltungsdialoges
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_kundenverwaltung/widget.phtml b/views/mods/mod_kundenverwaltung/widget.phtml index 0894cb5..278589b 100644 --- a/views/mods/mod_kundenverwaltung/widget.phtml +++ b/views/mods/mod_kundenverwaltung/widget.phtml @@ -2,6 +2,7 @@ /**
* Template für das Login Widget
+ * @version 4.6.1
*/
?>
@@ -49,7 +50,7 @@ <br /><br />
- <input type="submit" id="wpsg_mod_kundenverwaltung_widget_login" name="wpsg_mod_kundenverwaltung_login" value="<?php echo __('Anmelden', 'wpsg'); ?>" />
+ <input <?php echo ((\wpsg\ThemeStyle::isThemeMode())?'class="wp-element-button" ':''); ?>type="submit" id="wpsg_mod_kundenverwaltung_widget_login" name="wpsg_mod_kundenverwaltung_login" value="<?php echo __('Anmelden', 'wpsg'); ?>" />
<input type="hidden" name="wpsg_referer" value="<?php echo $this->getCurrentURL(); ?>" />
diff --git a/views/mods/mod_legaltexts/form_haendlerbund.phtml b/views/mods/mod_legaltexts/form_haendlerbund.phtml index 63726aa..bcfd57f 100644 --- a/views/mods/mod_legaltexts/form_haendlerbund.phtml +++ b/views/mods/mod_legaltexts/form_haendlerbund.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Händlerbund-Formulars in das Rechtstextmodul
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_legaltexts/form_itrecht.phtml b/views/mods/mod_legaltexts/form_itrecht.phtml index af3f7d4..cbedad2 100644 --- a/views/mods/mod_legaltexts/form_itrecht.phtml +++ b/views/mods/mod_legaltexts/form_itrecht.phtml @@ -2,6 +2,7 @@ /**
* Template des Rechtstext Moduls, welches ITRecht integriert
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_legaltexts/form_protectedshops.phtml b/views/mods/mod_legaltexts/form_protectedshops.phtml index e4099c0..30fccc4 100644 --- a/views/mods/mod_legaltexts/form_protectedshops.phtml +++ b/views/mods/mod_legaltexts/form_protectedshops.phtml @@ -2,6 +2,7 @@ /**
* Template des Rechtstext Moduls, welches das ProtectedsShops-Formular oder den Hinweistext anzeigt
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_legaltexts/settings_edit.phtml b/views/mods/mod_legaltexts/settings_edit.phtml index 9b3c7ec..9e81c03 100644 --- a/views/mods/mod_legaltexts/settings_edit.phtml +++ b/views/mods/mod_legaltexts/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für das Modul "Rechtstexte"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_micropayment_paywindow/order_done.phtml b/views/mods/mod_micropayment_paywindow/order_done.phtml index 3a0272b..c48ccdb 100644 --- a/views/mods/mod_micropayment_paywindow/order_done.phtml +++ b/views/mods/mod_micropayment_paywindow/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template welches den Zahlungsdienstleister nach Bestellabschluss einbindet
+ * @version 4.6.1
*/
$view = $this->view['wpsg_mod_micropayment_paywindow'];
diff --git a/views/mods/mod_micropayment_paywindow/settings_edit.phtml b/views/mods/mod_micropayment_paywindow/settings_edit.phtml index c6d5707..be3e58f 100644 --- a/views/mods/mod_micropayment_paywindow/settings_edit.phtml +++ b/views/mods/mod_micropayment_paywindow/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen für das Micropayment Modul
+ * @version 4.6.1
*/
$view = $this->view['wpsg_mod_micropayment_paywindow'];
diff --git a/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml b/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml index 49f46d5..4f53fed 100644 --- a/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml +++ b/views/mods/mod_minquantity/produkt_addedit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Integration des Moduls "Mindestbestellmenge" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_minquantity/produkt_edit_allgemein.phtml b/views/mods/mod_minquantity/produkt_edit_allgemein.phtml index 1188c39..6e9ed70 100644 --- a/views/mods/mod_minquantity/produkt_edit_allgemein.phtml +++ b/views/mods/mod_minquantity/produkt_edit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Integration des Moduls "Mindestbestellmenge" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_minquantity/settings_edit.phtml b/views/mods/mod_minquantity/settings_edit.phtml index 9a99582..4828f89 100644 --- a/views/mods/mod_minquantity/settings_edit.phtml +++ b/views/mods/mod_minquantity/settings_edit.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Einstellungen des Moduls Mindestbestellmenge
diff --git a/views/mods/mod_minrequest/produkt_addedit_allgemein.phtml b/views/mods/mod_minrequest/produkt_addedit_allgemein.phtml index ac3fe63..6859747 100644 --- a/views/mods/mod_minrequest/produkt_addedit_allgemein.phtml +++ b/views/mods/mod_minrequest/produkt_addedit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Integration des Moduls "Mindestbestellwert" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_minrequest/produkt_edit_allgemein.phtml b/views/mods/mod_minrequest/produkt_edit_allgemein.phtml index 8764879..80e0749 100644 --- a/views/mods/mod_minrequest/produkt_edit_allgemein.phtml +++ b/views/mods/mod_minrequest/produkt_edit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Integration des Moduls "Mindestbestellwert" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_minrequest/settings_edit.phtml b/views/mods/mod_minrequest/settings_edit.phtml index bc2860b..a779611 100644 --- a/views/mods/mod_minrequest/settings_edit.phtml +++ b/views/mods/mod_minrequest/settings_edit.phtml @@ -3,6 +3,7 @@ /**
* Template für die Einstellungen des Moduls "Mindestbestellwert"
* @author Daschmi
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_mollie/order_done.phtml b/views/mods/mod_mollie/order_done.phtml index 5f5a46f..4e85406 100644 --- a/views/mods/mod_mollie/order_done.phtml +++ b/views/mods/mod_mollie/order_done.phtml @@ -2,6 +2,7 @@ /** * Template für die Bestellabschlussseite mit Mollie + * @version 4.6.1 */ $mollie = $this->view['wpsg_mod_mollie']; diff --git a/views/mods/mod_mollie/order_view_afterpayment.phtml b/views/mods/mod_mollie/order_view_afterpayment.phtml index 95ac4b1..27e409a 100644 --- a/views/mods/mod_mollie/order_view_afterpayment.phtml +++ b/views/mods/mod_mollie/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /** * Zeigt die Mollie Daten einer Bestellung in der Bestellansicht im Backend + * @version 4.6.1 */ $oOrder = $this->view['wpsg_mod_mollie']['oOrder']; diff --git a/views/mods/mod_mollie/settings_edit.phtml b/views/mods/mod_mollie/settings_edit.phtml index ab362c5..9117806 100644 --- a/views/mods/mod_mollie/settings_edit.phtml +++ b/views/mods/mod_mollie/settings_edit.phtml @@ -2,6 +2,7 @@ /** * Template für die Einstellungen des Mollie Moduls + * @version 4.6.1 */ $view = $this->view['wpsg_mod_mollie']; diff --git a/views/mods/mod_newsletter/checkout_customer_inner.phtml b/views/mods/mod_newsletter/checkout_customer_inner.phtml index 1e5bf3e..d3c7dc5 100644 --- a/views/mods/mod_newsletter/checkout_customer_inner.phtml +++ b/views/mods/mod_newsletter/checkout_customer_inner.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration der optionalen Newsletteranmeldung in den Checkout
* Wird von der checkout.phtml aufgerufen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_newsletter/customer_sidebar.phtml b/views/mods/mod_newsletter/customer_sidebar.phtml index a41511c..929e1de 100644 --- a/views/mods/mod_newsletter/customer_sidebar.phtml +++ b/views/mods/mod_newsletter/customer_sidebar.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php echo wpsg_drawForm_AdminboxStart(__('Newsletter', 'wpsg')); ?>
<?php if ($this->view['wpsg_mod_newsletter']['found'] === true) { ?>
<input type="hidden" name="wpsg_mod_newsletter[abo_id]" value="<?php echo $this->view['wpsg_mod_newsletter']['abo_id']; ?>" />
diff --git a/views/mods/mod_newsletter/settings_edit.phtml b/views/mods/mod_newsletter/settings_edit.phtml index d447582..f722976 100644 --- a/views/mods/mod_newsletter/settings_edit.phtml +++ b/views/mods/mod_newsletter/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Newsletter Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_nlsatolo/checkout_customer_inner.phtml b/views/mods/mod_nlsatolo/checkout_customer_inner.phtml index 95fb869..6abcc1f 100644 --- a/views/mods/mod_nlsatolo/checkout_customer_inner.phtml +++ b/views/mods/mod_nlsatolo/checkout_customer_inner.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration der optionalen Newsletteranmeldung in den Checkout
* Wird von der checkout.phtml aufgerufen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_nlsatolo/settings_edit.phtml b/views/mods/mod_nlsatolo/settings_edit.phtml index 6edaee3..5425310 100644 --- a/views/mods/mod_nlsatolo/settings_edit.phtml +++ b/views/mods/mod_nlsatolo/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Satollo Newsletter Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_onepagecheckout/onepage.phtml b/views/mods/mod_onepagecheckout/onepage.phtml index 213b62c..091d3a7 100644 --- a/views/mods/mod_onepagecheckout/onepage.phtml +++ b/views/mods/mod_onepagecheckout/onepage.phtml @@ -2,6 +2,7 @@ /** * Template für den Bestellablauf auf einer Seite + * @version 4.6.1 */ ?> @@ -231,7 +232,7 @@ <?php if (isset($this->view['pflicht']['emailconfirm']) && $this->view['pflicht']['emailconfirm'] == '1') { ?> <div class="wpsg_checkoutblock"> - <label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> + <label for="email2" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?> <?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>: </label> <input class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="email" id="email2" name="wpsg[checkout][email2]" value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email2']); ?>" /> @@ -414,9 +415,9 @@ <br /> <?php if ($this->get_option('wpsg_mod_onepagecheckout_basket') == 0) { ?> - <input type="submit" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>'; return false;" class="wpsg_button wpsg_basketbutton" value="<?php echo __('Zurück zum Warenkorb', 'wpsg'); ?>" name="wpsg_redirect_basket" /> + <input type="submit" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>'; return false;" class="wpsg_button wpsg_basketbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('Zurück zum Warenkorb', 'wpsg'); ?>" name="wpsg_redirect_basket" /> <?php } ?> - <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_checkout2button" value="<?php echo __('Weiter', 'wpsg'); ?>" name="wpsg_checkout" /> + <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_checkout2button<?php echo wpsg_button_class(); ?>" value="<?php echo __('Weiter', 'wpsg'); ?>" name="wpsg_checkout" /> <div class="wpsg_clear"></div> diff --git a/views/mods/mod_onepagecheckout/settings_edit.phtml b/views/mods/mod_onepagecheckout/settings_edit.phtml index 483338b..cd73b69 100644 --- a/views/mods/mod_onepagecheckout/settings_edit.phtml +++ b/views/mods/mod_onepagecheckout/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Einstellungen des ehemaligen EinSeitenCheckouts: nur noch der Hinweis auf den SmartCheckout
+ * @version 4.6.1
*/
$url_smartcheckout = $this->view['wpsg_mod_onepagecheckout']['url_smartcheckout'];
diff --git a/views/mods/mod_ordercondition/list.phtml b/views/mods/mod_ordercondition/list.phtml index d68b1f5..ddeccf8 100644 --- a/views/mods/mod_ordercondition/list.phtml +++ b/views/mods/mod_ordercondition/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Bestellbedingungen im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordercondition/overview_top.phtml b/views/mods/mod_ordercondition/overview_top.phtml index 1c3d832..13ba816 100644 --- a/views/mods/mod_ordercondition/overview_top.phtml +++ b/views/mods/mod_ordercondition/overview_top.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Bestellbedingungen in die Bestellzusammenfassung
+ * @version 4.6.1
*/
// Die Mindestlänge, damit der Text in einer Scrollbox angezeigt wird
diff --git a/views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml b/views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml index 7dea1c1..6e36848 100644 --- a/views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml +++ b/views/mods/mod_ordercondition/produkt_addedit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Template für die Konfiguration der Bestellbedingungen innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordercondition/produkt_edit_sidebar.phtml b/views/mods/mod_ordercondition/produkt_edit_sidebar.phtml index d1d0350..f57c1aa 100644 --- a/views/mods/mod_ordercondition/produkt_edit_sidebar.phtml +++ b/views/mods/mod_ordercondition/produkt_edit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Bestellbedingungen in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordercondition/settings_edit.phtml b/views/mods/mod_ordercondition/settings_edit.phtml index 0c7f4fa..b7117a4 100644 --- a/views/mods/mod_ordercondition/settings_edit.phtml +++ b/views/mods/mod_ordercondition/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Bestellbedingungsmoduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderstates/settings_edit.phtml b/views/mods/mod_orderstates/settings_edit.phtml index d9e8ab6..0d0ca4b 100644 --- a/views/mods/mod_orderstates/settings_edit.phtml +++ b/views/mods/mod_orderstates/settings_edit.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_orderupload/basket_after.phtml b/views/mods/mod_orderupload/basket_after.phtml index 25aed96..d90a89e 100644 --- a/views/mods/mod_orderupload/basket_after.phtml +++ b/views/mods/mod_orderupload/basket_after.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 02.05.2018
* Time: 10:47
+ * @version 4.6.1
*/
// Es muss die ID der Bestellung verfügbar sein.
diff --git a/views/mods/mod_orderupload/basket_row.phtml b/views/mods/mod_orderupload/basket_row.phtml index 205fbbb..fb2a05a 100644 --- a/views/mods/mod_orderupload/basket_row.phtml +++ b/views/mods/mod_orderupload/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Upload pro Produkt im Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderupload/basket_row_upload_target.phtml b/views/mods/mod_orderupload/basket_row_upload_target.phtml index 12d567c..92f1308 100644 --- a/views/mods/mod_orderupload/basket_row_upload_target.phtml +++ b/views/mods/mod_orderupload/basket_row_upload_target.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
if (!$this->bMessageOut) echo $this->writeFrontendMessage();
diff --git a/views/mods/mod_orderupload/checkout_inner_prebutton.phtml b/views/mods/mod_orderupload/checkout_inner_prebutton.phtml index 79b06e3..e9df1a1 100644 --- a/views/mods/mod_orderupload/checkout_inner_prebutton.phtml +++ b/views/mods/mod_orderupload/checkout_inner_prebutton.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Bestelluploads in den Bestellprozess
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderupload/order_view_row.phtml b/views/mods/mod_orderupload/order_view_row.phtml index 0b7c4cd..dbef826 100644 --- a/views/mods/mod_orderupload/order_view_row.phtml +++ b/views/mods/mod_orderupload/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktuploads in die Bestellverwaltung Reiter "Bestelldaten"
+ * @version 4.6.1
*/
$view = $this->view['wpsg_mod_orderupload'];
diff --git a/views/mods/mod_orderupload/order_view_sidebar.phtml b/views/mods/mod_orderupload/order_view_sidebar.phtml index a7a00dd..eda3a5a 100644 --- a/views/mods/mod_orderupload/order_view_sidebar.phtml +++ b/views/mods/mod_orderupload/order_view_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Bestelluploads innerhalb des Bestellbackend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderupload/product_addedit_content.phtml b/views/mods/mod_orderupload/product_addedit_content.phtml index e70bbd5..7b12efd 100644 --- a/views/mods/mod_orderupload/product_addedit_content.phtml +++ b/views/mods/mod_orderupload/product_addedit_content.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 02.05.2018
* Time: 07:25
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderupload/settings_edit.phtml b/views/mods/mod_orderupload/settings_edit.phtml index 60584ca..417acf4 100644 --- a/views/mods/mod_orderupload/settings_edit.phtml +++ b/views/mods/mod_orderupload/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Bestell Upload Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_orderupload/smartcheckout_checkout.phtml b/views/mods/mod_orderupload/smartcheckout_checkout.phtml index 7da51cb..13dfd4b 100644 --- a/views/mods/mod_orderupload/smartcheckout_checkout.phtml +++ b/views/mods/mod_orderupload/smartcheckout_checkout.phtml @@ -7,6 +7,7 @@ * Löschen, darunter die Dateiauswahl. Die Datei wird direkt nach der Auswahl hochgeladen (data-sc-upload, * siehe smartcheckout.js), entfernt wird über data-sc-send, beides landet in * wpsg_mod_orderupload::smartcheckout_ajax(). Der Block wird bei jeder Antwort neu geliefert. + * @version 4.6.1 */ $arUploads = (array)($_SESSION['wpsg']['wpsg_mod_orderupload'] ?? []); diff --git a/views/mods/mod_orderupload/smartcheckout_row.phtml b/views/mods/mod_orderupload/smartcheckout_row.phtml index 66986f9..9d2754d 100644 --- a/views/mods/mod_orderupload/smartcheckout_row.phtml +++ b/views/mods/mod_orderupload/smartcheckout_row.phtml @@ -5,6 +5,7 @@ * * Das Ziel trägt dieselbe ID wie im klassischen Warenkorb, die Scripte aus basket_after.phtml * ersetzen seinen Inhalt nach dem Hochladen bzw. Löschen. + * @version 4.6.1 */ $product_index = $this->view['wpsg_mod_orderupload']['product_index']; diff --git a/views/mods/mod_ordervars/checkout_inner_prebutton.phtml b/views/mods/mod_ordervars/checkout_inner_prebutton.phtml index 99b6c08..d031891 100644 --- a/views/mods/mod_ordervars/checkout_inner_prebutton.phtml +++ b/views/mods/mod_ordervars/checkout_inner_prebutton.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Bestellvariablen innerhalb des Checkouts
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordervars/mail.phtml b/views/mods/mod_ordervars/mail.phtml index 5d1f563..5632761 100644 --- a/views/mods/mod_ordervars/mail.phtml +++ b/views/mods/mod_ordervars/mail.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration der Bestellvariablen in die Mails
* dieses Template wird für die Adminmail, Kundenmail und Auftragsbestätigung verwendet
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordervars/mail_html.phtml b/views/mods/mod_ordervars/mail_html.phtml index 8c2ee2f..8918043 100644 --- a/views/mods/mod_ordervars/mail_html.phtml +++ b/views/mods/mod_ordervars/mail_html.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration der Bestellvariablen in die HTML Mails
* dieses Template wird für die Adminmail, Kundenmail und Auftragsbestätigung verwendet
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordervars/order_view_sidebar.phtml b/views/mods/mod_ordervars/order_view_sidebar.phtml index e4c2eb6..f8ffb66 100644 --- a/views/mods/mod_ordervars/order_view_sidebar.phtml +++ b/views/mods/mod_ordervars/order_view_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Bestellvariablen in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordervars/ov_list.phtml b/views/mods/mod_ordervars/ov_list.phtml index b5c6d33..7d75f2f 100644 --- a/views/mods/mod_ordervars/ov_list.phtml +++ b/views/mods/mod_ordervars/ov_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Bestellvariablen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ordervars/settings_edit.phtml b/views/mods/mod_ordervars/settings_edit.phtml index 6146895..394f171 100644 --- a/views/mods/mod_ordervars/settings_edit.phtml +++ b/views/mods/mod_ordervars/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Bestellvariablen Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_packagetracking/mail_status.phtml b/views/mods/mod_packagetracking/mail_status.phtml index acebfe6..edf7f3a 100644 --- a/views/mods/mod_packagetracking/mail_status.phtml +++ b/views/mods/mod_packagetracking/mail_status.phtml @@ -1,2 +1,3 @@ +<?php /** @version 4.6.1 */ ?>
Paketverfolgung: <?php echo $this->view['wpsg_mod_packagetracking']['trackingURL']; ?>
diff --git a/views/mods/mod_packagetracking/mail_status_html.phtml b/views/mods/mod_packagetracking/mail_status_html.phtml index f303965..55f5cde 100644 --- a/views/mods/mod_packagetracking/mail_status_html.phtml +++ b/views/mods/mod_packagetracking/mail_status_html.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<p>
<a href="<?php echo $this->view['wpsg_mod_packagetracking']['trackingURL']; ?>"><?php echo __('Paketverfolgung', 'wpsg'); ?></a>
</p>
\ No newline at end of file diff --git a/views/mods/mod_packagetracking/order_view_switchStatus.phtml b/views/mods/mod_packagetracking/order_view_switchStatus.phtml index 225fd16..c65ab6c 100644 --- a/views/mods/mod_packagetracking/order_view_switchStatus.phtml +++ b/views/mods/mod_packagetracking/order_view_switchStatus.phtml @@ -1,6 +1,7 @@ <?php
/**
* Integration in das Formular für die Statusänderung einer Bestellung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_packagetracking/settings_edit.phtml b/views/mods/mod_packagetracking/settings_edit.phtml index 27acd13..85cbe0b 100644 --- a/views/mods/mod_packagetracking/settings_edit.phtml +++ b/views/mods/mod_packagetracking/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Einstellungen für das Paketverfolgungsmodul
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_packagetracking/settings_edit_list.phtml b/views/mods/mod_packagetracking/settings_edit_list.phtml index 7e5ed7c..39f9c29 100644 --- a/views/mods/mod_packagetracking/settings_edit_list.phtml +++ b/views/mods/mod_packagetracking/settings_edit_list.phtml @@ -2,6 +2,7 @@ /**
* Rendert die Liste der Paketverfolgungs Datensätze
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml b/views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml index 0f5e593..a609b41 100644 --- a/views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml +++ b/views/mods/mod_packagetracking/wpsg_mod_versandarten_listrow.phtml @@ -2,6 +2,7 @@ /**
* Erweiterung der Verwaltung der Versandarten
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_paypal/order_done.phtml b/views/mods/mod_paypal/order_done.phtml index 9f45680..f3f28eb 100644 --- a/views/mods/mod_paypal/order_done.phtml +++ b/views/mods/mod_paypal/order_done.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird nach dem Bestellabschluss mit der Zahlungsart PayPal angezeigt
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_paypal/order_view_afterpayment.phtml b/views/mods/mod_paypal/order_view_afterpayment.phtml index 20bbfd2..40d9ca3 100644 --- a/views/mods/mod_paypal/order_view_afterpayment.phtml +++ b/views/mods/mod_paypal/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der PayPal Zahlungsart in die Bestellverwaltung
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_paypal/settings_edit.phtml b/views/mods/mod_paypal/settings_edit.phtml index 41bd9bd..39db772 100644 --- a/views/mods/mod_paypal/settings_edit.phtml +++ b/views/mods/mod_paypal/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Templatedatei für die Einstellungen des PayPal Moduls
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_paypalapi/basket_inner_prebutton.phtml b/views/mods/mod_paypalapi/basket_inner_prebutton.phtml index 8c576ba..6660e5e 100644 --- a/views/mods/mod_paypalapi/basket_inner_prebutton.phtml +++ b/views/mods/mod_paypalapi/basket_inner_prebutton.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in den Warenkorb der PayPal API
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_paypalapi/checkout_handlePayment.phtml b/views/mods/mod_paypalapi/checkout_handlePayment.phtml index f47ec2b..c67383b 100644 --- a/views/mods/mod_paypalapi/checkout_handlePayment.phtml +++ b/views/mods/mod_paypalapi/checkout_handlePayment.phtml @@ -2,6 +2,7 @@ /**
* Template um die Zahlungsarten mittels PayPal PLUS im Checkout zu integrieren
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_paypalapi/order_done.phtml b/views/mods/mod_paypalapi/order_done.phtml index 5054509..66fa205 100644 --- a/views/mods/mod_paypalapi/order_done.phtml +++ b/views/mods/mod_paypalapi/order_done.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird nach einer Bestellung vo der Weiterleitung zur PayPal Zahlung angezeigt
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_paypalapi/order_view_afterpayment.phtml b/views/mods/mod_paypalapi/order_view_afterpayment.phtml index cf35149..b533097 100644 --- a/views/mods/mod_paypalapi/order_view_afterpayment.phtml +++ b/views/mods/mod_paypalapi/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der PayPal Zahlungsart in die Bestellverwaltung
+ * @version 4.6.1
*/
$wpsg_mod_paypalapi_paymentid = $this->view['oOrder']->getMeta('wpsg_mod_paypalapi_paymentid');
diff --git a/views/mods/mod_paypalapi/overview_preauth_button.phtml b/views/mods/mod_paypalapi/overview_preauth_button.phtml index 9fd775a..02a234a 100644 --- a/views/mods/mod_paypalapi/overview_preauth_button.phtml +++ b/views/mods/mod_paypalapi/overview_preauth_button.phtml @@ -2,6 +2,7 @@ /** * Ersetzt in der Bestellübersicht den Button "zahlungspflichtig bestellen", solange die Zahlung noch nicht bei PayPal autorisiert wurde + * @version 4.6.1 */ ?> diff --git a/views/mods/mod_paypalapi/paypalplus.phtml b/views/mods/mod_paypalapi/paypalplus.phtml index a2edc85..286f9d2 100644 --- a/views/mods/mod_paypalapi/paypalplus.phtml +++ b/views/mods/mod_paypalapi/paypalplus.phtml @@ -2,6 +2,7 @@ /**
* JS Teil für den PayPal PLUS Teil
+ * @version 4.6.1
*/
// https://www.paypalobjects.com/webstatic/de_DE/downloads/PayPal-PLUS-IntegrationGuide.pdf
diff --git a/views/mods/mod_paypalapi/settings_edit.phtml b/views/mods/mod_paypalapi/settings_edit.phtml index 7576912..e961dc5 100644 --- a/views/mods/mod_paypalapi/settings_edit.phtml +++ b/views/mods/mod_paypalapi/settings_edit.phtml @@ -2,6 +2,7 @@ /** * Template für die Einstellungen des PayPal API Moduls + * @version 4.6.1 */ ?> diff --git a/views/mods/mod_paypalratepay/settings_edit.phtml b/views/mods/mod_paypalratepay/settings_edit.phtml index d4458ac..c9d6535 100644 --- a/views/mods/mod_paypalratepay/settings_edit.phtml +++ b/views/mods/mod_paypalratepay/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des PayPal API Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_prepayment/mail.phtml b/views/mods/mod_prepayment/mail.phtml index e72e462..f437f74 100644 --- a/views/mods/mod_prepayment/mail.phtml +++ b/views/mods/mod_prepayment/mail.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template dient zur Integration der Admin Kontodaten in eine Bestellung
+ * @version 4.6.1
*/
?>
@@ -12,4 +13,4 @@ <?php echo wpsg_pad_right(__('IBAN', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_iban')); ?>
<?php echo wpsg_pad_right(__('Bank', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_bank')); ?>
<?php echo wpsg_pad_right(__('BIC-/SWIFT-Code', 'wpsg').':', 35); ?><?php echo $this->replaceUniversalPlatzhalter($this->get_option('wpsg_mod_prepayment_swift')); ?>
-<?php echo wpsg_pad_right(__('Betreff: #1#', 'wpsg'), 35); ?><?php echo $this->view['mod_prepayment']['subject']; ?>
\ No newline at end of file +<?php echo wpsg_pad_right(__('Betreff', 'wpsg').':', 35); ?><?php echo $this->view['mod_prepayment']['subject']; ?>
\ No newline at end of file diff --git a/views/mods/mod_prepayment/mail_html.phtml b/views/mods/mod_prepayment/mail_html.phtml index 0da2f01..3446141 100644 --- a/views/mods/mod_prepayment/mail_html.phtml +++ b/views/mods/mod_prepayment/mail_html.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template dient zur Integration der Admin Kontodaten in eine Bestellung (HTML)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_prepayment/mail_html_payment_after.phtml b/views/mods/mod_prepayment/mail_html_payment_after.phtml index 0726d69..cc3351b 100644 --- a/views/mods/mod_prepayment/mail_html_payment_after.phtml +++ b/views/mods/mod_prepayment/mail_html_payment_after.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_prepayment/order_done.phtml b/views/mods/mod_prepayment/order_done.phtml index 9fb9a20..aae0bf2 100644 --- a/views/mods/mod_prepayment/order_done.phtml +++ b/views/mods/mod_prepayment/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template welches bei der Zahlungsart "Vorkasse" nach Abschluss einer Bestellung angezeigt wird
+ * @version 4.6.1
*/
$formatIBAN = function($iban) {
diff --git a/views/mods/mod_prepayment/settings_edit.phtml b/views/mods/mod_prepayment/settings_edit.phtml index d8bdbe3..7cae7ef 100644 --- a/views/mods/mod_prepayment/settings_edit.phtml +++ b/views/mods/mod_prepayment/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Templatedatei für die Einstellungen des Vorkasse Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_printshop/basket_row.phtml b/views/mods/mod_printshop/basket_row.phtml index ab063c0..eee3f5b 100644 --- a/views/mods/mod_printshop/basket_row.phtml +++ b/views/mods/mod_printshop/basket_row.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/basket_row_before.phtml b/views/mods/mod_printshop/basket_row_before.phtml index e8fe82e..576dc98 100644 --- a/views/mods/mod_printshop/basket_row_before.phtml +++ b/views/mods/mod_printshop/basket_row_before.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/mail_row.phtml b/views/mods/mod_printshop/mail_row.phtml index c920b6d..bb35f9f 100644 --- a/views/mods/mod_printshop/mail_row.phtml +++ b/views/mods/mod_printshop/mail_row.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/mail_row_html.phtml b/views/mods/mod_printshop/mail_row_html.phtml index 577dc86..cbe1cff 100644 --- a/views/mods/mod_printshop/mail_row_html.phtml +++ b/views/mods/mod_printshop/mail_row_html.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/order_view_row.phtml b/views/mods/mod_printshop/order_view_row.phtml index c55e340..3bba8b9 100644 --- a/views/mods/mod_printshop/order_view_row.phtml +++ b/views/mods/mod_printshop/order_view_row.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/overview_row.phtml b/views/mods/mod_printshop/overview_row.phtml index 8990d82..4cdbfdc 100644 --- a/views/mods/mod_printshop/overview_row.phtml +++ b/views/mods/mod_printshop/overview_row.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/overview_row_before.phtml b/views/mods/mod_printshop/overview_row_before.phtml index e8fe82e..576dc98 100644 --- a/views/mods/mod_printshop/overview_row_before.phtml +++ b/views/mods/mod_printshop/overview_row_before.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/product.phtml b/views/mods/mod_printshop/product.phtml index 4c1e40f..5d2d1b5 100644 --- a/views/mods/mod_printshop/product.phtml +++ b/views/mods/mod_printshop/product.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/producttemplate.phtml b/views/mods/mod_printshop/producttemplate.phtml index dd344ab..74bab7b 100644 --- a/views/mods/mod_printshop/producttemplate.phtml +++ b/views/mods/mod_printshop/producttemplate.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für Flächenprodukte im Frontend
@@ -325,7 +326,7 @@ <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+ <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?><?php echo wpsg_button_class(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
<script type="text/javascript">
@@ -382,7 +383,7 @@ <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+ <input class="wpsg_button wpsg_add_requestlist<?php echo wpsg_button_class(); ?>" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
<?php } ?>
<?php /* Produktlangbeschreibung START */ ?>
diff --git a/views/mods/mod_printshop/produkt_addedit_content.phtml b/views/mods/mod_printshop/produkt_addedit_content.phtml index 9771e0a..f3c5b85 100644 --- a/views/mods/mod_printshop/produkt_addedit_content.phtml +++ b/views/mods/mod_printshop/produkt_addedit_content.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_printshop/settings_edit.phtml b/views/mods/mod_printshop/settings_edit.phtml index 5811388..77ca34b 100644 --- a/views/mods/mod_printshop/settings_edit.phtml +++ b/views/mods/mod_printshop/settings_edit.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 14.01.2020
* Time: 07:30
+ * @version 4.6.1
*/
declare(strict_types=1);
diff --git a/views/mods/mod_productfilter/settings_edit.phtml b/views/mods/mod_productfilter/settings_edit.phtml index 05f2c42..16f11a3 100644 --- a/views/mods/mod_productfilter/settings_edit.phtml +++ b/views/mods/mod_productfilter/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Tempalte für die Einstellungen des Produktfilter Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productfilter/widget.phtml b/views/mods/mod_productfilter/widget.phtml index 9538365..052d698 100644 --- a/views/mods/mod_productfilter/widget.phtml +++ b/views/mods/mod_productfilter/widget.phtml @@ -2,6 +2,7 @@ /**
* Template für das Widget des Produktfilters
+ * @version 4.6.1
*/
?>WIDGET
\ No newline at end of file diff --git a/views/mods/mod_productgroups/add.phtml b/views/mods/mod_productgroups/add.phtml index 09de0a8..8dd5f50 100644 --- a/views/mods/mod_productgroups/add.phtml +++ b/views/mods/mod_productgroups/add.phtml @@ -2,6 +2,7 @@ /**
* Template für das Anlegen/Bearbeiten einer Produktgruppe
+ * @version 4.6.1
*/
/** @var wpsg_productgroup|null $oProductgroup */
diff --git a/views/mods/mod_productgroups/admin_setcapabilities.phtml b/views/mods/mod_productgroups/admin_setcapabilities.phtml index 6c245d5..112dc43 100644 --- a/views/mods/mod_productgroups/admin_setcapabilities.phtml +++ b/views/mods/mod_productgroups/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_productgroups/index.phtml b/views/mods/mod_productgroups/index.phtml index c512509..49d1954 100644 --- a/views/mods/mod_productgroups/index.phtml +++ b/views/mods/mod_productgroups/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktgruppenübersicht
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productgroups/list.phtml b/views/mods/mod_productgroups/list.phtml index fbdaeff..654f039 100644 --- a/views/mods/mod_productgroups/list.phtml +++ b/views/mods/mod_productgroups/list.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
*
diff --git a/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml b/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml index 8fa7067..2a031fa 100644 --- a/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml +++ b/views/mods/mod_productgroups/productgroups_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Lagerverwaltung innerhalb der Einstellungen der Produktgruppe
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml b/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml index 6cbb9bd..8df07b7 100644 --- a/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_productgroups/produkt_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Konfiguration der Produktvariablen innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productgroups/settings_edit.phtml b/views/mods/mod_productgroups/settings_edit.phtml index 8d1d5e6..22b6877 100644 --- a/views/mods/mod_productgroups/settings_edit.phtml +++ b/views/mods/mod_productgroups/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungsseite der Produktgruppen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productgroups/show.phtml b/views/mods/mod_productgroups/show.phtml index 2f6a0d0..32b5464 100644 --- a/views/mods/mod_productgroups/show.phtml +++ b/views/mods/mod_productgroups/show.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
*
diff --git a/views/mods/mod_productgroups/show_2.phtml b/views/mods/mod_productgroups/show_2.phtml index 856fdfe..0f2ab98 100644 --- a/views/mods/mod_productgroups/show_2.phtml +++ b/views/mods/mod_productgroups/show_2.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ /** Template für die Anzeige von Produktgruppen Layout 2 */ diff --git a/views/mods/mod_productindex/css/productindex.css b/views/mods/mod_productindex/css/productindex.css index 137b64d..26292b5 100644 --- a/views/mods/mod_productindex/css/productindex.css +++ b/views/mods/mod_productindex/css/productindex.css @@ -30,7 +30,7 @@ .wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_product_inner { margin:15px; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_pic { text-align:center; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_infos { font-size:0.8em; }
-.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_title { font-size:1.0em; font-weight:bold; margin-bottom:5px; line-height:1.5em; min-height:3em; }
+.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_title { font-size:1.0em; font-weight:bold; margin-bottom:5px; line-height:1.5em; min-height:3em; overflow-wrap:anywhere; hyphens:auto; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_mod_productindex_price { font-size:1.4em; font-weight:normal; color:#000000; }
.wpsg_mod_productindex_grid .wpsg_mod_productindex_product .wpsg_mod_productindex_content .wpsg_produkt_preishinweis { font-size:0.8em; font-weight:normal; font-style:italic; }
.wpsg_mod_productindex_grid .wpsg_produkt_soldout { color:#FF0000; }
diff --git a/views/mods/mod_productindex/layouts/grid.phtml b/views/mods/mod_productindex/layouts/grid.phtml index b7373e8..f3839d0 100644 --- a/views/mods/mod_productindex/layouts/grid.phtml +++ b/views/mods/mod_productindex/layouts/grid.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktübersichtsseite (Gitteransicht)
+ * @version 4.6.1
*/
$col = 4;
@@ -85,7 +86,7 @@ <?php if (($i - 1) % $col == 0) { ?><div class="wpsg_mod_productindex_productrow"><?php } ?>
- <div class="wpsg_mod_productindex_product <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>" style="width:<?php echo round((100 / $col), 2) ?>%;">
+ <div class="wpsg_mod_productindex_product <?php echo (($i == sizeof($this->view['arProducts']))?'wpsg_mod_productindex_product_last':''); ?> <?php echo (($i == 1)?'wpsg_mod_productindex_product_first':''); ?>" style="<?php echo ((\wpsg\ThemeStyle::isThemeMode())?'--wpsg-columns:'.intval($col):'width:'.round((100 / $col), 2).'%'); ?>;">
<div class="wpsg_mod_productindex_product_inner">
<a title="<?php echo __('Zur Detailseite des Produktes', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>">
@@ -143,7 +144,7 @@ <?php } ?>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
<div class="wpsg_produkt_preishinweis">
- <?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+ <?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint">'.esc_html__('Endpreis', 'wpsg').'</a>'); ?>
</div>
<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
<div class="wpsg_produkt_preishinweis">
@@ -170,7 +171,7 @@ <?php if (false) { ?>
<span class="wpsg_produkt_soldout"><?php echo __('Produkt ausverkauft', 'wpsg'); ?></span>
<?php } else { ?>
- <a class="wpsg_button" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo __('Zum Produkt', 'wpsg'); ?></a>
+ <a class="wpsg_button<?php echo wpsg_button_class(); ?>" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo esc_html(wpsg_button_text('to_product', __('Zum Produkt', 'wpsg'))); ?></a>
<?php } ?>
</div>
@@ -239,8 +240,8 @@ </div>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
- <a name="kkhint"></a>
- <div class="wpsg_mod_productindex_kuhint"><?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?></div>
+ <?php /* Ziel des Links „Endpreis“; der title-Text erreichte Tastatur und Screenreader nicht (P31) */ ?>
+ <div class="wpsg_mod_productindex_kuhint" id="kkhint"><?php echo wp_kses_post((string)$this->get_option('wpsg_kleinunternehmer_text')); ?></div>
<?php } ?>
</div>
diff --git a/views/mods/mod_productindex/layouts/list.phtml b/views/mods/mod_productindex/layouts/list.phtml index c3f2e5c..c27ee69 100644 --- a/views/mods/mod_productindex/layouts/list.phtml +++ b/views/mods/mod_productindex/layouts/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktübersichtsseite
+ * @version 4.6.1
*/
?>
@@ -154,7 +155,7 @@ </div>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { /* Kleinunternehmerregelung aktiviert START */ ?>
<div class="wpsg_produkt_preishinweis">
- <?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint" title="'.wpsg_hspc($this->get_option('wpsg_kleinunternehmer_text')).'">Endpreis</a>'); ?>
+ <?php echo wpsg_translate(__('#2# zzgl. #1#', 'wpsg'), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>', '<a href="#kkhint">'.esc_html__('Endpreis', 'wpsg').'</a>'); ?>
</div>
<?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
<div class="wpsg_produkt_preishinweis">
@@ -174,7 +175,7 @@ <?php if (false) { ?>
<span class="wpsg_produkt_soldout"><?php echo __('Produkt ausverkauft', 'wpsg'); ?></span>
<?php } else { ?>
- <a class="wpsg_button" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo __('Zum Produkt', 'wpsg'); ?></a>
+ <a class="wpsg_button<?php echo wpsg_button_class(); ?>" title="<?php echo __('Zur Detailseite des Produkts', 'wpsg'); ?>" href="<?php echo wpsg_url($p['url']); ?>"><?php echo esc_html(wpsg_button_text('to_product', __('Zum Produkt', 'wpsg'))); ?></a>
<?php } ?>
</div>
@@ -237,8 +238,8 @@ </div>
<?php if ($this->get_option('wpsg_kleinunternehmer')) { ?>
- <a name="kkhint"></a>
- <div class="wpsg_mod_productindex_kuhint"><?php echo $this->get_option('wpsg_kleinunternehmer_text'); ?></div>
+ <?php /* Ziel des Links „Endpreis“; der title-Text erreichte Tastatur und Screenreader nicht (P31) */ ?>
+ <div class="wpsg_mod_productindex_kuhint" id="kkhint"><?php echo wp_kses_post((string)$this->get_option('wpsg_kleinunternehmer_text')); ?></div>
<?php } ?>
</div>
diff --git a/views/mods/mod_productindex/page_metabox.phtml b/views/mods/mod_productindex/page_metabox.phtml index ccea71f..a8685e3 100644 --- a/views/mods/mod_productindex/page_metabox.phtml +++ b/views/mods/mod_productindex/page_metabox.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen innerhalb des Posts
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/admin_edit.phtml b/views/mods/mod_productvariants/admin_edit.phtml index aaa0a7d..f3348d6 100644 --- a/views/mods/mod_productvariants/admin_edit.phtml +++ b/views/mods/mod_productvariants/admin_edit.phtml @@ -2,6 +2,7 @@ /**
* Template um eine Variante zu bearbeiten
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/admin_html.phtml b/views/mods/mod_productvariants/admin_html.phtml index 6f49037..26bee85 100644 --- a/views/mods/mod_productvariants/admin_html.phtml +++ b/views/mods/mod_productvariants/admin_html.phtml @@ -3,6 +3,7 @@ /**
* HTML Teil für die Produktvariablenverwaltung
* (GLOBAL und Produktbezogen)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/admin_show.phtml b/views/mods/mod_productvariants/admin_show.phtml index c3d7c9a..5908d74 100644 --- a/views/mods/mod_productvariants/admin_show.phtml +++ b/views/mods/mod_productvariants/admin_show.phtml @@ -2,6 +2,7 @@ /**
* Verwaltung der Produktvarianten im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/basket_row.phtml b/views/mods/mod_productvariants/basket_row.phtml index c542636..112156d 100644 --- a/views/mods/mod_productvariants/basket_row.phtml +++ b/views/mods/mod_productvariants/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Render ein Variantenprodukt im Warenkorb (basket.phtml)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/frontend.js b/views/mods/mod_productvariants/frontend.js index 66db90d..2d4957a 100644 --- a/views/mods/mod_productvariants/frontend.js +++ b/views/mods/mod_productvariants/frontend.js @@ -3,6 +3,10 @@ {
var template_index = jQuery(event.target).closest('.wpsg_mod_productvariants_product_wrap').attr('wpsg-productindex');
+
+ // Nach dem Nachladen steht der Fokus wieder auf der Auswahl, nicht auf body (Tastatur, W4)
+ var focus_id = event.target.id || '';
+ var focus_image = jQuery(event.target).closest('.wpsg_vp_update_image').data('wpsg-id');
wpsg_blockProductTemplate(template_index);
@@ -19,6 +23,12 @@ jQuery('#wpsg_produktform_' + template_index).replaceWith(data);
if (typeof refreshFsLightbox === 'function') refreshFsLightbox();
+
+ var form = document.getElementById('wpsg_produktform_' + template_index);
+ var focus = ((focus_id !== '')?document.getElementById(focus_id):null);
+ if (!focus && form && typeof focus_image !== 'undefined') focus = form.querySelector('.wpsg_vp_update_image[data-wpsg-id="' + focus_image + '"]');
+ if (!focus && form) focus = form.querySelector('.wpsg_vp_update, .wpsg_vp_update_image');
+ if (focus) focus.focus();
}
} );
diff --git a/views/mods/mod_productvariants/mail_row.phtml b/views/mods/mod_productvariants/mail_row.phtml index 6d86330..60ad223 100644 --- a/views/mods/mod_productvariants/mail_row.phtml +++ b/views/mods/mod_productvariants/mail_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Variantenintegration in die Kunden- und Adminmail
+ * @version 4.6.1
*/
?><?php echo wpsg_pad_left(__('Variante:', 'wpsg').' ', 15); ?><?php echo $this->view['variante']['key']; ?>
diff --git a/views/mods/mod_productvariants/mail_row_html.phtml b/views/mods/mod_productvariants/mail_row_html.phtml index e4f8864..506e032 100644 --- a/views/mods/mod_productvariants/mail_row_html.phtml +++ b/views/mods/mod_productvariants/mail_row_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Variantenintegration in die HTML Kunden- und Adminmail
+ * @version 4.6.1
*/
$i = $this->view['i'];
diff --git a/views/mods/mod_productvariants/order_view_row.phtml b/views/mods/mod_productvariants/order_view_row.phtml index 8baa495..9f1e3f6 100644 --- a/views/mods/mod_productvariants/order_view_row.phtml +++ b/views/mods/mod_productvariants/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Anzeige des Variantennamens in der Bestellverwaltung
+ * @version 4.6.1
*/
$i = $this->view['i'];
diff --git a/views/mods/mod_productvariants/overview_row.phtml b/views/mods/mod_productvariants/overview_row.phtml index 95d75d7..1b2818d 100644 --- a/views/mods/mod_productvariants/overview_row.phtml +++ b/views/mods/mod_productvariants/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Render ein Variantenprodukt in der Bestellübersicht (basket.phtml)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/productTemplate.phtml b/views/mods/mod_productvariants/productTemplate.phtml index fdba0ec..d833c96 100644 --- a/views/mods/mod_productvariants/productTemplate.phtml +++ b/views/mods/mod_productvariants/productTemplate.phtml @@ -2,6 +2,7 @@ /**
* Integration der Variantenauswahl in die Produktverwaltung
+ * @version 4.6.1
*/
die("VERALTETES TEMPLATE");
diff --git a/views/mods/mod_productvariants/produkt.phtml b/views/mods/mod_productvariants/produkt.phtml index 8c79867..5c3cbc5 100644 --- a/views/mods/mod_productvariants/produkt.phtml +++ b/views/mods/mod_productvariants/produkt.phtml @@ -2,6 +2,7 @@ /**
* Template für die Varianten wird vom Produkttemplate z.B. standard.phtml geladen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvariants/produkt_addedit_content.phtml b/views/mods/mod_productvariants/produkt_addedit_content.phtml index 0d3779b..8f50b9f 100644 --- a/views/mods/mod_productvariants/produkt_addedit_content.phtml +++ b/views/mods/mod_productvariants/produkt_addedit_content.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_productvariants/settings_edit.phtml b/views/mods/mod_productvariants/settings_edit.phtml index d516a57..1d52267 100644 --- a/views/mods/mod_productvariants/settings_edit.phtml +++ b/views/mods/mod_productvariants/settings_edit.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für die Einstellungen des Moduls
diff --git a/views/mods/mod_productvars/basket_row.phtml b/views/mods/mod_productvars/basket_row.phtml index 7bcae7d..3400cac 100644 --- a/views/mods/mod_productvars/basket_row.phtml +++ b/views/mods/mod_productvars/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Produktvariablen innerhalb des Warenkorbs
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvars/mail_row.phtml b/views/mods/mod_productvars/mail_row.phtml index 04d9b95..48055e5 100644 --- a/views/mods/mod_productvars/mail_row.phtml +++ b/views/mods/mod_productvars/mail_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktvariablen in den Mails
+ * @version 4.6.1
*/
?><?php if (is_array($this->view['wpsg_mod_productvars']['data']) && sizeof($this->view['wpsg_mod_productvars']['data']) > 0) { ?>
diff --git a/views/mods/mod_productvars/mail_row_html.phtml b/views/mods/mod_productvars/mail_row_html.phtml index f61f960..2ed6417 100644 --- a/views/mods/mod_productvars/mail_row_html.phtml +++ b/views/mods/mod_productvars/mail_row_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktvariablen in den HTML Mails
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvars/order_view_row.phtml b/views/mods/mod_productvars/order_view_row.phtml index 4abda08..28e2970 100644 --- a/views/mods/mod_productvars/order_view_row.phtml +++ b/views/mods/mod_productvars/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Darstellung der Produktvariablen in der Bestellansicht
+ * @version 4.6.1
*/
$product_index = $this->view['wpsg_mod_productvars']['p']['product_index'];
diff --git a/views/mods/mod_productvars/overview_row.phtml b/views/mods/mod_productvars/overview_row.phtml index 2247072..2c05fc2 100644 --- a/views/mods/mod_productvars/overview_row.phtml +++ b/views/mods/mod_productvars/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für eine Produktzeile bei der Bestellzusammenfassung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvars/produkt_addedit_sidebar.phtml b/views/mods/mod_productvars/produkt_addedit_sidebar.phtml index f811ff2..e31573b 100644 --- a/views/mods/mod_productvars/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_productvars/produkt_addedit_sidebar.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Aktivierung der Produktvariablen in der Produktvarwaltung
diff --git a/views/mods/mod_productvars/pv_list.phtml b/views/mods/mod_productvars/pv_list.phtml index 2d03925..4023ee4 100644 --- a/views/mods/mod_productvars/pv_list.phtml +++ b/views/mods/mod_productvars/pv_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Produktvariablen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvars/renderTemplate.phtml b/views/mods/mod_productvars/renderTemplate.phtml index ba8cf58..6521adf 100644 --- a/views/mods/mod_productvars/renderTemplate.phtml +++ b/views/mods/mod_productvars/renderTemplate.phtml @@ -6,6 +6,7 @@ * Die Beschriftung steht über dem Feld, Checkboxen stehen mit ihrem Text in einer Zeile.
* Pflichtfelder tragen required, der leere Platzhalter der Auswahl wird serverseitig zu not_set.
* Die Klassen wpsg_mod_productvars_row, _label und _input bleiben für bestehende Anpassungen im Theme erhalten.
+ * @version 4.6.1
*/
$template_index = intval($this->view['wpsg_mod_productvars']['template_index']??0);
diff --git a/views/mods/mod_productvars/settings_edit.phtml b/views/mods/mod_productvars/settings_edit.phtml index 0413531..9c55f16 100644 --- a/views/mods/mod_productvars/settings_edit.phtml +++ b/views/mods/mod_productvars/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen der Produktvariablen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_productvars/smartcheckout_row.phtml b/views/mods/mod_productvars/smartcheckout_row.phtml index b5845b5..bf34c80 100644 --- a/views/mods/mod_productvars/smartcheckout_row.phtml +++ b/views/mods/mod_productvars/smartcheckout_row.phtml @@ -6,6 +6,7 @@ * Die Feldnamen entsprechen denen aus basket_row.phtml, gespeichert wird über * wpsg_mod_productvars::basket_preUpdate(). Pflichtfelder tragen required, der leere * Platzhalter der Auswahl wird serverseitig zu not_set. + * @version 4.6.1 */ $p = $this->view['wpsg_mod_productvars']['p']; diff --git a/views/mods/mod_productview/productview.js b/views/mods/mod_productview/productview.js new file mode 100644 index 0000000..df33d92 --- /dev/null +++ b/views/mods/mod_productview/productview.js @@ -0,0 +1,253 @@ +/** + * wpShopGermany, Modul Produktansichten: Seiten, Sortierung, Ansicht und Filter ohne Neuladen + * + * Ohne JavaScript funktionieren Links und Formulare über die Adresse. Mit JavaScript holt das Skript die Ansicht per + * Ajax (wpsg_mod=wpsg_mod_productview, wpsg_action=refresh) und schreibt den Zustand in die Adresse. Die Attribute des + * Shortcodes kommen signiert aus dem Feld wpsg_atts; der Server übernimmt nur Seite, Sortierung, Ansicht und Filter. + * Produktlisten mit data-wpsg-filter (Block Produktliste, Produktkacheln) holt es mit der neuen Adresse als ganze Seite, + * wie ohne JavaScript, und tauscht ihren Inhalt; die Statuszeile und ein Filter darin bleiben stehen, damit Ansage und + * Fokus erhalten bleiben. + */ + +( function() { + + 'use strict'; + + function flatten( prefix, value, params ) { + + if ( value !== null && typeof value === 'object' ) { + + Object.keys( value ).forEach( function( k ) { flatten( prefix + '[' + k + ']', value[ k ], params ); } ); + + } else if ( value !== undefined && value !== null ) { + + params.append( prefix, String( value ) ); + + } + + return params; + + } + + function filterValues() { + + const form = document.getElementById( 'wpsg_mod_productview_filter' ); + const values = {}; + + if ( !form ) return values; + + new FormData( form ).forEach( function( v, name ) { + + const m = name.match( /^pvf\[(\w+)\](?:\[(\d+)\])?/ ); + if ( !m || v === '' ) return; + + if ( m[ 2 ] ) { + + values[ m[ 1 ] ] = values[ m[ 1 ] ] || {}; + values[ m[ 1 ] ][ m[ 2 ] ] = values[ m[ 1 ] ][ m[ 2 ] ] ? values[ m[ 1 ] ][ m[ 2 ] ] + ',' + v : v; + + } else values[ m[ 1 ] ] = v; + + } ); + + return values; + + } + + // Laufende Anfragen je Ansicht (Position auf der Seite) und für die Produktlisten: Nur die zuletzt gestellte zählt + const pending = []; + let pendingLists = null; + + function refresh( box, change, url, push ) { + + const field = box.querySelector( 'input[name="wpsg_atts"]' ); + if ( !field ) return false; + + const index = Array.prototype.indexOf.call( document.querySelectorAll( '.wpsg_productview' ), box ); + if ( pending[ index ] ) pending[ index ].abort(); + const ctl = pending[ index ] = new AbortController(); + + const atts = JSON.parse( field.value ); + Object.assign( atts, change ); + + const params = flatten( 'wpsg_atts', atts, new URLSearchParams( { wpsg_mod: 'wpsg_mod_productview', wpsg_action: 'refresh' } ) ); + + box.classList.add( 'is-loading' ); + box.setAttribute( 'aria-busy', 'true' ); + + fetch( box.getAttribute( 'data-wpsg-pv-url' ) + ( box.getAttribute( 'data-wpsg-pv-url' ).indexOf( '?' ) === -1 ? '?' : '&' ) + params.toString(), { credentials: 'same-origin', signal: ctl.signal } ) + .then( function( r ) { if ( !r.ok ) throw new Error( r.status ); return r.text(); } ) + .then( function( html ) { + + if ( pending[ index ] !== ctl ) return; + pending[ index ] = null; + + const tmp = document.createElement( 'div' ); + tmp.innerHTML = html; + + const fresh = tmp.querySelector( '.wpsg_productview' ); + if ( !fresh ) throw new Error( 'leer' ); + + fresh.querySelectorAll( '.wpsg-pv__order-submit' ).forEach( function( b ) { b.hidden = true; } ); + // Eine frühere Antwort kann die Ansicht schon ersetzt haben + document.querySelectorAll( '.wpsg_productview' )[ index ].replaceWith( fresh ); + if ( url && push !== false ) history.pushState( { wpsgPv: true }, '', url ); + + } ) + .catch( function() { if ( url && pending[ index ] === ctl ) location.href = url; } ); + + return true; + + } + + document.addEventListener( 'click', function( e ) { + + const a = e.target.closest( '.wpsg-pv__pager a, .wpsg-pv__modes a' ); + if ( !a ) return; + + const box = a.closest( '.wpsg_productview' ); + const change = a.hasAttribute( 'data-page' ) ? { page: a.getAttribute( 'data-page' ) } : { mode: a.getAttribute( 'data-mode' ) }; + + if ( refresh( box, change, a.href ) ) e.preventDefault(); + + } ); + + document.addEventListener( 'change', function( e ) { + + const select = e.target.closest( '.wpsg-pv__order select' ); + + if ( select ) { + + const form = select.form; + const url = form.action + ( form.action.indexOf( '?' ) === -1 ? '?' : '&' ) + new URLSearchParams( new FormData( form ) ).toString(); + + refresh( select.closest( '.wpsg_productview' ), { order: select.value, page: 1 }, url ); + return; + + } + + if ( e.target.closest( '#wpsg_mod_productview_filter' ) ) applyFilter(); + + } ); + + document.addEventListener( 'submit', function( e ) { + + if ( e.target.id !== 'wpsg_mod_productview_filter' ) return; + + if ( applyFilter() ) e.preventDefault(); + + } ); + + function refreshLists( lists, url ) { + + lists.forEach( function( list ) { list.setAttribute( 'aria-busy', 'true' ); } ); + + if ( pendingLists ) pendingLists.abort(); + const ctl = pendingLists = new AbortController(); + + fetch( url, { credentials: 'same-origin', signal: ctl.signal } ) + .then( function( r ) { if ( !r.ok ) throw new Error( r.status ); return r.text(); } ) + .then( function( html ) { + + if ( pendingLists !== ctl ) return; + pendingLists = null; + + const fresh = new DOMParser().parseFromString( html, 'text/html' ).querySelectorAll( '[data-wpsg-filter]' ); + if ( fresh.length !== lists.length ) throw new Error( 'anders' ); + + lists.forEach( function( list, i ) { + + const status = list.querySelector( ':scope > .wpsg-product-list__count' ); + const keep = function( child ) { return child.classList.contains( 'wpsg-product-list__count' ) || child.classList.contains( 'wpsg-block-product-filter' ); }; + + Array.prototype.slice.call( list.children ).forEach( function( child ) { if ( !keep( child ) ) child.remove(); } ); + Array.prototype.slice.call( fresh[ i ].children ).forEach( function( child ) { if ( !keep( child ) ) list.appendChild( document.importNode( child, true ) ); } ); + + const freshStatus = fresh[ i ].querySelector( ':scope > .wpsg-product-list__count' ); + if ( status && freshStatus ) status.textContent = freshStatus.textContent; + + list.removeAttribute( 'aria-busy' ); + + } ); + + } ) + .catch( function() { if ( pendingLists === ctl ) location.href = url; } ); + + } + + // Zahl der aktiven Filter im Knopf „Filter“ und „Filter zurücksetzen“ der Leiste; der Filter bleibt beim Tauschen stehen + function updateBar( form ) { + + const badge = form.querySelector( '.wpsg-pvf__badge' ); + const reset = form.querySelector( '.wpsg-pvf__toggle .wpsg-pvf__reset' ); + if ( !badge && !reset ) return; + + const groups = {}; + + new FormData( form ).forEach( function( v, name ) { + + if ( v === '' ) return; + + const m = name.match( /^pvf\[(variants|attributs)\]\[(\d+)\]/ ); + + if ( name === 'pvc' ) groups.cat = true; + else if ( /^pvf\[price_(min|max)\]$/.test( name ) ) groups.price = true; + else if ( m ) groups[ m[ 1 ] + m[ 2 ] ] = true; + + } ); + + const n = Object.keys( groups ).length; + + if ( badge ) { + + badge.hidden = ( n === 0 ); + badge.querySelector( '.wpsg-pvf__badge-count' ).textContent = String( n ); + + } + + if ( reset ) reset.hidden = ( n === 0 ); + + } + + function applyFilter() { + + const form = document.getElementById( 'wpsg_mod_productview_filter' ); + const boxes = document.querySelectorAll( '.wpsg_productview' ); + const lists = document.querySelectorAll( '[data-wpsg-filter]' ); + if ( !form || ( !boxes.length && !lists.length ) ) return false; + + const params = new URLSearchParams(); + new FormData( form ).forEach( function( v, name ) { if ( v !== '' && !/^pv-/.test( name ) ) params.append( name, v ); } ); + + // Sortierung und Ansicht aus der aktuellen Adresse behalten, die Seite beginnt neu + new URLSearchParams( location.search ).forEach( function( v, name ) { if ( /^pv-.*(order|mode)$/.test( name ) ) params.append( name, v ); } ); + + const url = form.action + ( form.action.indexOf( '?' ) === -1 ? '?' : '&' ) + params.toString(); + const values = filterValues(); + + boxes.forEach( function( box ) { refresh( box, { filter: values, page: 1 }, url, false ); } ); + if ( lists.length ) refreshLists( lists, url ); + + updateBar( form ); + + history.pushState( { wpsgPv: true }, '', url ); + + return true; + + } + + // Zurück und Vor: den Stand aus der Adresse neu laden + window.addEventListener( 'popstate', function( e ) { if ( e.state && e.state.wpsgPv ) location.reload(); } ); + + // Mit JavaScript sortiert die Auswahl sofort + document.querySelectorAll( '.wpsg-pv__order-submit' ).forEach( function( b ) { b.hidden = true; } ); + + // Filterleiste der Produktkacheln: am Handy zugeklappt, breit immer offen (Grenze wie WordPress, 782 px) + const narrow = window.matchMedia( '(max-width: 781px)' ); + + function toggleBar() { document.querySelectorAll( '.wpsg-pvf__toggle' ).forEach( function( d ) { d.open = !narrow.matches; } ); } + + toggleBar(); + narrow.addEventListener( 'change', toggleBar ); + +} )(); diff --git a/views/mods/mod_productview/productview.phtml b/views/mods/mod_productview/productview.phtml new file mode 100644 index 0000000..eb31fe3 --- /dev/null +++ b/views/mods/mod_productview/productview.phtml @@ -0,0 +1,167 @@ +<?php + + /** + * Modul Produktansichten: Ausgabe von [wpsg_productview] + * + * Das Element .wpsg_productview tauscht productview.js per Ajax aus; das versteckte Feld wpsg_atts mit der Signatur + * (_sig) muss in eigenen Fassungen erhalten bleiben. Seiten, Sortierung und Ansicht funktionieren auch ohne JavaScript + * über die Adresse (pv-pg, pv-order, pv-mode). + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $v = $this->view['wpsg_mod_productview']; + $atts = $v['atts']; + $currency = $this->get_option('wpsg_currency'); + $hint_id = \wpsg\Blocks::kleinunternehmerHintID('pv-'.$atts['key']); + $prefix = (($atts['key'] === 'default')?'pv-':'pv-'.$atts['key'].'-'); + + $arOrder = $v['arOrder']; + if ($atts['order_set'] !== '') $arOrder = array_intersect_key($arOrder, array_flip(explode(',', $atts['order_set']))); + + $hidden = function($name, $value) use (&$hidden) { + if (is_array($value)) { foreach ($value as $k => $sub) $hidden($name.'['.$k.']', $sub); return; } + echo '<input type="hidden" name="'.esc_attr($name).'" value="'.esc_attr((string)$value).'" />'; + }; + +?> +<div class="wpsg_productview wpsg-pv wpsg-pv--<?php echo esc_attr($v['mode']); ?>" id="wpsg_productview_<?php echo intval($v['index']); ?>" data-wpsg-pv="<?php echo intval($v['index']); ?>" data-wpsg-pv-url="<?php echo esc_url($this->getURL(wpsg_ShopController::URL_BASKET)); ?>"> + + <input type="hidden" name="wpsg_atts" value="<?php echo esc_attr((string)wp_json_encode($atts)); ?>" /> + + <div class="wpsg-pv__head"> + + <?php if ($v['title'] !== '') { ?> + <h2 class="wpsg-pv__title"><?php echo esc_html($v['title']); ?></h2> + <?php } ?> + + <p class="wpsg-pv__info" aria-live="polite"><?php if ($v['count'] > 0) { + echo esc_html(wpsg_translate(__('Anzeige #1# – #2# von #3# Ergebnissen', 'wpsg'), ($v['page'] - 1) * $v['per_page'] + 1, $v['pageMax'], $v['count'])); + } else { + echo esc_html__('Keine Produkte in dieser Ansicht.', 'wpsg'); + } ?></p> + + <?php if ($atts['hideorder'] !== '1' && $v['count'] > 1 && sizeof($arOrder) > 1) { ?> + <form class="wpsg-pv__order" method="get" action="<?php echo esc_url($v['url']); ?>"> + <?php if ($v['mode'] !== $atts['mode_initial']) $hidden($prefix.'mode', $v['mode']); ?> + <?php if (wpsg_isSizedArray($atts['filter'])) $hidden('pvf', $atts['filter']); ?> + <label> + <span class="wpsg-pv__order-label"><?php echo esc_html__('Sortierung', 'wpsg'); ?></span> + <select name="<?php echo esc_attr($prefix.'order'); ?>"> + <?php foreach ($arOrder as $value => $label) { ?> + <option value="<?php echo esc_attr($value); ?>" <?php selected($v['order'], $value); ?>><?php echo esc_html($label); ?></option> + <?php } ?> + </select> + </label> + <button type="submit" class="wpsg_button wpsg-pv__order-submit<?php echo wpsg_button_class(); ?>"><?php echo esc_html__('Sortieren', 'wpsg'); ?></button> + </form> + <?php } ?> + + <?php if ($atts['hideviewselect'] !== '1' && $v['count'] > 0) { ?> + <nav class="wpsg-pv__modes" aria-label="<?php echo esc_attr__('Ansicht', 'wpsg'); ?>"> + <a href="<?php echo esc_url(wpsg_mod_productview::getStateURL($v, ['mode' => 'grid', 'pg' => $v['page']])); ?>" data-mode="grid" <?php echo (($v['mode'] === 'grid')?'aria-current="true" class="active"':''); ?>><?php echo esc_html__('Kacheln', 'wpsg'); ?></a> + <a href="<?php echo esc_url(wpsg_mod_productview::getStateURL($v, ['mode' => 'list', 'pg' => $v['page']])); ?>" data-mode="list" <?php echo (($v['mode'] === 'list')?'aria-current="true" class="active"':''); ?>><?php echo esc_html__('Liste', 'wpsg'); ?></a> + </nav> + <?php } ?> + + </div> + + <?php if (wpsg_isSizedArray($v['products'])) { ?> + <ul class="wpsg-pv__items" style="--wpsg-columns:<?php echo intval($v['cols']); ?>"> + <?php foreach ($v['products'] as $oProduct) { $product_id = intval($oProduct->id); $url = $oProduct->getProductURL(); $name = $oProduct->getProductName(); $attachment_id = $this->imagehandler->getAttachmentID($oProduct->getProductKey()); ?> + <li class="wpsg-pv__item wpsg_productview_product_<?php echo $product_id; ?>"> + + <?php if (wpsg_isSizedInt($attachment_id)) { ?> + <a class="wpsg-pv__image" href="<?php echo esc_url($url); ?>" tabindex="-1" aria-hidden="true"><?php echo wp_get_attachment_image($attachment_id, wpsg_mod_productview::IMAGE_SIZE, false, ['alt' => '']); ?></a> + <?php } ?> + + <div class="wpsg-pv__body"> + + <h3 class="wpsg-pv__name"><a href="<?php echo esc_url($url); ?>"><?php echo esc_html($name); ?></a></h3> + <?php $detailname = (string)$oProduct->detailname; if ($detailname !== '' && $detailname !== $name) { ?> + <p class="wpsg-pv__detailname"><?php echo esc_html($detailname); ?></p> + <?php } ?> + + <?php if ($this->hasMod('wpsg_mod_reviews')) { /* Mit dem Modul Produktbewertungen nur freigegebene Bewertungen, sonst die Sterne am Produkt (doc/bewertungen.md, Entscheidung 1) */ ?> + <?php echo $this->callMod('wpsg_mod_reviews', 'renderSummary', [$product_id, 'wpsg-pv__rating']); ?> + <?php } else { $rating = floatval($oProduct->getRating()); if ($rating > 0) { ?> + <p class="wpsg-pv__rating" title="<?php echo esc_attr(wpsg_translate(__('#1# von 5 Sternen', 'wpsg'), trim(wpsg_ff($rating, '', true)))); ?>"><span aria-hidden="true"><?php echo str_repeat('★', intval(round($rating))).str_repeat('☆', 5 - intval(round($rating))); ?></span><span class="screen-reader-text"><?php echo esc_html(wpsg_translate(__('#1# von 5 Sternen', 'wpsg'), trim(wpsg_ff($rating, '', true)))); ?></span></p> + <?php } } ?> + + <?php if ($oProduct->canDisplayPrice()) { $price = $oProduct->getPrice(); $oldPrice = $oProduct->getOldPrice(); ?> + <p class="wpsg-pv__price"> + <?php if ($oldPrice !== false && $oldPrice != $price) { ?> + <span class="wpsg-pv__price-current wpsg_mod_productview_current"><?php echo wpsg_price_html($price, 'list'); ?></span> + <del class="wpsg-pv__price-old wpsg_mod_productview_oldprice"><?php echo wpsg_price_html($oldPrice, 'list_old'); ?></del> + <?php } else { ?> + <span class="wpsg-pv__price-current"><?php echo wpsg_price_html($price, 'list'); ?></span> + <?php } ?> + </p> + <?php if ($this->hasMod('wpsg_mod_fuellmenge')) { ?> + <div class="wpsg-pv__baseprice"><?php echo $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$price, $oProduct->fmenge, $product_id]); ?></div> + <?php } ?> + <p class="wpsg-pv__taxnote wpsg_produkt_preishinweis"><?php echo \wpsg\Blocks::priceNote($oProduct, $hint_id); ?></p> + <?php } else { ?> + <p class="wpsg-pv__price"><?php echo esc_html__('Preise werden nur für angemeldete Benutzer angezeigt.', 'wpsg'); ?></p> + <?php } ?> + + <?php if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') { ?> + <p class="wpsg-pv__stock"><?php echo esc_html(wpsg_translate(__('#1# Artikel auf Lager', 'wpsg'), intval($oProduct->stock))); ?></p> + <?php } ?> + + <?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?> + <p class="wpsg-pv__deliverytime"> + <?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', [$oProduct->getProductKey()])) { ?> + <?php echo esc_html((string)$this->callMod('wpsg_mod_deliverytime', 'displayStoreText', [$oProduct->getProductKey()])); ?> + <?php } else { $strDelay = (string)$this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', [$oProduct->getProductKey()]); ?> + <?php if ($strDelay !== '') { echo esc_html($strDelay); } else { ?> + <?php echo esc_html__('Lieferzeit:', 'wpsg'); ?> <?php echo wp_kses_post((string)$this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', [$oProduct->getProductKey()])); ?> + <?php } ?> + <?php } ?> + </p> + <?php } ?> + + <?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1' && floatval($oProduct->weight) > 0) { ?> + <p class="wpsg-pv__weight"><?php echo esc_html(wpsg_translate(__('Gewicht: #1#', 'wpsg'), wpsg_ff($oProduct->weight, $this->get_option('wpsg_mod_weight_unit')))); ?></p> + <?php } ?> + + <?php $short = (string)$oProduct->getShortDescription(); if ($short !== '') { ?> + <div class="wpsg-pv__description"><?php echo wp_kses_post($short); ?></div> + <?php } ?> + + <div class="wpsg-pv__action"> + <?php if ($atts['button'] === '1' && wpsg_buy_in_list($oProduct)) { ?> + <form method="post" action="<?php echo esc_url($v['url']); ?>"> + <input type="hidden" name="wpsg[produkt_id]" value="<?php echo esc_attr((string)$product_id); ?>" /> + <input type="hidden" name="wpsg[menge]" value="1" /> + <input type="hidden" name="myReferer" value="<?php echo esc_attr($v['url']); ?>" /> + <button type="submit" name="wpsg[submit]" value="1" class="wpsg_button wpsg_add_basket<?php echo wpsg_button_class(); ?>"><?php echo esc_html(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></button> + </form> + <?php } ?> + <a class="wpsg_button<?php echo wpsg_button_class(); ?>" href="<?php echo esc_url($url); ?>"><?php echo esc_html(wpsg_button_text('to_product', __('Zum Produkt', 'wpsg'))); ?><span class="screen-reader-text"><?php echo esc_html(': '.$name); ?></span></a> + </div> + + </div> + + </li> + <?php } ?> + </ul> + <?php echo \wpsg\Blocks::kleinunternehmerHint($hint_id); ?> + <?php } ?> + + <?php if ($v['pages'] > 1) { ?> + <nav class="wpsg-pv__pager wpsg_productview_pager" aria-label="<?php echo esc_attr__('Seiten', 'wpsg'); ?>"> + <?php for ($i = 1; $i <= $v['pages']; $i ++) { ?> + <?php if ($i === $v['page']) { ?> + <span aria-current="page"><?php echo $i; ?></span> + <?php } else if ($i === 1 || $i === $v['pages'] || abs($i - $v['page']) <= 2) { ?> + <a href="<?php echo esc_url(wpsg_mod_productview::getStateURL($v, ['pg' => $i])); ?>" data-page="<?php echo $i; ?>"><?php echo $i; ?></a> + <?php } else if (abs($i - $v['page']) === 3) { ?> + <span class="wpsg-pv__gap">…</span> + <?php } ?> + <?php } ?> + </nav> + <?php } ?> + +</div> diff --git a/views/mods/mod_productview/productview_filter.phtml b/views/mods/mod_productview/productview_filter.phtml new file mode 100644 index 0000000..c70510f --- /dev/null +++ b/views/mods/mod_productview/productview_filter.phtml @@ -0,0 +1,126 @@ +<?php + + /** + * Modul Produktansichten: Ausgabe von [wpsg_productview_filter] + * + * Ein Formular mit GET: Die Filterwerte stehen in der Adresse (pvf[…]), die Seite ist verlinkbar und funktioniert + * ohne JavaScript. Mit JavaScript aktualisiert productview.js die Produktansicht ohne Neuladen. + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arValues = $this->view['wpsg_mod_productview_filter']['values']; + $currency = $this->get_option('wpsg_currency'); + + $checked = function($group, $id, $value) use ($arValues) { + $arSet = explode(',', (string)($arValues[$group][$id]??'')); + return in_array((string)$value, $arSet, true); + }; + +?> +<form class="wpsg_mod_productview_filter wpsg-pvf" id="wpsg_mod_productview_filter" method="get" action="<?php echo esc_url($this->view['wpsg_mod_productview_filter']['url']); ?>"> + + <?php foreach ($this->view['wpsg_mod_productview_filter']['keep'] as $param => $value) { ?> + <input type="hidden" name="<?php echo esc_attr($param); ?>" value="<?php echo esc_attr($value); ?>" /> + <?php } ?> + + <?php /* Leiste über den Produktkacheln: am Handy unter „Filter“ zugeklappt (productview.js), breit offen */ $bBar = (($this->view['wpsg_mod_productview_filter']['bar']??false) === true); $nActive = intval($this->view['wpsg_mod_productview_filter']['active']??0); ?> + <?php if ($bBar) { ?> + <details class="wpsg-pvf__toggle" open> + <summary class="wpsg-pvf__summary"><?php echo esc_html__('Filter', 'wpsg'); ?><span class="wpsg-pvf__badge"<?php if ($nActive === 0) echo ' hidden'; ?>><span class="screen-reader-text">, </span><span class="wpsg-pvf__badge-count"><?php echo $nActive; ?></span><span class="screen-reader-text"> <?php echo esc_html__('aktiv', 'wpsg'); ?></span></span></summary> + <div class="wpsg-pvf__fields"> + <?php } ?> + + <?php foreach ($this->view['showFilter'] as $filter) { ?> + + <?php if ($filter['type'] === 'catselect') { ?> + <div class="wpsg-pvf__item wpsg-pvf__select wpsg-pvf__catselect"> + <label class="wpsg-pvf__title" for="wpsg_pvf_cat"><?php echo esc_html__('Kategorie', 'wpsg'); ?></label> + <select id="wpsg_pvf_cat" name="pvc"> + <option value=""><?php echo esc_html__('Alle Kategorien', 'wpsg'); ?></option> + <?php foreach ($filter['cats'] as $arCat) { ?> + <option value="<?php echo intval($arCat['id']); ?>" <?php selected(intval($filter['value']), intval($arCat['id'])); ?>><?php echo esc_html($arCat['label']); ?></option> + <?php } ?> + </select> + </div> + + <?php } else if ($filter['type'] === 'sort') { ?> + <div class="wpsg-pvf__item wpsg-pvf__select wpsg-pvf__sort"> + <label class="wpsg-pvf__title" for="wpsg_pvf_sort"><?php echo esc_html__('Sortierung', 'wpsg'); ?></label> + <select id="wpsg_pvf_sort" name="pvs"> + <?php $i = 0; foreach ($filter['orders'] as $key => $label) { /* Vorgabe ohne Wert, damit sie nicht in der Adresse steht */ ?> + <option value="<?php echo (($i ++ === 0)?'':esc_attr($key)); ?>" <?php selected($filter['value'], $key); ?>><?php echo esc_html($label); ?></option> + <?php } ?> + </select> + </div> + + <?php } else if ($filter['type'] === 'catfilter') { ?> + <nav class="wpsg-pvf__item wpsg-pvf__cat" aria-label="<?php echo esc_attr__('Produktkategorie', 'wpsg'); ?>"> + <h2 class="wpsg-pvf__title"><?php echo esc_html__('Produktkategorie', 'wpsg'); ?></h2> + <ul> + <?php foreach ($filter['cat'] as $oCat) { ?> + <li><a href="<?php echo esc_url(get_term_link($oCat)); ?>"><?php echo esc_html($oCat->name); ?></a></li> + <?php } ?> + </ul> + </nav> + + <?php } else if ($filter['type'] === 'pricefilter') { ?> + <fieldset class="wpsg-pvf__item wpsg-pvf__price"> + <?php /* In der Leiste steht die Währung in der Überschrift, sonst rutscht sie am Handy allein in eine Zeile */ ?> + <legend class="wpsg-pvf__title"><?php echo esc_html__('Preis', 'wpsg'); ?><?php if ($bBar) echo ' ('.esc_html($currency).')'; ?></legend> + <div class="wpsg-pvf__options"> + <label><span><?php echo esc_html__('von', 'wpsg'); ?></span> <input type="number" step="0.01" min="0" name="pvf[price_min]" value="<?php echo esc_attr((string)($arValues['price_min']??'')); ?>" placeholder="<?php echo esc_attr(wpsg_ff($filter['min'])); ?>" /></label> + <label><span><?php echo esc_html__('bis', 'wpsg'); ?></span> <input type="number" step="0.01" min="0" name="pvf[price_max]" value="<?php echo esc_attr((string)($arValues['price_max']??'')); ?>" placeholder="<?php echo esc_attr(wpsg_ff($filter['max'])); ?>" /></label> + <?php if (!$bBar) { ?><span class="wpsg-pvf__unit"><?php echo esc_html($currency); ?></span><?php } ?> + </div> + </fieldset> + + <?php } else if ($filter['type'] === 'productvariants') { $variant = $filter['variant']; ?> + <fieldset class="wpsg-pvf__item wpsg-pvf__variant wpsg-pvf__variant--<?php echo (($filter['displayMode'] === wpsg_mod_productview::DISPLAYMODE_FILTER_SMALL)?'small':'checkbox'); ?>" data-group="variants" data-id="<?php echo intval($variant['id']); ?>"> + <legend class="wpsg-pvf__title"><?php echo esc_html($variant['name']); ?></legend> + <div class="wpsg-pvf__options"> + <?php foreach ($filter['variation'] as $variation) { $label = (wpsg_isSizedString($variation['shortname'])?$variation['shortname']:$variation['name']); ?> + <label class="wpsg-pvf__option"> + <input type="checkbox" name="pvf[variants][<?php echo intval($variant['id']); ?>][]" value="<?php echo intval($variation['id']); ?>" <?php checked($checked('variants', intval($variant['id']), intval($variation['id']))); ?> /> + <?php if (preg_match('/^#[0-9a-fA-F]{3,8}$/', (string)$variation['shortname'])) { ?> + <span class="wpsg-pvf__color" style="background-color:<?php echo esc_attr($variation['shortname']); ?>;"></span><span class="screen-reader-text"><?php echo esc_html($variation['name']); ?></span> + <?php } else { ?> + <span><?php echo esc_html($label); ?></span> + <?php } ?> + </label> + <?php } ?> + </div> + </fieldset> + + <?php } else if ($filter['type'] === 'productattributs') { $attribute = $filter['attribute']; ?> + <fieldset class="wpsg-pvf__item wpsg-pvf__attribute" data-group="attributs" data-id="<?php echo intval($attribute['id']); ?>"> + <legend class="wpsg-pvf__title"><?php echo esc_html($attribute['name']); ?></legend> + <div class="wpsg-pvf__options"> + <?php foreach ($attribute['auswahl'] as $index => $choice) { ?> + <label class="wpsg-pvf__option"> + <input type="checkbox" name="pvf[attributs][<?php echo intval($attribute['id']); ?>][]" value="<?php echo esc_attr((string)$index); ?>" <?php checked($checked('attributs', intval($attribute['id']), (string)$index)); ?> /> + <span><?php echo esc_html($choice); ?></span> + </label> + <?php } ?> + </div> + </fieldset> + <?php } ?> + + <?php } ?> + + <div class="wpsg-pvf__actions"> + <button type="submit" class="wpsg_button<?php echo wpsg_button_class(); ?>"><?php echo esc_html__('Filtern', 'wpsg'); ?></button> + <?php if ($bBar) { /* Immer im Markup, productview.js blendet nach dem Filtern ein und aus */ ?> + <a class="wpsg-pvf__reset" href="<?php echo esc_url($this->view['wpsg_mod_productview_filter']['url']); ?>"<?php if ($nActive === 0) echo ' hidden'; ?>><?php echo esc_html__('Filter zurücksetzen', 'wpsg'); ?></a> + <?php } else if (wpsg_isSizedArray($arValues)) { ?> + <a class="wpsg-pvf__reset" href="<?php echo esc_url($this->view['wpsg_mod_productview_filter']['url']); ?>"><?php echo esc_html__('Filter zurücksetzen', 'wpsg'); ?></a> + <?php } ?> + </div> + + <?php if ($bBar) { ?> + </div> + </details> + <?php } ?> + +</form> diff --git a/views/mods/mod_productview/settings_edit.phtml b/views/mods/mod_productview/settings_edit.phtml new file mode 100644 index 0000000..275f1b6 --- /dev/null +++ b/views/mods/mod_productview/settings_edit.phtml @@ -0,0 +1,11 @@ +<?php + + /** + * Modul Produktansichten: Einstellungen (keine; alles über die Attribute der Shortcodes) + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + +?> +<p><?php echo esc_html__('Das Modul hat keine eigenen Einstellungen. Die Produktansicht steuern die Attribute der Shortcodes [wpsg_productview] und [wpsg_productview_filter].', 'wpsg'); ?></p> diff --git a/views/mods/mod_produktartikel/produkt_addedit_content.phtml b/views/mods/mod_produktartikel/produkt_addedit_content.phtml index 11b734d..1b364b2 100644 --- a/views/mods/mod_produktartikel/produkt_addedit_content.phtml +++ b/views/mods/mod_produktartikel/produkt_addedit_content.phtml @@ -2,6 +2,7 @@ /**
* Admin Template für die Integration des Moduls "Produktartikel" in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml b/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml index 19973a6..abada7f 100644 --- a/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml +++ b/views/mods/mod_produktartikel/produkt_edit_allgemein.phtml @@ -3,6 +3,7 @@ /**
* Template für die Inhalte die beim Bearbeiten eines Produktes in die Allgemein-Box eingefügt werden
* sollte in der Regel nicht angepasst werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktartikel/schemaorg.phtml b/views/mods/mod_produktartikel/schemaorg.phtml index 718ee80..9c37915 100644 --- a/views/mods/mod_produktartikel/schemaorg.phtml +++ b/views/mods/mod_produktartikel/schemaorg.phtml @@ -3,6 +3,7 @@ /**
* Template für die Daten für Schema.org
* sollten normalerweise nicht angezeigt werden. Alternativ kann das Microformat auch direkt im Produkttemplate eingebaut werden.
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktartikel/settings_edit.phtml b/views/mods/mod_produktartikel/settings_edit.phtml index b97485d..07fc9f5 100644 --- a/views/mods/mod_produktartikel/settings_edit.phtml +++ b/views/mods/mod_produktartikel/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungsseite des Produktartikel Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktattribute/basket_row.phtml b/views/mods/mod_produktattribute/basket_row.phtml index 4271260..bba4bbf 100644 --- a/views/mods/mod_produktattribute/basket_row.phtml +++ b/views/mods/mod_produktattribute/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktattribute im Warenkorb
+* @version 4.6.1
*/
//wpsg_debug($this->view);
?>
diff --git a/views/mods/mod_produktattribute/genPACode.phtml b/views/mods/mod_produktattribute/genPACode.phtml index 4189e1b..4576cea 100644 --- a/views/mods/mod_produktattribute/genPACode.phtml +++ b/views/mods/mod_produktattribute/genPACode.phtml @@ -3,6 +3,7 @@ /**
* Template für die Hilfe bei den Produktattributen
* Sollte nicht angepasst werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktattribute/list.phtml b/views/mods/mod_produktattribute/list.phtml index 1f59a93..2c32fab 100644 --- a/views/mods/mod_produktattribute/list.phtml +++ b/views/mods/mod_produktattribute/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Produktattribute im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktattribute/mail_row.phtml b/views/mods/mod_produktattribute/mail_row.phtml index aabf72e..6b98f38 100644 --- a/views/mods/mod_produktattribute/mail_row.phtml +++ b/views/mods/mod_produktattribute/mail_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktattribute in der Mail, die bei einer neuen Bestellung an den Kunde geht (Text Mail)
+ * @version 4.6.1
*/
?><?php foreach ((array)$this->view['wpsg_mod_produktattribute']['data'] as $pa_id) { ?>
diff --git a/views/mods/mod_produktattribute/mail_row_html.phtml b/views/mods/mod_produktattribute/mail_row_html.phtml index 7f4dc15..5d6e8ca 100644 --- a/views/mods/mod_produktattribute/mail_row_html.phtml +++ b/views/mods/mod_produktattribute/mail_row_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktattribute in der Mail, die bei einer neuen Bestellung an den Kunde geht (HTML Mail)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktattribute/overview_row.phtml b/views/mods/mod_produktattribute/overview_row.phtml index 0829bf2..489dd98 100644 --- a/views/mods/mod_produktattribute/overview_row.phtml +++ b/views/mods/mod_produktattribute/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktattribute in der Bestellzusammenfassung
+* @version 4.6.1
*/
//wpsg_debug($this->view);
?>
diff --git a/views/mods/mod_produktattribute/produkt_addedit_content.phtml b/views/mods/mod_produktattribute/produkt_addedit_content.phtml index 8b88859..d507e5c 100644 --- a/views/mods/mod_produktattribute/produkt_addedit_content.phtml +++ b/views/mods/mod_produktattribute/produkt_addedit_content.phtml @@ -2,6 +2,7 @@ /**
* Template für die Eingabe der Produktattribute innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
@@ -15,7 +16,7 @@ <?php if ($pa['typ'] == '1') { /* RTE */ ?>
<div class="form-horizontal"><div class="form-group-sm">
<label class="control-label" for="pa_5" style="padding-bottom:5px;"><?php echo wpsg_hspc($pa['name']); ?></label><br />
- <?php wp_editor($pa['value'], 'pa_'.$pa['id'].''); ?><br />
+ <?php wp_editor((string)($pa['value']??''), 'pa_'.$pa['id'].''); ?><br />
</div></div>
<?php } else if ($pa['typ'] == '2') { /* Auswahl */ ?>
<?php echo wpsg_drawForm_Select('pa_'.$pa['id'], $pa['name'], (array)explode('|', $pa['auswahl']), $pa['value']);?>
diff --git a/views/mods/mod_produktattribute/produkt_bottom.phtml b/views/mods/mod_produktattribute/produkt_bottom.phtml index b761eb3..94f9646 100644 --- a/views/mods/mod_produktattribute/produkt_bottom.phtml +++ b/views/mods/mod_produktattribute/produkt_bottom.phtml @@ -2,6 +2,7 @@ /**
* Template um die Produktvariablen im unteren Bereich des Produkttemplates zu integrieren
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_produktattribute/settings_edit.phtml b/views/mods/mod_produktattribute/settings_edit.phtml index 761e16b..6525cef 100644 --- a/views/mods/mod_produktattribute/settings_edit.phtml +++ b/views/mods/mod_produktattribute/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "Produktattribute"
+ * @version 4.6.1
*/
diff --git a/views/mods/mod_rechnungen/accounting_pdf.phtml b/views/mods/mod_rechnungen/accounting_pdf.phtml index c663e4b..47dd317 100644 --- a/views/mods/mod_rechnungen/accounting_pdf.phtml +++ b/views/mods/mod_rechnungen/accounting_pdf.phtml @@ -2,6 +2,7 @@ /**
* Template für die PDF Rechnungskorrektur
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/mods/mod_rechnungen/accountingmail.phtml b/views/mods/mod_rechnungen/accountingmail.phtml index afa04f8..7937c6d 100644 --- a/views/mods/mod_rechnungen/accountingmail.phtml +++ b/views/mods/mod_rechnungen/accountingmail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann
+ * @version 4.6.1
*/
//wpsg_debug($this->view);
diff --git a/views/mods/mod_rechnungen/accountingmail_html.phtml b/views/mods/mod_rechnungen/accountingmail_html.phtml index 1c84464..364d2a5 100644 --- a/views/mods/mod_rechnungen/accountingmail_html.phtml +++ b/views/mods/mod_rechnungen/accountingmail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnungskorrektur optional an den Kunden versendet werden kann (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_rechnungen/archive.phtml b/views/mods/mod_rechnungen/archive.phtml index fbc0c35..d7bc8c0 100644 --- a/views/mods/mod_rechnungen/archive.phtml +++ b/views/mods/mod_rechnungen/archive.phtml @@ -2,6 +2,7 @@ /**
* Archivliste im Reiter „Archiv“ (wird beim Anklicken nachgeladen)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_rechnungen/copymail.phtml b/views/mods/mod_rechnungen/copymail.phtml index 0b18b5a..fa83462 100644 --- a/views/mods/mod_rechnungen/copymail.phtml +++ b/views/mods/mod_rechnungen/copymail.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für die Rechnungskopie
diff --git a/views/mods/mod_rechnungen/copymail_html.phtml b/views/mods/mod_rechnungen/copymail_html.phtml index c7138d7..1392220 100644 --- a/views/mods/mod_rechnungen/copymail_html.phtml +++ b/views/mods/mod_rechnungen/copymail_html.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<p><?php echo __("Hallo", "wpsg"); ?> <?php echo $this->view['kunde']['vname']; ?> <?php echo $this->view['kunde']['name']; ?>,</p>
<?php if (isset($this->view['rnr'])) { ?>
diff --git a/views/mods/mod_rechnungen/foottext_list.phtml b/views/mods/mod_rechnungen/foottext_list.phtml index 36273fd..2ff7ec7 100644 --- a/views/mods/mod_rechnungen/foottext_list.phtml +++ b/views/mods/mod_rechnungen/foottext_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Fußtexte
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_rechnungen/invoice_pdf.phtml b/views/mods/mod_rechnungen/invoice_pdf.phtml index 2f497c1..4dfc4e9 100644 --- a/views/mods/mod_rechnungen/invoice_pdf.phtml +++ b/views/mods/mod_rechnungen/invoice_pdf.phtml @@ -2,6 +2,7 @@ /**
* Template für die PDF Rechnung
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/mods/mod_rechnungen/invoicemail.phtml b/views/mods/mod_rechnungen/invoicemail.phtml index fc5a0b0..df6de8f 100644 --- a/views/mods/mod_rechnungen/invoicemail.phtml +++ b/views/mods/mod_rechnungen/invoicemail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann
+ * @version 4.6.1
*/
//wpsg_debug($this->view);
diff --git a/views/mods/mod_rechnungen/invoicemail_html.phtml b/views/mods/mod_rechnungen/invoicemail_html.phtml index 4a37f73..0f2d204 100644 --- a/views/mods/mod_rechnungen/invoicemail_html.phtml +++ b/views/mods/mod_rechnungen/invoicemail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_rechnungen/multi_invoice_pdf.phtml b/views/mods/mod_rechnungen/multi_invoice_pdf.phtml index c1aea97..ff4c478 100644 --- a/views/mods/mod_rechnungen/multi_invoice_pdf.phtml +++ b/views/mods/mod_rechnungen/multi_invoice_pdf.phtml @@ -2,6 +2,7 @@ /**
* Template für die PDF Rechnung
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/mods/mod_rechnungen/multi_invoicemail.phtml b/views/mods/mod_rechnungen/multi_invoicemail.phtml index 5810a25..8748c9a 100644 --- a/views/mods/mod_rechnungen/multi_invoicemail.phtml +++ b/views/mods/mod_rechnungen/multi_invoicemail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_rechnungen/multi_invoicemail_html.phtml b/views/mods/mod_rechnungen/multi_invoicemail_html.phtml index 2aef894..d7f2e98 100644 --- a/views/mods/mod_rechnungen/multi_invoicemail_html.phtml +++ b/views/mods/mod_rechnungen/multi_invoicemail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, die beim Schreiben einer Rechnung optional an den Kunden versendet werden kann (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_rechnungen/order_view.phtml b/views/mods/mod_rechnungen/order_view.phtml index 6487bce..84a2ed3 100644 --- a/views/mods/mod_rechnungen/order_view.phtml +++ b/views/mods/mod_rechnungen/order_view.phtml @@ -2,6 +2,7 @@ /**
* Template für die Rechnungsmodulansicht innerhalb der Bestellansicht
+ * @version 4.6.1
*/
use horstoeko\zugferd\ZugferdProfiles;
use wpsg\mod_invoice\eInvoice;
diff --git a/views/mods/mod_rechnungen/order_view_orderdata_after.phtml b/views/mods/mod_rechnungen/order_view_orderdata_after.phtml index 2373b9e..0f4b668 100755 --- a/views/mods/mod_rechnungen/order_view_orderdata_after.phtml +++ b/views/mods/mod_rechnungen/order_view_orderdata_after.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_rechnungen/order_view_row.phtml b/views/mods/mod_rechnungen/order_view_row.phtml index 61bb3f0..1112fe0 100644 --- a/views/mods/mod_rechnungen/order_view_row.phtml +++ b/views/mods/mod_rechnungen/order_view_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktauswahl innerhalb der Bestellansicht
+ * @version 4.6.1
*/
$storno_amount = $this->view['wpsg_mod_rechnungen']['storno_amount'];
diff --git a/views/mods/mod_rechnungen/settings_edit.phtml b/views/mods/mod_rechnungen/settings_edit.phtml index 346dc43..7c0f9b9 100644 --- a/views/mods/mod_rechnungen/settings_edit.phtml +++ b/views/mods/mod_rechnungen/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Rechnungen Moduls
+ * @version 4.6.1
*/
use horstoeko\zugferd\ZugferdProfiles;
diff --git a/views/mods/mod_relatedproducts/basket_after.phtml b/views/mods/mod_relatedproducts/basket_after.phtml index 64a3ca6..c3094d1 100644 --- a/views/mods/mod_relatedproducts/basket_after.phtml +++ b/views/mods/mod_relatedproducts/basket_after.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Zubehörprodukte in den Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_relatedproducts/list.phtml b/views/mods/mod_relatedproducts/list.phtml index d4db6c6..3cd82fe 100644 --- a/views/mods/mod_relatedproducts/list.phtml +++ b/views/mods/mod_relatedproducts/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der gewählten Zubehörprodukte (Backend)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml b/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml index 6b670ea..080dc9f 100644 --- a/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_relatedproducts/produkt_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Zuweisung von Zubehörprodukten
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_relatedproducts/relatedproducts.phtml b/views/mods/mod_relatedproducts/relatedproducts.phtml index 8bb984a..ef59336 100644 --- a/views/mods/mod_relatedproducts/relatedproducts.phtml +++ b/views/mods/mod_relatedproducts/relatedproducts.phtml @@ -2,6 +2,7 @@ /** * Dieses Template wird um die Zubehörprodukte aufgerufen + * @version 4.6.1 */ ?> diff --git a/views/mods/mod_relatedproducts/settings_edit.phtml b/views/mods/mod_relatedproducts/settings_edit.phtml index 410f078..7fcd870 100644 --- a/views/mods/mod_relatedproducts/settings_edit.phtml +++ b/views/mods/mod_relatedproducts/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Tempalte für die Einstellungen des Moduls "Zubehörprodukte"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_request/adminmail.phtml b/views/mods/mod_request/adminmail.phtml index 06b12e8..8669bf0 100644 --- a/views/mods/mod_request/adminmail.phtml +++ b/views/mods/mod_request/adminmail.phtml @@ -2,6 +2,7 @@ /**
* Text E-Mail Template für die Admin Mail bei einer neuen Anfrage
+ * @version 4.6.1
*/
$this->htmlMail = false;
diff --git a/views/mods/mod_request/adminmail_html.phtml b/views/mods/mod_request/adminmail_html.phtml index 8df1fe3..298abe9 100644 --- a/views/mods/mod_request/adminmail_html.phtml +++ b/views/mods/mod_request/adminmail_html.phtml @@ -2,6 +2,7 @@ /**
* HTML E-Mail Template für die Admin Mail bei einer neuen Anfrage
+ * @version 4.6.1
*/
$this->htmlMail = true;
diff --git a/views/mods/mod_request/customermail.phtml b/views/mods/mod_request/customermail.phtml index 3c9243e..f5c1026 100644 --- a/views/mods/mod_request/customermail.phtml +++ b/views/mods/mod_request/customermail.phtml @@ -2,6 +2,7 @@ /**
* HTML E-Mail Template für die Admin Mail bei einer neuen Anfrage
+ * @version 4.6.1
*/
$this->htmlMail = true;
diff --git a/views/mods/mod_request/customermail_html.phtml b/views/mods/mod_request/customermail_html.phtml index 388ad1a..3c2687d 100644 --- a/views/mods/mod_request/customermail_html.phtml +++ b/views/mods/mod_request/customermail_html.phtml @@ -2,6 +2,7 @@ /**
* HTML E-Mail Template für die Admin Mail bei einer neuen Anfrage
+ * @version 4.6.1
*/
$this->htmlMail = true;
diff --git a/views/mods/mod_request/product_bottom.phtml b/views/mods/mod_request/product_bottom.phtml index 314a8ac..4f0f338 100644 --- a/views/mods/mod_request/product_bottom.phtml +++ b/views/mods/mod_request/product_bottom.phtml @@ -3,6 +3,7 @@ /**
* Integration des Anfragemoduls in die Produkttemplates
* Hier wird nicht der Button eingebunden sondern lediglich der JS Teil für die Anzeige im Fenster
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_request/produkt_edit_allgemein.phtml b/views/mods/mod_request/produkt_edit_allgemein.phtml index 3d97432..383ab11 100644 --- a/views/mods/mod_request/produkt_edit_allgemein.phtml +++ b/views/mods/mod_request/produkt_edit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Anfragemoduls in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_request/requestmail.phtml b/views/mods/mod_request/requestmail.phtml index bbf6532..293b311 100644 --- a/views/mods/mod_request/requestmail.phtml +++ b/views/mods/mod_request/requestmail.phtml @@ -3,6 +3,7 @@ /**
* Text E-Mail Template für die Daten der Anfrage
* wird von adminmail.phtml und customermail.phtml verwendet
+ * @version 4.6.1
*/
?><?php if (sizeof($this->view['requestlist']['tax']) > 1 || $this->get_option('wpsg_showMwstAlways') == '1') { $prod_col = 25; } else { $prod_col = 35; } ?>
diff --git a/views/mods/mod_request/requestmail_html.phtml b/views/mods/mod_request/requestmail_html.phtml index 5cdd0b7..bbac2e2 100644 --- a/views/mods/mod_request/requestmail_html.phtml +++ b/views/mods/mod_request/requestmail_html.phtml @@ -3,6 +3,7 @@ /**
* HTML E-Mail Template für die Daten der Anfrage
* wird von adminmail_html.phtml und customermail_html.phtml verwendet
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_request/requestpage.phtml b/views/mods/mod_request/requestpage.phtml index 7eb7fae..a2a3876 100644 --- a/views/mods/mod_request/requestpage.phtml +++ b/views/mods/mod_request/requestpage.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anfrageseite
+ * @version 4.6.1
*/
@@ -61,17 +62,6 @@ } );
- <?php /* Copy&Paste für das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
- window.onload = function() {
-
- var email2 = document.getElementById('email2');
-
- email2.onpaste = function(e) {
-
- e.preventDefault();
-
- }
- }
/* ]]> */</script>
<div class="wpsg_mod_request_requestpage">
@@ -248,7 +238,7 @@ </tfoot>
</table>
- <input type="submit" name="submit_requestpage_refresh" id="wpsg_requestbutton" class="wpsg_mod_request_button_refresh" value="<?php echo __('Anfrageliste aktualisieren', 'wpsg'); ?>" />
+ <input type="submit" name="submit_requestpage_refresh" id="wpsg_requestbutton" class="wpsg_mod_request_button_refresh<?php echo wpsg_button_class(); ?>" value="<?php echo __('Anfrageliste aktualisieren', 'wpsg'); ?>" />
<?php /* Anfang Bestellvariablen */ ?>
<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_request_ordervars')) && wpsg_isSizedArray($this->view['orderVars'])) { ?>
@@ -322,7 +312,7 @@ <?php if (wpsg_isSizedInt($this->view['pflicht']['emailconfirm'])) { ?>
<div class="wpsg_checkoutblock" id="wpsg_email2">
- <label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?>:<?php if ($this->view['pflicht']['email'] != '1') { ?> <span class="wpsg_required">*</span><?php } ?>
+ <label for="email2" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung)", "wpsg"); ?>:<?php if ($this->view['pflicht']['email'] != '1') { ?> <span class="wpsg_required">*</span><?php } ?>
</label>
<input class="<?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="email2" name="wpsg[request][customer][email2]" value="<?php echo wpsg_hspc(wpsg_getStr($this->view['requestlist']['customer']['email2'])); ?>" />
</div>
@@ -402,7 +392,7 @@ <select name="wpsg[request][customer][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
<option value="-1"><?php echo __('Bitte auswählen', 'wpsg'); ?></option>
<?php foreach ($this->view['countries'] as $oCountry) { ?>
- <option value="<?php echo wpsg_hspc($oCountry->id); ?>" <?php echo (($oCountry->id == $this->view['requestlist']['customer']['land'])?'selected="selected"':((!wpsg_isSizedInt($this->view['requestlist']['customer']['land']) && $this->get_option('wpsg_defaultland') == $oCountry->id)?'selected="selected"':'')); ?>><?php echo wpsg_hspc($oCountry->getName()); ?></option>
+ <option value="<?php echo wpsg_hspc($oCountry->id); ?>" <?php echo (($oCountry->id == ($this->view['requestlist']['customer']['land']??null))?'selected="selected"':((!wpsg_isSizedInt($this->view['requestlist']['customer']['land']) && $this->get_option('wpsg_defaultland') == $oCountry->id)?'selected="selected"':'')); ?>><?php echo wpsg_hspc($oCountry->getName()); ?></option>
<?php } ?>
</select>
</div>
@@ -418,7 +408,7 @@ <?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_request_customerdata'))) { ?>
- <?php foreach ((array)$this->view['pflicht']['custom'] as $c_id => $c) { if ($c['show'] != '2') { ?>
+ <?php foreach ((array)($this->view['pflicht']['custom']??[]) as $c_id => $c) { if ($c['show'] != '2') { ?>
<div class="wpsg_checkoutblock">
<label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo $c_id; ?>">
<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?>:<?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>
@@ -453,7 +443,7 @@ <br />
- <input type="submit" name="submit_requestpage" class="wpsg_mod_request_button_submit" value="<?php echo __('Anfrage starten', 'wpsg'); ?>" />
+ <input type="submit" name="submit_requestpage" class="wpsg_mod_request_button_submit<?php echo wpsg_button_class(); ?>" value="<?php echo __('Anfrage starten', 'wpsg'); ?>" />
<br />
diff --git a/views/mods/mod_request/settings_edit.phtml b/views/mods/mod_request/settings_edit.phtml index 431310b..5c18e00 100644 --- a/views/mods/mod_request/settings_edit.phtml +++ b/views/mods/mod_request/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "AnfrageProdukte"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_reviews/account_row.phtml b/views/mods/mod_reviews/account_row.phtml new file mode 100644 index 0000000..67395de --- /dev/null +++ b/views/mods/mod_reviews/account_row.phtml @@ -0,0 +1,18 @@ +<?php + /** + * Kundenkonto, Zeile unter einer Bestellposition: Link zum Bewerten (Modul Produktbewertungen) + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $v = $this->view['wpsg_mod_reviews']['account']; +?> +<tr class="wpsg-review-account"> + <td colspan="2"> + <?php if ($v['url'] !== '') { ?> + <a class="wpsg-review-account__link" href="<?php echo esc_url($v['url']); ?>"><?php echo esc_html__('Produkt bewerten', 'wpsg'); ?><span class="screen-reader-text"><?php echo esc_html(': '.$v['name']); ?></span></a> + <?php } else { ?> + <span class="wpsg-review-account__done"><?php echo esc_html__('Bewertung abgegeben', 'wpsg'); ?></span> + <?php } ?> + </td> +</tr> diff --git a/views/mods/mod_reviews/admin_index.phtml b/views/mods/mod_reviews/admin_index.phtml new file mode 100644 index 0000000..74f6fc5 --- /dev/null +++ b/views/mods/mod_reviews/admin_index.phtml @@ -0,0 +1,162 @@ +<?php + /** + * Backend: Bewertungen prüfen, freigeben, ablehnen, beantworten; Zeilen- und Mehrfachaktionen wie unter Kommentare + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $admin = $this->view['wpsg_mod_reviews']['admin']; + $arTabs = [ + wpsg_review::STATUS_PENDING => __('Zu prüfen', 'wpsg'), + wpsg_review::STATUS_APPROVED => __('Veröffentlicht', 'wpsg'), + wpsg_review::STATUS_REJECTED => __('Abgelehnt', 'wpsg') + ]; + $base = admin_url('admin.php?page=wpsg-Reviews'); + $current_url = add_query_arg(['status' => $admin['status'], 'paged' => $admin['paged']], $base); + + // Freigeben nicht bei veröffentlichten, Ablehnen nicht bei abgelehnten + $arActions = []; + if ($admin['status'] !== wpsg_review::STATUS_APPROVED) $arActions['approve'] = __('Freigeben', 'wpsg'); + if ($admin['status'] !== wpsg_review::STATUS_REJECTED) $arActions['reject'] = __('Ablehnen', 'wpsg'); + $arActions['delete'] = __('Löschen', 'wpsg'); + + // Oben und unten wie im Kern; schmal blendet der Kern die obere Auswahl aus + $bulkactions = function(string $position) use ($arActions) { + + $id = 'wpsg-reviews-bulk-'.$position; + + ?> + <div class="alignleft actions bulkactions"> + <label for="<?php echo esc_attr($id); ?>" class="screen-reader-text"><?php echo esc_html__('Mehrfachaktion wählen', 'wpsg'); ?></label> + <select name="wpsg_bulk_action[<?php echo esc_attr($position); ?>]" id="<?php echo esc_attr($id); ?>"> + <option value=""><?php echo esc_html__('Mehrfachaktionen', 'wpsg'); ?></option> + <?php foreach ($arActions as $action => $label) { ?> + <option value="<?php echo esc_attr($action); ?>"><?php echo esc_html($label); ?></option> + <?php } ?> + </select> + <button type="submit" name="wpsg_review_bulk" value="<?php echo esc_attr($position); ?>" class="button action"><?php echo esc_html__('Übernehmen', 'wpsg'); ?></button> + </div> + <?php + + }; + + $pagination = function() use ($admin, $current_url) { + + $total = intval($admin['count'][$admin['status']]??0); + + ?> + <div class="tablenav-pages<?php echo (($admin['pages'] <= 1)?' one-page':''); ?>"> + <span class="displaying-num"><?php echo esc_html(sprintf(_n('%s Eintrag', '%s Einträge', $total, 'wpsg'), number_format_i18n($total))); ?></span> + <?php if ($admin['pages'] > 1) { ?> + <span class="pagination-links"> + <?php if ($admin['paged'] > 1) { ?> + <a class="prev-page button" href="<?php echo esc_url(add_query_arg('paged', $admin['paged'] - 1, $current_url)); ?>"><span class="screen-reader-text"><?php echo esc_html__('Vorherige Seite', 'wpsg'); ?></span><span aria-hidden="true">‹</span></a> + <?php } else { ?> + <span class="tablenav-pages-navspan button disabled" aria-hidden="true">‹</span> + <?php } ?> + <span class="paging-input"><span class="tablenav-paging-text"><?php echo esc_html(sprintf(__('Seite %1$s von %2$s', 'wpsg'), number_format_i18n($admin['paged']), number_format_i18n($admin['pages']))); ?></span></span> + <?php if ($admin['paged'] < $admin['pages']) { ?> + <a class="next-page button" href="<?php echo esc_url(add_query_arg('paged', $admin['paged'] + 1, $current_url)); ?>"><span class="screen-reader-text"><?php echo esc_html__('Nächste Seite', 'wpsg'); ?></span><span aria-hidden="true">›</span></a> + <?php } else { ?> + <span class="tablenav-pages-navspan button disabled" aria-hidden="true">›</span> + <?php } ?> + </span> + <?php } ?> + </div> + <?php + + }; +?> +<div class="wrap wpsg-reviews-admin"> + + <h1><?php echo esc_html__('Bewertungen', 'wpsg'); ?></h1> + + <?php echo $this->writeBackendMessage(); ?> + + <?php echo $this->callMod('wpsg_mod_reviews', 'privacyNotice'); /* schon escaped */ ?> + <?php echo $this->callMod('wpsg_mod_reviews', 'importNotice'); /* schon escaped */ ?> + + <nav class="nav-tab-wrapper" aria-label="<?php echo esc_attr__('Bewertungen nach Status', 'wpsg'); ?>"> + <?php foreach ($arTabs as $status => $label) { ?> + <a href="<?php echo esc_url(add_query_arg('status', $status, $base)); ?>" class="nav-tab<?php echo (($admin['status'] === $status)?' nav-tab-active':''); ?>"<?php if ($admin['status'] === $status) { ?> aria-current="page"<?php } ?>><?php echo esc_html($label); ?> (<?php echo intval($admin['count'][$status]??0); ?>)</a> + <?php } ?> + </nav> + + <?php if (sizeof($admin['reviews']) === 0) { ?> + + <p><?php echo esc_html__('Keine Bewertungen.', 'wpsg'); ?></p> + + <?php } else { ?> + + <form method="post" action="<?php echo esc_url(add_query_arg('noheader', '1', $current_url)); ?>" class="wpsg-reviews-admin__form" data-confirm-bulk="<?php echo esc_attr__('Die ausgewählten Bewertungen endgültig löschen?', 'wpsg'); ?>"> + + <?php wp_nonce_field('wpsg_reviews_moderate'); ?> + + <div class="tablenav top"> + <?php $bulkactions('top'); ?> + <?php $pagination(); ?> + <br class="clear" /> + </div> + + <table class="wp-list-table widefat fixed striped table-view-list wpsg-reviews-admin__table"> + <thead> + <tr> + <td class="manage-column column-cb check-column"><input id="wpsg-reviews-select-all" type="checkbox" /><label for="wpsg-reviews-select-all"><span class="screen-reader-text"><?php echo esc_html__('Alle auswählen', 'wpsg'); ?></span></label></td> + <th scope="col" class="manage-column column-review column-primary"><?php echo esc_html__('Bewertung', 'wpsg'); ?></th> + <th scope="col" class="manage-column column-product"><?php echo esc_html__('Produkt', 'wpsg'); ?></th> + <th scope="col" class="manage-column column-author"><?php echo esc_html__('Name', 'wpsg'); ?></th> + <th scope="col" class="manage-column column-date"><?php echo esc_html__('Abgegeben', 'wpsg'); ?></th> + </tr> + </thead> + <tbody> + <?php foreach ($admin['reviews'] as $review) { $review_id = intval($review['id']); $bReply = ((string)$review['reply'] !== ''); ?> + <tr id="wpsg-review-<?php echo $review_id; ?>"> + <th scope="row" class="check-column"><input type="checkbox" id="wpsg-review-cb-<?php echo $review_id; ?>" name="review_ids[]" value="<?php echo $review_id; ?>" /><label for="wpsg-review-cb-<?php echo $review_id; ?>"><span class="screen-reader-text"><?php echo esc_html(wpsg_translate(__('Bewertung von #1# auswählen', 'wpsg'), $review['display_name'])); ?></span></label></th> + <?php /* Ohne data-colname: schmal stünde die Spaltenbeschriftung über den Sternen (in 7.1 ist die Hauptspalte im Kern ein th) */ ?> + <td class="column-review column-primary has-row-actions"> + <div class="wpsg-reviews-admin__stars"><span aria-hidden="true"><?php echo str_repeat('★', intval($review['stars'])).str_repeat('☆', 5 - intval($review['stars'])); ?></span><span class="screen-reader-text"><?php echo esc_html(wpsg_translate(__('#1# von 5 Sternen', 'wpsg'), intval($review['stars']))); ?></span></div> + <?php if ((string)$review['title'] !== '') { ?><strong class="wpsg-reviews-admin__title"><?php echo esc_html($review['title']); ?></strong><?php } ?> + <div class="wpsg-reviews-admin__text"><?php echo nl2br(esc_html((string)$review['text'])); ?></div> + <div class="wpsg-reviews-admin__meta"><?php echo esc_html($review['product']); ?> · <?php echo esc_html($review['display_name']); ?><?php if (intval($review['anonymous']??0) === 1) { ?> (<?php echo esc_html__('angezeigt als „Anonym“', 'wpsg'); ?>)<?php } ?></div> + <?php if ($bReply) { ?><div class="wpsg-reviews-admin__reply-text"><strong><?php echo esc_html__('Ihre Antwort:', 'wpsg'); ?></strong> <?php echo nl2br(esc_html((string)$review['reply'])); ?></div><?php } ?> + <div class="row-actions"> + <?php if (isset($arActions['approve'])) { ?><span class="wpsg-approve"><button type="submit" name="wpsg_review_action" value="approve:<?php echo $review_id; ?>" class="button-link"><?php echo esc_html($arActions['approve']); ?></button> | </span><?php } ?> + <?php if (isset($arActions['reject'])) { ?><span class="wpsg-reject"><button type="submit" name="wpsg_review_action" value="reject:<?php echo $review_id; ?>" class="button-link"><?php echo esc_html($arActions['reject']); ?></button> | </span><?php } ?> + <span class="wpsg-reply"><button type="button" class="button-link wpsg-reviews-admin__reply-toggle" aria-expanded="false" aria-controls="wpsg-review-reply-<?php echo $review_id; ?>"><?php echo esc_html(($bReply)?__('Antwort bearbeiten', 'wpsg'):__('Antworten', 'wpsg')); ?></button> | </span> + <span class="wpsg-delete"><button type="submit" name="wpsg_review_action" value="delete:<?php echo $review_id; ?>" class="button-link button-link-delete" data-confirm="<?php echo esc_attr__('Bewertung endgültig löschen?', 'wpsg'); ?>"><?php echo esc_html($arActions['delete']); ?></button></span> + </div> + <button type="button" class="toggle-row"><span class="screen-reader-text"><?php echo esc_html__('Mehr Details anzeigen', 'wpsg'); ?></span></button> + </td> + <td class="column-product" data-colname="<?php echo esc_attr__('Produkt', 'wpsg'); ?>"><?php echo esc_html($review['product']); ?><br /> + <small><?php echo ((intval($review['verified']) === 1)?esc_html__('Verifizierter Kauf', 'wpsg'):esc_html__('Ohne Kaufnachweis (übernommen)', 'wpsg')); ?></small> + <?php if (!$review['allowed']) { ?><br /><small><?php echo esc_html__('Bewertungen für dieses Produkt aus', 'wpsg'); ?></small><?php } ?></td> + <td class="column-author" data-colname="<?php echo esc_attr__('Name', 'wpsg'); ?>"><?php echo esc_html($review['display_name']); ?><?php if (intval($review['anonymous']??0) === 1) { ?><br /><?php echo esc_html__('angezeigt als „Anonym“', 'wpsg'); ?><?php } ?></td> + <td class="column-date" data-colname="<?php echo esc_attr__('Abgegeben', 'wpsg'); ?>"><?php echo esc_html((string)wp_date(get_option('date_format').' '.get_option('time_format'), (int)strtotime((string)$review['submitted'].' UTC'))); ?></td> + </tr> + <?php /* Leere Zeile hält die Streifen im Wechsel, wie die Schnellbearbeitung im Kern */ ?> + <tr class="hidden"></tr> + <tr id="wpsg-review-reply-<?php echo $review_id; ?>" class="inline-edit-row wpsg-reviews-admin__reply-row" hidden> + <td colspan="5"> + <label for="wpsg_review_reply_<?php echo $review_id; ?>"><?php echo esc_html__('Öffentliche Antwort', 'wpsg'); ?></label> + <textarea id="wpsg_review_reply_<?php echo $review_id; ?>" name="reply[<?php echo $review_id; ?>]" rows="3" class="large-text"><?php echo esc_textarea((string)$review['reply']); ?></textarea> + <p class="wpsg-reviews-admin__reply-buttons"> + <button type="submit" name="wpsg_review_action" value="reply:<?php echo $review_id; ?>" class="button button-primary"><?php echo esc_html__('Antwort speichern', 'wpsg'); ?></button> + <button type="button" class="button wpsg-reviews-admin__reply-cancel"><?php echo esc_html__('Abbrechen', 'wpsg'); ?></button> + </p> + </td> + </tr> + <?php } ?> + </tbody> + </table> + + <div class="tablenav bottom"> + <?php $bulkactions('bottom'); ?> + <?php $pagination(); ?> + <br class="clear" /> + </div> + + </form> + + <?php } ?> + +</div> diff --git a/views/mods/mod_reviews/list.phtml b/views/mods/mod_reviews/list.phtml new file mode 100644 index 0000000..985b2d8 --- /dev/null +++ b/views/mods/mod_reviews/list.phtml @@ -0,0 +1,57 @@ +<?php + /** + * Freigegebene Bewertungen unter dem Produkt (Modul Produktbewertungen) + * + * Mit Hinweis zur Echtheit (§ 5b Abs. 3 UWG). „Verifizierter Kauf“ steht nur an Bewertungen über den Link einer + * Bestellung (doc/bewertungen.md). + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $v = $this->view['wpsg_mod_reviews']['list']; + $section_id = 'wpsg-reviews-'.intval($v['product_id']); +?> +<section class="wpsg-reviews<?php if ($v['wide']) echo ' alignwide'; ?>" id="<?php echo esc_attr($section_id); ?>" aria-labelledby="<?php echo esc_attr($section_id.'-title'); ?>"> + + <h2 class="wpsg-reviews__title" id="<?php echo esc_attr($section_id.'-title'); ?>"><?php echo esc_html($v['title']); ?></h2> + + <?php echo $v['summary']; ?> + + <p class="wpsg-reviews__hint"><?php echo nl2br(esc_html($v['hint'])); ?></p> + + <ol class="wpsg-reviews__list"> + <?php foreach ($v['reviews'] as $review) { ?> + <li class="wpsg-review"> + + <?php echo $review['rating']; ?> + + <?php if ($review['title'] !== '') { ?> + <h3 class="wpsg-review__title"><?php echo esc_html($review['title']); ?></h3> + <?php } ?> + + <p class="wpsg-review__meta"> + <span class="wpsg-review__author"><?php echo esc_html($review['name']); ?></span> + <time class="wpsg-review__date" datetime="<?php echo esc_attr($review['datetime']); ?>"><?php echo esc_html($review['date']); ?></time> + <?php if ($review['verified']) { ?><span class="wpsg-review__verified"><?php echo esc_html__('Verifizierter Kauf', 'wpsg'); ?></span><?php } ?> + </p> + + <?php if ($review['text'] !== '') { ?> + <div class="wpsg-review__text"><?php echo nl2br(esc_html($review['text'])); ?></div> + <?php } ?> + + <?php if ($review['reply'] !== '') { ?> + <div class="wpsg-review__reply"> + <p class="wpsg-review__reply-title"><?php echo esc_html__('Antwort des Shops', 'wpsg'); ?></p> + <div><?php echo nl2br(esc_html($review['reply'])); ?></div> + </div> + <?php } ?> + + </li> + <?php } ?> + </ol> + + <?php if ($v['more_url'] !== '') { ?> + <p class="wpsg-reviews__more"><a href="<?php echo esc_url($v['more_url']); ?>"><?php /* translators: %s: Anzahl der Bewertungen */ echo esc_html(sprintf(__('Alle %s Bewertungen anzeigen', 'wpsg'), number_format_i18n($v['count']))); ?></a></p> + <?php } ?> + +</section> diff --git a/views/mods/mod_reviews/mail_remind.phtml b/views/mods/mod_reviews/mail_remind.phtml new file mode 100644 index 0000000..1492153 --- /dev/null +++ b/views/mods/mod_reviews/mail_remind.phtml @@ -0,0 +1,29 @@ +<?php + /** + * Textmail: Erinnerung an eine Bewertung, je Bestellung die offenen Produkte mit Link (Modul Produktbewertungen) + * + * Die Zeilenumbrüche werden ausdrücklich ausgegeben, weil PHP einen Zeilenumbruch direkt nach dem schließenden PHP-Tag + * verschluckt. + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Textmail ohne HTML-Kontext, HTML-Escaping würde den Text verfälschen + + $this->htmlMail = false; + + $v = $this->view['wpsg_mod_reviews']['remind']; + + echo (($v['name'] !== '')?wpsg_translate(__('Guten Tag #1#,', 'wpsg'), $v['name']):__('Guten Tag,', 'wpsg'))."\n\n"; + echo _n('Sie hatten uns erlaubt, Sie an eine Bewertung zu erinnern. Wie gefallen Ihnen die Produkte aus Ihrer Bestellung?', 'Sie hatten uns erlaubt, Sie an eine Bewertung zu erinnern. Wie gefallen Ihnen die Produkte aus Ihren Bestellungen?', sizeof($v['orders']), 'wpsg')."\n\n"; + + foreach ($v['orders'] as $order) { + + echo wpsg_translate(__('Bestellung #1# vom #2#', 'wpsg'), $order['nr'], $order['date'])."\n"; + foreach ($order['positions'] as $position) echo '- '.wpsg_translate(__('#1# bewerten:', 'wpsg'), $position['name'])."\n ".$position['url']."\n"; + echo "\n"; + + } + + echo __('Jeder Link führt zum Formular für ein Produkt und gilt einmal.', 'wpsg')."\n\n"; + echo __('Sie möchten keine Erinnerungen mehr? Hier abbestellen:', 'wpsg')."\n".$v['stop_url']."\n"; diff --git a/views/mods/mod_reviews/mail_remind_html.phtml b/views/mods/mod_reviews/mail_remind_html.phtml new file mode 100644 index 0000000..7299f00 --- /dev/null +++ b/views/mods/mod_reviews/mail_remind_html.phtml @@ -0,0 +1,30 @@ +<?php + /** + * HTML-Mail: Erinnerung an eine Bewertung, je Bestellung die offenen Produkte mit Bild und Link (Modul Produktbewertungen) + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $this->htmlMail = true; + + $v = $this->view['wpsg_mod_reviews']['remind']; +?> +<p><?php echo esc_html(($v['name'] !== '')?wpsg_translate(__('Guten Tag #1#,', 'wpsg'), $v['name']):__('Guten Tag,', 'wpsg')); ?></p> + +<p><?php echo esc_html(_n('Sie hatten uns erlaubt, Sie an eine Bewertung zu erinnern. Wie gefallen Ihnen die Produkte aus Ihrer Bestellung?', 'Sie hatten uns erlaubt, Sie an eine Bewertung zu erinnern. Wie gefallen Ihnen die Produkte aus Ihren Bestellungen?', sizeof($v['orders']), 'wpsg')); ?></p> + +<?php foreach ($v['orders'] as $order) { ?> +<h2><?php echo esc_html(wpsg_translate(__('Bestellung #1# vom #2#', 'wpsg'), $order['nr'], $order['date'])); ?></h2> +<table role="presentation" style="width:100%;"> + <?php foreach ($order['positions'] as $position) { ?> + <tr> + <td style="width:76px; padding:6px 12px 6px 0; vertical-align:middle;"><?php if ($position['image'] !== '') { ?><img src="<?php echo esc_url($position['image']); ?>" alt="" width="64" height="64" style="display:block; width:64px; height:64px;" /><?php } ?></td> + <td style="padding:6px 0; vertical-align:middle;"><a href="<?php echo esc_url($position['url']); ?>"><?php echo esc_html(wpsg_translate(__('#1# bewerten', 'wpsg'), $position['name'])); ?></a></td> + </tr> + <?php } ?> +</table> +<?php } ?> + +<p><?php echo esc_html__('Jeder Link führt zum Formular für ein Produkt und gilt einmal.', 'wpsg'); ?></p> + +<p><?php echo esc_html__('Sie möchten keine Erinnerungen mehr?', 'wpsg'); ?> <a href="<?php echo esc_url($v['stop_url']); ?>"><?php echo esc_html__('Erinnerungen abbestellen', 'wpsg'); ?></a></p> diff --git a/views/mods/mod_reviews/order_done.phtml b/views/mods/mod_reviews/order_done.phtml new file mode 100644 index 0000000..00af294 --- /dev/null +++ b/views/mods/mod_reviews/order_done.phtml @@ -0,0 +1,15 @@ +<?php + /** + * Abschlussseite: persönliche Links zum Bewerten der bestellten Produkte + * @version 4.6.1 + */ + defined('ABSPATH') || exit; +?> +<div class="wpsg-reviews-invite"> + <p><?php echo esc_html__('Sobald Ihre Bestellung bei Ihnen ist, können Sie die Produkte über diese persönlichen Links bewerten. Bewahren Sie sie auf, etwa als Lesezeichen:', 'wpsg'); ?></p> + <ul> + <?php foreach ((array)$this->view['wpsg_mod_reviews']['done'] as $review) { ?> + <li><a href="<?php echo esc_url($review['url']); ?>"><?php echo esc_html(wpsg_translate(__('#1# bewerten', 'wpsg'), $review['name'])); ?></a></li> + <?php } ?> + </ul> +</div> diff --git a/views/mods/mod_reviews/order_view.phtml b/views/mods/mod_reviews/order_view.phtml new file mode 100644 index 0000000..fdd672c --- /dev/null +++ b/views/mods/mod_reviews/order_view.phtml @@ -0,0 +1,36 @@ +<?php + /** + * Bestellansicht im Backend: Erinnerung per E-Mail und Bewertungen der Bestellung (Modul Produktbewertungen) + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $v = $this->view['wpsg_mod_reviews']['order']; + $c = $v['count']; + $submitted = intval($c[wpsg_review::STATUS_PENDING]) + intval($c[wpsg_review::STATUS_APPROVED]) + intval($c[wpsg_review::STATUS_REJECTED]); +?> +<?php echo wpsg_drawForm_AdminboxStart(__('Produktbewertungen', 'wpsg')); ?> +<p class="wpsg-reviews-order"> + <strong><?php echo esc_html__('Erinnerung per E-Mail', 'wpsg'); ?></strong><br /> + <?php if ($v['remind'] === '') { ?> + <?php echo esc_html__('nicht gewünscht', 'wpsg'); ?> + <?php } else { ?> + <?php echo esc_html(wpsg_translate(__('eingewilligt am #1#', 'wpsg'), $v['remind'])); ?><br /> + <?php if ($v['stop'] !== '') { ?> + <?php echo esc_html(wpsg_translate(__('abbestellt am #1#', 'wpsg'), $v['stop'])); ?> + <?php } else if ($v['sent'] !== '') { ?> + <?php echo esc_html(wpsg_translate(__('gesendet am #1#', 'wpsg'), $v['sent'])); ?> + <?php } else if ($v['skip'] !== '') { ?> + <?php echo esc_html(wpsg_translate(__('nicht gesendet, nichts mehr offen (#1#)', 'wpsg'), $v['skip'])); ?> + <?php } else if ($v['due'] !== '') { ?> + <?php echo esc_html(wpsg_translate(__('wird gesendet ab #1#', 'wpsg'), $v['due'])); ?> + <?php } else { ?> + <?php echo esc_html__('wartet auf den Status zum Bewerten', 'wpsg'); ?> + <?php } ?> + <?php } ?> +</p> +<p class="wpsg-reviews-order"> + <strong><?php echo esc_html__('Bewertungen', 'wpsg'); ?></strong><br /> + <?php echo esc_html(wpsg_translate(__('#1# abgegeben, #2# offen', 'wpsg'), $submitted, intval($c[wpsg_review::STATUS_INVITED]))); ?> +</p> +<?php echo wpsg_drawForm_AdminboxEnd(); ?> diff --git a/views/mods/mod_reviews/page.phtml b/views/mods/mod_reviews/page.phtml new file mode 100644 index 0000000..ce0e640 --- /dev/null +++ b/views/mods/mod_reviews/page.phtml @@ -0,0 +1,103 @@ +<?php + /** + * Seite „Bewertung abgeben“: Formular zum persönlichen Link + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $page = $this->view['wpsg_mod_reviews']['page']; +?> +<div class="wpsg wpsg_checkout wpsg-review-page"> + + <?php if ($page['thanks']) { ?> + + <p class="wpsg-review-page__message" role="status"><?php echo esc_html((($page['status']??'') === wpsg_review::STATUS_APPROVED)?__('Vielen Dank für Ihre Bewertung. Sie ist jetzt veröffentlicht.', 'wpsg'):__('Vielen Dank für Ihre Bewertung. Sie erscheint, sobald wir sie freigegeben haben.', 'wpsg')); ?></p> + + <?php } else if ($page['state'] === 'stop') { ?> + + <h2 class="wpsg-review-page__title"><?php echo esc_html__('Erinnerungen abbestellen', 'wpsg'); ?></h2> + <p class="wpsg-review-page__message"><?php echo esc_html__('Sie bekommen dann keine E-Mail mehr, die Sie an eine Bewertung Ihrer Bestellungen erinnert. Bewerten können Sie weiter über die Links, die Sie schon haben, und im Kundenkonto.', 'wpsg'); ?></p> + <form method="post" action="<?php echo esc_url(add_query_arg(wpsg_mod_reviews::PARAM_STOP, $page['token'], (string)get_permalink())); ?>"> + <?php wp_nonce_field('wpsg_review_stop_'.intval($page['order_id'])); ?> + <p class="wpsg_checkoutblock"><button type="submit" name="wpsg_review_stop_submit" value="1" class="wpsg_button<?php echo wpsg_button_class(); ?>"><?php echo esc_html__('Keine Erinnerungen mehr', 'wpsg'); ?></button></p> + </form> + + <?php } else if ($page['state'] === 'stopped') { ?> + + <p class="wpsg-review-page__message" role="status"><?php echo esc_html__('Erledigt: Sie bekommen keine Erinnerungen an eine Bewertung mehr.', 'wpsg'); ?></p> + + <?php } else if ($page['state'] === 'stop_invalid') { ?> + + <p class="wpsg-review-page__message"><?php echo esc_html__('Dieser Link ist ungültig. Bitte verwenden Sie den vollständigen Link aus der E-Mail.', 'wpsg'); ?></p> + + <?php } else if ($page['state'] === 'invalid') { ?> + + <p class="wpsg-review-page__message"><?php echo esc_html__('Dieser Link ist ungültig. Bitte verwenden Sie den vollständigen Link aus Ihrer Bestellung.', 'wpsg'); ?></p> + + <?php } else if ($page['state'] === 'done') { ?> + + <p class="wpsg-review-page__message"><?php echo esc_html(wpsg_translate(__('Sie haben „#1#“ bereits bewertet. Vielen Dank!', 'wpsg'), $page['product'])); ?></p> + + <?php } else if ($page['state'] === 'closed') { ?> + + <p class="wpsg-review-page__message"><?php echo esc_html(wpsg_translate(__('Für „#1#“ nimmt der Shop keine Bewertungen an.', 'wpsg'), $page['product'])); ?></p> + + <?php } else if ($page['state'] === 'early') { ?> + + <p class="wpsg-review-page__message"><?php echo esc_html(wpsg_translate(__('Sie können „#1#“ bewerten, sobald Ihre Bestellung bei Ihnen ist. Der Link bleibt gültig.', 'wpsg'), $page['product'])); ?></p> + + <?php } else { $errors = $page['errors']; $data = $page['data']; ?> + + <h2 class="wpsg-review-page__title"><?php echo esc_html(wpsg_translate(__('#1# bewerten', 'wpsg'), $page['product'])); ?></h2> + + <?php if (sizeof($errors) > 0) { ?> + <div class="wpsg-review-page__errors" role="alert"> + <ul><?php foreach ($errors as $error) { ?><li><?php echo esc_html($error); ?></li><?php } ?></ul> + </div> + <?php } ?> + + <form method="post" action="<?php echo esc_url(add_query_arg(wpsg_mod_reviews::PARAM, $page['token'], get_permalink())); ?>" class="wpsg-review-form" novalidate> + + <?php wp_nonce_field('wpsg_review_submit_'.$page['review_id']); ?> + + <div class="wpsg_checkoutblock"> + <fieldset class="wpsg-review-form__stars"<?php if (isset($errors['stars'])) { ?> aria-invalid="true"<?php } ?>> + <legend class="wpsg_checkout"><?php echo esc_html__('Ihre Bewertung', 'wpsg'); ?> <span class="wpsg_required">*</span></legend> + <?php for ($i = 5; $i >= 1; $i--) { ?> + <div><label><input type="radio" name="wpsg_review_data[stars]" value="<?php echo $i; ?>" <?php checked(intval($data['stars']), $i); ?> required /> <span aria-hidden="true"><?php echo str_repeat('★', $i).str_repeat('☆', 5 - $i); ?></span> <span class="wpsg-review-form__stars-text"><?php echo esc_html(wpsg_translate(_n('#1# Stern', '#1# Sterne', $i, 'wpsg'), $i)); ?></span></label></div> + <?php } ?> + </fieldset> + </div> + + <div class="wpsg_checkoutblock"> + <label for="wpsg_review_title" class="wpsg_checkout"><?php echo esc_html__('Überschrift', 'wpsg'); ?></label> + <input type="text" id="wpsg_review_title" class="wpsg_input_text wpsg_checkout" name="wpsg_review_data[title]" maxlength="<?php echo intval(wpsg_review::MAX_TITLE); ?>" value="<?php echo esc_attr((string)$data['title']); ?>" /> + </div> + + <div class="wpsg_checkoutblock wpsg_commentblock"> + <label for="wpsg_review_text" class="wpsg_checkout"><?php echo esc_html__('Ihre Erfahrung', 'wpsg'); ?></label> + <textarea id="wpsg_review_text" class="wpsg_checkout" name="wpsg_review_data[text]" rows="6" maxlength="<?php echo intval(wpsg_review::MAX_TEXT); ?>"><?php echo esc_textarea((string)$data['text']); ?></textarea> + </div> + + <div class="wpsg_checkoutblock"> + <label for="wpsg_review_name" class="wpsg_checkout"><?php echo esc_html__('Anzeigename', 'wpsg'); ?> <span class="wpsg_required">*</span></label> + <input type="text" id="wpsg_review_name" class="wpsg_input_text wpsg_checkout" name="wpsg_review_data[display_name]" maxlength="<?php echo intval(wpsg_review::MAX_NAME); ?>" autocomplete="nickname" value="<?php echo esc_attr((string)$data['display_name']); ?>" required<?php if (isset($errors['display_name'])) { ?> aria-invalid="true"<?php } ?> /> + </div> + + <?php if (wpsg_review::hasAnonymousColumn()) { ?> + <div class="wpsg_checkoutblock"> + <label><input type="checkbox" name="wpsg_review_data[anonymous]" value="1" <?php checked(intval($data['anonymous']??0), 1); ?> /> <?php echo esc_html__('Name anonymisieren', 'wpsg'); ?></label> + </div> + <?php } ?> + + <div class="wpsg_checkoutblock"> + <label><input type="checkbox" name="wpsg_review_data[consent]" value="1" <?php checked((string)$data['consent'], '1'); ?> required<?php if (isset($errors['consent'])) { ?> aria-invalid="true"<?php } ?> /> <?php echo esc_html__('Ich bin einverstanden, dass meine Bewertung mit dem Anzeigenamen oder anonym auf dieser Website veröffentlicht wird. Ich kann das jederzeit widerrufen.', 'wpsg'); ?> <span class="wpsg_required">*</span></label> + </div> + + <p class="wpsg_checkoutblock"><button type="submit" name="wpsg_review_submit" value="1" class="wpsg_button<?php echo wpsg_button_class(); ?>"><?php echo esc_html__('Bewertung absenden', 'wpsg'); ?></button></p> + + </form> + + <?php } ?> + +</div> diff --git a/views/mods/mod_reviews/rating.phtml b/views/mods/mod_reviews/rating.phtml new file mode 100644 index 0000000..8c6fa25 --- /dev/null +++ b/views/mods/mod_reviews/rating.phtml @@ -0,0 +1,13 @@ +<?php + /** + * Sterne mit Schnitt und Anzahl (Modul Produktbewertungen) + * + * Die Sternzeichen sind aria-hidden, den Wert sagt der Text. Leere Sterne sind Umrisse, volle Sterne liegen darüber. Modus full: Text sichtbar; compact: sichtbar „4,5 (12)“, + * der ganze Text für Screenreader; single: nur Sterne, der Text für Screenreader. Mit href ist in full die Anzahl der Link zur Liste derselben Seite. + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $r = $this->view['wpsg_mod_reviews']['rating']; +?> +<p class="wpsg-rating<?php if ($r['class'] !== '') echo ' '.esc_attr($r['class']); ?>"><span class="wpsg-rating__stars" aria-hidden="true"><span class="wpsg-rating__empty">☆☆☆☆☆</span><span class="wpsg-rating__fill" style="width:<?php echo intval($r['percent']); ?>%">★★★★★</span></span><?php if ($r['mode'] === 'full' && ($r['href']??'') !== '') { ?> <span class="wpsg-rating__text"><?php echo esc_html($r['stars']); ?>, <a class="wpsg-rating__link" href="<?php echo esc_url($r['href']); ?>"><?php echo esc_html($r['count']); ?></a></span><?php } else if ($r['mode'] === 'full') { ?> <span class="wpsg-rating__text"><?php echo esc_html($r['text']); ?></span><?php } else if ($r['mode'] === 'compact') { ?> <span class="wpsg-rating__text" aria-hidden="true"><?php echo esc_html($r['short']); ?></span><span class="screen-reader-text"><?php echo esc_html($r['text']); ?></span><?php } else { ?><span class="screen-reader-text"><?php echo esc_html($r['text']); ?></span><?php } ?></p> diff --git a/views/mods/mod_reviews/remind_checkbox.phtml b/views/mods/mod_reviews/remind_checkbox.phtml new file mode 100644 index 0000000..5817cf3 --- /dev/null +++ b/views/mods/mod_reviews/remind_checkbox.phtml @@ -0,0 +1,13 @@ +<?php + /** + * Kasse, Zusammenfassung: Einwilligung in die Erinnerung an eine Bewertung, nicht vorbelegt (Modul Produktbewertungen) + * @version 4.6.1 + */ + defined('ABSPATH') || exit; +?> +<div class="wpsg_checkoutblock wpsg-review-remind"> + <label> + <input type="checkbox" name="wpsg_mod_reviews[remind]" value="1" /> + <?php echo esc_html($this->view['wpsg_mod_reviews']['remind_label']); ?> + </label> +</div> diff --git a/views/mods/mod_reviews/settings_edit.phtml b/views/mods/mod_reviews/settings_edit.phtml new file mode 100644 index 0000000..9a047ff --- /dev/null +++ b/views/mods/mod_reviews/settings_edit.phtml @@ -0,0 +1,36 @@ +<?php + /** + * Einstellungen des Moduls Produktbewertungen + * @version 4.6.1 + */ + defined('ABSPATH') || exit; + + $arStatus = []; + foreach ([wpsg_ShopController::STATUS_ZAHLUNGAKZEPTIERT, wpsg_ShopController::STATUS_RECHNUNGGESCHRIEBEN, wpsg_ShopController::STATUS_WAREVERSENDET, wpsg_ShopController::STATUS_ZUGESTELLT] as $status) { + + if (isset($this->view['wpsg_mod_reviews']['status'][$status])) $arStatus[$status] = $this->view['wpsg_mod_reviews']['status'][$status]; + + } +?> +<?php echo $this->view['wpsg_mod_reviews']['notice']; /* schon escaped, wpsg_mod_reviews::privacyNotice() */ ?> +<?php echo wpsg_drawForm_Select('wpsg_page_review', __('Seite „Bewertung abgeben“', 'wpsg'), $this->view['wpsg_mod_reviews']['pages'], $this->get_option('wpsg_page_review')); ?> +<?php echo wpsg_drawForm_Select('wpsg_mod_reviews_from_status', __('Bewerten möglich ab Status', 'wpsg'), $arStatus, $this->get_option('wpsg_mod_reviews_from_status')); ?> +<?php echo wpsg_drawForm_Select('wpsg_mod_reviews_approval', __('Neue Bewertungen', 'wpsg'), [ + wpsg_mod_reviews::APPROVAL_MANUAL => __('Vor der Veröffentlichung prüfen', 'wpsg'), + wpsg_mod_reviews::APPROVAL_AUTO => __('Sofort veröffentlichen', 'wpsg') +], $this->get_option('wpsg_mod_reviews_approval')); ?> +<?php echo wpsg_drawForm_Textarea('wpsg_mod_reviews_hint', __('Hinweis zur Echtheit der Bewertungen', 'wpsg'), (string)$this->get_option('wpsg_mod_reviews_hint')); ?> +<div class="form-group form-group-sm"> + <div class="col-sm-6 col-sm-offset-6"> + <p class="description"><?php echo esc_html__('Steht über den Bewertungen. Leer lassen für diesen Text, der zu Ihren Einstellungen passt:', 'wpsg'); ?></p> + <p class="description"><em><?php echo esc_html($this->view['wpsg_mod_reviews']['default_hint']); ?></em></p> + </div> + <div class="clearfix wpsg_clear"></div> +</div> +<?php echo wpsg_drawForm_Checkbox(wpsg_mod_reviews::OPTION_REMIND, __('Erinnerung per E-Mail anbieten', 'wpsg'), strval($this->get_option(wpsg_mod_reviews::OPTION_REMIND)) === '1', [ + 'hint' => __('In der Kasse erscheint ein Ankreuzfeld, nicht vorbelegt. Nur wer es ankreuzt, bekommt eine Mail mit den Links zu seinen offenen Bewertungen, mehrere Bestellungen zusammen in einer Mail. Ergänzen Sie dafür Ihre Datenschutzerklärung. Betreff und Absender: wpShopGermany → Konfiguration → E-Mail Konfiguration.', 'wpsg') +]); ?> +<?php echo wpsg_drawForm_Input(wpsg_mod_reviews::OPTION_REMIND_DAYS, __('Erinnerung nach Tagen', 'wpsg'), strval($this->get_option(wpsg_mod_reviews::OPTION_REMIND_DAYS)), [ + 'type' => 'number', 'min' => 1, 'max' => 90, + 'hint' => __('Gezählt ab dem Status unter „Bewerten möglich ab Status“.', 'wpsg') +]); ?> diff --git a/views/mods/mod_reviews/wpsg_reviews.css b/views/mods/mod_reviews/wpsg_reviews.css new file mode 100644 index 0000000..eeced31 --- /dev/null +++ b/views/mods/mod_reviews/wpsg_reviews.css @@ -0,0 +1,34 @@ +/** + * Modul Produktbewertungen: Sterne, Liste unter dem Produkt, Kundenkonto + * + * Farben über --wpsg-*, mit Rückfall für den Modus „klassisch“. Eigene Farbe der Sterne: --wpsg-color-rating. + */ + +.wpsg-rating { display:flex; flex-wrap:wrap; align-items:center; gap:0.15em 0.5em; margin:0.25em 0 0.5em; font-size:var(--wpsg-font-size-small, 0.875em); line-height:1.4; } +.wpsg-rating__stars { position:relative; display:inline-block; flex:none; line-height:1; font-size:1.15em; letter-spacing:0.05em; white-space:nowrap; } +/* Umriss in der Textfarbe, 60 %: hell und dunkel über 3:1 zum Grund; voll und leer unterscheiden sich auch in der Form */ +.wpsg-rating__empty { color:currentColor; color:var(--wpsg-color-rating-empty, color-mix(in srgb, currentColor 60%, transparent)); } +.wpsg-rating__fill { position:absolute; top:0; left:0; overflow:hidden; white-space:nowrap; color:var(--wpsg-color-rating, #b07800); } +.wpsg-rating .screen-reader-text { position:absolute !important; width:1px; height:1px; margin:-1px; padding:0; overflow:hidden; clip:rect(0, 0, 0, 0); clip-path:inset(50%); white-space:nowrap; border:0; } + +/* Unter dem Produktnamen und in der Liste relativ zum Text; --wpsg-font-size-small ist im Modus „neu“ oft in rem und dort zu klein */ +.wpsg-rating--product { margin:0.25em 0 0.75em; font-size:0.875em; } + +.wpsg-reviews { margin-block:2em; padding-top:1.5em; border-top:1px solid var(--wpsg-color-line, rgba(127, 127, 127, 0.35)); } +.wpsg-reviews__title { margin:0 0 0.5em; } +.wpsg-reviews__summary { font-size:1em; } +.wpsg-reviews__hint { margin:0 0 1.5em; font-size:0.875em; opacity:var(--wpsg-muted-opacity, 0.8); } +.wpsg-reviews__list { margin:0; padding:0; list-style:none; } +.wpsg-review { margin:0; padding:1.25em 0; border-top:1px solid var(--wpsg-color-line-soft, rgba(127, 127, 127, 0.2)); overflow-wrap:anywhere; } +.wpsg-review:first-child { border-top:0; padding-top:0; } +.wpsg-review__rating { margin:0 0 0.25em; font-size:0.875em; } +.wpsg-review__title { margin:0 0 0.25em; font-size:1.05em; } +.wpsg-review__meta { display:flex; flex-wrap:wrap; gap:0 0.75em; margin:0 0 0.5em; font-size:0.875em; } +.wpsg-review__author { font-weight:600; } +.wpsg-review__verified::before { content:"✓\00a0"; color:var(--wpsg-color-success, #1e7a2d); } +.wpsg-review__text { margin:0; } +.wpsg-review__reply { margin:0.75em 0 0; padding:0.75em 1em; border-left:3px solid var(--wpsg-color-line, rgba(127, 127, 127, 0.35)); background:var(--wpsg-color-surface, rgba(127, 127, 127, 0.08)); } +.wpsg-review__reply-title { margin:0 0 0.25em; font-weight:600; font-size:0.875em; } +.wpsg-reviews__more { margin:1em 0 0; } + +.wpsg-review-account td { padding-top:0; } diff --git a/views/mods/mod_reviews/wpsg_reviews_admin.css b/views/mods/mod_reviews/wpsg_reviews_admin.css new file mode 100644 index 0000000..2317360 --- /dev/null +++ b/views/mods/mod_reviews/wpsg_reviews_admin.css @@ -0,0 +1,37 @@ +/* + * Modul Produktbewertungen, Backend-Liste unter wpShopGermany → Bewertungen + * Aufbau wie die Kommentare im Kern: Zeilenaktionen, Antwortfeld unter der Zeile, schmal ab 782 px aufklappbar + */ + +.wpsg-reviews-admin__table .column-product { width:22%; } +.wpsg-reviews-admin__table .column-author { width:12%; } +.wpsg-reviews-admin__table .column-date { width:14%; } + +.wpsg-reviews-admin__stars { letter-spacing:0.1em; } +.wpsg-reviews-admin__title { display:block; margin-top:0.25em; } +.wpsg-reviews-admin__text { margin-top:0.25em; } +.wpsg-reviews-admin__reply-text { margin-top:0.5em; padding:0.4em 0.75em; border-left:4px solid #c3c4c7; background:#f6f7f7; } +.wpsg-reviews-admin__meta { display:none; margin-top:0.5em; color:#646970; } + +/* Der Kern blendet .approve aus (Kommentare); eigene Klassen an den Zeilenaktionen */ +/* 13 px wie die Links im Kern; schmal setzt der Kern die Schrift der span auf 0 */ +.wpsg-reviews-admin .row-actions .button-link { font-size:13px; text-decoration:none; } +.wpsg-reviews-admin .row-actions .button-link:hover { text-decoration:underline; } + +/* 12.5rem des Kerns wären hier 125 px, die Backendseiten von wpsg setzen die Grundschrift auf 10 px */ +.wpsg-reviews-admin .tablenav select { max-width:none; } + +.wpsg-reviews-admin__reply-row td { padding:12px 10px 16px; } +.wpsg-reviews-admin__reply-row label { display:block; margin-bottom:4px; font-weight:600; } +.wpsg-reviews-admin__reply-buttons { margin:8px 0 0; } + +/* Schmal setzt der Kern .wp-list-table tr { display:flex }; das höbe hidden und .hidden auf */ +.wpsg-reviews-admin__table .wpsg-reviews-admin__reply-row[hidden], +.wpsg-reviews-admin__table tr.hidden { display:none; } + +@media screen and (max-width:782px) { + + .wpsg-reviews-admin__meta { display:block; } + .wpsg-reviews-admin__reply-row td { display:block; flex:1 1 100%; box-sizing:border-box; padding:12px 10px 16px; } + +} diff --git a/views/mods/mod_reviews/wpsg_reviews_admin.js b/views/mods/mod_reviews/wpsg_reviews_admin.js new file mode 100644 index 0000000..9406041 --- /dev/null +++ b/views/mods/mod_reviews/wpsg_reviews_admin.js @@ -0,0 +1,64 @@ +/* + * Modul Produktbewertungen, Backend-Liste: Antwortfeld unter der Zeile öffnen, Löschen bestätigen. + * Alle- und Zeilenauswahl, Zeilenaktionen bei Fokus und das Aufklappen schmaler Zeilen übernimmt der Kern (common.js). + */ +( function() { + + 'use strict'; + + function setReply( toggle, bOpen ) { + + const row = document.getElementById( toggle.getAttribute( 'aria-controls' ) ); + if ( !row ) return; + + row.hidden = !bOpen; + toggle.setAttribute( 'aria-expanded', bOpen ? 'true' : 'false' ); + + if ( bOpen ) row.querySelector( 'textarea' ).focus(); + else toggle.focus(); + + } + + document.addEventListener( 'click', function( event ) { + + const toggle = event.target.closest( '.wpsg-reviews-admin__reply-toggle' ); + + if ( toggle ) { + + setReply( toggle, toggle.getAttribute( 'aria-expanded' ) !== 'true' ); + return; + + } + + const cancel = event.target.closest( '.wpsg-reviews-admin__reply-cancel' ); + + if ( cancel ) { + + const row = cancel.closest( 'tr' ); + const opener = document.querySelector( '.wpsg-reviews-admin__reply-toggle[aria-controls="' + row.id + '"]' ); + + if ( opener ) setReply( opener, false ); + return; + + } + + const button = event.target.closest( '.wpsg-reviews-admin [data-confirm]' ); + if ( button && !window.confirm( button.getAttribute( 'data-confirm' ) ) ) event.preventDefault(); + + } ); + + // Mehrfachaktion Löschen bestätigen + document.addEventListener( 'submit', function( event ) { + + const form = event.target; + if ( !form.classList.contains( 'wpsg-reviews-admin__form' ) ) return; + + const submitter = event.submitter; + if ( !submitter || submitter.name !== 'wpsg_review_bulk' ) return; + + const select = form.elements[ 'wpsg_bulk_action[' + submitter.value + ']' ]; + if ( select && select.value === 'delete' && !window.confirm( form.getAttribute( 'data-confirm-bulk' ) ) ) event.preventDefault(); + + } ); + +} )(); diff --git a/views/mods/mod_revocation/ajaxDialogContent.phtml b/views/mods/mod_revocation/ajaxDialogContent.phtml index 069cde6..04f4b87 100644 --- a/views/mods/mod_revocation/ajaxDialogContent.phtml +++ b/views/mods/mod_revocation/ajaxDialogContent.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -17,9 +18,11 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); // Produkte - $dialog_config = json_decode((wp_kses_stripslashes($_REQUEST['dialog_config']??'[]')), true); + $dialog_config = json_decode((wp_kses_stripslashes((string)($_REQUEST['dialog_config']??'[]'))), true); + if (!is_array($dialog_config)) $dialog_config = []; $contact_email = ""; + $contact_name = ""; $customer_login_id = intval(\wpsg_ShopController::getShop()->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn')); @@ -28,6 +31,7 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); $oCustomer = \wpsg_customer::getInstance($customer_login_id); $contact_email = $oCustomer->getEmail(); + $contact_name = trim($oCustomer->getFirstname().' '.$oCustomer->getName()); } @@ -37,41 +41,36 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); <div id="msg_target"></div> - <?php if (sizeof($dialog_config['arOrderProductID']) > 0) { ?> + <?php /* Nur eigene Bestellungen des angemeldeten Kunden (Revocation::dialogRows) */ $arRows = Revocation::dialogRows((is_array($dialog_config)?($dialog_config['arOrderProductID']??null):null), $customer_login_id); ?> + <?php if (sizeof($arRows) > 0) { ?> - <?php foreach ($dialog_config['arOrderProductID'] as $row) { + <?php foreach ($arRows as $key => $row) { - $order_id = intval($row['order_id']); - $order_product_id = intval($row['order_product_id']); - $amount = intval($row['amount']); - - $oOrder = \wpsg_order::getInstance($order_id); - $oOrderProduct = \wpsg_order_product::getInstance($order_product_id); - - if (!$oOrder->isLoaded() || !$oOrderProduct->isLoaded()) continue; - - $key = $order_id.'_'.$order_product_id; + $oOrder = $row['oOrder']; + $oOrderProduct = $row['oOrderProduct']; + $amount = $row['amount']; + $id = 'wpsg_rvd_'.$key; // eindeutige ids für die Beschriftungen (W5) ?> <fieldset class="wpsg_revocation_order_product"> - <legend><?php echo $oOrderProduct->getProduct()->getProductName(); ?></legend> + <legend><?php echo \esc_html((string)$oOrderProduct->getProduct()->getProductName()); ?></legend> <div> - <input type="hidden" readonly name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_product_id]" value="<?php echo $oOrderProduct->getId(); ?>" /> + <input type="hidden" readonly name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_product_id]" value="<?php echo intval($oOrderProduct->getId()); ?>" /> <div class="form_field"> - <div class="label"><?php echo __('Bestellnummer / Menge', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_order_nr"><?php echo __('Bestellnummer / Menge', 'wpsg'); ?></label> <div class="value"> - <input type="text" readonly name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="<?php echo $oOrder->getNr(); ?>" /> - <input type="number" min="1" max="<?php echo $amount; ?>" name="wpsg_revocation_reason[row][<?php echo $key; ?>][amount]" value="<?php echo $amount; ?>" /> + <input type="text" readonly id="<?php echo $id; ?>_order_nr" name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="<?php echo \esc_attr((string)$oOrder->getNr()); ?>" /> + <input type="number" min="1" max="<?php echo $amount; ?>" aria-label="<?php echo \esc_attr__('Menge', 'wpsg'); ?>" name="wpsg_revocation_reason[row][<?php echo $key; ?>][amount]" value="<?php echo $amount; ?>" /> </div> </div> <div class="form_field"> - <div class="label"><?php echo __('Widerrufsgrund', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_reason"><?php echo __('Widerrufsgrund', 'wpsg'); ?></label> <div class="value"> - <select name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> + <select id="<?php echo $id; ?>_reason" name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> <option value=""><?php echo __("Keinen Grund angeben", 'wpsg') ?></option> <?php foreach ($arReason as $reason) { ?> <option value="<?php echo htmlspecialchars($reason['id']); ?>"><?php echo htmlspecialchars($reason['text']); ?></option> @@ -81,9 +80,9 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); </div> <div class="form_field"> - <div class="label"><?php echo __('Bemerkung', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_comment"><?php echo __('Bemerkung', 'wpsg'); ?></label> <div class="value"> - <textarea name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> + <textarea id="<?php echo $id; ?>_comment" name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> </div> </div> @@ -95,30 +94,31 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); <?php } else { $key = 0; + $id = 'wpsg_rvd_0'; ?> <fieldset class="wpsg_revocation_order_product"> <div class="form_field"> - <div class="label"><?php echo __('Artikel - Nr.', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_product_nr"><?php echo __('Artikel - Nr.', 'wpsg'); ?></label> <div class="value"> - <input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][product_nr]" value="<?php echo ($dialog_config['set_product_anr']??''); ?>" /> + <input type="text" id="<?php echo $id; ?>_product_nr" name="wpsg_revocation_reason[row][<?php echo $key; ?>][product_nr]" value="<?php echo \esc_attr((string)($dialog_config['set_product_anr']??'')); ?>" /> </div> </div> <div class="form_field"> - <div class="label"><?php echo __('Bestellnummer / Menge', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_order_nr"><?php echo __('Bestellnummer / Menge', 'wpsg'); ?></label> <div class="value"> - <input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="" /> - <input type="number" name="wpsg_revocation_reason[row][<?php echo $key; ?>][amount]" value="1" /> + <input type="text" id="<?php echo $id; ?>_order_nr" name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="" /> + <input type="number" aria-label="<?php echo \esc_attr__('Menge', 'wpsg'); ?>" name="wpsg_revocation_reason[row][<?php echo $key; ?>][amount]" value="1" /> </div> </div> <div class="form_field"> - <div class="label"><?php echo __('Widerrufsgrund', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_reason"><?php echo __('Widerrufsgrund', 'wpsg'); ?></label> <div class="value"> - <select name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> + <select id="<?php echo $id; ?>_reason" name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> <option value=""><?php echo __("Keinen Grund angeben", 'wpsg') ?></option> <?php foreach ($arReason as $reason) { ?> <option value="<?php echo htmlspecialchars($reason['id']); ?>"><?php echo htmlspecialchars($reason['text']); ?></option> @@ -128,9 +128,9 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); </div> <div class="form_field"> - <div class="label"><?php echo __('Bemerkung', 'wpsg'); ?></div> + <label class="label" for="<?php echo $id; ?>_comment"><?php echo __('Bemerkung', 'wpsg'); ?></label> <div class="value"> - <textarea name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> + <textarea id="<?php echo $id; ?>_comment" name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> </div> </div> @@ -138,17 +138,34 @@ $arReason = \wpsgRevocation\Revocation::getReasons(); <?php } ?> + <?php /* Bot-Falle (S21): für Menschen und Screenreader unsichtbar, nicht in der Tab-Reihenfolge */ ?> + <div class="wpsg_revocation_hp" aria-hidden="true"> + <label class="label" for="wpsg_rvd_check"><?php echo __('Bitte leer lassen', 'wpsg'); ?></label> + <input type="text" id="wpsg_rvd_check" name="wpsg_revocation_reason[wpsg_rv_check]" value="" tabindex="-1" autocomplete="off" /> + </div> + + <div class="form_field"> + <label class="label" for="wpsg_rvd_name"><?php echo __('Name', 'wpsg'); ?></label> + <div class="value"> + <input type="text" required id="wpsg_rvd_name" autocomplete="name" name="wpsg_revocation_reason[name]" value="<?php echo \esc_attr($contact_name); ?>" /> + </div> + </div> + + <?php /* Schlüssel aus dem Link der Bestellmail, füllt wp_footer.phtml aus wpsg_revo_key (S18) */ ?> + <input type="hidden" name="wpsg_revocation_reason[key]" value="" /> + <div class="form_field"> - <div class="label"><?php echo __('Kontakt - E-Mail', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvd_contact"><?php echo __('Kontakt - E-Mail', 'wpsg'); ?></label> <div class="value"> - <input type="email" required name="wpsg_revocation_reason[contact]" value="<?php echo $contact_email; ?>" + <input type="email" required id="wpsg_rvd_contact" autocomplete="email" name="wpsg_revocation_reason[contact]" value="<?php echo \esc_attr($contact_email); ?>" <?php echo (($contact_email !== '')?'readonly':''); ?> /> </div> </div> <p> - Es gelten unsere <?php echo '<a href="' . \wpsg_ShopController::getShop()->getURL(wpsg_ShopController::URL_DATENSCHUTZ) . '">Datenschutzbestimmungen</a>' ?> + <?php echo \esc_html__('Es gelten unsere', 'wpsg'); ?> + <a href="<?php echo \esc_url(\wpsg_ShopController::getShop()->getURL(wpsg_ShopController::URL_DATENSCHUTZ)); ?>"><?php echo \esc_html__('Datenschutzbestimmungen', 'wpsg'); ?></a>. </p> </form>
\ No newline at end of file diff --git a/views/mods/mod_revocation/mail_row.phtml b/views/mods/mod_revocation/mail_row.phtml index 3a5361a..183d68b 100755 --- a/views/mods/mod_revocation/mail_row.phtml +++ b/views/mods/mod_revocation/mail_row.phtml @@ -2,6 +2,7 @@ /** * Template für die Integration des Widerruflinks in die Kunden- und Adminmail + * @version 4.6.1 */ $order_id = intval($this->view['wpsg_mod_revocation']['order_id']); @@ -10,7 +11,8 @@ $amount = $this->view['wpsg_mod_revocation']['amount']; $order_product_id = intval($this->view['wpsg_mod_revocation']['order_product_id']); - $revo_url = home_url('/').'?wpsg_revo_order='.urlencode($order_nr).'&wpsg_revo_product='.urlencode($product_nr).'&wpsg_revo_amount='.urlencode($amount); + // Schlüssel der Bestellung (S18): bestätigt den Widerruf; keine Nonce, siehe Revocation::orderToken() + $revo_url = home_url('/').'?wpsg_revo_order='.urlencode($order_nr).'&wpsg_revo_product='.urlencode($product_nr).'&wpsg_revo_amount='.urlencode($amount).'&wpsg_revo_key='.urlencode((string)($this->view['wpsg_mod_revocation']['key'] ?? '')); ?><?php echo "\n"; ?> <?php echo wpsg_pad_left(__('Vertrag widerrufen:', 'wpsg').' ', 15); ?> <?php echo $revo_url; ?> diff --git a/views/mods/mod_revocation/mail_row_html.phtml b/views/mods/mod_revocation/mail_row_html.phtml index 207e575..ae060c1 100755 --- a/views/mods/mod_revocation/mail_row_html.phtml +++ b/views/mods/mod_revocation/mail_row_html.phtml @@ -2,6 +2,7 @@ /** * Template für die Integration des Widerruflinks in die Kunden- und Adminmail (HTML) + * @version 4.6.1 */ $i = intval($this->view['i']); @@ -12,13 +13,14 @@ $amount = $this->view['wpsg_mod_revocation']['amount']; $order_product_id = intval($this->view['wpsg_mod_revocation']['order_product_id']); - $revo_url = home_url('/').'?wpsg_revo_order='.urlencode($order_nr).'&wpsg_revo_product='.urlencode($product_nr).'&wpsg_revo_amount='.urlencode($amount); + // Schlüssel der Bestellung (S18): bestätigt den Widerruf; keine Nonce, siehe Revocation::orderToken() + $revo_url = home_url('/').'?wpsg_revo_order='.urlencode($order_nr).'&wpsg_revo_product='.urlencode($product_nr).'&wpsg_revo_amount='.urlencode($amount).'&wpsg_revo_key='.urlencode((string)($this->view['wpsg_mod_revocation']['key'] ?? '')); ?> <tr class="productrow productrow2 <?php echo ((($i % 2) == 0)?'productrow_odd':'productrow_even'); ?>"> <td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_pos"> </td> <td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name"><?php echo __('Widerruf', 'wpsg'); ?>:</td> <td style="padding:4px; line-height:100%; vertical-align:middle;" class="col_name" colspan="4"> - <a href="<?php echo $revo_url; ?>"><?php echo __('Vertrag widerrufen', 'wpsg'); ?></a> + <a href="<?php echo esc_url($revo_url); ?>"><?php echo __('Vertrag widerrufen', 'wpsg'); ?></a> </td> </tr> diff --git a/views/mods/mod_revocation/mails/mail_admin_html.phtml b/views/mods/mod_revocation/mails/mail_admin_html.phtml index 71e7d8e..c819841 100644 --- a/views/mods/mod_revocation/mails/mail_admin_html.phtml +++ b/views/mods/mod_revocation/mails/mail_admin_html.phtml @@ -1,80 +1,46 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); - + /** - * @author: Daniel Schmitzer - * @date: 14.04.26 - * @time: 09:21 + * Mail an den Betreiber (HTML) * + * Mit Bestelldaten (Platzhalter nur bei genau einer gefundenen Bestellung), Bestätigung und Vermerken (S18). */ - + namespace wpsgRevocation; - + $arSubmitData = \wpsg_ShopController::getShop()->view['arSubmitData'] ?? []; - $arReason = Revocation::getReasons(); + $time = (string)($arSubmitData[0]['time'] ?? \current_time('mysql')); ?> <p><?php echo __('Hallo,', 'wpsg'); ?></p> -<p><?php echo __('ein Kunde hat einen Widerruf für ein Produkt durchgeführt.', 'wpsg'); ?></p> +<p><?php echo __('es ist eine Widerrufserklärung eingegangen.', 'wpsg'); ?></p> <p> - <strong><?php echo __('Name', 'wpsg'); ?>:</strong> %kunde_anrede% %kunde_vname% %kunde_name%<br> - <strong><?php echo __('E-Mail', 'wpsg'); ?>:</strong> %kunde_email% + <strong><?php echo __('Name (angegeben)', 'wpsg'); ?>:</strong> <?php echo \esc_html($arSubmitData[0]['name'] ?? ''); ?><br> + <strong><?php echo __('E-Mail (angegeben)', 'wpsg'); ?>:</strong> <?php echo \esc_html($arSubmitData[0]['contact'] ?? ''); ?><br> + <strong><?php echo __('Eingang', 'wpsg'); ?>:</strong> <?php echo \esc_html(\mysql2date('d.m.Y H:i:s', $time)); ?> </p> <hr> -<?php foreach ($arSubmitData as $key => $d): - - $oOrder = $d['oOrder']; - $oOrderProduct = $d['oOrderProduct']; - - $reasonText = array_values(array_filter( - $arReason, - function($item) use ($d) { - return $item['id'] === $d['reason']; - } - ))[0]['text'] ?? __('Kein Grund angegeben', 'wpsg'); -?> - - <div style="margin-bottom:15px; padding-bottom:10px; border-bottom:1px solid #ddd;"> - <p> - <strong><?php echo __('Bestellung', 'wpsg'); ?>:</strong> - <?php echo $oOrder->getNr(); ?> - </p> - - <p> - <strong><?php echo __('Produkt', 'wpsg'); ?>:</strong> - <?php echo $d['amount']; ?> x <?php echo $oOrderProduct->getProduct()->getProductName(true); ?> - / <?php echo __('Artikelnummer', 'wpsg'); ?>: - <?php echo $oOrderProduct->getProduct()->getNr(); ?> - </p> +<?php foreach ($arSubmitData as $d) { $oOrder = $d['oOrder']; $oOrderProduct = $d['oOrderProduct']; ?> +<div style="margin-bottom:15px; padding-bottom:10px; border-bottom:1px solid #ddd;"> + <p><strong><?php echo __('Bestellung', 'wpsg'); ?>:</strong> <?php echo \esc_html(($oOrder !== null)?(string)$oOrder->getNr():$d['order_nr']); ?></p> + <?php if ($oOrder !== null) { ?><p><strong><?php echo __('Besteller', 'wpsg'); ?>:</strong> <?php echo \esc_html((string)$oOrder->getCustomer()->getEMail()); ?></p><?php } ?> + <p><strong><?php echo __('Produkt', 'wpsg'); ?>:</strong> <?php echo intval($d['amount']); ?> x <?php echo \esc_html(($oOrderProduct !== null)?$oOrderProduct->getProduct()->getProductName(true).' / '.__('Artikelnummer', 'wpsg').': '.$oOrderProduct->getProduct()->getNr():$d['product_nr']); ?></p> + <p><strong><?php echo __('Bestätigt', 'wpsg'); ?>:</strong> <?php echo (($d['confirmed'])?__('ja (Link aus der Bestellmail oder angemeldeter Besteller)', 'wpsg'):__('nein', 'wpsg')); ?></p> + <p><strong><?php echo __('Ausgewählter Grund', 'wpsg'); ?>:</strong> <?php echo \esc_html(Revocation::reasonText((string)$d['reason'])); ?></p> + <p><strong><?php echo __('Bemerkung', 'wpsg'); ?>:</strong> <?php echo nl2br(\esc_html($d['comment'])); ?></p> + <?php foreach (Revocation::noteTexts($d['notes']) as $note) { ?><p><strong><?php echo __('Vermerk', 'wpsg'); ?>:</strong> <?php echo \esc_html($note); ?></p><?php } ?> +</div> +<?php } ?> - <p> - <strong><?php echo __('Ausgewählter Grund', 'wpsg'); ?>:</strong> - <?php echo $reasonText; ?> - </p> - - <p> - <strong><?php echo __('Bemerkung', 'wpsg'); ?>:</strong> - <?php echo nl2br(htmlspecialchars($d['comment'] ?? '')); ?> - </p> - </div> - -<?php endforeach; ?> +<p><?php echo __('Bitte prüft den Vorgang und führt die Rückabwicklung (Storno / Rückerstattung) durch.', 'wpsg'); ?></p> <p> - <strong><?php echo __('Datum des Widerrufs', 'wpsg'); ?>:</strong> - <?php echo date('d.m.Y H:i:s'); ?> + <?php echo __('Viele Grüße', 'wpsg'); ?><br> + <?php echo \esc_html(\wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name')); ?> - <?php echo __('Team', 'wpsg'); ?> </p> - -<p> - <?php echo __('Bitte prüft den Vorgang und führt die Rückabwicklung (Storno / Rückerstattung) durch.', 'wpsg'); ?> -</p> - -<p> - <?php echo __('Viele Grüße', 'wpsg'); ?><br> - <?php echo \wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name'); ?> - - <?php echo __('Team', 'wpsg'); ?> -</p>
\ No newline at end of file diff --git a/views/mods/mod_revocation/mails/mail_admin_text.phtml b/views/mods/mod_revocation/mails/mail_admin_text.phtml index 435e7ad..4253b8d 100644 --- a/views/mods/mod_revocation/mails/mail_admin_text.phtml +++ b/views/mods/mod_revocation/mails/mail_admin_text.phtml @@ -1,44 +1,53 @@ <?php - + /** @version 4.6.1 */ + declare(strict_types=1); - + /** - * @author: Daniel Schmitzer - * @date: 14.04.26 - * @time: 09:21 + * Mail an den Betreiber * + * Mit Bestelldaten (Platzhalter nur bei genau einer gefundenen Bestellung), Bestätigung und Vermerken (S18). */ - + namespace wpsgRevocation; - + $arSubmitData = \wpsg_ShopController::getShop()->view['arSubmitData'] ?? []; - $arReason = Revocation::getReasons(); + $time = (string)($arSubmitData[0]['time'] ?? \current_time('mysql')); + +?><?php echo __('Hallo,', 'wpsg'); ?> + + +<?php echo __('es ist eine Widerrufserklärung eingegangen.', 'wpsg'); ?> + + +<?php echo mb_str_pad(__('Name (angegeben)', 'wpsg').':', 25); ?> <?php echo ($arSubmitData[0]['name'] ?? ''); ?> + +<?php echo mb_str_pad(__('E-Mail (angegeben)', 'wpsg').':', 25); ?> <?php echo ($arSubmitData[0]['contact'] ?? ''); ?> -?><?php echo __('Hallo,', 'wpsg'); ?> - -<?php echo __('ein Kunde hat einen Widerruf für ein Produkt durchgeführt.', 'wpsg'); ?> - -<?php echo mb_str_pad(__('Name', 'wpsg').':', 25); ?> %kunde_anrede% %kunde_vname% %kunde_name% -<?php echo mb_str_pad(__('E-Mail', 'wpsg').':', 25); ?> %kunde_email% - -<?php foreach ($arSubmitData as $key => $d) { +<?php echo mb_str_pad(__('Eingang', 'wpsg').':', 25); ?> <?php echo \mysql2date('d.m.Y H:i:s', $time); ?> - /** @var \wpsg_order $oOrder */ - $oOrder = $d['oOrder']; - /** @var \wpsg_order_product $oOrderProduct */ - $oOrderProduct = $d['oOrderProduct']; +<?php foreach ($arSubmitData as $d) { $oOrder = $d['oOrder']; $oOrderProduct = $d['oOrderProduct']; ?> +<?php echo mb_str_pad(__('Bestellung', 'wpsg').':', 25); ?> <?php echo (($oOrder !== null)?$oOrder->getNr():$d['order_nr']); ?> -?> -<?php echo mb_str_pad(__('Bestellung', 'wpsg').':', 25); ?> <?php echo $oOrder->getNr(); ?> -<?php echo mb_str_pad(__('Produkt', 'wpsg').':', 25); ?> <?php echo $d['amount']; ?> x <?php echo $oOrderProduct->getProduct()->getProductName(true); ?> / <?php echo __('Artikelnummer', 'wpsg'); ?>: <?php echo $oOrderProduct->getProduct()->getNr(); ?> -<?php echo mb_str_pad(__('Ausgewählter Grund', 'wpsg').':', 25); ?> <?php echo array_values(array_filter($arReason, function($item) use ($d) { return $item['id'] === $d['reason']; }))[0]['text'] ?? __('Kein Grund angegeben', 'wpsg'); ?> -<?php echo mb_str_pad(__('Bemerkung', 'wpsg').':', 25); ?> <?php echo $d['comment']; ?> +<?php if ($oOrder !== null) { ?><?php echo mb_str_pad(__('Besteller', 'wpsg').':', 25); ?> <?php echo $oOrder->getCustomer()->getEMail(); ?> <?php } ?> +<?php echo mb_str_pad(__('Produkt', 'wpsg').':', 25); ?> <?php echo intval($d['amount']); ?> x <?php echo (($oOrderProduct !== null)?$oOrderProduct->getProduct()->getProductName(true).' / '.__('Artikelnummer', 'wpsg').': '.$oOrderProduct->getProduct()->getNr():$d['product_nr']); ?> + +<?php echo mb_str_pad(__('Bestätigt', 'wpsg').':', 25); ?> <?php echo (($d['confirmed'])?__('ja (Link aus der Bestellmail oder angemeldeter Besteller)', 'wpsg'):__('nein', 'wpsg')); ?> + +<?php echo mb_str_pad(__('Ausgewählter Grund', 'wpsg').':', 25); ?> <?php echo Revocation::reasonText((string)$d['reason']); ?> + +<?php echo mb_str_pad(__('Bemerkung', 'wpsg').':', 25); ?> <?php echo $d['comment']; ?> + +<?php foreach (Revocation::noteTexts($d['notes']) as $note) { ?><?php echo mb_str_pad(__('Vermerk', 'wpsg').':', 25); ?> <?php echo $note; ?> + +<?php } ?> + +<?php } ?> +<?php echo __('Bitte prüft den Vorgang und führt die Rückabwicklung (Storno / Rückerstattung) durch.', 'wpsg'); ?> + -<?php echo mb_str_pad(__('Datum des Widerrufs', 'wpsg').':', 25); ?> <?php echo date('d.m.Y H:i:s'); ?> - -<?php echo __('Bitte prüft den Vorgang und führt die Rückabwicklung (Storno / Rückerstattung) durch.', 'wpsg'); ?> +<?php echo __('Viele Grüße', 'wpsg'); ?> -<?php echo __('Viele Grüße', 'wpsg'); ?> <?php echo \wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name'); ?> - <?php echo __('Team', 'wpsg'); ?>
\ No newline at end of file diff --git a/views/mods/mod_revocation/mails/mail_customer_html.phtml b/views/mods/mod_revocation/mails/mail_customer_html.phtml index 51b7b70..96ee023 100644 --- a/views/mods/mod_revocation/mails/mail_customer_html.phtml +++ b/views/mods/mod_revocation/mails/mail_customer_html.phtml @@ -1,76 +1,43 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); - + /** - * @author: Daniel Schmitzer - * @date: 14.04.26 - * @time: 09:21 + * Eingangsbestätigung an die eingetragene Adresse (HTML) * + * Nur die Angaben des Absenders, keine Daten aus der Bestellung (S18): Die Adresse hat der Absender selbst eingetragen. + * Ohne order_id versendet, Platzhalter wie %kunde_name% bleiben deshalb leer. */ - - namespace wpsgRevocation; - - $arSubmitData = \wpsg_ShopController::getShop()->view['arSubmitData'] ?? []; - $arReason = Revocation::getReasons(); - -?> -<p><?php echo __('Hallo', 'wpsg'); ?> %kunde_anrede% %kunde_name%,</p> - -<p><?php echo __('wir haben Ihren Widerruf erhalten und bedanken uns für Ihre Mitteilung.', 'wpsg'); ?></p> -<h3><?php echo __('Ihre Widerrufsanmeldung:', 'wpsg'); ?></h3> - -<?php foreach ($arSubmitData as $key => $d): + namespace wpsgRevocation; - $oOrder = $d['oOrder']; - $oOrderProduct = $d['oOrderProduct']; + $arSubmitData = \wpsg_ShopController::getShop()->view['arSubmitData'] ?? []; + $time = (string)($arSubmitData[0]['time'] ?? \current_time('mysql')); - $reasonText = array_values(array_filter( - $arReason, - function($item) use ($d) { - return $item['id'] === $d['reason']; - } - ))[0]['text'] ?? __('Kein Grund angegeben', 'wpsg'); ?> - - <div style="margin-bottom:20px; padding:15px; background-color:#f9f9f9; border-radius:5px;"> - <p style="margin:0 0 10px 0;"> - <strong><?php echo __('Bestellnummer', 'wpsg'); ?>:</strong> - <?php echo $oOrder->getNr(); ?> - </p> - - <p style="margin:0 0 10px 0;"> - <strong><?php echo __('Produkt', 'wpsg'); ?>:</strong> - <?php echo $d['amount']; ?> x <?php echo $oOrderProduct->getProduct()->getProductName(true); ?> - / <?php echo __('Artikelnr.', 'wpsg'); ?>: - <?php echo $oOrderProduct->getProduct()->getNr(); ?> - </p> - - <p style="margin:0 0 10px 0;"> - <strong><?php echo __('Grund', 'wpsg'); ?>:</strong> - <?php echo $reasonText; ?> - </p> - - <?php if (!empty($d['comment'])): ?> - <p style="margin:0 0 10px 0;"> - <strong><?php echo __('Bemerkung', 'wpsg'); ?>:</strong> - <?php echo nl2br(htmlspecialchars($d['comment'])); ?> - </p> - <?php endif; ?> - </div> - +<p><?php echo __('Hallo', 'wpsg'); ?> <?php echo \esc_html($arSubmitData[0]['name'] ?? ''); ?>,</p> + +<p><?php echo __('wir bestätigen den Eingang Ihrer Widerrufserklärung mit folgenden Angaben:', 'wpsg'); ?></p> + +<?php foreach ($arSubmitData as $d): ?> +<div style="margin-bottom:20px; padding:15px; background-color:#f9f9f9; border-radius:5px;"> + <p style="margin:0 0 10px 0;"><strong><?php echo __('Bestellnummer', 'wpsg'); ?>:</strong> <?php echo \esc_html($d['order_nr']); ?></p> + <?php if ($d['product_nr'] !== '') { ?><p style="margin:0 0 10px 0;"><strong><?php echo __('Artikelnr.', 'wpsg'); ?>:</strong> <?php echo \esc_html($d['product_nr']); ?></p><?php } ?> + <p style="margin:0 0 10px 0;"><strong><?php echo __('Menge', 'wpsg'); ?>:</strong> <?php echo intval($d['amount']); ?></p> + <p style="margin:0 0 10px 0;"><strong><?php echo __('Grund', 'wpsg'); ?>:</strong> <?php echo \esc_html(Revocation::reasonText((string)$d['reason'])); ?></p> + <?php if ($d['comment'] !== '') { ?><p style="margin:0 0 10px 0;"><strong><?php echo __('Bemerkung', 'wpsg'); ?>:</strong> <?php echo nl2br(\esc_html($d['comment'])); ?></p><?php } ?> +</div> <?php endforeach; ?> <p> - <strong><?php echo __('Widerrufdatum', 'wpsg'); ?>:</strong> - <?php echo date('d.m.Y H:i:s'); ?> + <strong><?php echo __('Name', 'wpsg'); ?>:</strong> <?php echo \esc_html($arSubmitData[0]['name'] ?? ''); ?><br> + <strong><?php echo __('E-Mail', 'wpsg'); ?>:</strong> <?php echo \esc_html($arSubmitData[0]['contact'] ?? ''); ?><br> + <strong><?php echo __('Eingang', 'wpsg'); ?>:</strong> <?php echo \esc_html(\mysql2date('d.m.Y H:i', $time)); ?> </p> -<!--<p>--><?php //echo __('Wir werden Ihren Widerruf nun schnellstmöglich bearbeiten und uns bei Fragen mit Ihnen in Verbindung setzen.', 'wpsg'); ?><!--</p>--> -<p><?php echo __('Bitte beachten Sie, dass die Prüfung der Wirksamkeit und Reichweite Ihrer Widerrufserklärung noch aussteht. Wir werden Ihre Mitteilung nun bearbeiten und uns bei Rückfragen mit Ihnen in Verbindung setzen.', 'wpsg'); ?></p> +<p><?php echo __('Dies ist eine Bestätigung des Eingangs. Die Prüfung der Wirksamkeit und Reichweite Ihrer Widerrufserklärung steht noch aus; wir melden uns bei Rückfragen.', 'wpsg'); ?></p> <p> - <?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?><br> - <?php echo \wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name'); ?> - - <?php echo __('Team', 'wpsg'); ?> -</p>
\ No newline at end of file + <?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?><br> + <?php echo \esc_html(\wpsg_ShopController::getShop()->get_option('wpsg_shopdata_name')); ?> - <?php echo __('Team', 'wpsg'); ?> +</p> diff --git a/views/mods/mod_revocation/mails/mail_customer_text.phtml b/views/mods/mod_revocation/mails/mail_customer_text.phtml index 4e79eda..5812b68 100644 --- a/views/mods/mod_revocation/mails/mail_customer_text.phtml +++ b/views/mods/mod_revocation/mails/mail_customer_text.phtml @@ -1,53 +1,47 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); - + /** - * @author: Daniel Schmitzer - * @date: 14.04.26 - * @time: 09:21 + * Eingangsbestätigung an die eingetragene Adresse * + * Nur die Angaben des Absenders, keine Daten aus der Bestellung (S18): Die Adresse hat der Absender selbst eingetragen. + * Ohne order_id versendet, Platzhalter wie %kunde_name% bleiben deshalb leer. */ - + namespace wpsgRevocation; - + $arSubmitData = \wpsg_ShopController::getShop()->view['arSubmitData'] ?? []; - $arReason = Revocation::getReasons(); + $time = (string)($arSubmitData[0]['time'] ?? \current_time('mysql')); -?><?php echo __('Hallo', 'wpsg'); ?> %kunde_anrede% %kunde_name%, +?><?php echo __('Hallo', 'wpsg'); ?> <?php echo ($arSubmitData[0]['name'] ?? ''); ?>, -<?php echo __('wir haben Ihren Widerruf erhalten und bedanken uns für Ihre Mitteilung.', 'wpsg'); ?> +<?php echo __('wir bestätigen den Eingang Ihrer Widerrufserklärung mit folgenden Angaben:', 'wpsg'); ?> -<?php echo __('Ihre Widerrufsanmeldung:', 'wpsg'); ?> +<?php foreach ($arSubmitData as $d): ?> +<?php echo mb_str_pad(__('Bestellnummer', 'wpsg').':', 20); ?> <?php echo $d['order_nr']; ?> -<?php foreach ($arSubmitData as $key => $d): +<?php if ($d['product_nr'] !== '') { ?><?php echo mb_str_pad(__('Artikelnr.', 'wpsg').':', 20); ?> <?php echo $d['product_nr']; ?> - $oOrder = $d['oOrder']; - $oOrderProduct = $d['oOrderProduct']; +<?php } ?> +<?php echo mb_str_pad(__('Menge', 'wpsg').':', 20); ?> <?php echo intval($d['amount']); ?> - $reasonText = array_values(array_filter( - $arReason, - function($item) use ($d) { - return $item['id'] === $d['reason']; - } - ))[0]['text'] ?? __('Kein Grund angegeben', 'wpsg'); -?> +<?php echo mb_str_pad(__('Grund', 'wpsg').':', 20); ?> <?php echo Revocation::reasonText((string)$d['reason']); ?> -<?php echo mb_str_pad(__('Bestellnummer', 'wpsg').':', 20); ?> <?php echo $oOrder->getNr(); ?> +<?php if ($d['comment'] !== '') { ?><?php echo mb_str_pad(__('Bemerkung', 'wpsg').':', 20); ?> <?php echo $d['comment']; ?> -<?php echo mb_str_pad(__('Produkt', 'wpsg').':', 20); ?> <?php echo $d['amount']; ?> x <?php echo $oOrderProduct->getProduct()->getProductName(true); ?> / <?php echo __('Artikelnr.', 'wpsg'); ?>: <?php echo $oOrderProduct->getProduct()->getNr(); ?> +<?php } ?> -<?php echo mb_str_pad(__('Grund', 'wpsg').':', 20); ?> <?php echo $reasonText; ?> +<?php endforeach; ?> +<?php echo mb_str_pad(__('Name', 'wpsg').':', 20); ?> <?php echo ($arSubmitData[0]['name'] ?? ''); ?> -<?php if (!empty($d['comment'])): ?> -<?php echo mb_str_pad(__('Bemerkung', 'wpsg').':', 20); ?> <?php echo $d['comment']; ?> -<?php endif; ?> +<?php echo mb_str_pad(__('E-Mail', 'wpsg').':', 20); ?> <?php echo ($arSubmitData[0]['contact'] ?? ''); ?> + +<?php echo mb_str_pad(__('Eingang', 'wpsg').':', 20); ?> <?php echo \mysql2date('d.m.Y H:i', $time); ?> -<?php endforeach; ?> -<?php echo mb_str_pad(__('Widerrufdatum', 'wpsg').':', 20); ?> <?php echo date('d.m.Y H:i:s'); ?> +<?php echo __('Dies ist eine Bestätigung des Eingangs. Die Prüfung der Wirksamkeit und Reichweite Ihrer Widerrufserklärung steht noch aus; wir melden uns bei Rückfragen.', 'wpsg'); ?> -<?php echo __('Wir werden Ihren Widerruf nun schnellstmöglich bearbeiten und uns bei Fragen mit Ihnen in Verbindung setzen.', 'wpsg'); ?> -<?php echo __('Bitte beachten Sie, dass die Prüfung der Wirksamkeit und Reichweite Ihrer Widerrufserklärung noch aussteht. Wir werden Ihre Mitteilung nun bearbeiten und uns bei Rückfragen mit Ihnen in Verbindung setzen.', 'wpsg'); ?> <?php echo __('Mit freundlichen Grüßen', 'wpsg'); ?> diff --git a/views/mods/mod_revocation/order_view_row.phtml b/views/mods/mod_revocation/order_view_row.phtml index 9a58cc1..9bfd17f 100644 --- a/views/mods/mod_revocation/order_view_row.phtml +++ b/views/mods/mod_revocation/order_view_row.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -17,6 +18,9 @@ <td colspan="5"> <?php echo __('Widerruf', 'wpsg'); ?>: <?php echo wpsg_translate(__('#1# Stück am #2# widerrufen', 'wpsg'), $row['amount'], \wp_date('d. F Y H:i:s', strtotime($row['time']))); ?> + <?php if (($row['name']??'') !== '') echo ' · '.esc_html($row['name']).' ('.esc_html((string)($row['contact']??'')).')'; ?> + <?php if (isset($row['confirmed'])) echo ' · '.(($row['confirmed'])?esc_html__('bestätigt', 'wpsg'):esc_html__('unbestätigt', 'wpsg')); ?> + <?php $arNotes = \wpsgRevocation\Revocation::noteTexts((array)($row['notes']??[])); if (sizeof($arNotes) > 0) echo ' · '.esc_html(implode(', ', $arNotes)); ?> </td> </tr> diff --git a/views/mods/mod_revocation/page_form.phtml b/views/mods/mod_revocation/page_form.phtml index 1ccb886..aacd6f2 100644 --- a/views/mods/mod_revocation/page_form.phtml +++ b/views/mods/mod_revocation/page_form.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -18,12 +19,14 @@ // Vorbelegung des Kontaktfeldes für eingeloggte Kunden $contact_email = ''; + $contact_name = ''; $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(); + $contact_name = trim($oCustomer->getFirstname().' '.$oCustomer->getName()); } @@ -32,6 +35,7 @@ $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']) : ''; + $get_key = isset($_GET['wpsg_revo_key']) ? \sanitize_key($_GET['wpsg_revo_key']) : ''; // Schlüssel aus der Bestellmail (S18) if ($contact_email === '' && $get_contact !== '' && \is_email($get_contact)) $contact_email = $get_contact; @@ -48,24 +52,24 @@ <fieldset class="wpsg_revocation_order_product"> <div class="form_field"> - <div class="label"><?php echo \__('Artikel - Nr.', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvp_product_nr"><?php echo \__('Artikel - Nr.', 'wpsg'); ?></label> <div class="value"> - <input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][product_nr]" value="<?php echo \esc_attr($get_product); ?>" /> + <input type="text" id="wpsg_rvp_product_nr" 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', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvp_order_nr"><?php echo \__('Bestellnummer / Menge', 'wpsg'); ?></label> <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); ?>" /> + <input type="text" id="wpsg_rvp_order_nr" name="wpsg_revocation_reason[row][<?php echo $key; ?>][order_nr]" value="<?php echo \esc_attr($get_order); ?>" /> + <input type="number" min="1" aria-label="<?php echo \esc_attr__('Menge', 'wpsg'); ?>" 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', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvp_reason"><?php echo \__('Widerrufsgrund', 'wpsg'); ?></label> <div class="value"> - <select name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> + <select id="wpsg_rvp_reason" name="wpsg_revocation_reason[row][<?php echo $key; ?>][reason]"> <option value=""><?php echo __("Keinen Grund angeben", 'wpsg') ?></option> <?php foreach ($arReason as $reason) { ?> <option value="<?php echo \htmlspecialchars($reason['id']); ?>"><?php echo \htmlspecialchars($reason['text']); ?></option> @@ -75,18 +79,33 @@ </div> <div class="form_field"> - <div class="label"><?php echo \__('Bemerkung', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvp_comment"><?php echo \__('Bemerkung', 'wpsg'); ?></label> <div class="value"> - <textarea name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> + <textarea id="wpsg_rvp_comment" name="wpsg_revocation_reason[row][<?php echo $key; ?>][comment]"></textarea> </div> </div> </fieldset> + <?php /* Bot-Falle (S21): für Menschen und Screenreader unsichtbar, nicht in der Tab-Reihenfolge */ ?> + <div class="wpsg_revocation_hp" aria-hidden="true"> + <label class="label" for="wpsg_rvp_check"><?php echo \__('Bitte leer lassen', 'wpsg'); ?></label> + <input type="text" id="wpsg_rvp_check" name="wpsg_revocation_reason[wpsg_rv_check]" value="" tabindex="-1" autocomplete="off" /> + </div> + + <div class="form_field"> + <label class="label" for="wpsg_rvp_name"><?php echo \__('Name', 'wpsg'); ?></label> + <div class="value"> + <input type="text" required id="wpsg_rvp_name" autocomplete="name" name="wpsg_revocation_reason[name]" value="<?php echo \esc_attr($contact_name); ?>" /> + </div> + </div> + + <input type="hidden" name="wpsg_revocation_reason[key]" value="<?php echo \esc_attr($get_key); ?>" /> + <div class="form_field"> - <div class="label"><?php echo \__('Kontakt - E-Mail', 'wpsg'); ?></div> + <label class="label" for="wpsg_rvp_contact"><?php echo \__('Kontakt - E-Mail', 'wpsg'); ?></label> <div class="value"> - <input type="email" required name="wpsg_revocation_reason[contact]" value="<?php echo \esc_attr($contact_email); ?>" + <input type="email" required id="wpsg_rvp_contact" autocomplete="email" name="wpsg_revocation_reason[contact]" value="<?php echo \esc_attr($contact_email); ?>" <?php echo (($customer_login_id > 0 && $contact_email !== '') ? 'readonly' : ''); ?> /> </div> @@ -94,7 +113,7 @@ <p class="wpsg_revocation_page_datenschutz"> <?php echo \__('Es gelten unsere', 'wpsg'); ?> - <a href="<?php echo \wpsg_ShopController::getShop()->getURL(wpsg_ShopController::URL_DATENSCHUTZ); ?>"><?php echo \__('Datenschutzbestimmungen', 'wpsg'); ?></a>. + <a href="<?php echo \esc_url(\wpsg_ShopController::getShop()->getURL(wpsg_ShopController::URL_DATENSCHUTZ)); ?>"><?php echo \__('Datenschutzbestimmungen', 'wpsg'); ?></a>. </p> <div class="form_field wpsg_revocation_page_submit_wrap"> @@ -111,7 +130,8 @@ const form = document.getElementById('wpsg_revocation_page_form'); if (form === null) return; - const nonce = '<?php echo \wp_create_nonce('wpsg_mod_revocation_nonce'); ?>'; + // Kann aus dem Seiten-Cache kommen; ist sie abgelaufen, schickt der Server eine frische mit (K48) + let nonce = <?php echo \wp_json_encode(\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'); @@ -154,26 +174,45 @@ const form_data = formDataToObject(new FormData(form)); - fetch(endpoint, { + const post = retry => fetch(endpoint, { method: 'POST', + credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ nonce: nonce, form_data: form_data }) - }).then(res => res.json()).then(res => { + }).then(res => res.json().then(json => { + + if (res.status === 403 && retry && (json?.data?.code ?? '') === 'wpsg_nonce') { + + nonce = json.data.nonce; + return post(false); + + } + + if (!res.ok) throw new Error(res.status); + + return json; + + })); + + post(true).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; + // Meldungen des Servers als Text, Screenreader sagen sie an + const list = document.createElement('ul'); + list.id = 'wpsg_error'; + list.className = 'wpsg_error'; + list.setAttribute('role', 'alert'); + (res.arError ?? []).forEach(error => { const li = document.createElement('li'); li.textContent = error; list.appendChild(li); }); + msg.replaceChildren(list); 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.', 'wpsg')); ?></div>'; + msg.innerHTML = '<div class="wpsg_revocation_page_success"><?php echo \esc_js(\__('Ihre Widerrufserklärung ist eingegangen. Die Eingangsbestätigung geht an die angegebene E-Mail-Adresse.', 'wpsg')); ?></div>'; msg.scrollIntoView({ behavior: 'smooth', block: 'center' }); } diff --git a/views/mods/mod_revocation/produkt_edit_allgemein.phtml b/views/mods/mod_revocation/produkt_edit_allgemein.phtml index 42ff8ff..043e31b 100644 --- a/views/mods/mod_revocation/produkt_edit_allgemein.phtml +++ b/views/mods/mod_revocation/produkt_edit_allgemein.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_revocation/settings_edit.phtml b/views/mods/mod_revocation/settings_edit.phtml index 47666f4..835535f 100644 --- a/views/mods/mod_revocation/settings_edit.phtml +++ b/views/mods/mod_revocation/settings_edit.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -18,6 +19,7 @@ <ul class="nav nav-tabs" role="tablist"> <li role="presentation" :class="{ 'active': tab === 1 }"><a href="#tab1" @click.prevent.stop="tab = 1"><?php echo __('Einstellungen', 'wpsg'); ?></a></li> <li role="presentation" :class="{ 'active': tab === 2 }"><a href="#tab2" @click.prevent.stop="tab = 2"><?php echo __('Gründe für Retouren', 'wpsg'); ?></a></li> + <li role="presentation" :class="{ 'active': tab === 3 }"><a href="#tab3" @click.prevent.stop="tab = 3"><?php echo __('Nicht zugeordnete Widerrufe', 'wpsg'); ?></a></li> </ul> <input type="hidden" name="wpsg_mod_revocation_reason" v-model="jsonString" /> @@ -68,6 +70,45 @@ <a href="#" @click.prevent.stop="addReason" class="addReason"><span class="wpsg-glyphicon glyphicon glyphicon-plus"></span><?php echo __('Neuen Grund anlegen', 'wpsg'); ?></a> </div> + <div v-show="tab === 3" class="tab-pane active"> + <?php /* S20: Widerrufe ohne passende Bestellung; v-pre, damit eingetragene Texte keine Vue-Vorlage sind. Löschen über das Modulformular (POST, Nonce, wpsg_conf) */ $arUnassigned = \wpsgRevocation\Revocation::unassignedEntries(); ?> + <div v-pre class="wpsg_mod_revocation_unassigned"> + <p><?php echo esc_html(wpsg_translate(__('Widerrufe, zu denen keine Bestellung oder Position gefunden wurde. Gespeichert werden höchstens die letzten #1#.', 'wpsg'), \wpsgRevocation\Revocation::UNASSIGNED_MAX)); ?></p> + <?php if (sizeof($arUnassigned) === 0) { ?> + <p><?php echo esc_html__('Keine Einträge.', 'wpsg'); ?></p> + <?php } else { ?> + <?php /* Der Admin-Controller speichert nur mit „submit“; auch die Löschknöpfe gehen diesen Weg (Nonce, wpsg_conf) */ ?> + <input type="hidden" name="submit" value="1" /> + <table class="table"> + <thead><tr> + <th scope="col"><?php echo esc_html__('Datum', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('Name', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('E-Mail', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('Bestellnummer', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('Artikelnummer', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('Menge', 'wpsg'); ?></th> + <th scope="col"><?php echo esc_html__('Vermerk', 'wpsg'); ?></th> + <th scope="col"><span class="screen-reader-text"><?php echo esc_html__('Löschen', 'wpsg'); ?></span></th> + </tr></thead> + <tbody> + <?php foreach (array_reverse($arUnassigned) as $entry) { ?> + <tr> + <td><?php echo esc_html(\mysql2date('d.m.Y H:i', (string)($entry['time']??''))); ?></td> + <td><?php echo esc_html((string)($entry['name']??'')); ?></td> + <td><?php echo esc_html((string)($entry['contact']??'')); ?></td> + <td><?php echo esc_html((string)($entry['order_nr']??'')); ?></td> + <td><?php echo esc_html((string)($entry['product_nr']??'')); ?></td> + <td><?php echo intval($entry['amount']??0); ?></td> + <td><?php echo esc_html(implode(', ', \wpsgRevocation\Revocation::noteTexts((array)($entry['notes']??[])))); ?></td> + <td><button type="submit" class="button" name="wpsg_mod_revocation_unassigned_delete" value="<?php echo esc_attr($entry['id']); ?>"><?php echo esc_html__('Löschen', 'wpsg'); ?></button></td> + </tr> + <?php } ?> + </tbody> + </table> + <button type="submit" class="button" name="wpsg_mod_revocation_unassigned_delete" value="all" onclick="return confirm(<?php echo esc_attr(wp_json_encode(__('Alle nicht zugeordneten Widerrufe löschen?', 'wpsg'))); ?>);"><?php echo esc_html__('Alle löschen', 'wpsg'); ?></button> + <?php } ?> + </div> + </div> </div> </div> diff --git a/views/mods/mod_revocation/wp_footer.phtml b/views/mods/mod_revocation/wp_footer.phtml index bc3878e..b535c0d 100644 --- a/views/mods/mod_revocation/wp_footer.phtml +++ b/views/mods/mod_revocation/wp_footer.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -14,10 +15,10 @@ <?php if (\wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation_view_flyout') === '1') { ?> - <div id="wpsg_revocation_button"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>Vertrag widerrufen</title><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> - <span id="wpsg_revocation_button_text"><?php echo __('Vertrag widerrufen', 'wpsg'); ?></span> - </div> + <button type="button" id="wpsg_revocation_button" aria-haspopup="dialog" aria-controls="wpsg_revocation_dialog"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> + <span id="wpsg_revocation_button_text"><?php echo esc_html__('Vertrag widerrufen', 'wpsg'); ?></span> + </button> <?php } else { ?> @@ -26,29 +27,86 @@ <?php } ?> <!-- Dialog --> -<div id="wpsg_revocation_dialog" class=""> - <div class="inner"> +<div id="wpsg_revocation_dialog" class="" aria-hidden="true" inert> + <div class="inner" role="dialog" aria-modal="true" aria-labelledby="wpsg_revocation_dialog_title" tabindex="-1"> <div class="header"> - <span><?php echo __('Widerrufsformular', 'wpsg'); ?></span> - <a href="#" class="close"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" /></svg> - </a> + <span id="wpsg_revocation_dialog_title"><?php echo esc_html__('Widerrufsformular', 'wpsg'); ?></span> + <button type="button" class="close" aria-label="<?php echo esc_attr__('Schließen', 'wpsg'); ?>"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" /></svg> + </button> </div> <div class="content"></div> <div class="footer"> - <button class="button button-primary wpsg_revocation_button_submit"><?php echo __('Widerruf bestätigen', 'wpsg'); ?></button> + <button type="button" class="button button-primary wpsg_revocation_button_submit"><?php echo esc_html__('Widerruf bestätigen', 'wpsg'); ?></button> </div> <div class="loading"> - <img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" /> + <svg class="wpsg_revocation_loader" width="24" height="16" viewBox="0 0 24 16" role="img" aria-label="<?php echo esc_attr__('Bitte warten ...', 'wpsg'); ?>" focusable="false"><rect x="2" y="3" width="4" height="10" /><rect x="10" y="3" width="4" height="10" /><rect x="18" y="3" width="4" height="10" /></svg> </div> </div> </div> <script> +( function() { + + // In einer Funktion: Ein doppelt ausgegebener Fuß bricht sonst an doppelt deklarierten Namen ab + if ( window.wpsgRevocationReady ) return; + window.wpsgRevocationReady = true; + + const ajax_url = <?php echo wp_json_encode(admin_url('admin-ajax.php')); ?>; + const error_text = <?php echo wp_json_encode(__('Es ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.', 'wpsg')); ?>; + + // Keine Nonce im HTML: Die Seite kann aus dem Seiten-Cache kommen. Sie kommt beim ersten Öffnen frisch vom Server (K48) + let nonce = null; + + const get_nonce = () => { + + if (nonce !== null) return Promise.resolve(nonce); + + return fetch(ajax_url + '?action=wpsg_mod_revocation&do=nonce&wpsg_frontend_ajax=1', { credentials: 'same-origin', cache: 'no-store' }) + .then(res => res.json()) + .then(res => { nonce = res.data.nonce; return nonce; }); + + }; + + // Sendet mit Nonce; ist sie abgelaufen, schickt der Server eine frische mit und es wird einmal neu gesendet + const send = (request, retry = true) => get_nonce().then(n => fetch(...request(n))).then(res => { + + if (res.status !== 403 || !retry) return res; + + return res.clone().json().then(json => { + + if ((json?.data?.code ?? '') !== 'wpsg_nonce') return res; + + nonce = json.data.nonce; + + return send(request, false); + + }, () => res); + + }); + + // Meldungen des Servers als Text, Screenreader sagen sie an + const error_list = (arError) => { + + const list = document.createElement('ul'); + list.id = 'wpsg_error'; + list.className = 'wpsg_error'; + list.setAttribute('role', 'alert'); + (arError??[]).forEach(error => { const li = document.createElement('li'); li.textContent = error; list.appendChild(li); }); + + return list; + + }; + + const show_error = () => { + + const target = el_dialog_content.querySelector('#msg_target') || el_dialog_content; + + target.innerHTML = '<ul id="wpsg_error" class="wpsg_error"><li></li></ul>'; + target.querySelector('#wpsg_error li').textContent = error_text; + el_dialog.classList.remove('loading'); - console.log('ok'); - - const wpsg_revocation_nonce = '<?php echo wp_create_nonce('wpsg_mod_revocation_nonce'); ?>'; + }; const el_dialog = document.getElementById('wpsg_revocation_dialog'); const el_dialog_content = document.getElementById('wpsg_revocation_dialog').querySelector('.inner > .content'); @@ -94,33 +152,37 @@ const formData = new FormData(form); const form_data = formDataToObject(formData); - fetch('<?php echo admin_url('admin-ajax.php'); ?>?action=wpsg_mod_revocation&do=ajaxDialogSubmit', { + send(n => [ ajax_url + '?action=wpsg_mod_revocation&do=ajaxDialogSubmit', { method: 'POST', + credentials: 'same-origin', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - nonce: wpsg_revocation_nonce, + nonce: n, form_data: form_data, }) - }).then(res => res.json()).then(res => { + } ]).then(res => { if (!res.ok) throw new Error(res.status); return res.json(); }).then(res => { - let html = ''; - if ((res.success??false) === false) { - html += '<ul id="wpsg_error" class="wpsg_error">'; - (res.arError??[]).forEach(error => { html += `<li>${error}</li>`; }); - html += '</ul>'; - - el_dialog_content.querySelector('#msg_target').innerHTML = html; + el_dialog_content.querySelector('#msg_target').replaceChildren(error_list(res.arError)); el_dialog.classList.remove('loading'); } else { - alert('<?php echo __('Ihr Widerruf ist bei uns eingegangen und wird nun bearbeitet.', 'wpsg'); ?>'); - close_dialog(event); + // Bestätigung im Dialog statt alert(): Statusmeldung mit Fokus, Absenden ausgeblendet + const success = document.createElement('div'); + success.className = 'wpsg_revocation_page_success'; + success.setAttribute('role', 'status'); + success.tabIndex = -1; + success.textContent = <?php echo wp_json_encode(__('Ihre Widerrufserklärung ist eingegangen. Die Eingangsbestätigung geht an die angegebene E-Mail-Adresse.', 'wpsg')); ?>; + + el_dialog_content.replaceChildren(success); + el_dialog.querySelector('.wpsg_revocation_button_submit').hidden = true; + el_dialog.classList.remove('loading'); + success.focus(); document.querySelectorAll('.wpsg_revocation_order_product_checkbox:checked').forEach(el => { @@ -130,21 +192,41 @@ } - }); + }).catch(show_error); } + // Auslöser, auf den der Fokus nach dem Schließen zurückgeht (K50) + let trigger = null; + const close_dialog = event => { - event.preventDefault(); - event.stopPropagation(); + if (event) { + + event.preventDefault(); + event.stopPropagation(); + + } + + if (!el_dialog.classList.contains('visible')) return; el_dialog.classList.remove('visible'); + el_dialog.setAttribute('aria-hidden', 'true'); + el_dialog.inert = true; + + if (trigger && document.contains(trigger)) trigger.focus(); + trigger = null; }; const open_dialog = el => { - el_dialog.classList.toggle('visible'); + trigger = document.activeElement; + + el_dialog.inert = false; + el_dialog.removeAttribute('aria-hidden'); + el_dialog.classList.add('visible'); el_dialog.classList.add('loading'); + el_dialog.querySelector('.wpsg_revocation_button_submit').hidden = false; + el_dialog.querySelector('.inner').focus(); const dialog_config = { arProductID: [], @@ -185,22 +267,25 @@ }); - fetch('<?php echo admin_url('admin-ajax.php'); ?>', { + send(n => [ ajax_url, { method: 'POST', + credentials: 'same-origin', body: new URLSearchParams({ - nonce: wpsg_revocation_nonce, + nonce: n, action: 'wpsg_mod_revocation', do: 'ajaxDialogContent', dialog_config: JSON.stringify(dialog_config), }) - }).then(res => res.text()).then(html => { + } ]).then(res => { if (!res.ok) throw new Error(res.status); return res.text(); }).then(html => { el_dialog_content.innerHTML = html; el_dialog.classList.remove('loading'); - }); + // Erstes leeres Feld, sonst das erste Feld des Formulars + const fields = [ ...el_dialog_content.querySelectorAll('input:not([type=hidden]), select, textarea') ]; + ( fields.find(f => f.value === '') || fields[0] )?.focus(); - setTimeout(() => {document.querySelector('[name="wpsg_revocation_reason[row][0][product_nr]"]')?.focus();}, 1000) + }).catch(show_error); }; @@ -238,6 +323,7 @@ const get_product_nr = urlParams.get('wpsg_revo_product'); const get_amount = urlParams.get('wpsg_revo_amount'); const get_contact = urlParams.get('wpsg_revo_contact'); + const get_key = urlParams.get('wpsg_revo_key'); if (get_order_nr !== null) { @@ -288,6 +374,15 @@ } + // Schlüssel aus der Bestellmail bestätigt den Widerruf (S18) + if (get_key) { + + const keyInput = form.querySelector('input[name="wpsg_revocation_reason[key]"]'); + + if (keyInput) keyInput.value = get_key; + + } + }; checkAndFillForm(); @@ -332,15 +427,29 @@ }) - // ESC Taste lauschen + // Escape schließt, Tab bleibt im Dialog (aria-modal) document.addEventListener('keydown', function (e) { + if (!el_dialog.classList.contains('visible')) return; + if (e.key === 'Escape') { - el_dialog.classList.remove('visible'); + close_dialog(e); + return; } + if (e.key !== 'Tab') return; + + const focusable = [ ...el_dialog.querySelectorAll('button, [href], input:not([type=hidden]), select, textarea, [tabindex]:not([tabindex="-1"])') ].filter(f => !f.disabled && f.offsetParent !== null); + if (focusable.length === 0) return; + + const first = focusable[0], last = focusable[focusable.length - 1]; + + if (e.shiftKey && (document.activeElement === first || document.activeElement === el_dialog.querySelector('.inner'))) { e.preventDefault(); last.focus(); } + else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); } + }); - + +} )(); </script>
\ No newline at end of file diff --git a/views/mods/mod_revocation/wpsg_mod_kundenverwaltung_order_after_products.phtml b/views/mods/mod_revocation/wpsg_mod_kundenverwaltung_order_after_products.phtml index 458e1f3..5833e78 100644 --- a/views/mods/mod_revocation/wpsg_mod_kundenverwaltung_order_after_products.phtml +++ b/views/mods/mod_revocation/wpsg_mod_kundenverwaltung_order_after_products.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -36,9 +37,10 @@ data-order_product_id="<?php echo $oOrderProduct->getId(); ?>" data-product_id="<?php echo $oOrderProduct->getProduct()->getId(); ?>" data-amount="<?php echo $amount; ?>" + aria-label="<?php echo \esc_attr(\wpsg_translate(\__('#1# für einen gemeinsamen Widerruf auswählen', 'wpsg'), $oOrderProduct->getProduct()->getProductName(true))); ?>" /> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>Vertrag widerrufen</title><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> - <span><?php echo __('Vertrag widerrufen', 'wpsg'); ?></span> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> + <button type="button" class="wpsg_revocation_order_product_open" aria-haspopup="dialog" aria-controls="wpsg_revocation_dialog"><?php echo \esc_html__('Vertrag widerrufen', 'wpsg'); ?></button> </div> <?php } else { ?> diff --git a/views/mods/mod_revocation/wpsg_producttemplate_afterButton.phtml b/views/mods/mod_revocation/wpsg_producttemplate_afterButton.phtml index dd3921e..70a23d8 100644 --- a/views/mods/mod_revocation/wpsg_producttemplate_afterButton.phtml +++ b/views/mods/mod_revocation/wpsg_producttemplate_afterButton.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); @@ -18,9 +19,9 @@ <?php if (\wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation_view_product') === '1') { ?> - <div class="wpsg_revocation_product_button" data-product_anr="<?php echo \esc_attr((string)(\wpsg_ShopController::getShop()->view['data']['anr']??'')); ?>"> - <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true"><title>Vertrag widerrufen</title><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> - <p class="wpsg_revocation_product_button_text"><?php echo \esc_html__('Vertrag widerrufen', 'wpsg'); ?></p> - </div> + <button type="button" class="wpsg_revocation_product_button" aria-haspopup="dialog" aria-controls="wpsg_revocation_dialog" data-product_anr="<?php echo \esc_attr((string)(\wpsg_ShopController::getShop()->view['data']['anr']??'')); ?>"> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3" /></svg> + <span class="wpsg_revocation_product_button_text"><?php echo \esc_html__('Vertrag widerrufen', 'wpsg'); ?></span> + </button> <?php } ?> diff --git a/views/mods/mod_revocation/wpsg_revocation.css b/views/mods/mod_revocation/wpsg_revocation.css index b74f0bb..ea7d833 100644 --- a/views/mods/mod_revocation/wpsg_revocation.css +++ b/views/mods/mod_revocation/wpsg_revocation.css @@ -1,64 +1,92 @@ /* Widerrufsformular — schlichte Gestaltung passend zum SmartCheckout: dünne Linien, gedämpfte Beschriftungen, Farbe vom Theme */ -#wpsg_revocation_button, #wpsg_revocation_dialog, .wpsg_revocation_product_button, .wpsg_revocation_page, .wpsg_mod_kundenverwaltung_order { --rv-line:rgba(127, 127, 127, 0.35); --rv-line-soft:rgba(127, 127, 127, 0.2); --rv-flat:rgba(127, 127, 127, 0.08); --rv-error:#b3261e; --rv-success:#2e7d32; --rv-radius:3px; } +#wpsg_revocation_button, #wpsg_revocation_dialog, .wpsg_revocation_product_button, .wpsg_revocation_page, .wpsg_mod_kundenverwaltung_order { --rv-line:rgba(127, 127, 127, 0.35); --rv-field-border:1px solid rgba(127, 127, 127, 0.9); --rv-line-soft:rgba(127, 127, 127, 0.2); --rv-flat:rgba(127, 127, 127, 0.08); --rv-error:#b3261e; --rv-success:#2e7d32; --rv-radius:3px; } +/* Feldränder brauchen 3:1 (WCAG 1.4.11, K76): der Feldrand des Themes, sonst ein Grau, das auf hellem und dunklem Grund reicht; den Dialog färbt wpsg-theme.css */ +.wpsg_revocation_page { --rv-field-border:var(--wpsg-field-border, 1px solid rgba(127, 127, 127, 0.9)); } /* Button am Produkt (Produkttemplate, SmartCheckout) */ -.wpsg_revocation_product_button { display:inline-flex; align-items:center; gap:0.4rem; width:auto; padding:0.35rem 0.7rem; border:1px solid var(--rv-line); border-radius:var(--rv-radius); background:none; color:inherit; font-size:0.85rem; line-height:1.2; cursor:pointer; user-select:none; transition:background-color 0.15s ease-out, border-color 0.15s ease-out; } +.wpsg_revocation_product_button { display:inline-flex; align-items:center; gap:0.4706em; width:auto; padding:0.4118em 0.8235em; border:1px solid var(--rv-line); border-radius:var(--rv-radius); background:none; color:inherit; font-size:0.85em; line-height:1.2; cursor:pointer; user-select:none; transition:background-color 0.15s ease-out, border-color 0.15s ease-out; } +.wpsg_revocation_product_button, #wpsg_revocation_button, #wpsg_revocation_dialog .inner > .header .close, .wpsg_revocation_order_product_open { margin:0; font-family:inherit; text-align:left; -webkit-appearance:none; appearance:none; } +/* Seit 4.6.1 echte Knöpfe (K50): Knopfregeln der Themes auf button zurücksetzen, damit sie aussehen wie zuvor als div */ +.wpsg_revocation_product_button.wpsg_revocation_product_button, .wpsg_revocation_order_product_open.wpsg_revocation_order_product_open, #wpsg_revocation_button { min-height:0; box-shadow:none; font-weight:inherit; letter-spacing:inherit; text-transform:none; text-shadow:none; } +.wpsg_revocation_product_button.wpsg_revocation_product_button { padding:0.4118em 0.8235em; border:1px solid var(--rv-line); border-radius:var(--rv-radius); background:none; color:inherit; font-size:0.85em; line-height:1.2; } +.wpsg_revocation_product_button.wpsg_revocation_product_button:focus, .wpsg_revocation_product_button.wpsg_revocation_product_button:active { background:none; color:inherit; border-color:var(--rv-line); } +.wpsg_revocation_product_button.wpsg_revocation_product_button:hover { background:var(--rv-flat); color:inherit; border-color:currentColor; } +.wpsg_revocation_order_product_open.wpsg_revocation_order_product_open, .wpsg_revocation_order_product_open.wpsg_revocation_order_product_open:hover, .wpsg_revocation_order_product_open.wpsg_revocation_order_product_open:focus { padding:0; border:0; border-radius:0; background:none; color:inherit; font-size:inherit; line-height:inherit; } +#wpsg_revocation_button { line-height:inherit; } +#wpsg_revocation_button:hover, #wpsg_revocation_button:focus, #wpsg_revocation_button:active { background-color:#FFFFFF; color:#1d1d1d; box-shadow:0 2px 10px rgba(0, 0, 0, 0.08); } +#wpsg_revocation_dialog .inner > .header .close:hover, #wpsg_revocation_dialog .inner > .header .close:focus { background:none; color:inherit; box-shadow:none; } +#wpsg_revocation_dialog .inner > .header .close, .wpsg_revocation_order_product_open { padding:0; border:0; background:none; } +.wpsg_revocation_order_product_open { color:inherit; font-size:inherit; line-height:inherit; cursor:pointer; text-decoration:underline; } .wpsg_revocation_product_button:hover { background:var(--rv-flat); border-color:currentColor; } .wpsg_revocation_product_button > svg { flex:0 0 16px; width:16px; height:16px; fill:currentColor; opacity:0.7; } /* Doppelte Klasse, damit Theme-Regeln wie ".entry-content p { margin-bottom:… }" nicht in den Button durchschlagen */ .wpsg_revocation_product_button .wpsg_revocation_product_button_text { margin:0; padding:0; font-size:inherit; line-height:inherit; color:inherit; text-align:left; white-space:nowrap; } /* Flyout am rechten Bildschirmrand, im Ruhezustand ist nur das Symbol sichtbar */ -#wpsg_revocation_button { position:fixed; right:0; top:25%; z-index:10; display:flex; align-items:center; gap:0.6rem; flex-wrap:nowrap; padding:0.6rem 0.9rem 0.6rem 0.6rem; border:1px solid var(--rv-line); border-right:0; border-radius:var(--rv-radius) 0 0 var(--rv-radius); background-color:#FFFFFF; color:#1d1d1d; font-size:0.9rem; box-shadow:0 2px 10px rgba(0, 0, 0, 0.08); cursor:pointer; transform:translateX(calc(100% - (26px + 1.2rem))); transition:transform 0.3s ease-out; } -#wpsg_revocation_button:hover, #wpsg_revocation_button:focus-within { transform:translateX(0); } +#wpsg_revocation_button { position:fixed; right:0; top:25%; z-index:10; display:flex; align-items:center; gap:0.6667em; flex-wrap:nowrap; padding:0.6667em 1em 0.6667em 0.6667em; border:1px solid var(--rv-line); border-right:0; border-radius:var(--rv-radius) 0 0 var(--rv-radius); background-color:#FFFFFF; color:#1d1d1d; font-size:0.9em; box-shadow:0 2px 10px rgba(0, 0, 0, 0.08); cursor:pointer; transform:translateX(calc(100% - (26px + 1.3333em))); transition:transform 0.3s ease-out; } +#wpsg_revocation_button:hover, #wpsg_revocation_button:focus-within, #wpsg_revocation_button:focus-visible { transform:translateX(0); } #wpsg_revocation_button svg { flex:0 0 26px; width:26px; height:26px; fill:currentColor; opacity:0.8; } #wpsg_revocation_button span { white-space:nowrap; } /* Dialog */ -#wpsg_revocation_dialog { position:fixed; left:0; top:0; z-index:100000; display:flex; align-items:center; justify-content:center; width:100vw; height:100vh; padding:1rem; box-sizing:border-box; background-color:rgba(0, 0, 0, 0.45); opacity:0; pointer-events:none; transition:opacity 0.2s ease-out; } -#wpsg_revocation_dialog.visible { opacity:1; pointer-events:all; } +/* Geschlossen unsichtbar, nicht nur inert: Die Lightbox des Kerns nimmt allen Kindern von body das inert; visibility erst nach dem Ausblenden */ +#wpsg_revocation_dialog { position:fixed; left:0; top:0; z-index:100000; display:flex; align-items:center; justify-content:center; width:100vw; height:100vh; padding:1em; box-sizing:border-box; background-color:rgba(0, 0, 0, 0.45); opacity:0; pointer-events:none; visibility:hidden; transition:opacity 0.2s ease-out, visibility 0s linear 0.2s; } +#wpsg_revocation_dialog.visible { opacity:1; pointer-events:all; visibility:visible; transition:opacity 0.2s ease-out, visibility 0s; } #wpsg_revocation_dialog * { box-sizing:border-box; } -#wpsg_revocation_dialog .inner { position:relative; display:flex; flex-direction:column; width:100%; max-width:640px; max-height:calc(100vh - 2rem); padding:1.5rem; border-radius:var(--rv-radius); background-color:#FFFFFF; color:#1d1d1d; box-shadow:0 10px 40px rgba(0, 0, 0, 0.2); } -#wpsg_revocation_dialog .inner > .header { display:flex; flex:0 0 auto; align-items:center; justify-content:space-between; gap:1rem; padding-bottom:1rem; border-bottom:1px solid var(--rv-line-soft); font-size:1.1rem; font-weight:600; line-height:1.3; } +#wpsg_revocation_dialog .inner { position:relative; display:flex; flex-direction:column; width:100%; max-width:640px; max-height:calc(100vh - 2em); padding:1.5em; border-radius:var(--rv-radius); background-color:#FFFFFF; color:#1d1d1d; box-shadow:0 10px 40px rgba(0, 0, 0, 0.2); } +#wpsg_revocation_dialog .inner > .header { display:flex; flex:0 0 auto; align-items:center; justify-content:space-between; gap:0.9091em; padding-bottom:0.9091em; border-bottom:1px solid var(--rv-line-soft); font-size:1.1em; font-weight:600; line-height:1.3; } #wpsg_revocation_dialog .inner > .header .close { display:flex; align-items:center; justify-content:center; width:28px; height:28px; color:inherit; opacity:0.6; cursor:pointer; transition:opacity 0.15s ease-out; } #wpsg_revocation_dialog .inner > .header .close:hover { opacity:1; } #wpsg_revocation_dialog .inner > .header .close svg { width:20px; height:20px; fill:currentColor; } -#wpsg_revocation_dialog .inner > .content { flex:1 1 auto; min-height:0; overflow-y:auto; margin:1rem 0; } -#wpsg_revocation_dialog .inner > .footer { display:flex; flex:0 0 auto; align-items:center; justify-content:flex-end; gap:0.75rem; padding-top:1rem; border-top:1px solid var(--rv-line-soft); } +#wpsg_revocation_dialog .inner > .content { flex:1 1 auto; min-height:0; overflow-y:auto; margin:1em 0; } +#wpsg_revocation_dialog .inner > .footer { display:flex; flex:0 0 auto; align-items:center; justify-content:flex-end; gap:0.75em; padding-top:1em; border-top:1px solid var(--rv-line-soft); } #wpsg_revocation_dialog .inner > .loading { position:absolute; left:0; top:0; z-index:2; display:flex; align-items:center; justify-content:center; width:100%; height:100%; border-radius:var(--rv-radius); background-color:rgba(255, 255, 255, 0.7); opacity:0; pointer-events:none; transition:opacity 0.2s ease-out; } #wpsg_revocation_dialog.loading > .inner > .loading { opacity:1; pointer-events:all; } +/* Ladesymbol als SVG statt ajax-loader.gif: scharf auf jedem Display; Grau wie bisher, die Ladefläche ist immer hell */ +#wpsg_revocation_dialog .wpsg_revocation_loader rect { fill:#777777; opacity:0.35; animation:wpsg_rv_loader 0.9s ease-in-out infinite; } +#wpsg_revocation_dialog .wpsg_revocation_loader rect:nth-child(2) { animation-delay:0.15s; } +#wpsg_revocation_dialog .wpsg_revocation_loader rect:nth-child(3) { animation-delay:0.3s; } +@keyframes wpsg_rv_loader { 0%, 100% { opacity:0.35; } 50% { opacity:1; } } +@media (prefers-reduced-motion: reduce) { #wpsg_revocation_dialog .wpsg_revocation_loader rect { animation:none; } } /* Absende-Button im Dialog und auf der Formularseite */ -#wpsg_revocation_dialog .wpsg_revocation_button_submit, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap button, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap input[type="submit"] { display:inline-flex; align-items:center; justify-content:center; min-height:0; margin:0; padding:0.65rem 1.1rem; border:1px solid currentColor; border-radius:var(--rv-radius); background:none; color:inherit; font:inherit; font-weight:600; line-height:1.2; text-shadow:none; box-shadow:none; cursor:pointer; transition:background-color 0.15s ease-out; } +#wpsg_revocation_dialog .wpsg_revocation_button_submit, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap button, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap input[type="submit"] { display:inline-flex; align-items:center; justify-content:center; min-height:0; margin:0; padding:0.65em 1.1em; border:1px solid currentColor; border-radius:var(--rv-radius); background:none; color:inherit; font:inherit; font-weight:600; line-height:1.2; text-shadow:none; box-shadow:none; cursor:pointer; transition:background-color 0.15s ease-out; } +#wpsg_revocation_dialog .wpsg_revocation_button_submit[hidden] { display:none; } #wpsg_revocation_dialog .wpsg_revocation_button_submit:hover, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap button:hover, .wpsg_revocation_page .wpsg_revocation_page_submit_wrap input[type="submit"]:hover { background:var(--rv-flat); } /* Formular (Dialog und eigenständige Seite) */ -#wpsg_revocation_form, #wpsg_revocation_page_form { display:flex; flex-direction:column; gap:1rem; width:100%; margin:0; } -#wpsg_revocation_form .wpsg_revocation_order_product, #wpsg_revocation_page_form .wpsg_revocation_order_product { display:flex; flex-direction:column; gap:0.9rem; margin:0; padding:1rem; border:1px solid var(--rv-line-soft); border-radius:var(--rv-radius); min-width:0; } -#wpsg_revocation_form .wpsg_revocation_order_product > div, #wpsg_revocation_page_form .wpsg_revocation_order_product > div { display:flex; flex-direction:column; gap:0.9rem; width:100%; } -#wpsg_revocation_form legend, #wpsg_revocation_page_form legend { padding:0 0.35rem; font-size:0.95rem; font-weight:600; } -#wpsg_revocation_form .form_field, #wpsg_revocation_page_form .form_field { display:flex; flex-direction:column; gap:0.3rem; width:100%; } -#wpsg_revocation_form .form_field .label, #wpsg_revocation_page_form .form_field .label { color:inherit; font-size:0.85rem; opacity:0.7; } -#wpsg_revocation_form .form_field .value, #wpsg_revocation_page_form .form_field .value { display:flex; gap:0.5rem; justify-content:stretch; } -#wpsg_revocation_form .form_field .value input, #wpsg_revocation_form .form_field .value textarea, #wpsg_revocation_form .form_field .value select, #wpsg_revocation_page_form .form_field .value input, #wpsg_revocation_page_form .form_field .value textarea, #wpsg_revocation_page_form .form_field .value select { flex:1 1 auto; width:auto; min-width:0; min-height:0; margin:0; padding:0.55rem 0.7rem; border:1px solid var(--rv-line); border-radius:var(--rv-radius); background:none; color:inherit; font:inherit; text-indent:0; box-shadow:none; } -#wpsg_revocation_form .form_field .value input:focus, #wpsg_revocation_form .form_field .value textarea:focus, #wpsg_revocation_form .form_field .value select:focus, #wpsg_revocation_page_form .form_field .value input:focus, #wpsg_revocation_page_form .form_field .value textarea:focus, #wpsg_revocation_page_form .form_field .value select:focus { border-color:currentColor; outline:none; } +#wpsg_revocation_form, #wpsg_revocation_page_form { display:flex; flex-direction:column; gap:1em; width:100%; margin:0; } +#wpsg_revocation_form .wpsg_revocation_order_product, #wpsg_revocation_page_form .wpsg_revocation_order_product { display:flex; flex-direction:column; gap:0.9em; margin:0; padding:1em; border:1px solid var(--rv-line-soft); border-radius:var(--rv-radius); min-width:0; } +#wpsg_revocation_form .wpsg_revocation_order_product > div, #wpsg_revocation_page_form .wpsg_revocation_order_product > div { display:flex; flex-direction:column; gap:0.9em; width:100%; } +#wpsg_revocation_form legend, #wpsg_revocation_page_form legend { padding:0 0.3684em; font-size:0.95em; font-weight:600; } +#wpsg_revocation_form .form_field, #wpsg_revocation_page_form .form_field { display:flex; flex-direction:column; gap:0.3em; width:100%; } +#wpsg_revocation_form .form_field .label, #wpsg_revocation_page_form .form_field .label { color:inherit; font-size:0.85em; opacity:0.7; } +/* Bot-Falle (S21): aus dem Bild, ohne display:none, damit Programme sie ausfüllen */ +.wpsg_revocation_hp { position:absolute; left:-10000px; top:auto; width:1px; height:1px; overflow:hidden; } +/* Links in Schriftfarbe: Die Linkfarbe des Themes ist auf dem Dialog sonst zu blass (W5) */ +#wpsg_revocation_dialog .inner a, .wpsg_revocation_page a { color:inherit; text-decoration:underline; } +#wpsg_revocation_form .form_field .value, #wpsg_revocation_page_form .form_field .value { display:flex; gap:0.5em; justify-content:stretch; } +#wpsg_revocation_form .form_field .value input, #wpsg_revocation_form .form_field .value textarea, #wpsg_revocation_form .form_field .value select, #wpsg_revocation_page_form .form_field .value input, #wpsg_revocation_page_form .form_field .value textarea, #wpsg_revocation_page_form .form_field .value select { flex:1 1 auto; width:auto; min-width:0; min-height:0; margin:0; padding:0.55em 0.7em; border:var(--rv-field-border); border-radius:var(--rv-radius); background:none; color:inherit; font:inherit; text-indent:0; box-shadow:none; } +#wpsg_revocation_form .form_field .value input:focus, #wpsg_revocation_form .form_field .value textarea:focus, #wpsg_revocation_form .form_field .value select:focus, #wpsg_revocation_page_form .form_field .value input:focus, #wpsg_revocation_page_form .form_field .value textarea:focus, #wpsg_revocation_page_form .form_field .value select:focus { border-color:currentColor; } #wpsg_revocation_form .form_field .value input[readonly], #wpsg_revocation_page_form .form_field .value input[readonly] { background:var(--rv-flat); } -#wpsg_revocation_form .form_field .value input[type="number"], #wpsg_revocation_page_form .form_field .value input[type="number"] { flex:0 0 6rem; } -#wpsg_revocation_form .form_field .value textarea, #wpsg_revocation_page_form .form_field .value textarea { min-height:5.5rem; resize:vertical; } -#wpsg_revocation_form > p, #wpsg_revocation_page_form .wpsg_revocation_page_datenschutz { margin:0; font-size:0.85rem; opacity:0.7; } +#wpsg_revocation_form .form_field .value input[type="number"], #wpsg_revocation_page_form .form_field .value input[type="number"] { flex:0 0 6em; } +#wpsg_revocation_form .form_field .value textarea, #wpsg_revocation_page_form .form_field .value textarea { min-height:5.5em; resize:vertical; } +#wpsg_revocation_form > p, #wpsg_revocation_page_form .wpsg_revocation_page_datenschutz { margin:0; font-size:0.85em; opacity:0.7; } /* Meldungen */ -#wpsg_revocation_dialog #wpsg_error, #wpsg_revocation_page_form #wpsg_error, #wpsg_revocation_page_form .wpsg_error { margin:0; padding:0.6rem 0.9rem; border-left:3px solid var(--rv-error); background:var(--rv-flat); color:inherit; list-style:none; } +#wpsg_revocation_dialog #wpsg_error, #wpsg_revocation_page_form #wpsg_error, #wpsg_revocation_page_form .wpsg_error { margin:0; padding:0.6em 0.9em; border-left:3px solid var(--rv-error); background:var(--rv-flat); color:inherit; list-style:none; } #wpsg_revocation_dialog #msg_target:empty { display:none; } -.wpsg_revocation_page_success { padding:0.6rem 0.9rem; border-left:3px solid var(--rv-success); background:var(--rv-flat); color:inherit; } +.wpsg_revocation_page_success { padding:0.6em 0.9em; border-left:3px solid var(--rv-success); background:var(--rv-flat); color:inherit; } /* Eigenständige Widerrufsformular-Seite (kein Popup) */ .wpsg_revocation_page { width:100%; max-width:640px; margin:0 auto; } -.wpsg_revocation_page .wpsg_revocation_page_submit_wrap { margin-top:0.25rem; } +/* Modus „neu“: so breit wie die Inhaltsspalte und bündig mit dem Seitentitel; Block-Themes zentrieren Kinder mit !important */ +.wpsg-style-theme .wpsg_revocation_page { max-width:var(--wp--style--global--content-size, 640px); margin-left:0; } +.wpsg_revocation_page .wpsg_revocation_page_submit_wrap { margin-top:0.25em; } /* Auswahl der Produkte in der Bestellübersicht des Kundenkontos */ -.wpsg_mod_kundenverwaltung_order .wpsg_revocation_order_product { display:inline-flex; flex-direction:row; align-items:center; gap:0.5rem; margin-bottom:1rem; padding:0.4rem 0.7rem; border:1px solid var(--rv-line); border-radius:var(--rv-radius); font-size:0.85rem; user-select:none; } +.wpsg_mod_kundenverwaltung_order .wpsg_revocation_order_product { display:inline-flex; flex-direction:row; align-items:center; gap:0.5882em; margin-bottom:1.1765em; padding:0.4706em 0.8235em; border:1px solid var(--rv-line); border-radius:var(--rv-radius); font-size:0.85em; user-select:none; } .wpsg_mod_kundenverwaltung_order .wpsg_revocation_order_product > svg { flex:0 0 18px; width:18px; height:18px; fill:currentColor; opacity:0.7; } .wpsg_mod_kundenverwaltung_order .wpsg_revocation_order_product > input { flex-shrink:0; width:16px; height:16px; margin:0; } .wpsg_mod_kundenverwaltung_order .wpsg_revocation_order_product > .inner { cursor:pointer; } diff --git a/views/mods/mod_scaleprice/product_bottom.phtml b/views/mods/mod_scaleprice/product_bottom.phtml index e59189b..1c128e2 100644 --- a/views/mods/mod_scaleprice/product_bottom.phtml +++ b/views/mods/mod_scaleprice/product_bottom.phtml @@ -3,6 +3,7 @@ /**
* Template für die Integration der Staffelanzeige in das Produkttemplate
* Muss in den Darstellungsoptionen aktiviert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_scaleprice/product_edit_allgemein.phtml b/views/mods/mod_scaleprice/product_edit_allgemein.phtml index 5dd280c..0380cc1 100644 --- a/views/mods/mod_scaleprice/product_edit_allgemein.phtml +++ b/views/mods/mod_scaleprice/product_edit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Staffelpreise in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml b/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml index 1aca5e1..a648568 100644 --- a/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml +++ b/views/mods/mod_scaleprice/produkt_addedit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Staffelpreise in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_scaleprice/scaleList.phtml b/views/mods/mod_scaleprice/scaleList.phtml index 1d70e41..b50d96a 100644 --- a/views/mods/mod_scaleprice/scaleList.phtml +++ b/views/mods/mod_scaleprice/scaleList.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Staffelpreise innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_scaleprice/settings_edit.phtml b/views/mods/mod_scaleprice/settings_edit.phtml index ed4f3fd..81363d8 100644 --- a/views/mods/mod_scaleprice/settings_edit.phtml +++ b/views/mods/mod_scaleprice/settings_edit.phtml @@ -3,6 +3,7 @@ /**
* Template für die Einstellungen des Staffelpreismoduls
* Sollte nicht verändert werden
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_securepay/order_done.phtml b/views/mods/mod_securepay/order_done.phtml index bf08070..cbcff00 100644 --- a/views/mods/mod_securepay/order_done.phtml +++ b/views/mods/mod_securepay/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template für die Bestellabschlussseite mit SecurePay
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_securepay/settings_edit.phtml b/views/mods/mod_securepay/settings_edit.phtml index 37501c8..435b982 100644 --- a/views/mods/mod_securepay/settings_edit.phtml +++ b/views/mods/mod_securepay/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des SecurePay Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml b/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml index b7d591b..b1f9705 100644 --- a/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml +++ b/views/mods/mod_shippingadress/checkout_inner_prebutton.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="wpsg_mod_shippingadress">
<h2><?php echo __('Gesonderte Lieferadresse', 'wpsg'); ?></h2>
diff --git a/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml b/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml index e00dbb5..5d80c8c 100644 --- a/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml +++ b/views/mods/mod_shippingadress/wpsg_order_view_customerdata.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Versandadresse in die Bestellansicht
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_shs/order_done.phtml b/views/mods/mod_shs/order_done.phtml index 6f1e82f..053df7c 100644 --- a/views/mods/mod_shs/order_done.phtml +++ b/views/mods/mod_shs/order_done.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird nach einer Sparkassen Internetkasse Zahlung angezeigt
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_shs/settings_edit.phtml b/views/mods/mod_shs/settings_edit.phtml index df10ecb..f36be77 100644 --- a/views/mods/mod_shs/settings_edit.phtml +++ b/views/mods/mod_shs/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Sparkassen Internet Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_skrill/order_done.phtml b/views/mods/mod_skrill/order_done.phtml index 5679f43..178db16 100644 --- a/views/mods/mod_skrill/order_done.phtml +++ b/views/mods/mod_skrill/order_done.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für das Zahlungsformular nach Bestellablauf
diff --git a/views/mods/mod_skrill/settings_edit.phtml b/views/mods/mod_skrill/settings_edit.phtml index da85c01..a407050 100644 --- a/views/mods/mod_skrill/settings_edit.phtml +++ b/views/mods/mod_skrill/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Zahlungsmoduls "Skrill"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_smartcheckout/checkout.phtml b/views/mods/mod_smartcheckout/checkout.phtml index 6bae4ca..043b151 100644 --- a/views/mods/mod_smartcheckout/checkout.phtml +++ b/views/mods/mod_smartcheckout/checkout.phtml @@ -6,6 +6,7 @@ * Das Markup ist das DOM-Template der Vue-Anwendung aus views/js/smartcheckout.js. * Gerechnet und formatiert wird ausschließlich serverseitig, die Anwendung stellt nur * dar, was ihr der Server im Zustand liefert. + * @version 4.6.1 */ $state = $this->view['smartcheckout']; @@ -45,269 +46,281 @@ <div class="sc_main"> - <?php /* Schritt 1: Warenkorb */ ?> - <section class="sc_box" aria-labelledby="sc_title_basket"> - <h2 class="sc_title" id="sc_title_basket"><span class="sc_step">1</span><?php echo esc_html__('Ihr Warenkorb', 'wpsg'); ?></h2> - - <div class="sc_modul_basket sc_modul_dynamic" v-if="state.html.basketTop" v-html="state.html.basketTop"></div> + <?php /* Bestätigungsschritt beim Bestellabschluss „Zusammenfassung vor Abschluss“ */ ?> + <div class="sc_confirm_note" v-if="confirm" role="status"> + <strong><?php echo esc_html__('Bitte prüfen Sie Ihre Angaben', 'wpsg'); ?></strong> + <p><?php echo esc_html__('Alle Eingaben sind jetzt gesperrt. Stimmt alles, schließen Sie die Bestellung in der Zusammenfassung ab. Um etwas zu korrigieren, klicken Sie auf „Angaben ändern“.', 'wpsg'); ?></p> + <button type="button" class="sc_button sc_button_secondary" @click="editConfirm" :disabled="busy"><?php echo esc_html__('Angaben ändern', 'wpsg'); ?></button> + </div> - <div class="sc_products"> + <?php /* Im Bestätigungsschritt sind alle Eingaben gesperrt, vor dem Absenden gibt smartcheckout.js sie wieder frei */ ?> + <fieldset class="sc_fieldset" :disabled="confirm"> - <div class="sc_product" v-for="product in state.products" :key="product.index"> + <?php /* Schritt 1: Warenkorb */ ?> + <section class="sc_box" aria-labelledby="sc_title_basket"> + <h2 class="sc_title" id="sc_title_basket"><span class="sc_step">1</span><?php echo esc_html__('Ihr Warenkorb', 'wpsg'); ?></h2> - <div class="sc_product_image" v-if="product.image"> - <img :src="product.image" :alt="product.name" loading="lazy" /> - </div> + <div class="sc_modul_basket sc_modul_dynamic" v-if="state.html.basketTop" v-html="state.html.basketTop"></div> - <div class="sc_product_body"> + <div class="sc_products"> - <?php /* Angaben der Module vor dem Produkt, z.B. Maße beim Druckshop */ ?> - <div class="sc_product_before sc_modul_dynamic" v-if="product.before" v-html="product.before"></div> + <div class="sc_product" v-for="product in state.products" :key="product.index"> - <div class="sc_product_name"> - <a v-if="product.link" :href="product.link">{{ product.name }}</a> - <span v-else>{{ product.name }}</span> + <div class="sc_product_image" v-if="product.image"> + <img :src="product.image" :alt="product.name" loading="lazy" /> </div> - <div class="sc_product_desc" v-if="product.shortdesc" v-html="product.shortdesc"></div> - <div class="sc_product_extra sc_modul_dynamic" v-if="product.extra" v-html="product.extra"></div> - <div class="sc_product_garan" v-if="product.garan" v-html="product.garan"></div> - <div class="sc_product_revocation" v-if="product.revocation" v-html="product.revocation"></div> + <div class="sc_product_body"> - <div class="sc_product_tax" v-if="state.showTax"> - <?php echo esc_html__('MwSt.', 'wpsg'); ?> {{ product.tax_value }} - </div> + <?php /* Angaben der Module vor dem Produkt, z.B. Maße beim Druckshop */ ?> + <div class="sc_product_before sc_modul_dynamic" v-if="product.before" v-html="product.before"></div> - </div> + <div class="sc_product_name"> + <a v-if="product.link" :href="product.link">{{ product.name }}</a> + <span v-else>{{ product.name }}</span> + </div> - <div class="sc_product_amount"> + <div class="sc_product_desc" v-if="product.shortdesc" v-html="product.shortdesc"></div> + <div class="sc_product_extra sc_modul_dynamic" v-if="product.extra" v-html="product.extra"></div> + <div class="sc_product_garan" v-if="product.garan" v-html="product.garan"></div> + <div class="sc_product_revocation" v-if="product.revocation" v-html="product.revocation"></div> + + <div class="sc_product_tax" v-if="state.showTax"> + <?php echo esc_html__('MwSt.', 'wpsg'); ?> {{ product.tax_value }} + </div> - <div class="sc_stepper" v-if="!product.fixed"> - <button type="button" class="sc_stepper_btn" @click="changeAmount(product, -1)" :disabled="busy" :aria-label="'<?php echo esc_js(__('Menge verringern', 'wpsg')); ?>'">−</button> - <input - type="text" - inputmode="numeric" - class="sc_stepper_input" - :name="'wpsg[menge][' + product.index + ']'" - v-model="amounts[product.index]" - @change="refresh" - :aria-label="'<?php echo esc_js(__('Menge', 'wpsg')); ?>'" - /> - <button type="button" class="sc_stepper_btn" @click="changeAmount(product, 1)" :disabled="busy" :aria-label="'<?php echo esc_js(__('Menge erhöhen', 'wpsg')); ?>'">+</button> </div> - <div class="sc_stepper sc_stepper_fixed" v-else> - <input type="hidden" :name="'wpsg[menge][' + product.index + ']'" :value="product.amount" /> - <span class="sc_stepper_static">{{ product.amount }}</span> + <div class="sc_product_amount"> + + <div class="sc_stepper" v-if="!product.fixed"> + <button type="button" class="sc_stepper_btn" @click="changeAmount(product, -1)" :disabled="busy" :aria-label="'<?php echo esc_js(__('Menge verringern', 'wpsg')); ?>'">−</button> + <input + type="text" + inputmode="numeric" + class="sc_stepper_input" + :name="'wpsg[menge][' + product.index + ']'" + v-model="amounts[product.index]" + @change="refresh" + :aria-label="'<?php echo esc_js(__('Menge', 'wpsg')); ?>'" + /> + <button type="button" class="sc_stepper_btn" @click="changeAmount(product, 1)" :disabled="busy" :aria-label="'<?php echo esc_js(__('Menge erhöhen', 'wpsg')); ?>'">+</button> + </div> + + <div class="sc_stepper sc_stepper_fixed" v-else> + <input type="hidden" :name="'wpsg[menge][' + product.index + ']'" :value="product.amount" /> + <span class="sc_stepper_static">{{ product.amount }}</span> + </div> + + <button type="button" class="sc_remove" @click="removeProduct(product)" :disabled="busy"> + <?php echo esc_html__('Entfernen', 'wpsg'); ?> + </button> + </div> - <button type="button" class="sc_remove" @click="removeProduct(product)" :disabled="busy"> - <?php echo esc_html__('Entfernen', 'wpsg'); ?> - </button> + <div class="sc_product_price"> + <div class="sc_product_price_total">{{ product.price_total }}</div> + <div class="sc_product_price_single" v-if="product.amount !== 1">{{ product.price }} <?php echo esc_html__('je Stück', 'wpsg'); ?></div> + </div> - </div> + <?php /* Eingabefelder der Module (z.B. Produktvariablen) über die volle Breite der Position */ ?> + <div class="sc_product_fields sc_modul_dynamic" v-if="product.fields" v-html="product.fields"></div> - <div class="sc_product_price"> - <div class="sc_product_price_total">{{ product.price_total }}</div> - <div class="sc_product_price_single" v-if="product.amount !== 1">{{ product.price }} <?php echo esc_html__('je Stück', 'wpsg'); ?></div> </div> - <?php /* Eingabefelder der Module (z.B. Produktvariablen) über die volle Breite der Position */ ?> - <div class="sc_product_fields sc_modul_dynamic" v-if="product.fields" v-html="product.fields"></div> - </div> - </div> + <div class="sc_modul_basket sc_modul_dynamic" v-if="state.html.basketAfterProducts" v-html="state.html.basketAfterProducts"></div> - <div class="sc_modul_basket sc_modul_dynamic" v-if="state.html.basketAfterProducts" v-html="state.html.basketAfterProducts"></div> - - <?php if ($this->hasMod('wpsg_mod_gutschein')) { ?> - <div class="sc_voucher"> - - <label class="sc_voucher_label" for="wpsg_smartcheckout_voucher"><?php echo esc_html__('Gutscheincode', 'wpsg'); ?></label> - - <div class="sc_voucher_row"> - <input - type="text" - id="wpsg_smartcheckout_voucher" - class="sc_voucher_input" - :class="{ 'sc_invalid': voucherError }" - name="wpsg[gutschein]" - v-model="voucher" - @keydown.enter.prevent="addVoucher" - /> - <button type="button" class="sc_button sc_button_secondary" @click="addVoucher" :disabled="busy || voucher === ''"> - <?php echo esc_html__('Einlösen', 'wpsg'); ?> - </button> - </div> + <?php if ($this->hasMod('wpsg_mod_gutschein')) { ?> + <div class="sc_voucher"> + + <label class="sc_voucher_label" for="wpsg_smartcheckout_voucher"><?php echo esc_html__('Gutscheincode', 'wpsg'); ?></label> - <div class="sc_voucher_list" v-if="state.hasVouchers"> - <div class="sc_voucher_item" v-for="item in state.vouchers" :key="item.id"> - <span class="sc_voucher_code"><template v-if="item.coupon"><?php echo esc_html__('Wertgutschein', 'wpsg'); ?> </template>{{ item.code }}</span> - <span class="sc_voucher_partial" v-if="item.partial"><?php echo esc_html__('teilweise angerechnet', 'wpsg'); ?></span> - <span class="sc_voucher_value">{{ item.value }}</span> - <button type="button" class="sc_remove" @click="removeVoucher(item)" :disabled="busy"><?php echo esc_html__('Entfernen', 'wpsg'); ?></button> + <div class="sc_voucher_row"> + <input + type="text" + id="wpsg_smartcheckout_voucher" + class="sc_voucher_input" + :class="{ 'sc_invalid': voucherError }" + name="wpsg[gutschein]" + v-model="voucher" + @keydown.enter.prevent="addVoucher" + /> + <button type="button" class="sc_button sc_button_secondary" @click="addVoucher" :disabled="busy || voucher === ''"> + <?php echo esc_html__('Einlösen', 'wpsg'); ?> + </button> </div> + + <div class="sc_voucher_list" v-if="state.hasVouchers"> + <div class="sc_voucher_item" v-for="item in state.vouchers" :key="item.id"> + <span class="sc_voucher_code"><template v-if="item.coupon"><?php echo esc_html__('Wertgutschein', 'wpsg'); ?> </template>{{ item.code }}</span> + <span class="sc_voucher_partial" v-if="item.partial"><?php echo esc_html__('teilweise angerechnet', 'wpsg'); ?></span> + <span class="sc_voucher_value">{{ item.value }}</span> + <button type="button" class="sc_remove" @click="removeVoucher(item)" :disabled="busy"><?php echo esc_html__('Entfernen', 'wpsg'); ?></button> + </div> + </div> + </div> + <?php } ?> - </div> - <?php } ?> + </section> - </section> + <?php /* Schritt 2: Kundendaten */ ?> + <section class="sc_box" aria-labelledby="sc_title_customer"> + <h2 class="sc_title" id="sc_title_customer"><span class="sc_step">2</span><?php echo esc_html__('Ihre Daten', 'wpsg'); ?></h2> - <?php /* Schritt 2: Kundendaten */ ?> - <section class="sc_box" aria-labelledby="sc_title_customer"> - <h2 class="sc_title" id="sc_title_customer"><span class="sc_step">2</span><?php echo esc_html__('Ihre Daten', 'wpsg'); ?></h2> + <?php /* Login und Registrierung der Kundenverwaltung, serverseitig gerendert */ ?> + <div class="sc_modul_login" v-pre> + <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?> + </div> - <?php /* Login und Registrierung der Kundenverwaltung, serverseitig gerendert */ ?> - <div class="sc_modul_login" v-pre> - <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?> - </div> + <div class="sc_fields"> - <div class="sc_fields"> - - <div - class="sc_field" - v-for="field in state.fields" - :key="field.name" - :class="['sc_field_' + field.width, { 'sc_invalid': hasError(field.name) }]" - > - - <label class="sc_label" :for="'wpsg_sc_' + field.name"> - {{ field.label }}<span class="sc_required" v-if="field.required" aria-hidden="true">*</span> - </label> - - <select - v-if="field.type === 'select'" - class="sc_input" - :id="'wpsg_sc_' + field.name" - :name="fieldName(field)" - :required="field.required" - v-model="form[field.name]" - @change="refresh" + <div + class="sc_field" + v-for="field in state.fields" + :key="field.name" + :class="['sc_field_' + field.width, { 'sc_invalid': hasError(field.name) }]" > - <option value="-1"><?php echo esc_html__('Bitte auswählen', 'wpsg'); ?></option> - <option v-for="option in field.options" :key="option.value" :value="option.value">{{ option.label }}</option> - </select> - <template v-else-if="field.type === 'checkbox'"> - <input type="hidden" :name="fieldName(field)" value="0" /> + <label class="sc_label" :for="'wpsg_sc_' + field.name"> + {{ field.label }}<span class="sc_required" v-if="field.required" aria-hidden="true">*</span> + </label> + + <select + v-if="field.type === 'select'" + class="sc_input" + :id="'wpsg_sc_' + field.name" + :name="fieldName(field)" + :required="field.required" + v-model="form[field.name]" + @change="refresh" + > + <option value="-1"><?php echo esc_html__('Bitte auswählen', 'wpsg'); ?></option> + <option v-for="option in field.options" :key="option.value" :value="option.value">{{ option.label }}</option> + </select> + + <template v-else-if="field.type === 'checkbox'"> + <input type="hidden" :name="fieldName(field)" value="0" /> + <input + type="checkbox" + class="sc_checkbox" + :id="'wpsg_sc_' + field.name" + :name="fieldName(field)" + value="1" + :required="field.required" + v-model="form[field.name]" + true-value="1" + false-value="0" + @change="refresh" + /> + </template> + <input - type="checkbox" - class="sc_checkbox" + v-else + class="sc_input" + :type="field.type" :id="'wpsg_sc_' + field.name" :name="fieldName(field)" - value="1" :required="field.required" + :autocomplete="field.autocomplete || 'off'" v-model="form[field.name]" - true-value="1" - false-value="0" @change="refresh" + @paste="field.nopaste ? $event.preventDefault() : null" /> - </template> - - <input - v-else - class="sc_input" - :type="field.type" - :id="'wpsg_sc_' + field.name" - :name="fieldName(field)" - :required="field.required" - :autocomplete="field.autocomplete || 'off'" - v-model="form[field.name]" - @change="refresh" - @paste="field.nopaste ? $event.preventDefault() : null" - /> + + </div> </div> - </div> + <?php /* Erweiterungen der Module innerhalb der Kundendaten */ ?> + <div class="sc_modul_customer" v-pre> + <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); ?> + <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); ?> + <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); ?> + <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_newsletter', 'checkout_customer_inner'); ?> + </div> - <?php /* Erweiterungen der Module innerhalb der Kundendaten */ ?> - <div class="sc_modul_customer" v-pre> - <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); ?> - <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); ?> - <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); ?> - <?php echo \wpsgSmartcheckout\State::renderMod('wpsg_mod_newsletter', 'checkout_customer_inner'); ?> - </div> + <div class="sc_hint"> + <?php echo wpsg_translate(__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="sc_required">*</span>'); ?> + </div> - <div class="sc_hint"> - <?php echo wpsg_translate(__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="sc_required">*</span>'); ?> - </div> + </section> - </section> + <?php /* Abweichende Lieferanschrift und weitere Module vor dem Abschluss */ ?> + <?php $strPreButton = \wpsgSmartcheckout\State::renderHook('checkout_inner_prebutton', [&$this->view]); ?> + <?php if (trim($strPreButton) !== '') { ?> + <section class="sc_box sc_modul_extra" v-pre> + <?php echo $strPreButton; ?> + </section> + <?php } ?> - <?php /* Abweichende Lieferanschrift und weitere Module vor dem Abschluss */ ?> - <?php $strPreButton = \wpsgSmartcheckout\State::renderHook('checkout_inner_prebutton', [&$this->view]); ?> - <?php if (trim($strPreButton) !== '') { ?> - <section class="sc_box sc_modul_extra" v-pre> - <?php echo $strPreButton; ?> - </section> - <?php } ?> + <?php /* Blöcke der Module, die sich mit jeder Antwort ändern (z.B. Bestellupload) */ ?> + <section class="sc_box sc_modul_upload sc_modul_dynamic" v-if="state.html.checkoutDynamic" v-html="state.html.checkoutDynamic"></section> - <?php /* Blöcke der Module, die sich mit jeder Antwort ändern (z.B. Bestellupload) */ ?> - <section class="sc_box sc_modul_upload sc_modul_dynamic" v-if="state.html.checkoutDynamic" v-html="state.html.checkoutDynamic"></section> + <?php /* Schritt 3: Versandart */ ?> + <section class="sc_box" v-if="state.shipping.show" aria-labelledby="sc_title_shipping"> + <h2 class="sc_title" id="sc_title_shipping"><span class="sc_step">3</span><?php echo esc_html__('Versandart', 'wpsg'); ?></h2> - <?php /* Schritt 3: Versandart */ ?> - <section class="sc_box" v-if="state.shipping.show" aria-labelledby="sc_title_shipping"> - <h2 class="sc_title" id="sc_title_shipping"><span class="sc_step">3</span><?php echo esc_html__('Versandart', 'wpsg'); ?></h2> + <div class="sc_choices" :class="{ 'sc_invalid': hasError('shipping') }"> - <div class="sc_choices" :class="{ 'sc_invalid': hasError('shipping') }"> + <?php /* Das label umfasst nur die Kopfzeile, Hinweise der Module können eigene Eingabefelder enthalten */ ?> + <div class="sc_choice" v-for="item in state.shipping.list" :key="item.id" :class="{ 'sc_choice_active': form.shipping === item.id }" @click="selectChoice('shipping', item.id, $event)"> - <?php /* Das label umfasst nur die Kopfzeile, Hinweise der Module können eigene Eingabefelder enthalten */ ?> - <div class="sc_choice" v-for="item in state.shipping.list" :key="item.id" :class="{ 'sc_choice_active': form.shipping === item.id }" @click="selectChoice('shipping', item.id, $event)"> + <?php /* Radio, Logo und Bezeichnung auf einer Zeile, die Beschreibung darunter */ ?> + <label class="sc_choice_head"> + <input type="radio" name="wpsg[checkout][shipping]" :value="item.id" v-model="form.shipping" @change="refresh" /> + <img class="sc_choice_logo" v-if="item.logo" :src="item.logo" :alt="item.name" /> + <span class="sc_choice_name">{{ item.name }}</span> + <span class="sc_choice_price" v-if="item.price">{{ item.price }}</span> + </label> + <div class="sc_choice_hint" v-if="item.hint" v-html="item.hint"></div> - <?php /* Radio, Logo und Bezeichnung auf einer Zeile, die Beschreibung darunter */ ?> - <label class="sc_choice_head"> - <input type="radio" name="wpsg[checkout][shipping]" :value="item.id" v-model="form.shipping" @change="refresh" /> - <img class="sc_choice_logo" v-if="item.logo" :src="item.logo" :alt="item.name" /> - <span class="sc_choice_name">{{ item.name }}</span> - <span class="sc_choice_price" v-if="item.price">{{ item.price }}</span> - </label> - <div class="sc_choice_hint" v-if="item.hint" v-html="item.hint"></div> + </div> </div> - </div> + </section> - </section> + <?php /* Schritt 4: Zahlungsart */ ?> + <section class="sc_box" v-if="state.payment.show" aria-labelledby="sc_title_payment"> + <h2 class="sc_title" id="sc_title_payment"><span class="sc_step">4</span><?php echo esc_html__('Zahlungsart', 'wpsg'); ?></h2> - <?php /* Schritt 4: Zahlungsart */ ?> - <section class="sc_box" v-if="state.payment.show" aria-labelledby="sc_title_payment"> - <h2 class="sc_title" id="sc_title_payment"><span class="sc_step">4</span><?php echo esc_html__('Zahlungsart', 'wpsg'); ?></h2> + <div class="sc_choices" :class="{ 'sc_invalid': hasError('payment') }"> - <div class="sc_choices" :class="{ 'sc_invalid': hasError('payment') }"> + <?php /* Das label umfasst nur die Kopfzeile, Hinweise der Module können eigene Eingabefelder enthalten (z.B. Kreditkarte) */ ?> + <div class="sc_choice" v-for="item in state.payment.list" :key="item.id" :class="{ 'sc_choice_active': form.payment === item.id }" @click="selectChoice('payment', item.id, $event)"> - <?php /* Das label umfasst nur die Kopfzeile, Hinweise der Module können eigene Eingabefelder enthalten (z.B. Kreditkarte) */ ?> - <div class="sc_choice" v-for="item in state.payment.list" :key="item.id" :class="{ 'sc_choice_active': form.payment === item.id }" @click="selectChoice('payment', item.id, $event)"> + <?php /* Radio, Logo und Bezeichnung auf einer Zeile, Beschreibung und Zusatzangaben darunter */ ?> + <label class="sc_choice_head"> + <input type="radio" name="wpsg[checkout][payment]" :value="item.id" v-model="form.payment" @change="refresh" /> + <img class="sc_choice_logo" v-if="item.logo" :src="item.logo" :alt="item.name" /> + <span class="sc_choice_name">{{ item.name }}</span> + <span class="sc_choice_price" v-if="item.price">{{ item.price }}</span> + </label> + <div class="sc_choice_hint" v-if="item.hint" v-html="item.hint"></div> + <div class="sc_choice_extra" v-if="item.extra" v-html="item.extra"></div> - <?php /* Radio, Logo und Bezeichnung auf einer Zeile, Beschreibung und Zusatzangaben darunter */ ?> - <label class="sc_choice_head"> - <input type="radio" name="wpsg[checkout][payment]" :value="item.id" v-model="form.payment" @change="refresh" /> - <img class="sc_choice_logo" v-if="item.logo" :src="item.logo" :alt="item.name" /> - <span class="sc_choice_name">{{ item.name }}</span> - <span class="sc_choice_price" v-if="item.price">{{ item.price }}</span> - </label> - <div class="sc_choice_hint" v-if="item.hint" v-html="item.hint"></div> - <div class="sc_choice_extra" v-if="item.extra" v-html="item.extra"></div> + </div> </div> - </div> + <?php /* Zahlungsmodule, die eigene Eingabefelder mitbringen */ ?> + <div class="sc_modul_payment sc_modul_dynamic" v-if="state.html.paymentInner" v-html="state.html.paymentInner"></div> - <?php /* Zahlungsmodule, die eigene Eingabefelder mitbringen */ ?> - <div class="sc_modul_payment sc_modul_dynamic" v-if="state.html.paymentInner" v-html="state.html.paymentInner"></div> + </section> - </section> + <?php /* Bestellkommentar */ ?> + <section class="sc_box" aria-labelledby="sc_title_comment"> + <h2 class="sc_title" id="sc_title_comment"><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></h2> - <?php /* Bestellkommentar */ ?> - <section class="sc_box" aria-labelledby="sc_title_comment"> - <h2 class="sc_title" id="sc_title_comment"><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></h2> + <label class="sc_label sc_label_hidden" for="wpsg_sc_comment"><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></label> + <textarea class="sc_textarea" id="wpsg_sc_comment" name="wpsg[checkout][comment]" rows="4" v-model="form.comment"></textarea> - <label class="sc_label sc_label_hidden" for="wpsg_sc_comment"><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></label> - <textarea class="sc_textarea" id="wpsg_sc_comment" name="wpsg[checkout][comment]" rows="4" v-model="form.comment"></textarea> + </section> - </section> + </fieldset> </div> @@ -318,6 +331,14 @@ <h2 class="sc_title" id="sc_title_sum"><?php echo esc_html__('Zusammenfassung', 'wpsg'); ?></h2> + <?php /* Positionen in Kurzform, damit Ware, Menge und Preis unmittelbar über dem Bestellbutton stehen (§ 312j Abs. 2 BGB) */ ?> + <div class="sc_sum_products"> + <div class="sc_sum_product" v-for="product in state.products" :key="product.index"> + <span class="sc_sum_product_name">{{ product.amount }} × {{ product.name }}</span> + <span class="sc_sum_product_price">{{ product.price_total }}</span> + </div> + </div> + <div class="sc_sum_rows"> <div class="sc_sum_row"> @@ -397,11 +418,11 @@ <div class="sc_modul_conditions sc_modul_dynamic" :class="{ 'sc_invalid': state.errorConditions }" - v-if="state.html.conditions" + v-if="state.html.conditions && showFinal" v-html="state.html.conditions" ></div> - <div class="sc_agb" v-if="state.needAGB" :class="{ 'sc_invalid': hasError('agb') }"> + <div class="sc_agb" v-if="state.needAGB && showFinal" :class="{ 'sc_invalid': hasError('agb') }"> <label> <input type="checkbox" name="wpsg[agb]" value="1" v-model="agb" required /> <span><?php @@ -415,14 +436,35 @@ </div> <?php /* GARAN-Gewährleistungslabel direkt vor dem Bestellbutton */ ?> - <div class="sc_garan" v-if="state.warranty && state.warranty.need && !state.warranty.popup"> + <div class="sc_garan" v-if="state.warranty && state.warranty.need && !state.warranty.popup && showFinal"> <button type="button" class="sc_garan_zoom" @click="garanLightbox = true" title="<?php echo esc_attr__('Gewährleistungslabel vergrößern', 'wpsg'); ?>"> - <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" /> + <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" width="1200" height="1697" /> </button> </div> + <?php /* Bestellabschluss „Zusammenfassung anzeigen“: Prüfen und weiter zur klassischen Zusammenfassung, dort wird bestellt */ ?> + <button + v-if="state.finish === 'overview'" + type="submit" + class="sc_button sc_button_order" + name="wpsg_smartcheckout_order" + value="1" + :disabled="busy" + ><?php echo esc_html__('Weiter zur Zusammenfassung', 'wpsg'); ?></button> + + <?php /* Bestellabschluss „Zusammenfassung vor Abschluss“: Prüfen und Eingaben für den Bestätigungsschritt sperren */ ?> + <button + v-if="state.canOrder && state.finish === 'confirm' && !confirm" + type="button" + class="sc_button sc_button_order" + @click="startConfirm" + :disabled="busy" + ><?php echo esc_html__('Weiter', 'wpsg'); ?></button> + + <input v-if="confirm" type="hidden" name="wpsg_smartcheckout_confirmed" value="1" /> + <button - v-if="state.canOrder" + v-if="state.canOrder && showFinal && state.finish !== 'overview'" type="submit" class="sc_button sc_button_order" name="wpsg_smartcheckout_order" @@ -434,6 +476,8 @@ <template v-else><?php echo esc_html__('zahlungspflichtig bestellen', 'wpsg'); ?></template> </button> + <button v-if="confirm" type="button" class="sc_button sc_button_secondary sc_button_edit" @click="editConfirm" :disabled="busy"><?php echo esc_html__('Angaben ändern', 'wpsg'); ?></button> + <div class="sc_sum_hint"> <?php echo wpsg_translate(__('Es gelten die Preise inklusive der gesetzlichen MwSt. zuzüglich #1#.', 'wpsg'), '<a target="_blank" rel="noopener" href="'.esc_url($state['url']['shipping']).'">'.esc_html__('Versandkosten', 'wpsg').'</a>'); ?> </div> @@ -461,7 +505,7 @@ <div class="sc_garan_popup sc_garan_lightbox" v-if="garanLightbox" role="dialog" aria-modal="true" @click.self="garanLightbox = false"> <div class="sc_garan_popup_inner"> <div class="sc_garan_popup_image"> - <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" /> + <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" width="1200" height="1697" /> </div> <button type="button" class="sc_button" @click="garanLightbox = false"><?php echo esc_html__('Schließen', 'wpsg'); ?></button> </div> @@ -471,7 +515,7 @@ <div class="sc_garan_popup" v-if="garanPopup" role="dialog" aria-modal="true"> <div class="sc_garan_popup_inner"> <div class="sc_garan_popup_image"> - <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" /> + <img :src="state.warranty.image" alt="<?php echo esc_attr__('GARAN Gewährleistungslabel', 'wpsg'); ?>" width="1200" height="1697" /> </div> <button type="button" class="sc_button sc_button_order" @click="confirmGaran"><?php echo esc_html__('Zur Kenntnis genommen', 'wpsg'); ?></button> </div> diff --git a/views/mods/mod_smartcheckout/product_suggestions.phtml b/views/mods/mod_smartcheckout/product_suggestions.phtml index 78acea5..10356e2 100644 --- a/views/mods/mod_smartcheckout/product_suggestions.phtml +++ b/views/mods/mod_smartcheckout/product_suggestions.phtml @@ -6,6 +6,7 @@ * Das Mengenfeld hat bewusst keinen Namen: es wird bei den Aktualisierungen des Checkouts nicht * mitgeschickt. Erst der Button überträgt die Menge unter <send_name>[<ID>] (siehe onModuleClick in * smartcheckout.js). Befüllt über \wpsgSmartcheckout\State::renderSuggestions(). + * @version 4.6.1 */ $view = $this->view['wpsg_smartcheckout_suggestions']; diff --git a/views/mods/mod_smartcheckout/settings_edit.phtml b/views/mods/mod_smartcheckout/settings_edit.phtml index 06d00ac..46e43d8 100644 --- a/views/mods/mod_smartcheckout/settings_edit.phtml +++ b/views/mods/mod_smartcheckout/settings_edit.phtml @@ -2,6 +2,7 @@ /** * Einstellungen des modernen EinSeitenCheckouts + * @version 4.6.1 */ $arLayout = [ @@ -9,17 +10,26 @@ '1' => __('Einspaltig', 'wpsg') ]; + // Reihenfolge wie im Bestellablauf: mit eigener Zusammenfassung zuerst + $arFinish = [ + wpsg_mod_smartcheckout::FINISH_OVERVIEW => __('Zusammenfassung anzeigen', 'wpsg'), + wpsg_mod_smartcheckout::FINISH_CONFIRM => __('Zusammenfassung vor Abschluss', 'wpsg'), + wpsg_mod_smartcheckout::FINISH_DIRECT => __('Direkt abschließen', 'wpsg') + ]; + ?> <?php echo wpsg_drawForm_Select('wpsg_mod_smartcheckout_page', __('Seite für den SmartCheckout', 'wpsg'), $this->view['arPages'], $this->get_option('wpsg_mod_smartcheckout_page'), ['hint' => __('Wählen Sie „Neu anlegen und zuordnen", damit beim Speichern automatisch eine eigene Seite erstellt wird — oder ordnen Sie eine bestehende Seite zu. Der Checkout wird automatisch in diese Seite eingebunden.', 'wpsg')]); ?> <?php echo wpsg_drawForm_Select('wpsg_mod_smartcheckout_layout', __('Aufteilung', 'wpsg'), $arLayout, $this->get_option('wpsg_mod_smartcheckout_layout'), ['hint' => __('Zweispaltig: Eingaben links, Zusammenfassung rechts mitlaufend. Einspaltig: Zusammenfassung unterhalb der Eingaben.', 'wpsg')]); ?> +<?php echo wpsg_drawForm_Select('wpsg_mod_smartcheckout_finish', __('Bestellabschluss', 'wpsg'), $arFinish, $this->get_option('wpsg_mod_smartcheckout_finish'), ['hint' => __('Zusammenfassung anzeigen: „Weiter zur Zusammenfassung“ führt auf die gesonderte Bestellübersicht, dort wird zahlungspflichtig bestellt. Zusammenfassung vor Abschluss: „Weiter“ prüft die Angaben und sperrt alle Felder, der Button wechselt auf „zahlungspflichtig bestellen“, mit „Angaben ändern“ lassen sich die Felder wieder bearbeiten. Direkt abschließen: Der Kunde bestellt direkt im SmartCheckout.', 'wpsg')]); ?> + <?php echo wpsg_drawForm_Checkbox('wpsg_mod_smartcheckout_image', __('Produktbilder im Warenkorb anzeigen', 'wpsg'), $this->get_option('wpsg_mod_smartcheckout_image')); ?> <p class="wpsg_note"> - <?php echo __('Solange das Modul aktiv ist, wird die Warenkorbseite auf den SmartCheckout umgeleitet — der klassische Ablauf (Warenkorb, Kasse, Versand/Zahlung, Zusammenfassung) wird nicht mehr angesteuert.', 'wpsg'); ?> + <?php echo esc_html__('Solange das Modul aktiv ist, wird die Warenkorbseite auf den SmartCheckout umgeleitet — der klassische Ablauf (Warenkorb, Kasse, Versand/Zahlung) wird nicht mehr angesteuert. Die klassische Zusammenfassung erscheint nur beim Bestellabschluss „Zusammenfassung anzeigen“.', 'wpsg'); ?> </p> <p class="wpsg_note"> - <?php echo __('Der SmartCheckout rechnet ausschließlich serverseitig — jede Änderung an Menge, Anschrift, Versand- oder Zahlungsart wird an den Shop geschickt und mit der regulären Kalkulation neu berechnet.', 'wpsg'); ?> + <?php echo esc_html__('Der SmartCheckout rechnet ausschließlich serverseitig — jede Änderung an Menge, Anschrift, Versand- oder Zahlungsart wird an den Shop geschickt und mit der regulären Kalkulation neu berechnet.', 'wpsg'); ?> </p> diff --git a/views/mods/mod_spconditions/conditionList.phtml b/views/mods/mod_spconditions/conditionList.phtml index f868169..36bc208 100644 --- a/views/mods/mod_spconditions/conditionList.phtml +++ b/views/mods/mod_spconditions/conditionList.phtml @@ -2,6 +2,7 @@ /**
* Zeichnet die Liste der bereits definierten Versand- und Zahlungsbedingunen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_spconditions/settings_edit.phtml b/views/mods/mod_spconditions/settings_edit.phtml index b256e2f..c284e34 100644 --- a/views/mods/mod_spconditions/settings_edit.phtml +++ b/views/mods/mod_spconditions/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für das Modul "Versand- und Zahlungsbedingungen"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_statistics/admin_setcapabilities.phtml b/views/mods/mod_statistics/admin_setcapabilities.phtml index a015b7e..19f1b99 100644 --- a/views/mods/mod_statistics/admin_setcapabilities.phtml +++ b/views/mods/mod_statistics/admin_setcapabilities.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration in die Verwaltung der Berechtigungen
+ * @version 4.6.1
*/
global $wpdb; $arRoles = get_option($wpdb->prefix."user_roles");
diff --git a/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml b/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml index 9b5fe3a..f0f9fce 100644 --- a/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml +++ b/views/mods/mod_statistics/chartsalestopaymentmethod/all.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php if (wpsg_isSizedArray($this->view['chart']['data']['records'])) { ?>
diff --git a/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml b/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml index f65ad5a..6494ea2 100644 --- a/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml +++ b/views/mods/mod_statistics/chartsalestopaymentmethod/data.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<table style="width:auto !important;" class="widefat fixed tags" border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
diff --git a/views/mods/mod_statistics/charttopsellertosales/all.phtml b/views/mods/mod_statistics/charttopsellertosales/all.phtml index 6544b94..c3bc770 100644 --- a/views/mods/mod_statistics/charttopsellertosales/all.phtml +++ b/views/mods/mod_statistics/charttopsellertosales/all.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php if (wpsg_isSizedArray($this->view['chart']['data']['records'])) { ?>
diff --git a/views/mods/mod_statistics/charttopsellertosales/data.phtml b/views/mods/mod_statistics/charttopsellertosales/data.phtml index b13119b..37bac44 100644 --- a/views/mods/mod_statistics/charttopsellertosales/data.phtml +++ b/views/mods/mod_statistics/charttopsellertosales/data.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<table style="width:auto !important;" class="widefat fixed tags" border="0" cellspacing="0" cellpadding="0">
<thead>
<tr>
diff --git a/views/mods/mod_statistics/chartturnover/all.phtml b/views/mods/mod_statistics/chartturnover/all.phtml index ead62fd..9896563 100644 --- a/views/mods/mod_statistics/chartturnover/all.phtml +++ b/views/mods/mod_statistics/chartturnover/all.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnover/customrange.phtml b/views/mods/mod_statistics/chartturnover/customrange.phtml index 3f046ae..5d20de0 100644 --- a/views/mods/mod_statistics/chartturnover/customrange.phtml +++ b/views/mods/mod_statistics/chartturnover/customrange.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnover/data.phtml b/views/mods/mod_statistics/chartturnover/data.phtml index 7d5e89c..5e540d0 100644 --- a/views/mods/mod_statistics/chartturnover/data.phtml +++ b/views/mods/mod_statistics/chartturnover/data.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php foreach ($this->view['chart']['data'] as $index => $data) { ?>
<?php if (is_numeric($index)) { ?>
<div class="wpsg-table-data-wrapper">
diff --git a/views/mods/mod_statistics/chartturnover/day.phtml b/views/mods/mod_statistics/chartturnover/day.phtml index a7b5751..2fdf534 100644 --- a/views/mods/mod_statistics/chartturnover/day.phtml +++ b/views/mods/mod_statistics/chartturnover/day.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnover/month.phtml b/views/mods/mod_statistics/chartturnover/month.phtml index d6a9bda..14ade40 100644 --- a/views/mods/mod_statistics/chartturnover/month.phtml +++ b/views/mods/mod_statistics/chartturnover/month.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnover/quarter.phtml b/views/mods/mod_statistics/chartturnover/quarter.phtml index 4e40783..a39ac96 100644 --- a/views/mods/mod_statistics/chartturnover/quarter.phtml +++ b/views/mods/mod_statistics/chartturnover/quarter.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<br /><br />
diff --git a/views/mods/mod_statistics/chartturnover/week.phtml b/views/mods/mod_statistics/chartturnover/week.phtml index 9777326..d37454c 100644 --- a/views/mods/mod_statistics/chartturnover/week.phtml +++ b/views/mods/mod_statistics/chartturnover/week.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnover/year.phtml b/views/mods/mod_statistics/chartturnover/year.phtml index 319cc9d..abf5917 100644 --- a/views/mods/mod_statistics/chartturnover/year.phtml +++ b/views/mods/mod_statistics/chartturnover/year.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnoverperhour/all.phtml b/views/mods/mod_statistics/chartturnoverperhour/all.phtml index 30e1499..9fabdf9 100644 --- a/views/mods/mod_statistics/chartturnoverperhour/all.phtml +++ b/views/mods/mod_statistics/chartturnoverperhour/all.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php $this->render(WPSG_PATH_VIEW.'/mods/mod_statistics/simplefilter.phtml'); ?>
<?php
diff --git a/views/mods/mod_statistics/chartturnoverperhour/data.phtml b/views/mods/mod_statistics/chartturnoverperhour/data.phtml index 3e98ee4..2161e96 100644 --- a/views/mods/mod_statistics/chartturnoverperhour/data.phtml +++ b/views/mods/mod_statistics/chartturnoverperhour/data.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<?php foreach ($this->view['chart']['data'] as $index => $data) { ?>
<?php if (is_numeric($index)) { ?>
<div class="wpsg-table-data-wrapper">
diff --git a/views/mods/mod_statistics/customermap/all.phtml b/views/mods/mod_statistics/customermap/all.phtml index 20adb05..fc58cb4 100644 --- a/views/mods/mod_statistics/customermap/all.phtml +++ b/views/mods/mod_statistics/customermap/all.phtml @@ -2,6 +2,7 @@ /**
* Template f�r die Anzeige der Kundenkarte innerhalb des Statistikmoduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_statistics/produkt_edit_sidebar.phtml b/views/mods/mod_statistics/produkt_edit_sidebar.phtml index d85587a..e7c7d7c 100644 --- a/views/mods/mod_statistics/produkt_edit_sidebar.phtml +++ b/views/mods/mod_statistics/produkt_edit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen der Statistik innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
@@ -98,7 +99,8 @@ jQuery.ajax( {
url: '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_statistics', 'aktualisieren'); ?>',
data: {
- 'edit_id': <?php echo $_REQUEST['edit_id']?>,
+ 'edit_id': <?php echo intval($_REQUEST['edit_id']); ?>,
+ 'wpsg_nonce': '<?php echo esc_js(wp_create_nonce('wpsg-mod-statistics')); ?>',
'von': jQuery('#st_von').val(),
'bis': jQuery('#st_bis').val(),
},
@@ -113,7 +115,8 @@ jQuery('#st_export').bind('click', function(){
location.href = '<?php echo $this->getUrl(wpsg_ShopController::URL_BASKET, 'wpsg_mod_statistics', 'export', array(
- 'edit_id' => $_REQUEST['edit_id']
+ 'edit_id' => intval($_REQUEST['edit_id']),
+ 'wpsg_nonce' => wp_create_nonce('wpsg-mod-statistics')
)); ?>&von=' + jQuery('#st_von').val() + '&bis=' + jQuery('#st_bis').val();
});
diff --git a/views/mods/mod_statistics/settings_edit.phtml b/views/mods/mod_statistics/settings_edit.phtml index 2b1e23b..245ab4d 100644 --- a/views/mods/mod_statistics/settings_edit.phtml +++ b/views/mods/mod_statistics/settings_edit.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<br/>
<div id="wpsg_tab">
diff --git a/views/mods/mod_statistics/simplefilter.phtml b/views/mods/mod_statistics/simplefilter.phtml index 9623431..52d6872 100644 --- a/views/mods/mod_statistics/simplefilter.phtml +++ b/views/mods/mod_statistics/simplefilter.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
?>
diff --git a/views/mods/mod_statistics/statisticProduct.phtml b/views/mods/mod_statistics/statisticProduct.phtml index e9ca64b..661305b 100644 --- a/views/mods/mod_statistics/statisticProduct.phtml +++ b/views/mods/mod_statistics/statisticProduct.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der Produktstatistik innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_statistics/statistics.phtml b/views/mods/mod_statistics/statistics.phtml index 5883dfe..337163d 100644 --- a/views/mods/mod_statistics/statistics.phtml +++ b/views/mods/mod_statistics/statistics.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<!-- Root-Template für Statistikdaten -->
<script type="text/javascript">
diff --git a/views/mods/mod_statistics/totals.phtml b/views/mods/mod_statistics/totals.phtml index 9faa879..8883ecb 100644 --- a/views/mods/mod_statistics/totals.phtml +++ b/views/mods/mod_statistics/totals.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<!-- Dashboard Widget -->
<div id="<?php echo $this->view['modul_name']; ?>_totals">
diff --git a/views/mods/mod_stock/product_addedit_content.phtml b/views/mods/mod_stock/product_addedit_content.phtml index e48ed6f..1806e73 100644 --- a/views/mods/mod_stock/product_addedit_content.phtml +++ b/views/mods/mod_stock/product_addedit_content.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Lagerbestandes in die Produktverwaltung
+ * @version 4.6.1
*/
/** @var wpsg_product $oProduct */
diff --git a/views/mods/mod_stock/settings_edit.phtml b/views/mods/mod_stock/settings_edit.phtml index 38618e2..e135262 100644 --- a/views/mods/mod_stock/settings_edit.phtml +++ b/views/mods/mod_stock/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Lagerbestandsmoduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_stock/stockmail.phtml b/views/mods/mod_stock/stockmail.phtml index ff6863a..3bbaac3 100644 --- a/views/mods/mod_stock/stockmail.phtml +++ b/views/mods/mod_stock/stockmail.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird für die HTML Mail beim Erreichen des Mindestlagerbestandes eines Produktes verwendet
+ * @version 4.6.1
*/
$this->htmlMail = false;
diff --git a/views/mods/mod_stock/stockmail_html.phtml b/views/mods/mod_stock/stockmail_html.phtml index 0a3c19d..baa62ef 100644 --- a/views/mods/mod_stock/stockmail_html.phtml +++ b/views/mods/mod_stock/stockmail_html.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird für die HTML Mail beim Erreichen des Mindestlagerbestandes eines Produktes verwendet
+ * @version 4.6.1
*/
$this->htmlMail = true;
diff --git a/views/mods/mod_su/order_done.phtml b/views/mods/mod_su/order_done.phtml index 0f6f15e..1241db6 100644 --- a/views/mods/mod_su/order_done.phtml +++ b/views/mods/mod_su/order_done.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template wird nach einer Sofortüberweisungs Zahlung angezeigt
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_su/settings_edit.phtml b/views/mods/mod_su/settings_edit.phtml index 472cf73..8e6264c 100644 --- a/views/mods/mod_su/settings_edit.phtml +++ b/views/mods/mod_su/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "Sofortüberweisung"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_surfaceproduct/basket_row.phtml b/views/mods/mod_surfaceproduct/basket_row.phtml index d99a0b5..7277fb1 100644 --- a/views/mods/mod_surfaceproduct/basket_row.phtml +++ b/views/mods/mod_surfaceproduct/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der FlächenProdukte im Warenkorb
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_surfaceproduct/mail_row.html.phtml b/views/mods/mod_surfaceproduct/mail_row.html.phtml index a0f5963..47cdda6 100644 --- a/views/mods/mod_surfaceproduct/mail_row.html.phtml +++ b/views/mods/mod_surfaceproduct/mail_row.html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Intergration der FlächenProdukt-Daten in die HTML Kunden- und Adminmail
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_surfaceproduct/mail_row.phtml b/views/mods/mod_surfaceproduct/mail_row.phtml index 685c927..20acae6 100644 --- a/views/mods/mod_surfaceproduct/mail_row.phtml +++ b/views/mods/mod_surfaceproduct/mail_row.phtml @@ -3,6 +3,7 @@ /**
* Template für die Intergration der FlächenProdukt-Daten
*
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_surfaceproduct/overview_row.phtml b/views/mods/mod_surfaceproduct/overview_row.phtml index e2437d5..458b227 100644 --- a/views/mods/mod_surfaceproduct/overview_row.phtml +++ b/views/mods/mod_surfaceproduct/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der FlächenProdukte im Overview
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_surfaceproduct/product.phtml b/views/mods/mod_surfaceproduct/product.phtml index 782a9e4..e8392c5 100644 --- a/views/mods/mod_surfaceproduct/product.phtml +++ b/views/mods/mod_surfaceproduct/product.phtml @@ -2,6 +2,7 @@ /**
* Template für die Flächenprodukte wird vom Produkttemplate z.B. standard.phtml geladen
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml b/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml index f16034e..e28ff3a 100644 --- a/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml +++ b/views/mods/mod_surfaceproduct/produkt_edit_sidebar.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<php
/**
diff --git a/views/mods/mod_surfaceproduct/settings_edit.phtml b/views/mods/mod_surfaceproduct/settings_edit.phtml index fcab241..f1d49e4 100644 --- a/views/mods/mod_surfaceproduct/settings_edit.phtml +++ b/views/mods/mod_surfaceproduct/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "FlächenProdukt"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_targo/order_done.phtml b/views/mods/mod_targo/order_done.phtml index 14d1eee..9af7a1c 100644 --- a/views/mods/mod_targo/order_done.phtml +++ b/views/mods/mod_targo/order_done.phtml @@ -2,6 +2,7 @@ /** * Dieses Template wird nach einer Targo Zahlung angezeigt + * @version 4.6.1 */ if ($this->get_option('wpsg_mod_targo_url_use') == 0) diff --git a/views/mods/mod_targo/order_view_afterpayment.phtml b/views/mods/mod_targo/order_view_afterpayment.phtml index f403979..60050d5 100644 --- a/views/mods/mod_targo/order_view_afterpayment.phtml +++ b/views/mods/mod_targo/order_view_afterpayment.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Targo Zahlungsart in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_targo/settings_edit.phtml b/views/mods/mod_targo/settings_edit.phtml index 945fa57..066909a 100644 --- a/views/mods/mod_targo/settings_edit.phtml +++ b/views/mods/mod_targo/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Templatedatei für die Einstellungen des Targo Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_ticket/basket_row.phtml b/views/mods/mod_ticket/basket_row.phtml index a04669e..8ccfa26 100755 --- a/views/mods/mod_ticket/basket_row.phtml +++ b/views/mods/mod_ticket/basket_row.phtml @@ -2,6 +2,7 @@ /** * Template für die Integration der Produktvariablen innerhalb des Warenkorbs + * @version 4.6.1 */ namespace wpsgTicket; diff --git a/views/mods/mod_ticket/order_view.phtml b/views/mods/mod_ticket/order_view.phtml index 06a16aa..40e9516 100644 --- a/views/mods/mod_ticket/order_view.phtml +++ b/views/mods/mod_ticket/order_view.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/order_view_row.phtml b/views/mods/mod_ticket/order_view_row.phtml index 961bdcc..cc5215c 100755 --- a/views/mods/mod_ticket/order_view_row.phtml +++ b/views/mods/mod_ticket/order_view_row.phtml @@ -2,6 +2,7 @@ /** * Anzeige des Variantennamens in der Bestellverwaltung + * @version 4.6.1 */ namespace wpsgTicket; diff --git a/views/mods/mod_ticket/product_addedit_content.phtml b/views/mods/mod_ticket/product_addedit_content.phtml index 38798cd..6a3bde8 100644 --- a/views/mods/mod_ticket/product_addedit_content.phtml +++ b/views/mods/mod_ticket/product_addedit_content.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/produkttemplate.phtml b/views/mods/mod_ticket/produkttemplate.phtml index 47d9cbc..7e8e689 100644 --- a/views/mods/mod_ticket/produkttemplate.phtml +++ b/views/mods/mod_ticket/produkttemplate.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/qrScanner.phtml b/views/mods/mod_ticket/qrScanner.phtml index 3b9bd59..c49e383 100644 --- a/views/mods/mod_ticket/qrScanner.phtml +++ b/views/mods/mod_ticket/qrScanner.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/settings_edit.phtml b/views/mods/mod_ticket/settings_edit.phtml index ac1b57f..870212d 100644 --- a/views/mods/mod_ticket/settings_edit.phtml +++ b/views/mods/mod_ticket/settings_edit.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/settings_edit_templates.phtml b/views/mods/mod_ticket/settings_edit_templates.phtml index fe16757..7ab5926 100755 --- a/views/mods/mod_ticket/settings_edit_templates.phtml +++ b/views/mods/mod_ticket/settings_edit_templates.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ namespace wpsgTicket; diff --git a/views/mods/mod_ticket/ticket_mail.phtml b/views/mods/mod_ticket/ticket_mail.phtml index b1a3283..c132e03 100644 --- a/views/mods/mod_ticket/ticket_mail.phtml +++ b/views/mods/mod_ticket/ticket_mail.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_ticket/ticket_mail_html.phtml b/views/mods/mod_ticket/ticket_mail_html.phtml index 183b316..69f7e2a 100644 --- a/views/mods/mod_ticket/ticket_mail_html.phtml +++ b/views/mods/mod_ticket/ticket_mail_html.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/mods/mod_topseller/produkt_addedit_allgemein.phtml b/views/mods/mod_topseller/produkt_addedit_allgemein.phtml index ba2e3c4..1c04e7a 100644 --- a/views/mods/mod_topseller/produkt_addedit_allgemein.phtml +++ b/views/mods/mod_topseller/produkt_addedit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Template für die Konfiguration der Topseller innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_topseller/settings_edit.phtml b/views/mods/mod_topseller/settings_edit.phtml index 56c82a1..f28a179 100644 --- a/views/mods/mod_topseller/settings_edit.phtml +++ b/views/mods/mod_topseller/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des "TopSeller" Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_topseller/topseller.phtml b/views/mods/mod_topseller/topseller.phtml index 47da016..ebea76f 100644 --- a/views/mods/mod_topseller/topseller.phtml +++ b/views/mods/mod_topseller/topseller.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige der TopSeller im Frontend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_topseller/widget_form.phtml b/views/mods/mod_topseller/widget_form.phtml index dbffc81..28e3344 100644 --- a/views/mods/mod_topseller/widget_form.phtml +++ b/views/mods/mod_topseller/widget_form.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des TopSeller Widgets
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/checkout_customer_inner.phtml b/views/mods/mod_trustedshops/checkout_customer_inner.phtml index 3ccf518..de38433 100644 --- a/views/mods/mod_trustedshops/checkout_customer_inner.phtml +++ b/views/mods/mod_trustedshops/checkout_customer_inner.phtml @@ -2,6 +2,7 @@ /**
* Template für die Abfrage ob der Kunde an der Bewertung teilnehmen möchte im Checkout
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/invoicemail.phtml b/views/mods/mod_trustedshops/invoicemail.phtml index 9e2261e..58d82c0 100644 --- a/views/mods/mod_trustedshops/invoicemail.phtml +++ b/views/mods/mod_trustedshops/invoicemail.phtml @@ -2,6 +2,7 @@ /**
* Template für den Trusted Shops Bewertungs Link in der Rechnungs - Email
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/invoicemail_html.phtml b/views/mods/mod_trustedshops/invoicemail_html.phtml index 38235a1..40ae653 100644 --- a/views/mods/mod_trustedshops/invoicemail_html.phtml +++ b/views/mods/mod_trustedshops/invoicemail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für den Trusted Shops Bewertungs Link in der Rechnungs - E-mail (HTML)
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/mail.phtml b/views/mods/mod_trustedshops/mail.phtml index 55894e4..7c39b32 100644 --- a/views/mods/mod_trustedshops/mail.phtml +++ b/views/mods/mod_trustedshops/mail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden, die manuell aus der Bestellansicht versendet werden kann
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_trustedshops/mail_aftercalculation.phtml b/views/mods/mod_trustedshops/mail_aftercalculation.phtml index ed1faa0..5f8fb80 100644 --- a/views/mods/mod_trustedshops/mail_aftercalculation.phtml +++ b/views/mods/mod_trustedshops/mail_aftercalculation.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Bewertungslinkes in die Kundenmail
+ * @version 4.6.1
*/
diff --git a/views/mods/mod_trustedshops/mail_aftercalculation_html.phtml b/views/mods/mod_trustedshops/mail_aftercalculation_html.phtml index f0b0a05..cfadcb8 100644 --- a/views/mods/mod_trustedshops/mail_aftercalculation_html.phtml +++ b/views/mods/mod_trustedshops/mail_aftercalculation_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Bewertungslinkes in die Kundenmail
+ * @version 4.6.1
*/
diff --git a/views/mods/mod_trustedshops/mail_html.phtml b/views/mods/mod_trustedshops/mail_html.phtml index 6d5157c..c3f6577 100644 --- a/views/mods/mod_trustedshops/mail_html.phtml +++ b/views/mods/mod_trustedshops/mail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail an den Kunden, die manuell aus der Bestellansicht versendet werden kann (HTML)
+ * @version 4.6.1
*/
?><p><?php echo wpsg_translate(__('Hallo #1# #2#,', 'wpsg'), $this->view['customer']['vname'], $this->view['customer']['name']); ?></p>
diff --git a/views/mods/mod_trustedshops/order_done.phtml b/views/mods/mod_trustedshops/order_done.phtml index 2651975..ff88ed8 100644 --- a/views/mods/mod_trustedshops/order_done.phtml +++ b/views/mods/mod_trustedshops/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einbindung des Trusted Shops Bewertungs Links nach Bestellabschluss
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/order_view_sidebar.phtml b/views/mods/mod_trustedshops/order_view_sidebar.phtml index 223eb5a..8c5c85d 100644 --- a/views/mods/mod_trustedshops/order_view_sidebar.phtml +++ b/views/mods/mod_trustedshops/order_view_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Trusted Shops Integration in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/settings_edit.phtml b/views/mods/mod_trustedshops/settings_edit.phtml index 1b66130..c8646c9 100644 --- a/views/mods/mod_trustedshops/settings_edit.phtml +++ b/views/mods/mod_trustedshops/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Trusted Shops Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/widget.phtml b/views/mods/mod_trustedshops/widget.phtml index 3cd4f4a..89451e0 100644 --- a/views/mods/mod_trustedshops/widget.phtml +++ b/views/mods/mod_trustedshops/widget.phtml @@ -2,6 +2,7 @@ /**
* Template für die Ausgabe des Trusted Shops Widgets im Frontend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_trustedshops/widget_form.phtml b/views/mods/mod_trustedshops/widget_form.phtml index 8b9ccf5..ac85e8b 100644 --- a/views/mods/mod_trustedshops/widget_form.phtml +++ b/views/mods/mod_trustedshops/widget_form.phtml @@ -2,6 +2,7 @@ /**
* Template für das Trusted Shops Widget im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_userpayment/list.phtml b/views/mods/mod_userpayment/list.phtml index cd5aa82..594174b 100644 --- a/views/mods/mod_userpayment/list.phtml +++ b/views/mods/mod_userpayment/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste von Zahlungsarten
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_userpayment/settings_edit.phtml b/views/mods/mod_userpayment/settings_edit.phtml index c1ce75b..fa5d5a9 100644 --- a/views/mods/mod_userpayment/settings_edit.phtml +++ b/views/mods/mod_userpayment/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungsseite des Zahlungsvarianten Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_versandarten/list.phtml b/views/mods/mod_versandarten/list.phtml index e6f6257..d48e99b 100644 --- a/views/mods/mod_versandarten/list.phtml +++ b/views/mods/mod_versandarten/list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Versandarten
+ * @version 4.6.1
*/
$arVzNamen = [];
diff --git a/views/mods/mod_versandarten/settings_edit.phtml b/views/mods/mod_versandarten/settings_edit.phtml index 34cfe1c..f151da9 100644 --- a/views/mods/mod_versandarten/settings_edit.phtml +++ b/views/mods/mod_versandarten/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Versandarten/Lieferanten Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_voucherproduct/gutschein_mail.phtml b/views/mods/mod_voucherproduct/gutschein_mail.phtml index 8ae3972..079c5be 100644 --- a/views/mods/mod_voucherproduct/gutschein_mail.phtml +++ b/views/mods/mod_voucherproduct/gutschein_mail.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, der die gekauften Gutscheine versendet
+ * @version 4.6.1
*/
$arPflicht = $this->loadPflichtFeldDaten();
diff --git a/views/mods/mod_voucherproduct/gutschein_mail_html.phtml b/views/mods/mod_voucherproduct/gutschein_mail_html.phtml index e48a658..b5dd68e 100644 --- a/views/mods/mod_voucherproduct/gutschein_mail_html.phtml +++ b/views/mods/mod_voucherproduct/gutschein_mail_html.phtml @@ -2,6 +2,7 @@ /**
* Template für die Mail, der die gekauften Gutscheine versendet (HTML)
+ * @version 4.6.1
*/
include(WPSG_PATH_VIEW . 'mailtemplates/html/logo.phtml');
diff --git a/views/mods/mod_voucherproduct/order_view_sidebar.phtml b/views/mods/mod_voucherproduct/order_view_sidebar.phtml index f4803d9..fb040f1 100644 --- a/views/mods/mod_voucherproduct/order_view_sidebar.phtml +++ b/views/mods/mod_voucherproduct/order_view_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Gutscheinprodukt Moduls in die Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml b/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml index 5c931a3..e6439be 100644 --- a/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml +++ b/views/mods/mod_voucherproduct/order_view_sidebar_content.phtml @@ -2,6 +2,7 @@ /**
* Template für die Ausgabe des Gutscheinproduktmoduls innerhalb der Bestellverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_voucherproduct/product_bottom.phtml b/views/mods/mod_voucherproduct/product_bottom.phtml index 1dce133..5499096 100644 --- a/views/mods/mod_voucherproduct/product_bottom.phtml +++ b/views/mods/mod_voucherproduct/product_bottom.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
declare(strict_types=1);
diff --git a/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml b/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml index f7364b5..5817e26 100644 --- a/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml +++ b/views/mods/mod_voucherproduct/produkt_edit_sidebar.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Gutscheinproduktes innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_voucherproduct/settings_edit.phtml b/views/mods/mod_voucherproduct/settings_edit.phtml index 5662918..28980b3 100644 --- a/views/mods/mod_voucherproduct/settings_edit.phtml +++ b/views/mods/mod_voucherproduct/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Gutscheinprodukt Moduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_voucherproduct/voucher_pdf.phtml b/views/mods/mod_voucherproduct/voucher_pdf.phtml index c66a960..ad93249 100644 --- a/views/mods/mod_voucherproduct/voucher_pdf.phtml +++ b/views/mods/mod_voucherproduct/voucher_pdf.phtml @@ -2,6 +2,7 @@ /**
* Template für den PDF Gutschein
+ * @version 4.6.1
*/
require_once WPSG_PATH_LIB.'FPDF_1.81/fpdf.php';
diff --git a/views/mods/mod_weight/basket_row.phtml b/views/mods/mod_weight/basket_row.phtml index 1f8b2aa..22d3b38 100644 --- a/views/mods/mod_weight/basket_row.phtml +++ b/views/mods/mod_weight/basket_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige des Produktgewichts im Warenkorb
+ * @version 4.6.1
*/
//wpsg_debug($this->view);
diff --git a/views/mods/mod_weight/basket_row_end.phtml b/views/mods/mod_weight/basket_row_end.phtml index a58d2e0..728e8da 100644 --- a/views/mods/mod_weight/basket_row_end.phtml +++ b/views/mods/mod_weight/basket_row_end.phtml @@ -2,6 +2,7 @@ /**
* Template für die Anzeige des Gesamtgewichts innerhalb des Warenkorbs
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_weight/overview_row.phtml b/views/mods/mod_weight/overview_row.phtml index beac1f1..a79a4e4 100644 --- a/views/mods/mod_weight/overview_row.phtml +++ b/views/mods/mod_weight/overview_row.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktgewichts in die Bestellzusammenfassung
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_weight/overview_row_end.phtml b/views/mods/mod_weight/overview_row_end.phtml index d9a7f3e..6a91ed6 100644 --- a/views/mods/mod_weight/overview_row_end.phtml +++ b/views/mods/mod_weight/overview_row_end.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktgewichts in die Bestellzusammenfassung
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_weight/product_addedit_content.phtml b/views/mods/mod_weight/product_addedit_content.phtml index 34bd8ff..b7882a1 100644 --- a/views/mods/mod_weight/product_addedit_content.phtml +++ b/views/mods/mod_weight/product_addedit_content.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktgewichts in die Produktverwaltung
+ * @version 4.6.1
*/
if (!defined('ABSPATH')) exit;
diff --git a/views/mods/mod_weight/produkt_edit_allgemein.phtml b/views/mods/mod_weight/produkt_edit_allgemein.phtml index 76f9271..f13aad2 100644 --- a/views/mods/mod_weight/produkt_edit_allgemein.phtml +++ b/views/mods/mod_weight/produkt_edit_allgemein.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration des Produktgewichts in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_weight/settings_edit.phtml b/views/mods/mod_weight/settings_edit.phtml index e05ea1c..8d5682b 100644 --- a/views/mods/mod_weight/settings_edit.phtml +++ b/views/mods/mod_weight/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Gewichtsmoduls
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_willcollect/mail.phtml b/views/mods/mod_willcollect/mail.phtml index 8c1804e..70c74fd 100644 --- a/views/mods/mod_willcollect/mail.phtml +++ b/views/mods/mod_willcollect/mail.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template integriert die Adresse bei der Zahlungsart "Selbstabholung" in die Mail
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_willcollect/mail_html.phtml b/views/mods/mod_willcollect/mail_html.phtml index ec7500f..ee0b6cb 100644 --- a/views/mods/mod_willcollect/mail_html.phtml +++ b/views/mods/mod_willcollect/mail_html.phtml @@ -2,6 +2,7 @@ /**
* Dieses Template integriert die Adresse bei der Zahlungsart "Selbstabholung" in die Mail
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_willcollect/settings_edit.phtml b/views/mods/mod_willcollect/settings_edit.phtml index a1abbf8..e0b1c24 100644 --- a/views/mods/mod_willcollect/settings_edit.phtml +++ b/views/mods/mod_willcollect/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen der Versandart "Selbstabholung"
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_willcollect/shippinghint.phtml b/views/mods/mod_willcollect/shippinghint.phtml index c6369b6..5f4ecb2 100644 --- a/views/mods/mod_willcollect/shippinghint.phtml +++ b/views/mods/mod_willcollect/shippinghint.phtml @@ -2,6 +2,7 @@ /**
* Template für die Erweiterung des Hinweistextes bei der Versandart. Es wird standardmäßig die Zieladresse aus dem Backend dort noch einmal angezeigt
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_wirecard/order_done.phtml b/views/mods/mod_wirecard/order_done.phtml index 3e77d40..4dc19b8 100644 --- a/views/mods/mod_wirecard/order_done.phtml +++ b/views/mods/mod_wirecard/order_done.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration von wirecard in die Bestellabschlussseite
+ * @version 4.6.1
*/
?>
diff --git a/views/mods/mod_wirecard/paymenthint.phtml b/views/mods/mod_wirecard/paymenthint.phtml index 7d5b912..5bb1faf 100644 --- a/views/mods/mod_wirecard/paymenthint.phtml +++ b/views/mods/mod_wirecard/paymenthint.phtml @@ -1,3 +1,4 @@ +<?php /** @version 4.6.1 */ ?>
<div class="wpsg_mod_wirecard_hint">
<?php echo __($this->get_option('wpsg_mod_wirecard_hint'), 'wpsg'); ?>
<?php if (wpsg_isSizedArray($this->view['wpsg_mod_wirecard']['arPaymentTypes']) && sizeof($this->view['wpsg_mod_wirecard']['arPaymentTypes']) > 1) { ?>
diff --git a/views/mods/mod_wirecard/settings_edit.phtml b/views/mods/mod_wirecard/settings_edit.phtml index 8e58d66..e9137cb 100644 --- a/views/mods/mod_wirecard/settings_edit.phtml +++ b/views/mods/mod_wirecard/settings_edit.phtml @@ -2,6 +2,7 @@ /**
* Template für die Einstellungen des Moduls "wirecard"
+ * @version 4.6.1
*/
?>
diff --git a/views/order/add.phtml b/views/order/add.phtml index f9410b8..0975902 100644 --- a/views/order/add.phtml +++ b/views/order/add.phtml @@ -2,6 +2,7 @@ /**
* Template für das Anlegen einer Bestellung
+ * @version 4.6.1
*/
diff --git a/views/order/backendEdit/addDiscount.phtml b/views/order/backendEdit/addDiscount.phtml index 399b8bc..75f049e 100644 --- a/views/order/backendEdit/addDiscount.phtml +++ b/views/order/backendEdit/addDiscount.phtml @@ -2,6 +2,7 @@ /**
* Template für das Bearbeiten eines Rabattes im Backend
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/order/backendEdit/addProduct.phtml b/views/order/backendEdit/addProduct.phtml index 3511e60..4052350 100644 --- a/views/order/backendEdit/addProduct.phtml +++ b/views/order/backendEdit/addProduct.phtml @@ -2,6 +2,7 @@ /**
* Template für das hinzufügen von Produkten zur Bestellung
+ * @version 4.6.1
*/
?>
diff --git a/views/order/backendEdit/addProduct_product_selected.phtml b/views/order/backendEdit/addProduct_product_selected.phtml index c15c305..e33f28b 100644 --- a/views/order/backendEdit/addProduct_product_selected.phtml +++ b/views/order/backendEdit/addProduct_product_selected.phtml @@ -2,6 +2,7 @@ /**
* Template für das hinzufügen eines Produktes wenn das Produkt ausgewählt wurde
+ * @version 4.6.1
*/
/** @var wpsg_product $oProduct */
diff --git a/views/order/backendEdit/addVoucher.phtml b/views/order/backendEdit/addVoucher.phtml index 890dcca..44db8ed 100644 --- a/views/order/backendEdit/addVoucher.phtml +++ b/views/order/backendEdit/addVoucher.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 05.10.2018
* Time: 08:24
+ * @version 4.6.1
*/
namespace wpsg;
diff --git a/views/order/backendEdit/editPayShipping.phtml b/views/order/backendEdit/editPayShipping.phtml index 584f4b8..3013d7d 100644 --- a/views/order/backendEdit/editPayShipping.phtml +++ b/views/order/backendEdit/editPayShipping.phtml @@ -2,6 +2,7 @@ /**
* Template für das Bearbeiten der Versand- und Zahlungsart im Backend
+ * @version 4.6.1
*/
$arCalculation = $this->view['oCalculation']->getCalculationArray();
diff --git a/views/order/index.phtml b/views/order/index.phtml index 749fa7d..0292d90 100644 --- a/views/order/index.phtml +++ b/views/order/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Übersicht der Bestellungen
+ * @version 4.6.1
*/
$arPaymentKeySelect = [
diff --git a/views/order/product_table.phtml b/views/order/product_table.phtml index 2cbcb13..c0b6784 100644 --- a/views/order/product_table.phtml +++ b/views/order/product_table.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produkttabelle im Backend der Bestellverwaltung
+ * @version 4.6.1
*/
$arCalculation = $this->view['oCalculation']->getCalculationArray(true);
diff --git a/views/order/view.phtml b/views/order/view.phtml index 30681d1..593db7b 100644 --- a/views/order/view.phtml +++ b/views/order/view.phtml @@ -2,6 +2,7 @@ /**
* Template für die Ansicht einer Bestellung im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/order/view_alternativeDesign.phtml b/views/order/view_alternativeDesign.phtml index 0fe1911..6244a03 100644 --- a/views/order/view_alternativeDesign.phtml +++ b/views/order/view_alternativeDesign.phtml @@ -2,6 +2,7 @@ /**
* Template für die alternative Ansicht einer Bestellung im Backend
+ * @version 4.6.1
*/
?>
diff --git a/views/order/view_customerdata.phtml b/views/order/view_customerdata.phtml index 2a101f4..7160f8a 100644 --- a/views/order/view_customerdata.phtml +++ b/views/order/view_customerdata.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 07.08.2016
* Time: 10:40
+ * @version 4.6.1
*/
/** @var wpsg_customer $Customer */
diff --git a/views/order/view_dev.phtml b/views/order/view_dev.phtml index 6c96cbc..c8747c4 100644 --- a/views/order/view_dev.phtml +++ b/views/order/view_dev.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 07.08.2016
* Time: 10:51
+ * @version 4.6.1
*/
/** @var \wpsg_order $oOrder */
diff --git a/views/order/view_general.phtml b/views/order/view_general.phtml index c2a1bd7..4629de8 100644 --- a/views/order/view_general.phtml +++ b/views/order/view_general.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 06.08.2016
* Time: 11:22
+ * @version 4.6.1
*/
?>
diff --git a/views/order/view_orderdata.phtml b/views/order/view_orderdata.phtml index 851175f..df5fa88 100644 --- a/views/order/view_orderdata.phtml +++ b/views/order/view_orderdata.phtml @@ -4,6 +4,7 @@ * User: Daschmi (daschmi@dsachmi.de)
* Date: 06.08.2016
* Time: 13:45
+ * @version 4.6.1
*/
?>
diff --git a/views/order/view_orderlog.phtml b/views/order/view_orderlog.phtml index b1272d5..64773ca 100644 --- a/views/order/view_orderlog.phtml +++ b/views/order/view_orderlog.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 06.08.2016
* Time: 11:24
+ * @version 4.6.1
*/
?>
diff --git a/views/order/view_shippay.phtml b/views/order/view_shippay.phtml index 95ce5a9..e1d269a 100644 --- a/views/order/view_shippay.phtml +++ b/views/order/view_shippay.phtml @@ -4,6 +4,7 @@ * User: Daschmi (https://daschmi.de)
* Date: 07.08.2016
* Time: 10:52
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/addedit.phtml b/views/produkt/addedit.phtml index f1bc2e1..a4a176b 100644 --- a/views/produkt/addedit.phtml +++ b/views/produkt/addedit.phtml @@ -3,6 +3,7 @@ /**
* Template für das Produkt Anlegen/Bearbeiten Formular
* Hier sollten keine Anpassungen vorgenommen werden
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/addedit_alternativeDesign.phtml b/views/produkt/addedit_alternativeDesign.phtml index 930c5b6..ad563ad 100644 --- a/views/produkt/addedit_alternativeDesign.phtml +++ b/views/produkt/addedit_alternativeDesign.phtml @@ -2,6 +2,7 @@ /**
* Alternativtemplate zur Ausgabe der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/addedit_general.phtml b/views/produkt/addedit_general.phtml index 1cd072e..dc1780e 100644 --- a/views/produkt/addedit_general.phtml +++ b/views/produkt/addedit_general.phtml @@ -2,6 +2,7 @@ /**
* Template für den Reiter "Allgemein" der Produktverwaltung
+ * @version 4.6.1
*/
?>
@@ -47,6 +48,7 @@ <?php } ?>
<?php if (!isset($_REQUEST['wpsg_lang'])) { ?>
<?php echo wpsg_drawForm_Input('anr', __('Artikelnummer', 'wpsg'), wpsg_getStr($this->view['data']['anr'])); ?>
+ <?php if (wpsg_product::hasColumn('manufacturer')) echo wpsg_drawForm_Input('manufacturer', __('Hersteller', 'wpsg'), (string)($this->view['data']['manufacturer']??''), []); ?>
<?php if (!is_array($this->view['templates']) || sizeof($this->view['templates']) <= 0) { ?>
<?php echo wpsg_drawForm_Text(__('Produkttemplate', 'wpsg'), __('Keine Templatesdateien gefunden!', 'wpsg'), array('class_content_wrap' => 'wpsg_error')); ?>
<?php } else { ?>
@@ -64,6 +66,8 @@ '1' => __('Mehrfach mit beliebiger Menge', 'wpsg'),
'2' => __('Mehrfach mit Menge 1', 'wpsg')
), wpsg_getStr($this->view['data']['basket_multiple']), array('help' => 'basket_multiple')); ?>
+ <?php if (wpsg_product::hasColumn('mark_new')) echo wpsg_drawForm_Checkbox('mark_new', __('Als neu kennzeichnen', 'wpsg'), intval($this->view['data']['mark_new']??0) === 1); ?>
+ <?php if (\wpsg\Blocks::hasDetailOnlyColumn()) echo wpsg_drawForm_Checkbox('detail_only', __('Kauf nur über die Detailseite', 'wpsg'), intval($this->view['data']['detail_only']??0) === 1, ['help' => 'detail_only']); ?>
<?php } ?>
<br />
@@ -90,7 +94,7 @@ <?php echo wpsg_drawForm_Checkbox('garan', __('GARAN-Gewährleistungslabel', 'wpsg'), intval($this->view['data']['garan']??0) === 1, ['id' => 'wpsg_garan_checkbox']); ?>
<div id="wpsg_garan_layer" style="display:none;">
<?php echo wpsg_drawForm_Input('garan_years', __('GARAN-Gewährleistungsjahre', 'wpsg'), ((intval($this->view['data']['garan_years']??0) > 0)?intval($this->view['data']['garan_years']):''), ['type' => 'number', 'min' => 2]); ?>
- <?php echo wpsg_drawForm_Input('garan_brand', __('GARAN-Marke/Markenzeichen', 'wpsg'), $this->view['data']['garan_brand']??'', []); ?>
+ <?php echo wpsg_drawForm_Input('garan_brand', __('Herstellername auf dem GARAN-Label', 'wpsg'), $this->view['data']['garan_brand']??'', ['hint' => __('Leer: Hersteller des Produkts', 'wpsg')]); ?>
<?php echo wpsg_drawForm_Input('garan_model', __('GARAN-Modellnummer', 'wpsg'), $this->view['data']['garan_model']??'', []); ?>
</div>
<script>
diff --git a/views/produkt/addedit_payship.phtml b/views/produkt/addedit_payship.phtml index 96429a2..8a146c5 100644 --- a/views/produkt/addedit_payship.phtml +++ b/views/produkt/addedit_payship.phtml @@ -2,6 +2,7 @@ /**
* Template für den Reiter "Versand-/ Zahlungsarten"
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/addedit_price.phtml b/views/produkt/addedit_price.phtml index 7e495a9..bd0ac31 100644 --- a/views/produkt/addedit_price.phtml +++ b/views/produkt/addedit_price.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Preiseinstellungen in die Produktverwaltung
+ * @version 4.6.1
*/
// Neues Produkt: Regelsatz des Standardlands
diff --git a/views/produkt/addedit_productcodes.phtml b/views/produkt/addedit_productcodes.phtml index 93707bd..fadf193 100644 --- a/views/produkt/addedit_productcodes.phtml +++ b/views/produkt/addedit_productcodes.phtml @@ -1,4 +1,5 @@ <?php + /** @version 4.6.1 */ declare(strict_types=1); diff --git a/views/produkt/addedit_rating.phtml b/views/produkt/addedit_rating.phtml index 5376801..fbf80fd 100644 --- a/views/produkt/addedit_rating.phtml +++ b/views/produkt/addedit_rating.phtml @@ -2,6 +2,7 @@ /**
* Template für die Integration der Produktbewertung in die Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/addedit_texte.phtml b/views/produkt/addedit_texte.phtml index 7ad6c06..6b62604 100644 --- a/views/produkt/addedit_texte.phtml +++ b/views/produkt/addedit_texte.phtml @@ -2,6 +2,7 @@ /**
* Template für die Texte innerhalb der Produktverwaltung
+ * @version 4.6.1
*/
?>
@@ -36,7 +37,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['beschreibung'], 'beschreibung');
+ wp_editor((string)($this->view['data']['beschreibung']??''), 'beschreibung');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
@@ -50,7 +51,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['longdescription'], 'longdescription');
+ wp_editor((string)($this->view['data']['longdescription']??''), 'longdescription');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
@@ -63,7 +64,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['longdescription_addon'], 'longdescription_addon');
+ wp_editor((string)($this->view['data']['longdescription_addon']??''), 'longdescription_addon');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
@@ -76,7 +77,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['productfeatures'], 'productfeatures');
+ wp_editor((string)($this->view['data']['productfeatures']??''), 'productfeatures');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
@@ -89,7 +90,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['moreinfos'], 'moreinfos');
+ wp_editor((string)($this->view['data']['moreinfos']??''), 'moreinfos');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
@@ -102,7 +103,7 @@ add_filter('tiny_mce_before_init', 'wpsg_formatTinyMCE');
add_filter('admin_head', 'wpsg_ShowTinyMCE');
- wp_editor(@$this->view['data']['moreinfos2'], 'moreinfos2');
+ wp_editor((string)($this->view['data']['moreinfos2']??''), 'moreinfos2');
?>
<?php echo wpsg_drawForm_AdminboxEnd(); ?>
diff --git a/views/produkt/images.phtml b/views/produkt/images.phtml index 5e11aac..7f9e655 100644 --- a/views/produkt/images.phtml +++ b/views/produkt/images.phtml @@ -2,6 +2,7 @@ /**
* Template für den Reiter "Produktbilder" in der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/images_list.phtml b/views/produkt/images_list.phtml index 550045b..92201ce 100644 --- a/views/produkt/images_list.phtml +++ b/views/produkt/images_list.phtml @@ -2,6 +2,7 @@ /**
* Template für die Liste der Bilder eines Produkts
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/import.phtml b/views/produkt/import.phtml index e4c506c..eda0827 100644 --- a/views/produkt/import.phtml +++ b/views/produkt/import.phtml @@ -2,6 +2,7 @@ /**
* Template für die Importmaske in der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/index.phtml b/views/produkt/index.phtml index b9379b8..a1d6137 100644 --- a/views/produkt/index.phtml +++ b/views/produkt/index.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktübersicht im Backend
+ * @version 4.6.1
*/
$arTermExclude = [];
@@ -500,7 +501,7 @@ jQuery('#wpsg_mod_productvariations_dialog').modal();
jQuery.ajax( {
- url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_stock&edit_id=<?php echo $d['id']; ?>&noheader=1&wpsg_cmd=getVariInfo',
+ url: '<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Produkt&action=ajax&mod=wpsg_mod_stock&edit_id=<?php echo intval($d['id']??0); ?>&noheader=1&wpsg_cmd=getVariInfo',
data: {
'subaction': 'admin_show',
'product_id': product_id
diff --git a/views/produkt/mapimport.phtml b/views/produkt/mapimport.phtml index bd8c8bd..bd00287 100644 --- a/views/produkt/mapimport.phtml +++ b/views/produkt/mapimport.phtml @@ -2,6 +2,7 @@ /**
* Template für die Importmaske in der Produktverwaltung
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/select.phtml b/views/produkt/select.phtml index d9a2fe1..5cfda8a 100644 --- a/views/produkt/select.phtml +++ b/views/produkt/select.phtml @@ -2,6 +2,7 @@ /**
* Template für die Produktauswahl über den RTE
+ * @version 4.6.1
*/
?><html>
diff --git a/views/produkt/select_filter.phtml b/views/produkt/select_filter.phtml index 20c3434..eab221b 100644 --- a/views/produkt/select_filter.phtml +++ b/views/produkt/select_filter.phtml @@ -2,6 +2,7 @@ /**
* Template für den Produktauswahldialog mit Filter
+ * @version 4.6.1
*/
?>
diff --git a/views/produkt/select_filter_productlist.phtml b/views/produkt/select_filter_productlist.phtml index e8da939..ba6f74b 100644 --- a/views/produkt/select_filter_productlist.phtml +++ b/views/produkt/select_filter_productlist.phtml @@ -2,6 +2,7 @@ /**
* Template für das Ergebnis der Produktfilterung
+ * @version 4.6.1
*/
?>
diff --git a/views/produktseite/produkt.phtml b/views/produktseite/produkt.phtml new file mode 100644 index 0000000..22d14e0 --- /dev/null +++ b/views/produktseite/produkt.phtml @@ -0,0 +1,407 @@ +<?php + + /** + * Produktseite im Modus „neu“ (doc/theme-kompatibilitaet.md, Punkt 8) + * + * Ersetzt dort die Produktvorlagen 1–3, wenn der Betreiber keine eigene Kopie hat (ThemeStyle::productTemplate()). + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + //Ausgabe der verfügbaren Variablen + // wpsg_debug($this->view['data']); + + // Damit keine Zubehörprodukte ausgegeben werden + //$this->noReleatedProducts = true; + + /** @var wpsg_product $oProduct */ + $oProduct = $this->view['oProduct']; + if (($this->view['data']['product_key']??'') !== '') $oProduct->setProductKey($this->view['data']['product_key']); + + // Nur das Hauptprodukt bekommt Brotkrumen und H1; ähnliche und eingebettete Produkte H2 (K67) + $bMainProduct = \wpsg\ProductPage::isMain(\wpsg\ProductPage::enter(), (bool)$this->noReleatedProducts); + // titleDisplayed: Die Seite zeigt den Titel. Für ähnliche Produkte gilt er nicht, sie stehen nach dem Hauptprodukt. + $bRelated = (!$bMainProduct && $this->noReleatedProducts && ($_REQUEST['action']??'') !== 'wpsg_productvariants_switch'); + $bTitleByPage = ($this->titleDisplayed && !$bRelated && !($bMainProduct && \wpsg\ProductPage::templateWithoutTitle())); + $nTitleLevel = \wpsg\ProductPage::titleLevel($bMainProduct, (bool)$bTitleByPage); + $nSectionLevel = (($bMainProduct)?2:3); + + // Hauptprodukt in der breiten Spalte wie die Kasse; renderProdukt() setzt alignwide am Formular (W7) + if ($bMainProduct) \wpsg\ProductPage::markWide(); + +?> + +<div class="wpsg_produkt_wrapper wpsg-product"> + + <input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" /> + <input type="hidden" name="titleDisplayed" value="<?php echo (($bTitleByPage)?'1':''); ?>" /> + + <?php if (!$bMainProduct) { ?><input type="hidden" name="wpsg_sub_product" value="1" /><?php } ?> + + <?php if ($bMainProduct) echo \wpsg\ProductPage::breadcrumbs($oProduct); ?> + + <?php /* Strukturierte Daten stehen als JSON-LD im Kopf der Seite (ProductSchema), daher hier keine Microdata */ ?> + <div class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>"> + + <?php /* Zweispaltig: Bilder links, Angaben rechts; schmal untereinander (Punkt 8.1) */ ?> + <div class="wpsg-product__main"> + + <?php /* Block für die Produktbilder START */ ?> + <?php + + /* Das ist das primäre Anzeigebild des Produktes (AttachmentID) */ + $arAttachmentID = $this->imagehandler->getAttachmentID($this->view['data']['product_key']); + + /* Array mit allen AttachmentIDs der Produktbilder */ + $arAttachmentIDsAll = $this->imagehandler->getAttachmentIDs($this->view['data']['product_id']); + + ?> + + <?php if (wpsg_isSizedArray($arAttachmentIDsAll)) { $nImages = sizeof($arAttachmentIDsAll); ?> + <div class="wpsg_productimages wpsg-product__media"> + + <?php /* Großes Bild, die übrigen verborgen für die Lightbox; darunter die Bildleiste (Punkt 8.2) */ ?> + <div class="wpsg_produkt_produktbilder wpsg-product__gallery"> + + <?php foreach ($arAttachmentIDsAll as $i => $attachment_id) { ?> + + <?php /* URL für die Lightbox */ ?> + <?php $att = wp_get_attachment_image_src($attachment_id, 'large', false); ?> + + <a class="wpsg-product__image" <?php if ($attachment_id != $arAttachmentID) echo 'style="display:none;"'; ?> rel="gallery-wpsg-<?php echo $this->getTemplateIndex(); ?>" title="<?php echo esc_attr($oProduct->getProductName()); ?>" href="<?php echo esc_url((string)($att[0]??'')); ?>" data-fslightbox="<?php echo $this->getTemplateIndex(); ?>" data-wpsg-image="<?php echo intval($i); ?>"> + <?php /* Sichtbares Bild des Hauptprodukts sofort und zuerst laden, verborgene erst beim Zeigen (W6) */ $bShown = ($attachment_id == $arAttachmentID); ?> + <?php echo wp_get_attachment_image($attachment_id, 'large', false, ['sizes' => '(min-width: 800px) 50vw, 100vw', 'loading' => (($bShown && $bMainProduct)?false:'lazy'), 'fetchpriority' => (($bShown && $bMainProduct)?'high':'auto')]); ?> + </a> + + <?php } ?> + + </div> + + <?php if ($nImages > 1) { ?> + <ul class="wpsg-product__thumbs"> + <?php foreach ($arAttachmentIDsAll as $i => $attachment_id) { ?> + <li><button type="button" class="wpsg-product__thumb" data-wpsg-image="<?php echo intval($i); ?>" aria-pressed="<?php echo (($attachment_id == $arAttachmentID)?'true':'false'); ?>" aria-label="<?php /* translators: 1: Nummer des Bildes, 2: Anzahl */ echo esc_attr(sprintf(__('Bild %1$d von %2$d anzeigen', 'wpsg'), $i + 1, $nImages)); ?>"><?php echo wp_get_attachment_image($attachment_id, 'medium', false, ['alt' => '', 'sizes' => '(min-width: 800px) 8rem, 25vw', 'loading' => false]); ?></button></li> + <?php } ?> + </ul> + <?php } ?> + + </div> + <?php } ?> + <?php /* Block für die Produktbilder ENDE */ ?> + + <div class="wpsg-product__details"> + + <?php /* Etiketten über dem Titel (Punkt 8.3) */ echo \wpsg\ProductPage::labels($oProduct, floatval($oProduct->getPrice($this->view['data']['product_key']))); ?> + + <div class="wpsg_produkt wpsg_product_name"> + + <?php if ($nTitleLevel > 0) { ?> + <h<?php echo $nTitleLevel; ?> class="wpsg_producttitle"><?php echo $oProduct->getProductName(); ?></h<?php echo $nTitleLevel; ?>> + <?php if (($this->view['data']['detailname']??'') !== '' && $oProduct->getProductName() !== $this->view['data']['detailname']) { ?> + <p class="wpsg_productdetailtitle"><?php echo wp_kses_post($this->view['data']['detailname']); ?></p> + <?php } ?> + <?php } ?> + + <?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?> + + </div> + + <?php $this->callMods('product_top', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?> + + <?php /* Preis, Preiszeile und Lieferzeit (Punkt 8.5) START */ ?> + <div class="wpsg-product__offer"> + + <?php if ($oProduct->canDisplayPrice()) { $price = $oProduct->getPrice($this->view['data']['product_key']); $oldPrice = $oProduct->getOldPrice(); $hint_id = \wpsg\Blocks::kleinunternehmerHintID('product-'.$oProduct->getId()); ?> + + <div class="wpsg_produkt_preis wpsg-product__price"> + + <?php if ($oldPrice !== false && $oldPrice != $price) { ?> + <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_price_html($price, 'product'); ?></span> + <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_price_html($oldPrice, 'product_old'); ?></span> + <?php } else { ?> + <span class="wpsg_mod_productview_price"><?php echo wpsg_price_html($price, 'product'); ?></span> + <?php } ?> + + </div> + + <?php ob_start(); if ($this->hasMod('wpsg_mod_fuellmenge')) $this->callMod('wpsg_mod_fuellmenge', 'renderPriceInfo', [$price, $this->view['data']['fmenge'], $oProduct->getId()]); $baseprice = (string)ob_get_clean(); ?> + <div class="wpsg_produkt_preishinweis wpsg-product__taxnote"><?php echo \wpsg\Blocks::priceLine($oProduct, $hint_id, $baseprice); ?></div> + + <?php /* Lieferzeit START */ ?> + <?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_show_product') == '1') { ?> + <div class="wpsg-product__deliverytime"> + + <?php /* Produkt nur im Store, nicht im Onlineshop vorhanden */ ?> + <?php if ($this->callMod('wpsg_mod_deliverytime', 'isStoreProduct', array($this->view['data']['product_key']))) { ?> + + <div class="wpsg_product_only_store"><?php echo __($this->callMod('wpsg_mod_deliverytime', 'displayStoreText', array($this->view['data']['product_key']))); ?></div> + + <?php $stl = 0; $stl = $this->callMod('wpsg_mod_deliverytime', 'displayStoreLink', array($this->view['data']['product_key'])) ?> + <?php if (wpsg_isSizedInt($stl)) { ?> + + <a href="<?php echo get_permalink($stl); ?>"><?php echo __('So erreichen Sie uns.', 'wpsg'); ?></a> + + <?php } ?> + + <?php } else { ?> + + <?php $strDelayNote = $this->callMod('wpsg_mod_deliverytime', 'displayDelayTime', array($this->view['data']['product_key'])); ?> + <?php if (wpsg_isSizedString($strDelayNote)) { ?> + + <div class="wpsg_mod_deliverytime_offline"> + + <div class="wpsg_mod_deliverytime_delay"><?php echo wpsg_hspc($strDelayNote); ?></div> + + </div> + + <?php } else { ?> + + <div class="wpsg_mod_deliverytime"> + <span class="label label_deliverytime"><?php echo wpsg_translate(__('Lieferzeit:', 'wpsg')); ?></span> + <?php echo $this->callMod('wpsg_mod_deliverytime', 'displayDeliveryTime', array($this->view['data']['product_key'])); ?> + </div> + + <?php } ?> + + <?php } ?> + + </div> + <?php } ?> + <?php /* Lieferzeit ENDE */ ?> + + <?php echo \wpsg\Blocks::kleinunternehmerHint($hint_id); ?> + + <?php } else { ?> + + <div class="wpsg-product__price"><?php echo wpsg_translate(__('Die Produktpreise werden nur eingeloggten Benutzern angezeigt. Loggen Sie sich <a href="'.$this->getURL(wpsg_ShopController::URL_PROFIL).'">hier</a> bitte ein, um zu bestellen.')); ?></div> + + <?php } ?> + + </div> + <?php /* Preis, Preiszeile und Lieferzeit ENDE */ ?> + + <?php /* Kurzbeschreibung; der Kurztext weiter unten nur, wenn er etwas anderes sagt (W2) */ $shortdesc_text = trim(wp_strip_all_tags((string)($this->view['data']['shortdesc']??''))); ?> + <?php if ($shortdesc_text !== '') { ?> + <div class="wpsg_produkt_shortdescription"> + + <span><?php echo $this->view['data']['shortdesc']; ?></span> + + </div> + <?php } ?> + + <div class="wpsg_clear"></div> + + <?php /* Lagerbestand START*/ ?> + <?php + + if ($this->hasMod('wpsg_mod_stock') && $this->get_option('wpsg_mod_stock_showProduct') == '1') { + + $stock_source_display = '0'; // Variantenbestand + + if ($oProduct->getMeta('wpsg_vp_product_stock_display', false, '0') === '0') { + + // Einstellung + if ($this->get_option('wpsg_vp_product_stock_display') === '1') $stock_source_display = '1'; + + } else if ($oProduct->getMeta('wpsg_vp_product_stock_display') === '1') { + + $stock_source_display = '1'; // Produktbestand + + } + + $stock_display = $this->view['data']['stock']; + + if ($stock_source_display === '1') $stock_display = $oProduct->__get('stock'); + + ?> + + <div class="wpsg_mod_produktindex_stock"> + + <?php if ($stock_display > 0) {?> + + <label><?php echo __('Lagerbestand', 'wpsg'); ?></label> + <?php echo wpsg_translate(__('#1# Artikel auf Lager','wpsg'), $stock_display); ?> + + <?php } else { ?> + + <label><?php echo wpsg_translate(__('Ausverkauft', 'wpsg')); ?></label> + + <?php } ?> + + </div> + <?php } ?> + <?php /* Lagerbestand ENDE*/ ?> + + + <?php /* Gewichtsanzeige START */ ?> + <?php if ($this->hasMod('wpsg_mod_weight') && $this->get_option('wpsg_mod_weight_showProduct') === '1') { ?> + <div class="wpsg_mod_weight_produkt"> + + <?php if (($this->view['data']['weight']) > '0') { ?> + <span class="label label_weight"><?php echo wpsg_translate(__('Gewicht:', 'wpsg')); ?></span> + <?php echo wpsg_translate(__('#1# #2#', 'wpsg'), '<span class="wpsg_weight" id="weight_'.$this->view['data']['id'].'">'.wpsg_ff($this->view['data']['weight']).'</span>', $this->get_option('wpsg_mod_weight_unit')); ?> + <?php } else { ?> + <label><?php wpsg_translate(__('', 'wpsg'))?></label> + <?php } ?> + </div> + <?php } ?> + <?php /* Gewichtsanzeige ENDE */ ?> + + + <?php /* Produktkurzbeschreibung START */ ?> + <div class="wpsg_product_informationarea"> + + <?php $kurztext = trim(wp_strip_all_tags((string)($this->view['data']['beschreibung']??''))); if ($kurztext !== '' && $kurztext !== $shortdesc_text) { ?> + <div class="wpsg_product_information_short"> + <div class="wpsg_produkt_additional_information"> + <div class="wpsg_produkt_shortdescription"> + <span><?php echo $this->view['data']['beschreibung']; ?></span> + </div> + </div> + </div> + <?php } ?> + + </div> + <?php /* Produktkurzbeschreibung ENDE */ ?> + + <?php /* Varianten als Feld über der Menge (Punkt 8.6) START */ ?> + <div class="wpsg_produkt_varianten wpsg-product__variants"> + <?php echo $this->callMod('wpsg_mod_productvariants', 'renderTemplate', array($this->view['data']['product_key'])); ?> + </div> + <?php /* Varianten ENDE */ ?> + + <?php $this->callMods('product_bottom', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?> + + <?php if ($oProduct->isGARAN()) { ?> + + <?php echo \wpsg\WarrantyLabel::getProductHTML($oProduct); ?> + + <?php } ?> + + <div class="wpsg_product_buttonarea"> + <div class="wpsg_product_buttons_add_basket"> + <?php /* Urlaubsgruß im Urlaubszeitraum */ ?> + <?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->callMod('wpsg_mod_deliverytime', 'holiday', array($this->view['data']['product_key']))) { ?> + <div class="wpsg_product_deliverytime_holiday" style="padding:10px; border:1px solid #ff0000;"><?php echo wpsg_hspc($this->callMod('wpsg_mod_deliverytime', 'displayHolidaytext', array($this->view['data']['product_key']))); ?></div> + <?php } ?> + + <?php if ($this->view['oProduct']->canOrder()) { ?> + <div class="wpsg_produkt_add_basket_wrapper wpsg-product__buy"> + + <?php /* Menge mit Beschriftung darüber, daneben der Knopf (Punkt 8.6) */ ?> + <div class="wpsg-product__amount"> + <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo esc_html__('Menge', 'wpsg'); ?></label> + <input type="text" inputmode="numeric" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> /> + </div> + + <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?><?php echo wpsg_button_class(); ?>" type="submit" value="<?php echo esc_attr(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?>" name="wpsg[submit]" /> + + <?php /* Ausgaben nach dem Knopf (Widerrufsknopf) in eigener Zeile unter Menge und Knopf (Punkt 8.8) */ ob_start(); do_action('wpsg_producttemplate_afterButton'); $after_button = trim((string)ob_get_clean()); ?> + + <?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?> + <script type="text/javascript"> + + jQuery(document).ready(function() { + + jQuery('.wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>').on('click', function() { + + wpsg_blockProductTemplate(<?php echo $this->getTemplateIndex(); ?>); + + jQuery.ajax( { + url: '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>', + data: { + 'wpsg_form_data': jQuery('#wpsg_produktform_<?php echo $this->getTemplateIndex(); ?>').serialize(), + 'wpsg[ajax]': '1', + 'wpsg[submit]': '1' + }, + success: function(data) { + + wpsg_refreshBasketWidget(); + + <?php if ($this->get_option('wpsg_afterinsert') == '2') { ?> + + tb_show('<?php echo __('Ihr Warenkorb', 'wpsg'); ?>', '<?php echo $this->getURL(wpsg_ShopController::URL_BASKET_AJAX); ?>&height=500'); + + <?php } else { ?> + + jQuery('body').append(data); + + <?php } ?> + + wpsg_unblockProductTemplate(<?php echo $this->getTemplateIndex(); ?>); + + } + } ); + + return false; + + } ); + + } ); + + </script> + <?php } ?> + + </div> + <?php if ($after_button !== '') { ?><div class="wpsg-product__after-buy"><?php echo $after_button; ?></div><?php } ?> + <?php } ?> + </div> + </div> + + <div class="wpsg_clear"></div> + + <?php if ($this->hasMod('wpsg_mod_request') && $this->callMod('wpsg_mod_request', 'isRequestProduct', array($this->view['data']['id']))) { ?> + <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label> + <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> /> + + <input class="wpsg_button wpsg_add_requestlist<?php echo wpsg_button_class(); ?>" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" /> + <?php } ?> + + <?php /* Artikelnummer, Hersteller und Produktcodes als Liste (Punkt 8.7) START */ ?> + <?php $bNr = ($this->get_option('wpsg_showArticelnumber') == '1'); $arProductCodes = $oProduct->getAllProductCodes(); $manufacturer = $oProduct->getManufacturer(); ?> + <?php if ($bNr || sizeof($arProductCodes) > 0 || $manufacturer !== '') { ?> + <ul class="wpsg-product__facts"> + <?php if ($bNr) { ?> + <li class="wpsg_artikelnummer"><?php echo esc_html__('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo esc_html((string)$oProduct->getNr()); ?></span></li> + <?php } ?> + <?php if ($manufacturer !== '') { ?> + <li class="wpsg-product__manufacturer"><?php echo esc_html__('Hersteller', 'wpsg'); ?>: <?php echo esc_html($manufacturer); ?></li> + <?php } ?> + <?php foreach ($arProductCodes as $product_code) { ?> + <li class="product_code <?php echo esc_attr($product_code['code_key']); ?>"><span class="label"><?php echo esc_html($product_code['label']); ?></span>: <span class="code"><?php echo esc_html($product_code['code']); ?></span></li> + <?php } ?> + </ul> + <?php } ?> + <?php /* Artikelnummer und Produktcodes ENDE */ ?> + + </div> + </div> + <?php /* Zweispaltig ENDE */ ?> + + <?php /* Langtext, Zusätzliche Informationen und Lieferumfang je als Abschnitt mit H2 (Punkt 8.7) START */ ?> + <?php foreach (['longdescription' => __('Beschreibung', 'wpsg'), 'moreinfos' => __('Zusätzliche Informationen', 'wpsg'), 'moreinfos2' => __('Lieferumfang', 'wpsg')] as $field => $title) { ?> + <?php if (trim((string)($this->view['data'][$field]??'')) === '') continue; $section_id = 'wpsg-product-'.$field.'-'.$this->getTemplateIndex(); ?> + <?php /* Benannte Landmarke nur beim Hauptprodukt; nachgeordnete Produkte hätten sonst gleichnamige (axe landmark-unique) */ $section_tag = (($bMainProduct)?'section':'div'); ?> + <<?php echo $section_tag; ?> class="wpsg-product__section wpsg_produkt_<?php echo esc_attr($field); ?>"<?php if ($bMainProduct) { ?> aria-labelledby="<?php echo esc_attr($section_id); ?>"<?php } ?>> + <h<?php echo $nSectionLevel; ?> id="<?php echo esc_attr($section_id); ?>" class="wpsg-product__section-title"><?php echo esc_html($title); ?></h<?php echo $nSectionLevel; ?>> + <div><?php echo $this->view['data'][$field]; ?></div> + </<?php echo $section_tag; ?>> + <?php } ?> + <?php /* Abschnitte ENDE */ ?> + + <div class="wpsg_clear"></div> + + <?php /* Social Media Integration */ ?> + <div class="wpsg_product_social_media"> + <?php if (is_plugin_active('plugin-directory/shariff.php')) {?> + <?php echo do_shortcode('[shariff]')?> + <?php } ?> + </div> + + </div> + + <?php $this->callMods('product_bottom_end', array(&$this->view['data']['product_key'], $this->getTemplateIndex())); ?> + +</div> +<?php \wpsg\ProductPage::leave(); ?> diff --git a/views/produkttemplates/standard.phtml b/views/produkttemplates/standard.phtml index ea1087a..82cc85d 100644 --- a/views/produkttemplates/standard.phtml +++ b/views/produkttemplates/standard.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für das Produkt im Frontend
@@ -25,7 +26,9 @@ <?php if (!$this->titleDisplayed) { ?>
<h1 class="wpsg_producttitle"><?php echo $oProduct->getProductName(); ?></h1>
- <h2 class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
+ <?php if (($this->view['data']['detailname']??'') !== '' && $oProduct->getProductName() !== $this->view['data']['detailname']) { ?>
+ <h2 class="wpsg_productdetailtitle"><?php echo wp_kses_post($this->view['data']['detailname']); ?></h2>
+ <?php } ?>
<?php } ?>
<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
@@ -37,7 +40,6 @@ <div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
<meta itemprop="name" content="<?php echo wpsg_hspc($oProduct->getProductName()); ?>" />
- <meta itemprop="detailname" content="<?php echo wpsg_hspc($this->view['data']['detailname']); ?>" />
<?php foreach ($oProduct->getAllProductCodes() as $product_code) { ?>
<?php if ($product_code['itemprop'] !== null) { ?>
@@ -108,7 +110,7 @@ <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
- <meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+ <?php /* Nur ein gültiger ISO-Code, das Feld „Währung“ ist frei */ $schema_currency = \wpsg\ProductSchema::currency((string)$this->get_option('wpsg_currency')); if ($schema_currency !== null) { ?><meta itemprop="priceCurrency" content="<?php echo esc_attr($schema_currency); ?>" /><?php } ?>
<meta itemprop="price" content="<?php echo $this->view['oProduct']->getPrice($this->view['data']['product_key']); ?>" />
<?php echo __('Stückpreis:', 'wpsg'); ?>
@@ -116,10 +118,10 @@ <?php $oldPrice = $this->view['oProduct']->getOldPrice(); ?>
<?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
- <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
- <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
+ <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_price_html($oldPrice, 'product_old'); ?></span>
<?php } else { ?>
- <span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
<?php } ?>
</div>
@@ -134,9 +136,9 @@ <div class="wpsg_produkt_preishinweis">
- <?php $fs = explode(',', $this->view['data']['allowedshipping']); ?>
+ <?php $fs = explode(',', (string)$this->view['data']['allowedshipping']); ?>
<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (array_search('500', $fs) || array_search('', $fs))) { /* Versandkostenfrei aktiv */?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -152,7 +154,7 @@ <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
<?php }?>
<?php } else { /* Frontend = BRUTTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (array_search('500', $fs) || array_search('', $fs))) { /* Versandkostenfrei aktiv */ ?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */ ?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -333,7 +335,7 @@ <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+ <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?><?php echo wpsg_button_class(); ?>" type="submit" value="<?php echo esc_attr(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?>" name="wpsg[submit]" />
<?php echo do_action('wpsg_producttemplate_afterButton'); ?>
@@ -392,7 +394,7 @@ <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+ <input class="wpsg_button wpsg_add_requestlist<?php echo wpsg_button_class(); ?>" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
<?php } ?>
<?php /* Produktlangbeschreibung START */ ?>
diff --git a/views/produkttemplates/standard2.phtml b/views/produkttemplates/standard2.phtml index f61e688..6308039 100644 --- a/views/produkttemplates/standard2.phtml +++ b/views/produkttemplates/standard2.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für das Produkt im Frontend
@@ -45,10 +46,14 @@ <div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
- <meta itemprop="url" content="<?php echo $oProduct->getProductURL().'?test'; ?>" />
+ <meta itemprop="url" content="<?php echo esc_url($oProduct->getProductURL()); ?>" />
<meta itemprop="name" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id'])); ?>" />
- <meta itemprop="detailname" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id']).' / '.rtrim(($var_info['key']??''), ' /')); ?>" />
- <meta itemprop="sku" content="<?php echo wpsg_hspc($oProduct->getEAN()); ?>" />
+
+ <?php foreach ($oProduct->getAllProductCodes() as $product_code) { ?>
+ <?php if ($product_code['itemprop'] !== null) { ?>
+ <meta itemprop="<?php echo esc_attr($product_code['itemprop']); ?>" content="<?php echo esc_attr($product_code['code']); ?>" />
+ <?php } ?>
+ <?php } ?>
<?php /* Block für die Produktbilder START */ ?>
<?php
@@ -110,17 +115,18 @@ <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
- <meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+ <?php /* Nur ein gültiger ISO-Code, das Feld „Währung“ ist frei */ $schema_currency = \wpsg\ProductSchema::currency((string)$this->get_option('wpsg_currency')); if ($schema_currency !== null) { ?><meta itemprop="priceCurrency" content="<?php echo esc_attr($schema_currency); ?>" /><?php } ?>
+ <meta itemprop="price" content="<?php echo esc_attr((string)$this->view['oProduct']->getPrice($this->view['data']['product_key'])); ?>" />
<?php echo __('Stückpreis:', 'wpsg'); ?>
<?php $oldPrice = $this->view['oProduct']->getOldPrice(); ?>
<?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
- <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
- <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
+ <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_price_html($oldPrice, 'product_old'); ?></span>
<?php } else { ?>
- <span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
<?php } ?>
</div>
@@ -134,8 +140,9 @@ <?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
<div class="wpsg_produkt_preishinweis">
+ <?php $fs = explode(',', (string)$this->view['data']['allowedshipping']); ?>
<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -151,7 +158,7 @@ <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
<?php }?>
<?php } else { /* Frontend = BRUTTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */ ?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */ ?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -320,7 +327,7 @@ <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+ <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?><?php echo wpsg_button_class(); ?>" type="submit" value="<?php echo esc_attr(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?>" name="wpsg[submit]" />
<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
<script type="text/javascript">
@@ -376,7 +383,7 @@ <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+ <input class="wpsg_button wpsg_add_requestlist<?php echo wpsg_button_class(); ?>" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
<?php } ?>
<?php /* Produktlangbeschreibung START */ ?>
diff --git a/views/produkttemplates/standard3.phtml b/views/produkttemplates/standard3.phtml index 788b21c..c305178 100644 --- a/views/produkttemplates/standard3.phtml +++ b/views/produkttemplates/standard3.phtml @@ -1,4 +1,5 @@ <?php
+ /** @version 4.6.1 */
/*
* Template für das Produkt im Frontend Layout 3
@@ -61,8 +62,10 @@ <div>
<?php if (!$this->titleDisplayed) { ?>
- <h1 itemprop="name" class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h1>
- <h2 itemprop="detailname" class="wpsg_productdetailtitle"><?php echo $this->view['data']['detailname']; ?></h2>
+ <h1 class="wpsg_producttitle"><?php echo $this->getProductName($this->view['data']['id']); ?></h1>
+ <?php if (($this->view['data']['detailname']??'') !== '' && $this->getProductName($this->view['data']['id']) !== $this->view['data']['detailname']) { ?>
+ <h2 class="wpsg_productdetailtitle"><?php echo wp_kses_post($this->view['data']['detailname']); ?></h2>
+ <?php } ?>
<?php } ?>
<?php $this->callMods('product_top_afterheadline', array(&$this->view['data']['id'], $this->getTemplateIndex())); ?>
@@ -71,6 +74,8 @@ <div itemscope itemtype="http://schema.org/Product" class="wpsg_produkt wpsg_produkt_<?php echo $this->view['data']['id']; ?>">
+ <meta itemprop="name" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id'])); ?>" />
+
<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
<div class="wpsg_artikelnummer">
<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
@@ -97,17 +102,18 @@ <div itemprop="offers" itemscope itemtype="http://schema.org/Offer" class="wpsg_produkt_preis">
- <meta itemprop="priceCurrency" content="<?php echo $this->get_option('wpsg_currency'); ?>" />
+ <?php /* Nur ein gültiger ISO-Code, das Feld „Währung“ ist frei */ $schema_currency = \wpsg\ProductSchema::currency((string)$this->get_option('wpsg_currency')); if ($schema_currency !== null) { ?><meta itemprop="priceCurrency" content="<?php echo esc_attr($schema_currency); ?>" /><?php } ?>
+ <meta itemprop="price" content="<?php echo esc_attr((string)$this->view['oProduct']->getPrice($this->view['data']['product_key'])); ?>" />
<?php echo __('Stückpreis:', 'wpsg'); ?>
<?php $oldPrice = $this->view['oProduct']->getOldPrice(); ?>
<?php if ($oldPrice !== false && $oldPrice != $this->view['oProduct']->getPrice($this->view['data']['product_key'])) { ?>
- <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
- <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_ff($oldPrice, $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price wpsg_mod_productview_current"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
+ <span class="wpsg_mod_productview_oldprice"><?php echo wpsg_price_html($oldPrice, 'product_old'); ?></span>
<?php } else { ?>
- <span class="wpsg_mod_productview_price"><?php echo wpsg_ff($this->view['oProduct']->getPrice($this->view['data']['product_key']), $this->get_option('wpsg_currency')); ?></span>
+ <span class="wpsg_mod_productview_price"><?php echo wpsg_price_html($this->view['oProduct']->getPrice($this->view['data']['product_key']), 'product'); ?></span>
<?php } ?>
</div>
@@ -121,8 +127,9 @@ <?php } else { /* Kleinunternehmerregelung aktiviert ENDE */ ?>
<div class="wpsg_produkt_preishinweis">
+ <?php $fs = explode(',', (string)$this->view['data']['allowedshipping']); ?>
<?php if ($this->getFrontendTaxview() == WPSG_NETTO) { /* Frontend = NETTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -138,7 +145,7 @@ <?php echo wpsg_translate(__('(zzgl. #1#% MwSt. und zzgl. #2#)', 'wpsg'), wpsg_ff($this->view['data']['mwst_value']), '<a href="'.$this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN).'">'.__('Versandkosten', 'wpsg').'</a>'); ?>
<?php }?>
<?php } else { /* Frontend = BRUTTO Preise */ ?>
- <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1') { /* Versandkostenfrei aktiv */ ?>
+ <?php if ($this->hasMod('wpsg_mod_freeshipping') && $this->get_option('wpsg_mod_freeshipping_aktiv') == '1' && (in_array('500', $fs, true) || in_array('', $fs, true))) { /* Versandkostenfrei aktiv */ ?>
<?php if ($this->get_option('wpsg_mod_freeshipping_minvalue') > 0) { ?>
<?php echo wpsg_translate(__('(inkl. #1#% MwSt. und <a href="#3#">ab #2# € versandkostenfrei</a>)', 'wpsg'),
@@ -290,7 +297,7 @@ <input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('In den Warenkorb', 'wpsg'); ?>" name="wpsg[submit]" />
+ <input class="wpsg_button wpsg_add_basket wpsg_add_basket_<?php echo $this->getTemplateIndex(); ?><?php echo wpsg_button_class(); ?>" type="submit" value="<?php echo esc_attr(wpsg_button_text('add_to_basket', __('In den Warenkorb', 'wpsg'))); ?>" name="wpsg[submit]" />
<?php if (in_array($this->get_option('wpsg_afterinsert'), array('2', '3'))) { ?>
<script type="text/javascript">
@@ -346,7 +353,7 @@ <label class="wpsg_amount_label" for="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>"><?php echo __('Anzahl', 'wpsg'); ?></label>
<input type="text" value="<?php echo ((wpsg_isSizedInt($this->view['data']['menge']))?$this->view['data']['menge']:'1'); ?>" name="wpsg[menge]" class="wpsg_menge" id="wpsg_menge_<?php echo $this->getTemplateIndex(); ?>" <?php echo (($this->view['data']['basket_multiple'] == 4)?' readonly="readonly" ':''); ?> />
- <input class="wpsg_button wpsg_add_requestlist" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
+ <input class="wpsg_button wpsg_add_requestlist<?php echo wpsg_button_class(); ?>" id="wpsg_add_requestlist_<?php echo $this->getTemplateIndex(); ?>" type="submit" value="<?php echo __('Auf die Anfrageliste', 'wpsg'); ?>" name="wpsg[submit_request]" />
<?php } ?>
<?php /* Produktlangbeschreibung START */ ?>
diff --git a/views/warenkorb/ajaxDialog.phtml b/views/warenkorb/ajaxDialog.phtml index 60043d6..4e5328d 100644 --- a/views/warenkorb/ajaxDialog.phtml +++ b/views/warenkorb/ajaxDialog.phtml @@ -2,6 +2,7 @@ /**
* Template für den Dialog wenn im Backend "Lightbox Meldung" eingestellt ist
+ * @version 4.6.1
*/
// $this->view['product_key'] // Der ProduktSchlüssel des hinzugefügten Produktes
diff --git a/views/warenkorb/basket.phtml b/views/warenkorb/basket.phtml index d2fef29..75e6f68 100644 --- a/views/warenkorb/basket.phtml +++ b/views/warenkorb/basket.phtml @@ -2,6 +2,7 @@ /**
* Template für den Warenkorb
+ * @version 4.6.1
*/
//wpsg_debug($this->view['basket']);
@@ -83,10 +84,10 @@ </div>
<div class="amount">
- <input class="wpsg_form_submit_return amount" type="text" name="wpsg[menge][<?php echo $product_data['product_index']; ?>]" <?php echo ((wpsg_isTrue($product_data['oneOnly']) || wpsg_isSizedInt($product_data['basket_multiple'], 4))?'readonly="readonly"':''); ?> value="<?php echo wpsg_hspc($product_data['menge']); ?>" size="3" />
+ <input class="wpsg_form_submit_return amount" type="text" name="wpsg[menge][<?php echo $product_data['product_index']; ?>]" aria-label="<?php echo esc_attr(sprintf(__('Anzahl: %s', 'wpsg'), (($product_data['detailname'] != '')?$product_data['detailname']:$product_data['name']))); ?>" <?php echo ((wpsg_isTrue($product_data['oneOnly']) || wpsg_isSizedInt($product_data['basket_multiple'], 4))?'readonly="readonly"':''); ?> value="<?php echo wpsg_hspc($product_data['menge']); ?>" size="3" />
<a class="wpsg_basket_removelink" href="<?php echo $this->getRemoveLinkURL($product_data['product_index']); ?>" title="<?php echo __('Produkt aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass Sie das Produkt aus dem Warenkorb entfernen möchten?', 'wpsg'); ?>');">
- <img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('Löschen', 'wpsg'); ?>" />
+ <img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" width="16" height="16" alt="<?php echo __('Löschen', 'wpsg'); ?>" />
</a>
</div>
@@ -149,7 +150,7 @@ <div class="basket_sum_row basket_sum_voucher">
<div class="title">
- <a class="wpsg_basket_removelink" href="<?php echo str_replace('&', '&', $this->getRemoveLinkURL('voucher_'.$gs['id'])); ?>" title="<?php echo __('Gutschein aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen möchten?', 'wpsg'); ?>');"><img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" alt="<?php echo __('Löschen', 'wpsg'); ?>" /></a>
+ <a class="wpsg_basket_removelink" href="<?php echo str_replace('&', '&', $this->getRemoveLinkURL('voucher_'.$gs['id'])); ?>" title="<?php echo __('Gutschein aus dem Warenkorb entfernen', 'wpsg'); ?>" onclick="return confirm('<?php echo __('Sind Sie sich sicher, dass sie den Gutschein aus dem Warenkorb entfernen möchten?', 'wpsg'); ?>');"><img src="<?php echo WPSG_URL; ?>views/gfx/bin_x.png" width="16" height="16" alt="<?php echo __('Löschen', 'wpsg'); ?>" /></a>
<?php echo __('Gutschein', 'wpsg'); ?> <?php
$arInfo = [];
@@ -223,7 +224,7 @@ <div class="title">
<span><?php echo wpsg_translate(__('<a href="#1#">Versandkosten</a>:', 'wpsg'), $this->getURL(wpsg_ShopController::URL_VERSANDKOSTEN)); ?></span>
<?php if (sizeof($this->arShipping) > 1) { ?>
- <select name="set_shipping" class="wpsg_form_submit set_shipping">
+ <select name="set_shipping" class="wpsg_form_submit set_shipping" aria-label="<?php echo esc_attr__('Versandart', 'wpsg'); ?>">
<option><?php echo __('Bitte wählen', 'wpsg')?></option>
<?php foreach ($this->arShipping as $s_id => $s) { ?>
<option <?php echo (($s['id'] == $this->view['basket']['checkout']['shipping'])?'selected="selected"':''); ?> value="<?php echo $s_id; ?>"><?php echo wpsg_hspc(__($s['name'], 'wpsg')); ?></option>
@@ -235,7 +236,7 @@ <span><?php echo $this->arShipping[$this->view['basket']['checkout']['shipping']]['name']; ?></span>
<?php } ?>
<?php if ($this->get_option('wpsg_hideBasketCountrySelect') != '1') { ?>
- <select name="set_land" id="set_land" class="wpsg_form_submit set_land">
+ <select name="set_land" id="set_land" class="wpsg_form_submit set_land" aria-label="<?php echo esc_attr__('Lieferland', 'wpsg'); ?>">
<?php foreach ($this->view['arLander'] as $l_id => $l) { ?>
<option <?php echo (($l_id == $this->getFrontendShippingCountry(true))?'selected="selected"':''); ?> value="<?php echo $l_id; ?>"><?php echo wpsg_hspc(__($l, 'wpsg')); ?></option>
<?php } ?>
@@ -286,7 +287,7 @@ <div class="title">
<?php echo __('Zahlungsart:', 'wpsg').' '; ?>
<?php if (sizeof($this->arPayment) > 1) { ?>
- <select name="set_payment" class="wpsg_form_submit set_payment">
+ <select name="set_payment" class="wpsg_form_submit set_payment" aria-label="<?php echo esc_attr__('Zahlungsart', 'wpsg'); ?>">
<option><?php echo __('Bitte wählen', 'wpsg')?></option>
<?php foreach ($this->arPayment as $p_id => $p) { ?>
<option <?php echo (($p['id'] == $this->view['basket']['checkout']['payment'])?'selected="selected"':''); ?> value="<?php echo $p_id; ?>"><?php echo wpsg_hspc($p['name']); ?></option>
@@ -400,8 +401,8 @@ <input type="hidden" name="wpsg_basket_submit" value="1" />
- <input type="submit" class="wpsg_button wpsg_refreshbutton" value="<?php echo __('aktualisieren', 'wpsg'); ?>" name="wpsg_basket_refresh" />
- <input type="submit" class="wpsg_button wpsg_checkoutbutton" id="wpsg_basket_submit" value="<?php echo __('zur Kasse', 'wpsg'); ?>" name="wpsg_checkout" />
+ <input type="submit" class="wpsg_button wpsg_refreshbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('aktualisieren', 'wpsg'); ?>" name="wpsg_basket_refresh" />
+ <input type="submit" class="wpsg_button wpsg_checkoutbutton<?php echo wpsg_button_class(); ?>" id="wpsg_basket_submit" value="<?php echo __('zur Kasse', 'wpsg'); ?>" name="wpsg_checkout" />
<br /><br />
diff --git a/views/warenkorb/checkout.phtml b/views/warenkorb/checkout.phtml index 1d30a1c..4b91475 100644 --- a/views/warenkorb/checkout.phtml +++ b/views/warenkorb/checkout.phtml @@ -3,437 +3,427 @@ /**
* Template für den ersten Schritt der Kasse
* Kundendaten etc.
+ * @version 4.6.1
*/
-
+
//wpsg_debug($this->view);
-?>
+?>
<script type="text/javascript">/* <![CDATA[ */
-
+
jQuery(document).ready(function() {
-
+
<?php if ($this->get_option('wpsg_form_validation') == '1') { ?>
-
- if (typeof jQuery.validationEngine == "object")
- {
-
- jQuery("#form-step2").validationEngine('attach', {promptPosition : "bottomLeft", scroll: false});
-
- jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function(){
- jQuery("#form-step2").validationEngine('detach');
+
+ if (typeof jQuery.validationEngine == 'object') {
+
+ jQuery('#form-step2').validationEngine('attach', {promptPosition : 'bottomLeft', scroll: false});
+
+ jQuery('.wpsg_mod_kundenverwaltung_login').bind('click', function() {
+
+ jQuery('#form-step2').validationEngine('detach');
+
});
}
-
+
<?php } else if ($this->get_option('wpsg_form_validation') == '2') { ?>
- jQuery.validator.addMethod("cRequired", jQuery.validator.methods.required, "<?php echo __('Dieses Feld ist ein Pflichtfeld.', 'wpsg'); ?>");
+ jQuery.validator.addMethod('cRequired', jQuery.validator.methods.required, '<?php echo esc_js(__('Dieses Feld ist ein Pflichtfeld.', 'wpsg')); ?>');
jQuery.validator.addClassRules('validate[required]', { cRequired: true } );
- jQuery("#form-step2").validate( {
+ jQuery('#form-step2').validate( {
ignore: '',
errorClass: 'wpsg_error',
onsubmit: false,
showErrors: function(errorMap, errorList) {
- this.defaultShowErrors();
+ this.defaultShowErrors();
}
- } );
+ } );
- jQuery('#wpsg_checkout2button').bind('click', function() {
+ jQuery('#wpsg_checkout2button').bind('click', function() {
var bReturn = jQuery('#form-step2').validate().form();
if (jQuery('#form-step2 input.wpsg_error').length > 0) jQuery('#form-step2 input.wpsg_error')[0].focus();
return bReturn;
-
+
} );
-
+
<?php } ?>
jQuery('.wpsg_checkout input').bind('keyup keypress', function(e) {
var jqThis = jQuery(this);
-
+
// Enter lass ich direkt durch
- if (jqThis.attr("type") === 'submit') return true;
-
+ if (jqThis.attr('type') === 'submit') return true;
+
var keyCode = e.keyCode || e.which;
-
+
if (keyCode == 13) {
-
+
if (jqThis.parents('.wpsg_loginform').length > 0) {
jQuery('input[name="wpsg_mod_kundenverwaltung_login"]').click();
-
+
} else {
-
+
jQuery('#wpsg_checkout2button').click();
-
+
}
-
- }
-
- } );
-
- } );
- <?php /* Copy&Paste für das Eingabefeld "E-Mail-Wiederholung sperren */ ?>
- window.onload = function() {
-
- var email2 = document.getElementById('email2');
+ }
- email2.onpaste = function(e) {
+ } );
- e.preventDefault();
+ } );
- }
- }
-
/* ]]> */</script>
<div class="wpsg alignwide wpsg_checkout">
- <?php echo $this->writeFrontendMessage(); ?>
-
+ <?php echo $this->writeFrontendMessage(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- HTML aus writeFrontendMessage(), die Meldungen setzt der Shop selbst ?>
+
<?php $GLOBALS['step'] = 2; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
-
- <form id="form-step2" method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>" enctype="multipart/form-data">
- <?php /* Einbindung des Logins im Checkout */ ?>
+ <?php $bSummary = \wpsg\ThemeStyle::isThemeMode(); /* Modus „neu“: Formular und „Ihre Bestellung“ nebeneinander (Punkt 8.10) */ ?>
+ <?php if ($bSummary) { ?><div class="wpsg-checkout__layout"><?php } ?>
+
+ <form id="form-step2" method="post" action="<?php echo esc_url($this->getURL(wpsg_ShopController::URL_BASKET)); ?>" enctype="multipart/form-data">
+
+ <?php /* Einbindung des Logins im Checkout */ ?>
<div class="wpsg_loginform">
<?php $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_login'); ?>
</div>
-
+
<div class="wpsg_box" id="wpsg_box_kundendaten">
-
+
<?php /*Wenn Kunden eingeloggt, oder wenn Kunde nicht eingeloggt */ ?>
<?php if ($this->callMod('wpsg_mod_kundenverwaltung', 'isLoggedIn')) { ?>
- <h2><?php echo __('Bitte überprüfen Sie Ihre Kundendaten','wpsg');?></h2>
- <?php } else { ?>
- <h2><?php echo __('Bitte geben Sie Ihre Kundendaten ein', 'wpsg'); ?></h2>
+ <h2><?php echo esc_html__('Bitte überprüfen Sie Ihre Kundendaten', 'wpsg'); ?></h2>
+ <?php } else { ?>
+ <h2><?php echo esc_html__('Bitte geben Sie Ihre Kundendaten ein', 'wpsg'); ?></h2>
<?php } ?>
-
+
<div class="wpsg_spacer"></div>
-
+
<div class="wpsg_inner">
-
+
<?php if ($this->view['pflicht']['firma'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_firma_block">
- <label for="wpsg_firma"><?php echo __("Firma:", "wpsg"); ?>
+ <label for="wpsg_firma"><?php echo esc_html__('Firma:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['firma'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("firma", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" name="wpsg[checkout][firma]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['firma'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['firma'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('firma', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_firma" autocomplete="organization" name="wpsg[checkout][firma]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['firma']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['anrede'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_anrede">
- <label for="wpsg_title"><?php echo __('Anrede:', 'wpsg'); ?>
+ <label for="wpsg_title"><?php echo esc_html__('Anrede:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['anrede'] != '1') { ?><span class="wpsg_required">*</span><?php } ?></label>
- <select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("title", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" name="wpsg[checkout][title]">
- <option value="-1"><?php echo __('Bitte auswählen', 'wpsg'); ?></option>
- <?php $i=0; foreach (explode("|", $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
- <option value="<?php echo $i; /*wpsg_hspc($t);*/ ?>" <?php echo ((strval($this->view['basket']['checkout']['title'] ?? '-1') === strval($i))?'selected="selected"':''); ?>><?php echo $t; $i++; ?></option>
- <?php } ?>
+ <select class="<?php echo (($this->view['pflicht']['anrede'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('title', (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_title" autocomplete="honorific-prefix" name="wpsg[checkout][title]">
+ <option value="-1"><?php echo esc_html__('Bitte auswählen', 'wpsg'); ?></option>
+ <?php $i = 0; foreach (explode('|', $this->view['pflicht']['anrede_auswahl']) as $t) { ?>
+ <option value="<?php echo esc_attr($i); ?>" <?php echo ((strval(($this->view['basket']['checkout']['title']??'-1')) === strval($i))?'selected="selected"':''); ?>><?php echo wpsg_hspc($t); $i++; ?></option>
+ <?php } ?>
</select>
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['vname'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_vorname">
- <label for="vname" class="wpsg_checkout"><?php echo __("Vorname:", "wpsg"); ?>
+ <label for="vname" class="wpsg_checkout"><?php echo esc_html__('Vorname:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['vname'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
<input
- class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("vname", (array)$this->view['error']))?'wpsg_error':''); ?>"
+ class="<?php echo (($this->view['pflicht']['vname'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('vname', (array)$this->view['error']))?'wpsg_error':''); ?>"
type="text"
id="vname"
- autocomplete="vname"
+ autocomplete="given-name"
name="wpsg[checkout][vname]"
- value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['vname'])); ?>"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['vname']??''); ?>"
/>
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['name'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_name">
- <label for="name" class="wpsg_checkout"><?php echo __("Name:", "wpsg"); ?>
+ <label for="name" class="wpsg_checkout"><?php echo esc_html__('Name:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['name'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
<input
- class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("name", (array)$this->view['error']))?'wpsg_error':''); ?>"
+ class="<?php echo (($this->view['pflicht']['name'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('name', (array)$this->view['error']))?'wpsg_error':''); ?>"
type="text"
id="name"
- autocomplete="name"
+ autocomplete="family-name"
name="wpsg[checkout][name]"
- value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['name'])); ?>"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['name']??''); ?>"
/>
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['email'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_email">
- <label for="email" class="wpsg_checkout"><?php echo __("E-Mail Adresse:", "wpsg"); ?>
+ <label for="email" class="wpsg_checkout"><?php echo esc_html__('E-Mail Adresse:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input
- class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email", (array)$this->view['error']))?'wpsg_error':''); ?>"
- type="email"
- id="email"
- name="wpsg[checkout][email]"
- value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['email'])); ?>"
- autocomplete="off"
- />
+ <input
+ class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('email', (array)$this->view['error']))?'wpsg_error':''); ?>"
+ type="email"
+ id="email"
+ name="wpsg[checkout][email]"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['email']??''); ?>"
+ autocomplete="email"
+ />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['email'] != '2') { ?>
<?php if (isset($this->view['pflicht']['emailconfirm']) && $this->view['pflicht']['emailconfirm'] == '1') { ?>
<div class="wpsg_checkoutblock" id="wpsg_email2">
- <label for="email" class="wpsg_checkout"><?php echo __("E-Mail (Wiederholung):", "wpsg"); ?>
+ <label for="email2" class="wpsg_checkout"><?php echo esc_html__('E-Mail (Wiederholung):', 'wpsg'); ?>
<?php if ($this->view['pflicht']['email'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input
- class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("email2", (array)$this->view['error']))?'wpsg_error':''); ?>"
- type="email"
- id="email2"
- name="wpsg[checkout][email2]"
- value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['email2'])); ?>"
- autocomplete="off"
- />
+ <input
+ class="wpsg_input_text <?php echo (($this->view['pflicht']['email'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('email2', (array)$this->view['error']))?'wpsg_error':''); ?>"
+ type="email"
+ id="email2"
+ name="wpsg[checkout][email2]"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['email2']??''); ?>"
+ autocomplete="email"
+ />
</div>
<?php } ?>
<?php } ?>
-
+
<?php if (intval($this->view['pflicht']['eInvoice']??0) === 1) { ?>
<div class="wpsg_checkoutblock" id="wpsg_email_einvoice">
- <label for="wpsg_email_einvoice_input" class="wpsg_checkout"><?php echo __("E-Mail (für eRechnung, optional)", "wpsg"); ?></label>
+ <label for="wpsg_email_einvoice_input" class="wpsg_checkout"><?php echo esc_html__('E-Mail (für eRechnung, optional)', 'wpsg'); ?></label>
<input
- class="wpsg_input_text wpsg_checkout <?php echo ((in_array("email_einvoice", (array)$this->view['error']))?'wpsg_error':''); ?>"
+ class="wpsg_input_text wpsg_checkout <?php echo ((in_array('email_einvoice', (array)$this->view['error']))?'wpsg_error':''); ?>"
type="email"
id="wpsg_email_einvoice_input"
name="wpsg[checkout][email_einvoice]"
- value="<?php echo htmlspecialchars($this->view['basket']['checkout']['email_einvoice']??''); ?>"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['email_einvoice']??''); ?>"
autocomplete="off"
/>
</div>
<?php } ?>
<?php if (intval($this->view['pflicht']['leitweg']??0) === 1) { ?>
- <div class="wpsg_checkoutblock" id="wpsg_leitweg_id">
- <label for="wpsg_leitweg_id_input" class="wpsg_checkout"><?php echo __("Leitweg-ID (für eRechnung, optional)", "wpsg"); ?></label>
- <input
- class="wpsg_input_text wpsg_checkout <?php echo ((in_array("leitweg_id", (array)$this->view['error']))?'wpsg_error':''); ?>"
- type="text"
- id="wpsg_email_leitweg_id_input"
- name="wpsg[checkout][leitweg_id]"
- value="<?php echo htmlspecialchars($this->view['basket']['checkout']['leitweg_id']??''); ?>"
- autocomplete="off"
- />
- </div>
+ <div class="wpsg_checkoutblock" id="wpsg_leitweg_id">
+ <label for="wpsg_email_leitweg_id_input" class="wpsg_checkout"><?php echo esc_html__('Leitweg-ID (für eRechnung, optional)', 'wpsg'); ?></label>
+ <input
+ class="wpsg_input_text wpsg_checkout <?php echo ((in_array('leitweg_id', (array)$this->view['error']))?'wpsg_error':''); ?>"
+ type="text"
+ id="wpsg_email_leitweg_id_input"
+ name="wpsg[checkout][leitweg_id]"
+ value="<?php echo wpsg_hspc($this->view['basket']['checkout']['leitweg_id']??''); ?>"
+ autocomplete="off"
+ />
+ </div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['geb'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_geburtsdatum">
- <label for="geb" class="wpsg_checkout"><?php echo __('Geburtsdatum (Format: TT.MM.JJJJ):',"wpsg"); ?>
+ <label for="geb" class="wpsg_checkout"><?php echo esc_html__('Geburtsdatum (Format: TT.MM.JJJJ):', 'wpsg'); ?>
<?php if ($this->view['pflicht']['geb'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("geb", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" name="wpsg[checkout][geb]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['geb'])); ?>" />
+ <input class="wpsg_input_text <?php echo (($this->view['pflicht']['geb'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('geb', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="geb" autocomplete="bday" name="wpsg[checkout][geb]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['geb']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['fax'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_fax">
- <label for="fax" class="wpsg_checkout"><?php echo __("Fax.:", "wpsg"); ?>
+ <label for="fax" class="wpsg_checkout"><?php echo esc_html__('Fax.:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['fax'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("fax", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="fax" name="wpsg[checkout][fax]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['fax'])); ?>" />
+ <input class="wpsg_input_text <?php echo (($this->view['pflicht']['fax'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('fax', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="fax" autocomplete="fax tel" name="wpsg[checkout][fax]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['fax']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['tel'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_telefon">
- <label for="tel" class="wpsg_checkout"><?php echo __("Tel.:", "wpsg"); ?>
+ <label for="tel" class="wpsg_checkout"><?php echo esc_html__('Tel.:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['tel'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("tel", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="tel" name="wpsg[checkout][tel]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['tel'])); ?>" />
+ <input class="wpsg_input_text <?php echo (($this->view['pflicht']['tel'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('tel', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="tel" autocomplete="tel" name="wpsg[checkout][tel]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['tel']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['strasse'] != '2') { ?>
-
- <?php if (wpsg_isSizedInt($this->view['pflicht']['wpsg_showNr'])) { ?>
-
+
+ <?php if (is_numeric($this->view['pflicht']['wpsg_showNr']??null) && $this->view['pflicht']['wpsg_showNr'] > 0) { ?>
+
<div class="wpsg_checkoutblock" id="wpsg_streetnr">
- <label for="strasse" class="street wpsg_checkout"><?php echo __('Straße:', 'wpsg'); ?>
+ <label for="strasse" class="street wpsg_checkout"><?php echo esc_html__('Straße:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
- <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['strasse'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('strasse', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" autocomplete="address-line1" name="wpsg[checkout][strasse]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']??''); ?>" />
</label>
- <label for="nr" class="nr wpsg_checkout"><?php echo __('Nr:', 'wpsg'); ?>
+ <label for="nr" class="nr wpsg_checkout"><?php echo esc_html__('Nr:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
- <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("nr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[checkout][nr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['nr'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('nr', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="nr" name="wpsg[checkout][nr]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['nr']??''); ?>" />
</label>
</div>
-
+
<?php } else { ?>
<div class="wpsg_checkoutblock" id="wpsg_strasse">
- <label for="strasse" class="wpsg_checkout"><?php echo __("Straße, Nr.:", "wpsg"); ?>
+ <label for="strasse" class="wpsg_checkout"><?php echo esc_html__('Straße, Nr.:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['strasse'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("strasse", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" name="wpsg[checkout][strasse]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['strasse'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['strasse'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('strasse', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="strasse" autocomplete="address-line1" name="wpsg[checkout][strasse]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['strasse']??''); ?>" />
</div>
-
+
<?php } ?>
-
+
<?php } ?>
-
+
<?php if ($this->view['pflicht']['plz'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_postleitzahl">
- <label for="plz" class="wpsg_checkout"><?php echo __("Postleitzahl:", "wpsg"); ?>
+ <label for="plz" class="wpsg_checkout"><?php echo esc_html__('Postleitzahl:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['plz'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("plz", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" name="wpsg[checkout][plz]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['plz'])); ?>" />
+ <input class="wpsg_input_text <?php echo (($this->view['pflicht']['plz'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('plz', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="plz" autocomplete="postal-code" name="wpsg[checkout][plz]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['plz']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['ort'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_ort">
- <label for="ort" class="wpsg_checkout"><?php echo __("Ort:", "wpsg"); ?>
+ <label for="ort" class="wpsg_checkout"><?php echo esc_html__('Ort:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['ort'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ort", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" name="wpsg[checkout][ort]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['ort'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['ort'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('ort', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="ort" autocomplete="address-level2" name="wpsg[checkout][ort]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['ort']??''); ?>" />
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['land'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_land_block">
- <label for="wpsg_land" class="wpsg_checkout"><?php echo __("Land:", "wpsg"); ?>
+ <label for="wpsg_land" class="wpsg_checkout"><?php echo esc_html__('Land:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['land'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
- </label>
- <select name="wpsg[checkout][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("land", (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land">
- <option value="-1"><?php echo __('Bitte auswählen', 'wpsg'); ?></option>
+ </label>
+ <select name="wpsg[checkout][land]" class="<?php echo (($this->view['pflicht']['land'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('land', (array)$this->view['error']))?'wpsg_error':''); ?>" id="wpsg_land" autocomplete="country-name">
+ <option value="-1"><?php echo esc_html__('Bitte auswählen', 'wpsg'); ?></option>
<?php foreach ($this->view['laender'] as $l) { ?>
- <option value="<?php echo wpsg_hspc($l['id']); ?>" <?php echo (($l['id'] == $this->view['basket']['checkout']['land'])?'selected="selected"':((!wpsg_isSizedInt($this->view['basket']['checkout']['land']) && $this->get_option('wpsg_defaultland') == $l['id'])?'selected="selected"':'')); ?>><?php echo wpsg_hspc(__($l['name'], 'wpsg')); ?></option>
+ <option value="<?php echo wpsg_hspc($l['id']); ?>" <?php echo (($l['id'] == $this->view['basket']['checkout']['land'])?'selected="selected"':((!(is_numeric($this->view['basket']['checkout']['land']??null) && $this->view['basket']['checkout']['land'] > 0) && $this->get_option('wpsg_defaultland') == $l['id'])?'selected="selected"':'')); ?>><?php echo wpsg_hspc(__($l['name'], 'wpsg')); ?></option>
<?php } ?>
</select>
</div>
<?php } ?>
-
+
<?php if ($this->view['pflicht']['ustidnr'] != '2') { ?>
<div class="wpsg_checkoutblock" id="wpsg_ustidnr_block">
- <label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo __("UStIdNr.:", "wpsg"); ?>
+ <label for="wpsg_ustidnr" class="wpshopgermany_checkout"><?php echo esc_html__('UStIdNr.:', 'wpsg'); ?>
<?php if ($this->view['pflicht']['ustidnr'] != '1') { ?><span class="wpsg_required">*</span><?php } ?>
</label>
- <input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array("ustidnr", (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo htmlspecialchars(wpsg_getStr($this->view['basket']['checkout']['ustidnr'])); ?>" />
+ <input class="<?php echo (($this->view['pflicht']['ustidnr'] != '1')?'validate[required]':''); ?> wpsg_checkout <?php echo ((in_array('ustidnr', (array)$this->view['error']))?'wpsg_error':''); ?>" type="text" id="wpsg_ustidnr" name="wpsg[checkout][ustidnr]" value="<?php echo wpsg_hspc($this->view['basket']['checkout']['ustidnr']??''); ?>" />
</div>
<?php } ?>
-
+
<?php /* Automatische Einbindung der benutzerdefinierten Felder */ ?>
<?php if ($this->get_option('wpsg_kundenvariablen_show') == '1') { ?>
<?php foreach ((array)$this->view['pflicht']['custom'] as $c_id => $c) { if ($c['show'] != '2') { ?>
<div class="wpsg_checkoutblock">
- <label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo $c_id; ?>">
+ <label class="wpsg_cv wpsg_checkout" for="wpsg_cv_<?php echo esc_attr($c_id); ?>">
<?php echo wpsg_hspc(__($c['name'], 'wpsg')); ?><?php if ($c['show'] == '0') { ?> <span class="wpsg_required">*</span><?php } ?>:
- </label>
- <?php if ($c['typ'] == '0') { // Textfeld ?>
- <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" type="text" value="<?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
- <?php } else if ($c['typ'] == '1') { $arAuswahl = explode("|", $c['auswahl']); // Auswahlfeld ?>
- <select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array("custom_".$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo $c_id; ?>]">
- <option value="-1"><?php echo __('Bitte auswählen', 'wpsg'); ?></option>
- <?php foreach ((array)$arAuswahl as $a) { ?>
- <option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == @$this->view['basket']['checkout']['custom'][$c_id])?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
- <?php } ?>
- </select>
- <?php } else if ($c['typ'] == '2') { // Checkbox ?>
- <input type="hidden" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="0" />
- <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo $c_id; ?>]" value="1" <?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc(($this->view['basket']['checkout']['custom'][$c_id] == '1')?'checked="checked"':''); ?> />
- <?php } ?>
+ </label>
+ <?php /* Textfeld */ ?>
+ <?php if ($c['typ'] == '0') { ?>
+ <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array('custom_'.$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo esc_attr($c_id); ?>]" type="text" value="<?php if (isset($this->view['basket']['checkout']['custom'][$c_id])) echo wpsg_hspc($this->view['basket']['checkout']['custom'][$c_id]); ?>" />
+ <?php } else if ($c['typ'] == '1') { ?>
+ <?php /* Auswahlfeld */ $arAuswahl = explode('|', $c['auswahl']); ?>
+ <select class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> <?php echo ((in_array('custom_'.$c_id, (array)$this->view['error']))?'wpsg_error':''); ?>" name="wpsg[checkout][custom][<?php echo esc_attr($c_id); ?>]">
+ <option value="-1"><?php echo esc_html__('Bitte auswählen', 'wpsg'); ?></option>
+ <?php foreach ((array)$arAuswahl as $a) { ?>
+ <option value="<?php echo wpsg_hspc($a); ?>" <?php echo (($a == ($this->view['basket']['checkout']['custom'][$c_id]??null))?'selected="selected"':''); ?>><?php echo wpsg_hspc($a); ?></option>
+ <?php } ?>
+ </select>
+ <?php } else if ($c['typ'] == '2') { ?>
+ <?php /* Checkbox */ ?>
+ <input type="hidden" name="wpsg[checkout][custom][<?php echo esc_attr($c_id); ?>]" value="0" />
+ <input class="<?php echo (($c['show'] == '0')?'validate[required]':''); ?> checkbox" type="checkbox" value="1" name="wpsg[checkout][custom][<?php echo esc_attr($c_id); ?>]" value="1" <?php if (isset($this->view['basket']['checkout']['custom'][$c_id]) && $this->view['basket']['checkout']['custom'][$c_id] == '1') echo 'checked="checked"'; ?> />
+ <?php } ?>
</div>
<?php } } ?>
<?php } ?>
<?php /* Automatische Einbindung der benutzerdefinierten Kundenfelder ENDE */ ?>
<div class="wpsg_clear"></div>
-
+
<?php /* $this->callMods('checkout_customer_inner'); START */ ?>
-
- <?php /* Passwortabfrage für Neuregistrierung */ ?>
- <?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); ?>
-
+
+ <?php /* Passwortabfrage für Neuregistrierung */ ?>
+ <?php echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- HTML des Moduls ?>
+
<?php /*echo $this->callMod('wpsg_mod_kundenverwaltung', 'checkout_customer_inner'); */ ?>
-
+
<?php /* Abfrage Satollo-Newsletter */ ?>
- <?php echo $this->callMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); ?>
-
+ <?php echo $this->callMod('wpsg_mod_nlsatolo', 'checkout_customer_inner'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- HTML des Moduls ?>
+
<?php /* Einverständnisabfrage Trusted Shops */ ?>
- <?php echo $this->callMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); ?>
-
+ <?php echo $this->callMod('wpsg_mod_trustedshops', 'checkout_customer_inner'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- HTML des Moduls ?>
+
<?php /* Newsletter Integration */ ?>
- <?php echo $this->callMod('wpsg_mod_newsletter', 'checkout_customer_inner'); ?>
-
+ <?php echo $this->callMod('wpsg_mod_newsletter', 'checkout_customer_inner'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- HTML des Moduls ?>
+
<?php /* $this->callMods('checkout_customer_inner'); ENDE */ ?>
-
+
</div>
-
+
</div>
-
- <?php $this->callMods('checkout_inner_prebutton', array(&$this->view)); ?>
-
+
+ <?php $this->callMods('checkout_inner_prebutton', [&$this->view]); ?>
+
<div class="wpsg_clear"></div>
-
+
<div class="wpsg_box">
-
- <h2><?php echo __('Bestellkommentar', 'wpsg'); ?></h2>
-
+
+ <h2 id="wpsg_checkout_comment_title"><?php echo esc_html__('Bestellkommentar', 'wpsg'); ?></h2>
+
<div class="wpsg_spacer"></div>
-
+
<div class="wpsg_inner wpsg_commentblock">
- <textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment"><?php echo wpsg_getStr($this->view['basket']['checkout']['comment']); ?></textarea>
+ <textarea name="wpsg[checkout][comment]" id="wpsg_checkout_comment" aria-labelledby="wpsg_checkout_comment_title"><?php echo esc_textarea($this->view['basket']['checkout']['comment']??''); ?></textarea>
</div>
</div>
-
+
<div class="wpsg_mandatoryfield_hint">
- <?php echo wpsg_translate(__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="wpsg_required">*</span>'); ?>
+ <?php echo wp_kses_post(wpsg_translate(esc_html__('Mit #1# gekennzeichnete Felder sind Pflichtfelder.', 'wpsg'), '<span class="wpsg_required">*</span>')); ?>
</div>
-
+
<br />
-
+
<?php $this->ClearSessionErrors(); ?>
-
- <input type="submit" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>'; return false;" class="wpsg_button wpsg_basketbutton" value="<?php echo __('zurück zum Warenkorb', 'wpsg'); ?>" name="wpsg_redirect_basket" />
- <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_checkout2button" value="<?php echo __('weiter', 'wpsg'); ?>" name="wpsg_checkout" />
-
+
+ <?php if (\wpsg\ThemeStyle::isThemeMode()) { /* Modus „neu“: Zurück als Link, er speichert nichts (Punkt 8.12) */ ?>
+ <a class="wpsg-checkout__back" href="<?php echo esc_url($this->getURL(wpsg_ShopController::URL_BASKET)); ?>"><?php echo esc_html__('Zurück zum Warenkorb', 'wpsg'); ?></a>
+ <?php } else { ?>
+ <input type="submit" onclick="location.href='<?php echo esc_js($this->getURL(wpsg_ShopController::URL_BASKET)); ?>'; return false;" class="wpsg_button wpsg_basketbutton<?php echo wpsg_button_class(); ?>" value="<?php echo esc_attr__('zurück zum Warenkorb', 'wpsg'); ?>" name="wpsg_redirect_basket" />
+ <?php } ?>
+ <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_checkout2button<?php echo wpsg_button_class(); ?>" value="<?php echo esc_attr__('weiter', 'wpsg'); ?>" name="wpsg_checkout" />
+
<div class="wpsg_clear"></div>
-
- <br />
-
+
+ <br />
+
</form>
-
+
+ <?php if ($bSummary) { $this->render(WPSG_PATH_VIEW.'/warenkorb/checkout_summary.phtml'); ?></div><?php } ?>
+
<script type="text/javascript">/* <![CDATA[ */
jQuery(document).ready(function() {
- jQuery('#wpsg_checkout_set_comment').bind('change', function() {
- if (jQuery(this).attr('checked') == true || jQuery(this).attr('checked') == "checked") jQuery('#wpsg_checkout_comment').show();
+
+ jQuery('#wpsg_checkout_set_comment').bind('change', function() {
+
+ if (jQuery(this).attr('checked') == true || jQuery(this).attr('checked') == 'checked') jQuery('#wpsg_checkout_comment').show();
else jQuery('#wpsg_checkout_comment').hide();
- } );
- } );
-
- <?php if ($this->hasMod('wpsg_mod_addressvalidation')) { ?>
- validateAddressBind( {
- Strasse: '#strasse',
- Nr: '#nr',
- Ort: '#ort',
- PLZ: '#plz',
- Land: '#wpsg_land',
- Key: '<?php echo $this->get_option('wpsg_mod_addressvalidation_apikey');?>',
- StorageKey: 'KundenAddress',
- MsgTeil1: 'Kundenadresse'
} );
- <?php } ?>
-
- //} );
+
+ } );
/* ]]> */</script>
-
+
</div>
\ No newline at end of file diff --git a/views/warenkorb/checkout2.phtml b/views/warenkorb/checkout2.phtml index 5137a4b..84d1ac8 100644 --- a/views/warenkorb/checkout2.phtml +++ b/views/warenkorb/checkout2.phtml @@ -2,6 +2,7 @@ /**
* Template für die Eingabe der Zahlungs- und Versandinformationen
+ * @version 4.6.1
*/
//wpsg_debug($this->view['basket']['checkout']);
@@ -14,6 +15,9 @@ <?php $GLOBALS['step'] = 3; $this->render(WPSG_PATH_VIEW.'/warenkorb/progress.phtml'); ?>
+ <?php $bSummary = \wpsg\ThemeStyle::isThemeMode(); /* Modus „neu“: Formular und „Ihre Bestellung“ nebeneinander (Punkt 8.10) */ ?>
+ <?php if ($bSummary) { ?><div class="wpsg-checkout__layout"><?php } ?>
+
<form id="wpsg_checkout_form" method="post" action="<?php echo $this->getURL(wpsg_ShopController::URL_BASKET); ?>">
<input type="hidden" value="1" name="wpsg[checkout][send]" />
@@ -100,12 +104,18 @@ <?php $this->callMods('checkout2_inner_prebutton', array(&$this->view)); ?>
- <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_overviewbutton" value="<?php echo __('weiter', 'wpsg'); ?>" name="wpsg_checkout2" />
- <input type="submit" class="wpsg_button wpsg_checkoutbutton" value="<?php echo __('zurück', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
+ <input type="submit" id="wpsg_checkout2button" class="wpsg_button wpsg_overviewbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('weiter', 'wpsg'); ?>" name="wpsg_checkout2" />
+ <?php if (\wpsg\ThemeStyle::isThemeMode()) { /* Modus „neu“: Zurück als Link, er speichert nichts (Punkt 8.12) */ ?>
+ <a class="wpsg-checkout__back" href="<?php echo esc_url($this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?>"><?php echo esc_html__('Zurück zu den Kundendaten', 'wpsg'); ?></a>
+ <?php } else { ?>
+ <input type="submit" class="wpsg_button wpsg_checkoutbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('zurück', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
+ <?php } ?>
<div class="wpsg_clear"></div>
</form>
+
+ <?php if ($bSummary) { $this->render(WPSG_PATH_VIEW.'/warenkorb/checkout_summary.phtml'); ?></div><?php } ?>
<div style="position:fixed; left:0; top:0; width:100vw; height:100vh; background-color:rgba(255, 255, 255, 0.5); display:none;" id="pppl_loading_blocker"></div>
diff --git a/views/warenkorb/checkout_summary.phtml b/views/warenkorb/checkout_summary.phtml new file mode 100644 index 0000000..cd0979e --- /dev/null +++ b/views/warenkorb/checkout_summary.phtml @@ -0,0 +1,85 @@ +<?php + + /** + * „Ihre Bestellung“ neben dem Formular der Kasse, nur im Modus „neu“ (Punkt 8.10) + * + * Posten, Versandkosten, Zahlungsart, Rabatt, Summe und die enthaltene MwSt. aus dem Warenkorb ($this->view['basket']). + * @version 4.6.1 + */ + + if (!defined('ABSPATH')) exit; + + $arBasket = (array)($this->view['basket']??[]); + $arSum = (array)($arBasket['sum']??[]); + $currency = $this->get_option('wpsg_currency'); + $arCheckout = (array)($arBasket['checkout']??[]); + $shipping_name = (string)($this->arShipping[$arCheckout['shipping']??'']['name']??''); + $payment_name = (string)($this->arPayment[$arCheckout['payment']??'']['name']??''); + $bKU = (get_option('wpsg_kleinunternehmer') == '1'); + $bNetto = (!$bKU && $this->getFrontendTaxview() == WPSG_NETTO); + +?> +<aside class="wpsg-checkout__summary" aria-labelledby="wpsg-checkout-summary-title"> + + <h2 id="wpsg-checkout-summary-title" class="wpsg-checkout__summary-title"><?php echo esc_html__('Ihre Bestellung', 'wpsg'); ?></h2> + + <ul class="wpsg-checkout__summary-items"> + <?php foreach ((array)($arBasket['produkte']??[]) as $product_data) { $name = (((string)($product_data['detailname']??'') !== '')?$product_data['detailname']:($product_data['name']??'')); ?> + <li class="wpsg-checkout__summary-row"> + <span> + <?php /* translators: 1: Menge, 2: Produktname */ echo esc_html(sprintf(__('%1$s × %2$s', 'wpsg'), (string)$product_data['menge'], (string)$name)); ?> + <?php $product_key = (string)($product_data['product_key']??($product_data['id']??'')); if ($this->hasMod('wpsg_mod_productvariants') && preg_match('/pv_(.*)/', $product_key)) { $arVariant = (array)$this->callMod('wpsg_mod_productvariants', 'getVariantenInfoArray', [$product_key]); ?> + <span class="wpsg-checkout__summary-variant"><?php echo esc_html(rtrim(trim((string)($arVariant['key']??'')), ';')); ?></span> + <?php } ?> + </span> + <span><?php echo esc_html(wpsg_ff(floatval($product_data['menge']) * floatval($product_data['preis']), $currency)); ?></span> + </li> + <?php } ?> + </ul> + + <?php if (wpsg_tf($arSum['preis_rabatt']??0) > 0) { ?> + <div class="wpsg-checkout__summary-row is-muted"> + <span><?php echo esc_html__('Rabatt', 'wpsg'); ?></span> + <span><?php echo esc_html('-'.wpsg_ff($arSum['preis_rabatt'], $currency)); ?></span> + </div> + <?php } ?> + + <?php if (isset($arSum['preis_shipping']) && (wpsg_tf($arSum['preis_shipping']) != 0 || $this->get_option('wpsg_hideemptyshipping') != '1')) { ?> + <div class="wpsg-checkout__summary-row is-muted"> + <span><?php echo esc_html__('Versandkosten', 'wpsg'); ?><?php if ($shipping_name !== '') { ?> <span class="wpsg-checkout__summary-detail"><?php echo esc_html(__($shipping_name, 'wpsg')); ?></span><?php } ?></span> + <span><?php echo esc_html(wpsg_ff($arSum['preis_shipping'], $currency)); ?></span> + </div> + <?php } ?> + + <?php if (wpsg_tf($arSum['preis_payment']??0) != 0) { ?> + <div class="wpsg-checkout__summary-row is-muted"> + <span><?php echo esc_html__('Zahlungsart', 'wpsg'); ?><?php if ($payment_name !== '') { ?> <span class="wpsg-checkout__summary-detail"><?php echo esc_html(__($payment_name, 'wpsg')); ?></span><?php } ?></span> + <span><?php echo esc_html(wpsg_ff($arSum['preis_payment'], $currency)); ?></span> + </div> + <?php } ?> + + <?php if ($bNetto) { /* wie der Warenkorb: netto, zzgl. MwSt., brutto */ ?> + <div class="wpsg-checkout__summary-row"> + <span><?php echo esc_html__('Gesamtpreis (Netto)', 'wpsg'); ?></span> + <span><?php echo esc_html(wpsg_ff($arSum['preis_gesamt_netto']??0, $currency)); ?></span> + </div> + <?php foreach ((array)($arBasket['mwst']??[]) as $mwst) { ?> + <div class="wpsg-checkout__summary-row is-muted"> + <span><?php /* translators: %s: Steuersatz */ echo esc_html(sprintf(__('zzgl. MwSt. (%s)', 'wpsg'), __($mwst['name'], 'wpsg'))); ?></span> + <span><?php echo esc_html(wpsg_ff($mwst['sum'], $currency)); ?></span> + </div> + <?php } ?> + <?php } ?> + + <div class="wpsg-checkout__summary-row wpsg-checkout__summary-total"> + <span><?php echo esc_html($bNetto?__('Gesamtpreis (Brutto)', 'wpsg'):__('Summe', 'wpsg')); ?></span> + <span><?php echo esc_html(wpsg_ff($arSum['preis_gesamt_brutto']??0, $currency)); ?></span> + </div> + + <?php if ($bKU) { ?> + <p class="wpsg-checkout__summary-tax"><?php echo wp_kses_post((string)get_option('wpsg_kleinunternehmer_text')); ?></p> + <?php } else if (!$bNetto) { foreach ((array)($arBasket['mwst']??[]) as $mwst) { ?> + <p class="wpsg-checkout__summary-tax"><?php /* translators: 1: Steuersatz, 2: Betrag */ echo esc_html(sprintf(__('enthält MwSt. (%1$s): %2$s', 'wpsg'), __($mwst['name'], 'wpsg'), wpsg_ff($mwst['sum'], $currency))); ?></p> + <?php } } ?> + +</aside> diff --git a/views/warenkorb/customerquestion.phtml b/views/warenkorb/customerquestion.phtml index 95ba68c..261b2cc 100644 --- a/views/warenkorb/customerquestion.phtml +++ b/views/warenkorb/customerquestion.phtml @@ -2,6 +2,7 @@ /**
* Zeigt die Abfrage nach der EU - Leistungsortregel an
+ * @version 4.6.1
*/
?>
@@ -39,7 +40,7 @@ </div>
<div class="button_wrap">
- <input id="customerquestion_ok_button" type="submit" name="wpsg_submit" class="wpsg_button" value="<?php echo __('OK', 'wpsg'); ?>" />
+ <input id="customerquestion_ok_button" type="submit" name="wpsg_submit" class="wpsg_button<?php echo wpsg_button_class(); ?>" value="<?php echo __('OK', 'wpsg'); ?>" />
</div>
</form>
diff --git a/views/warenkorb/done.phtml b/views/warenkorb/done.phtml index 2ef286c..a216d4d 100644 --- a/views/warenkorb/done.phtml +++ b/views/warenkorb/done.phtml @@ -2,6 +2,7 @@ /**
* Template, welches nach erfolgreicher Bestellung angezeigt wird
+ * @version 4.6.1
*/
/*
diff --git a/views/warenkorb/index.phtml b/views/warenkorb/index.phtml index c654fdd..3e0e947 100644 --- a/views/warenkorb/index.phtml +++ b/views/warenkorb/index.phtml @@ -2,6 +2,7 @@ /**
* Template für das Warenkorb Widget
+ * @version 4.6.1
*/
?>
@@ -80,7 +81,7 @@ </span>
<?php if (get_the_ID() !== intval($this->get_option('wpsg_page_basket')) || (($_REQUEST['wpsg']['action']??'') === 'widget')) { ?>
- <input type="button" class="button wpsg_button wpshopgermany_linktokasse" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController:: URL_BASKET); ?>';" value="<?php echo __("Zum Warenkorb", "wpsg"); ?>" />
+ <input type="button" class="button wpsg_button wpshopgermany_linktokasse<?php echo wpsg_button_class(); ?>" onclick="location.href='<?php echo $this->getURL(wpsg_ShopController:: URL_BASKET); ?>';" value="<?php echo __("Zum Warenkorb", "wpsg"); ?>" />
<?php } ?>
<?php } else { ?>
diff --git a/views/warenkorb/kundendaten_renderfield.phtml b/views/warenkorb/kundendaten_renderfield.phtml index ef3ec09..163ba32 100644 --- a/views/warenkorb/kundendaten_renderfield.phtml +++ b/views/warenkorb/kundendaten_renderfield.phtml @@ -2,6 +2,7 @@ /**
* Zeichnet eine einzelne Kundenvariable innerhalb des checkout.phtml
+ * @version 4.6.1
*/
?>
diff --git a/views/warenkorb/messageDialog.phtml b/views/warenkorb/messageDialog.phtml index 7d70a4d..4a7ac74 100644 --- a/views/warenkorb/messageDialog.phtml +++ b/views/warenkorb/messageDialog.phtml @@ -3,6 +3,7 @@ /**
* Template wird verwendet wenn Meldungen vom Shop nicht ausgegeben werden konnte.
* Beispielsweise wenn Produktvariable auf einem Produkttemplate abgefragt und Pflichtfeld ist
+ * @version 4.6.1
*/
?>
diff --git a/views/warenkorb/overview.phtml b/views/warenkorb/overview.phtml index a128dd2..31c25a2 100644 --- a/views/warenkorb/overview.phtml +++ b/views/warenkorb/overview.phtml @@ -3,6 +3,7 @@ /**
* Template für die Zusammenfassung der Bestellung
* Anzeige vor dem Abschluss einer Bestellung
+ * @version 4.6.1
*/
if ($this->getFrontendTaxView() === WPSG_BRUTTO) $display_brutto_netto = 'brutto';
@@ -504,15 +505,15 @@ <?php if (\wpsg\WarrantyLabel::isNeed()) { ?>
<?php if (\wpsg\WarrantyLabel::getLayout() === wpsg_ShopController::WARRANTYLABEL_INLINE) { ?>
<div class="garan_label_wrap">
- <img src="<?php echo wpsg_ShopController::getShop()->getRessourceURL('gfx/garan/legal_guarantee_notice_den.jpg'); ?>" alt="<?php echo __('GARAN Gewährleistungslabel', 'wpsg'); ?>" />
+ <img src="<?php echo esc_url(wpsg_ShopController::getShop()->getRessourceURL('gfx/garan/legal_guarantee_notice_den.jpg')); ?>" alt="<?php echo esc_attr(__('GARAN Gewährleistungslabel', 'wpsg')); ?>" width="1200" height="1697" />
</div>
<?php } else { ?>
<div class="garan_label_popup" id="wpsg_garan_label_popup">
<div class="garan_label_popup_inner">
<div class="garan_label_popup_image">
- <img src="<?php echo esc_url(wpsg_ShopController::getShop()->getRessourceURL('gfx/garan/legal_guarantee_notice_den.jpg')); ?>" alt="<?php echo esc_attr(__('GARAN Gewährleistungslabel', 'wpsg')); ?>" />
+ <img src="<?php echo esc_url(wpsg_ShopController::getShop()->getRessourceURL('gfx/garan/legal_guarantee_notice_den.jpg')); ?>" alt="<?php echo esc_attr(__('GARAN Gewährleistungslabel', 'wpsg')); ?>" width="1200" height="1697" />
</div>
- <button type="button" class="garan_label_popup_confirm" id="wpsg_garan_label_popup_confirm"><?php echo __('Zur Kenntnis genommen', 'wpsg'); ?></button>
+ <button type="button" class="garan_label_popup_confirm<?php echo wpsg_button_class(); ?>" id="wpsg_garan_label_popup_confirm"><?php echo __('Zur Kenntnis genommen', 'wpsg'); ?></button>
</div>
</div>
<noscript>
@@ -533,10 +534,14 @@ <?php } ?>
<?php } ?>
- <input type="submit" class="wpsg_checkoutbutton" value="<?php echo __('zurück', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
+ <?php if (\wpsg\ThemeStyle::isThemeMode()) { /* Modus „neu“: Zurück als Link, er speichert nichts (Punkt 8.12) */ ?>
+ <a class="wpsg-checkout__back" href="<?php echo esc_url($this->getURL(wpsg_ShopController::URL_CHECKOUT)); ?>"><?php echo esc_html__('Zurück zu den Kundendaten', 'wpsg'); ?></a>
+ <?php } else { ?>
+ <input type="submit" class="wpsg_checkoutbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('zurück', 'wpsg'); ?>" name="wpsg_redirect_checkout" />
+ <?php } ?>
<?php if ($this->callMods('handle_order')) { ?>
- <input type="submit" class="wpsg_orderbutton" value="<?php echo __('zahlungspflichtig bestellen', 'wpsg'); ?>" name="wpsg_order" />
+ <input type="submit" class="wpsg_orderbutton<?php echo wpsg_button_class(); ?>" value="<?php echo __('zahlungspflichtig bestellen', 'wpsg'); ?>" name="wpsg_order" />
<?php } ?>
<div class="wpsg_clear"></div>
diff --git a/views/warenkorb/progress.phtml b/views/warenkorb/progress.phtml index 542350b..2a94a55 100644 --- a/views/warenkorb/progress.phtml +++ b/views/warenkorb/progress.phtml @@ -2,9 +2,35 @@ /**
* Fortschrittsbalken
+ * @version 4.6.1
*/
?>
+<?php if (\wpsg\ThemeStyle::isThemeMode()) {
+
+ // Modus „neu“: nummerierte Liste, der aktuelle Schritt mit aria-current (Punkt 8.9)
+ $arSteps = [
+ 1 => [__('Warenkorb', 'wpsg'), $this->getUrl(wpsg_ShopController::URL_BASKET)],
+ 2 => [__('Kundendaten', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT)],
+ 3 => [__('Versand/Zahlung', 'wpsg'), $this->getURL(wpsg_ShopController::URL_CHECKOUT2)],
+ 4 => [__('Abschluss', 'wpsg'), $this->getURL(wpsg_ShopController::URL_OVERVIEW)]
+ ];
+ $current = intval($GLOBALS['step']);
+
+?>
+<nav class="wpsg-steps" aria-label="<?php echo esc_attr__('Schritte der Bestellung', 'wpsg'); ?>">
+ <ol class="wpsg-steps__list">
+ <?php foreach ($arSteps as $nr => $arStep) { $class = (($nr === $current)?'is-current':(($nr < $current)?'is-done':'')); ?>
+ <li class="wpsg-steps__step <?php echo esc_attr($class); ?>"<?php echo (($nr === $current)?' aria-current="step"':''); ?>>
+ <?php if ($nr < $current) { ?><a href="<?php echo esc_url($arStep[1]); ?>"><?php } ?>
+ <span class="wpsg-steps__number"><?php echo esc_html((string)$nr); ?></span>
+ <span class="wpsg-steps__label"><?php echo str_replace('/', '/<wbr>', esc_html($arStep[0])); ?></span>
+ <?php if ($nr < $current) { ?></a><?php } ?>
+ </li>
+ <?php } ?>
+ </ol>
+</nav>
+<?php return; } ?>
<div class="wpsg_progress">
|
