Index: /controller/wpsg_ProduktController.class.php
===================================================================
--- /controller/wpsg_ProduktController.class.php	(revision 8278)
+++ /controller/wpsg_ProduktController.class.php	(revision 8279)
@@ -944,6 +944,5 @@
 				");
 
-				if ($product_translated_id <= 0)
-				{
+				if ($product_translated_id <= 0) {
 
 					$arLang = $this->shop->getStoreLanguages();
@@ -975,7 +974,5 @@
 				");
 
-			}
-			else
-			{
+			} else {
 
 				$this->shop->view['data'] = $this->db->fetchRow("
@@ -1054,4 +1051,9 @@
 				)
 			);
+			
+			$this->shop->view['arSubAction']['productcodes'] = [
+				'title' => __('Produktcodes', 'wpsg'),
+				'content' => $this->shop->render(WPSG_PATH_VIEW.'/produkt/addedit_productcodes.phtml', false)
+			];
 
 			$this->shop->view['arSubAction']['texte'] = array(
@@ -1060,6 +1062,5 @@
 			);
 
-			if ($this->shop->hasMod('wpsg_mod_produktartikel'))
-			{
+			if ($this->shop->hasMod('wpsg_mod_produktartikel')) {
 
 				$this->shop->view['arCom'] = $this->db->fetchAssoc("
@@ -1085,6 +1086,5 @@
 			}
 
-			if (!isset($wpsg_lang))
-			{
+			if (!isset($wpsg_lang)) {
 
 				$this->shop->view['arSubAction']['price'] = array(
@@ -1101,6 +1101,5 @@
 
 			/* Produktbilder */
-			if (!isset($wpsg_lang))
-			{
+			if (!isset($wpsg_lang)) {
 
 				if (wpsg_isSizedInt($this->shop->view['data']['id']))
@@ -1119,13 +1118,10 @@
 
 			$this->shop->callMods('product_addedit_content', array(&$this->shop->view['arSubAction'], &$this->shop->view['data']));
-
-			if($this->get_option('wpsg_alternativeProductDetailDesign') == true)
-			{
+			
+			if ($this->get_option('wpsg_alternativeProductDetailDesign') == true) {
 
 				$this->shop->render( WPSG_PATH_VIEW . '/produkt/addedit_alternativeDesign.phtml' );
 
-			}
-			else
-			{
+			} else {
 
 				$this->shop->render( WPSG_PATH_VIEW . '/produkt/addedit.phtml' );
@@ -1307,13 +1303,19 @@
 				$this->shop->callMods('produkt_save_before', array(&$data));
 				
-				if (wpsg_getInt($edit_id) > 0)
-				{
+				if (wpsg_getInt($edit_id) > 0) {
 
 					$this->db->UpdateQuery(WPSG_TBL_PRODUCTS, $data, "`id` = '".wpsg_q($edit_id)."'");
+					
+					$oProduct = wpsg_product::getInstance(intval($edit_id));
+					
+					foreach ($_REQUEST['meta'] as $meta_key => $meta_value) {
+						
+						$oProduct->setMeta($meta_key, $meta_value);
+						
+					}
+					
 					$this->addBackendMessage(__('Produkt erfolgreich gespeichert.', 'wpsg'));
 
-				}
-				else
-				{
+				} else {
 
 					$data['cdate'] = 'NOW()';
Index: /controller/wpsg_ShopController.class.php
===================================================================
--- /controller/wpsg_ShopController.class.php	(revision 8278)
+++ /controller/wpsg_ShopController.class.php	(revision 8279)
@@ -15,4 +15,6 @@
 		var $bLicence = false;
 
+		var $noReleatedProducts  = false;
+		
 		/** BasketController */
 		var $basketController;
Index: /model/wpsg_product.class.php
===================================================================
--- /model/wpsg_product.class.php	(revision 8278)
+++ /model/wpsg_product.class.php	(revision 8279)
@@ -62,8 +62,100 @@
 		
 		/**
+		 * Nutzt die getProdcutCode und gibt einen Array mit allen gesetzten ProductCodes zurÃŒck
+		 * @return array
+		 */
+		public function getAllProductCodes(): array {
+		
+			$r = [];
+			
+			foreach (['ean', 'gtin', 'mpn', 'pzn', 'sku', 'upc', 'isbn', 'issn', 'isin'] as $code) {
+				
+				$code = $this->getProductCode($code);
+				
+				if ($code !== null) $r[] = $code;
+				
+			}
+			
+			return $r;
+		
+		}
+		
+		/**
+		 * Gibt den Code zurÃŒck, fÃŒr $code_key kann folgendes verwendet werden:
+		 * ean, gtin, mpn, pzn, sku, upc, isbn, issn, isin
+		 *
+		 * @param string|null $code_key
+		 * @return string
+		 * @throws Exception
+		 */
+		public function getProductCode(string $code_key = null): ?array {
+			
+			$arCodes = ['ean', 'gtin', 'mpn', 'pzn', 'sku', 'upc', 'isbn', 'issn', 'isin'];
+			
+			if (in_array($code_key, $arCodes)) {
+				
+				$code = $this->getMeta($code_key, false, '');
+				
+				if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants') && wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$this->getProductKey()])) {
+ 
+					$oCombination = \wpsg\wpsg_combination::findByProductAndKey($this->getId(), $this->getProductKey());
+					
+					if ($oCombination !== null) {
+					
+						$code_variant = $oCombination->getMeta($code_key, false, '');
+						
+						if ($code_variant !== '') $code = $code_variant;
+						
+					}
+					
+				}
+				
+				if ($code === '') return null;
+				
+				$itemprop = null;
+				
+				switch ($code) {
+					
+					case 'sku': $itemprop = 'ean'; break;
+					case 'ean': $itemprop = 'gtin13'; break;
+					
+				}
+				
+				return [
+					'code' => $code,
+					'code_key' => $code_key,
+					'label' => strtoupper($code_key),
+					'itemprop' => $itemprop
+				];
+			
+			} else throw new \Exception(__('UngÃŒltiger Productcode angefragt.', 'wpsg'));
+			
+		}
+		
+		/**
 		 * Gibt die Artikelnummer zurÃŒck
 		 * @return string
 		 */
-		public function getNr() { return $this->anr; }
+		public function getNr() {
+			
+			$anr = $this->anr;
+		
+			if (wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants') && wpsg_ShopController::getShop()->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$this->getProductKey()])) {
+ 
+				$oCombination = \wpsg\wpsg_combination::findByProductAndKey($this->getId(), $this->getProductKey());
+				
+				if ($oCombination !== null) {
+					
+					$vari_anr = $oCombination->getMeta('anr', false, '');
+					
+					if ($vari_anr !== '') $anr = $vari_anr;
+					
+				}
+				
+			}
+		
+			return $anr;
+			
+		}
 		
 		public function appendData($arData)
@@ -105,6 +197,5 @@
 		 * Setzt den Produkt Key
 		 */
-		public function setProductKey($product_key)
-		{
+		public function setProductKey($product_key) {
 
 			$this->product_key = $product_key;
@@ -177,39 +268,28 @@
 
 		} // public function getShortDescription()
-
-		/**
-		 * Gibt die Produktnummer / SKU zurÃŒck
-		 */
-		public function getProductNr() {
-
-			return $this->__get('anr');
+ 
+		/**
+		 * DEPRECATED durch getProductCode ersetzt
+		 * Gibt die EAN zurÃŒck
+		 */
+		public function getEAN() {
+
+			$code = $this->getProductCode('ean');
+			
+			if ($code === null) return '';
+			else return $code['code'];
 
 		}
 
 		/**
-		 * Gibt die EAN zurÃŒck
-		 */
-		public function getEAN() {
-
-			$shop = wpsg_ShopController::getShop();
-			
-			if ($shop->callMod('wpsg_mod_productvariants', 'isVariantsProductKey', [$this->getProductKey()])) {
-				
-				$ean_vari = $shop->callMod('wpsg_mod_productvariants', 'getEAN', [$this->getProductKey()]);
-					
-				if ($ean_vari !== '') return $this->__get('ean').$ean_vari;
-				
-			}
-			
-			return $this->__get('ean');
-
-		}
-
-		/**
+		 * DEPRECATED durch getProductCode ersetzt
 		 * Gibt die GTIN zurÃŒck
 		 */
 		public function getGTIN() {
-
-			return $this->__get('gtin');
+ 
+			$code = $this->getProductCode('gtin');
+			
+			if ($code === null) return '';
+			else return $code['code'];
 
 		}
Index: /mods/mod_productvariants/wpsg_combination.class.php
===================================================================
--- /mods/mod_productvariants/wpsg_combination.class.php	(revision 8278)
+++ /mods/mod_productvariants/wpsg_combination.class.php	(revision 8279)
@@ -41,4 +41,13 @@
 			
 			$json['anr'] = $this->getMeta('anr', false, '');
+			$json['ean'] = $this->getMeta('ean', false, '');
+			$json['mpn'] = $this->getMeta('mpn', false, '');
+			$json['pzn'] = $this->getMeta('pzn', false, '');
+			$json['sku'] = $this->getMeta('sku', false, '');
+			$json['gtin'] = $this->getMeta('gtin', false, '');
+			$json['upc'] = $this->getMeta('upc', false, '');
+			$json['isbn'] = $this->getMeta('isbn', false, '');
+			$json['issn'] = $this->getMeta('issn', false, '');
+			$json['isin'] = $this->getMeta('isin', false, '');
 			
 			return $json;
@@ -91,4 +100,6 @@
 		public static function findByProductAndKey(int $product_id, string $var_key): ?wpsg_combination {
 			
+			$var_key = self::normalizeKey($var_key);
+			
 			$component_id = intval($GLOBALS['wpsg_db']->fetchOnePrepared("SELECT `id` FROM `".WPSG_TBL_PRODUCTS_COMBINATION."` WHERE `product_id` = %d AND `var_key` = %s ", $product_id, self::normalizeKey($var_key)));
 			
@@ -106,4 +117,6 @@
 		public static function normalizeKey(string $var_key): string {
 			
+			if (substr($var_key, 0, 3) === 'pv_') $var_key = preg_replace('/^pv_\d+\|/', '', $var_key);
+		 
 			$arKeys = explode('|', $var_key);
 			
Index: /mods/wpsg_mod_discount.class.php
===================================================================
--- /mods/wpsg_mod_discount.class.php	(revision 8278)
+++ /mods/wpsg_mod_discount.class.php	(revision 8279)
@@ -1258,5 +1258,5 @@
 				");
 
-				$rabatt = explode("_", $rabatt_produktgruppe);
+				$rabatt = explode("_", $rabatt_produktgruppe??'');
 
 			}
Index: /mods/wpsg_mod_productvariants.class.php
===================================================================
--- /mods/wpsg_mod_productvariants.class.php	(revision 8278)
+++ /mods/wpsg_mod_productvariants.class.php	(revision 8279)
@@ -181,14 +181,5 @@
 				'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/produkt_addedit_content.phtml', false)
 			);
-			
-			if (wpsg_isSizedInt($product_data['id'])) {
-				
-				$product_content['wpsg_mod_productvariants_combination'] = array(
-					'title' => __('Variantenkombinationen', 'wpsg'),
-					'content' => $this->shop->render(WPSG_PATH_VIEW.'/mods/mod_productvariants/produkt_addedit_content_combination.phtml', false)
-				);
-				
-			}
-
+		
 		} // public function product_addedit_content(&$product_content, &$produkt_data)
 
@@ -1301,5 +1292,4 @@
 			
 			if (!isset($data['product_id']) || $data['product_id'] <= 0) throw new \Exception(_('Aufrufsfehler!'));
-			if (strlen(trim($data['var_key']??'')) === 0) throw new \Exception(_('Aufrufsfehler!'));
 			if (!isset($data['action_do'])) throw new \Exception(_('Aufrufsfehler!'));
 			
@@ -1307,4 +1297,6 @@
 			
 			if (in_array($data['action_do'], ['add', 'edit', 'save'])) {
+			
+				if (strlen(trim($data['var_key']??'')) === 0) throw new \Exception(_('Aufrufsfehler!'));
 				
 				$oCombination = \wpsg\wpsg_combination::getByProductAndKey($data['product_id'], $data['var_key']);
@@ -1313,8 +1305,68 @@
 				
 					$oCombination->setMeta('anr', $data['combination']['anr']);
+					$oCombination->setMeta('ean', $data['combination']['ean']);
+					$oCombination->setMeta('mpn', $data['combination']['mpn']);
+					$oCombination->setMeta('pzn', $data['combination']['pzn']);
+					$oCombination->setMeta('sku', $data['combination']['sku']);
+					$oCombination->setMeta('gtin', $data['combination']['gtin']);
+					$oCombination->setMeta('upc', $data['combination']['upc']);
+					$oCombination->setMeta('isbn', $data['combination']['isbn']);
+					$oCombination->setMeta('issn', $data['combination']['issn']);
+					$oCombination->setMeta('isin', $data['combination']['isin']);
 					
 				}
 				
 				$result = ['combination' => $oCombination->toJSON()];
+				
+			} else if ($data['action_do'] === 'getCombination') {
+				
+				$oProduct = wpsg_product::getInstance($data['product_id']);
+				
+				$arPossibleKeys = $oProduct->getPossibleProductVariantKeys();
+	
+				foreach ($arPossibleKeys as $k => $v) {
+					
+					$arPossibleKeys[$k]['data'] = null;
+					
+					try {
+						
+						$arPossibleKeys[$k]['id'] = intval(\wpsg\wpsg_combination::findByProductAndKey($oProduct->getId(), $v['var_key'])->getId());
+						
+					} catch (\Throwable $e) { $arPossibleKeys[$k]['id'] = 0; }
+					
+				}
+				
+				$arVariantInfo = $this->getVariants($oProduct->getId(),  true, true, true);
+	
+				$arVariant = []; $arVariantLabel = []; $arFilter = [];
+				$arVariationen = []; $arVariationLabel = [];
+				
+				foreach ($arVariantInfo as $var) {
+					
+					$arVariant[] = intval($var['id']);
+					$arVariationen[$var['id']] = [];
+					
+					foreach ($var['arVariation'] as $vari) {
+						
+						$arVariationen[intval($var['id'])][] = intval($vari['variation_id']);
+					
+						if (!in_array($var['id'], $arVariationLabel)) try { $arVariationLabel[$vari['variation_id']] = \wpsg\wpsg_variation::getInstance($vari['variation_id'])->getLabel(); } catch (\Exception $e) { $arVariationLabel[$vari['variation_id']] = $vari['variation_id']; }
+						
+					}
+					
+					if (!in_array($var['id'], $arVariantLabel)) try { $arVariantLabel[$var['id']] = \wpsg\wpsg_variant::getInstance($var['id'])->getLabel(); } catch (\Exception $e) {  $arVariantLabel[$var['id']] = $var['id']; }
+					
+					$arFilter[$var['id']] = 0;
+					
+				}
+				
+				$result = [
+					'arVariant' => $arVariant,
+					'arVariantLabel' => $arVariantLabel,
+					'arVariationen' => $arVariationen,
+					'arVariationLabel' => $arVariationLabel,
+					'arPossibleKeys' => $arPossibleKeys,
+					'arFilter' => $arFilter
+				];
 				
 			}
Index: /mods/wpsg_mod_produktartikel.class.php
===================================================================
--- /mods/wpsg_mod_produktartikel.class.php	(revision 8278)
+++ /mods/wpsg_mod_produktartikel.class.php	(revision 8279)
@@ -337,6 +337,4 @@
 
             $this->shop->update_option('wpsg_mod_produktartikel_showui', $_REQUEST['wpsg_mod_produktartikel_showui'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_produktartikel_ean', $_REQUEST['wpsg_mod_produktartikel_ean'], false, false, WPSG_SANITIZE_CHECKBOX);
-            $this->shop->update_option('wpsg_mod_produktartikel_gtin', $_REQUEST['wpsg_mod_produktartikel_gtin'], false, false, WPSG_SANITIZE_CHECKBOX);
             $this->shop->update_option('wpsg_mod_produktartikel_comment', $_REQUEST['wpsg_mod_produktartikel_comment'], false, false, WPSG_SANITIZE_INT);
 
Index: /views/mods/mod_printshop/producttemplate.phtml
===================================================================
--- /views/mods/mod_printshop/producttemplate.phtml	(revision 8278)
+++ /views/mods/mod_printshop/producttemplate.phtml	(revision 8279)
@@ -84,12 +84,22 @@
 		<div class="wpsg_artikelnummer">
 			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span><br />
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_ean'))) {?>
-				<?php echo __('EAN','wpsg');?>:<span class="wpsg_ean"><?php echo wpsg_hspc($this->view['data']['ean']); ?></span><br />
-			<?php } ?>
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_gtin'))) {?>
-				<?php echo __('GTIN','wpsg');?>:<span class="wpsg_gtin"><?php echo wpsg_hspc($this->view['data']['gtin']); ?></span><br />
-			<?php }?></div>
-		<?php } ?>
-
+		</div>
+		<?php } ?>
+		
+		<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
+		<?php if (sizeof($arProductCodes) > 0) { ?>
+			<div class="product_code_wrap">
+			<?php foreach ($arProductCodes as $product_code) { ?>
+				<?php if ($product_code !== null) { ?>
+					
+					<div class="product_code <?php echo $product_code['code_key']; ?>">
+						<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
+					</div>
+					
+				<?php } ?>
+			<?php } ?>
+			</div>
+		<?php } ?>
+		
 		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt START*/ ?>
 		<?php if ($this->view['oProduct']->canDisplayPrice()) { ?>
Index: /views/mods/mod_productvariants/admin_html.phtml
===================================================================
--- /views/mods/mod_productvariants/admin_html.phtml	(revision 8278)
+++ /views/mods/mod_productvariants/admin_html.phtml	(revision 8279)
@@ -211,6 +211,5 @@
 	}
 	
-	function wpsg_mod_productvariants_back()
-	{
+	function wpsg_mod_productvariants_back() {
 
 		var product_id = jQuery('#wpsg_mod_productvariants_product_id').val();
@@ -235,6 +234,8 @@
 				jQuery('#wpsg_mod_productvariants_dialog .modal-body').html(data);
 
-			}
-    	} );
+				if (window.wpsg_mod_productvariants) window.wpsg_mod_productvariants.updateCombinationData();
+				
+			}
+		} );
 
 		return false;
@@ -242,7 +243,6 @@
 	} // function wpsg_mod_productvariants_back()
 
-	function wpsg_mod_productvariants_show(product_id)
-	{
-
+	function wpsg_mod_productvariants_show(product_id) {
+ 
 		jQuery('#wpsg_mod_productvariants_dialog button').prop('disabled', true);
 		jQuery('#wpsg_mod_productvariants_dialog .modal-body').html('<img src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />');
@@ -262,10 +262,12 @@
 				jQuery('#wpsg_mod_productvariants_dialog button').prop('disabled', false); 
 
-			}
-    	} ); 
-		 
+				if (window.wpsg_mod_productvariants) window.wpsg_mod_productvariants.updateCombinationData();
+				
+			}
+		} );
+		
 		return false;
 		
-	} // function wpsg_mod_productvariants_show()
+	}
 
 </script>
Index: /views/mods/mod_productvariants/produkt_addedit_content.phtml
===================================================================
--- /views/mods/mod_productvariants/produkt_addedit_content.phtml	(revision 8278)
+++ /views/mods/mod_productvariants/produkt_addedit_content.phtml	(revision 8279)
@@ -1,33 +1,425 @@
 <?php
-
+	
+	declare(strict_types=1);
+	
 	/**
 	 * Template fÃŒr die Verwaltung der Produktvarianten innerhalb des Produktes
+	 * @author: Daniel Schmitzer (daschmi@daschmi.de)
+	 * @date: 20.04.23
+	 * @time: 11:30
 	 */
+	
+	namespace wpsg;
+	
+?>
 
-?>
- 
-<?php echo wpsg_drawForm_AdminboxStart(__('Produktvarianten', 'wpsg')); ?>
+<?php if (!wpsg_isSizedInt($this->view['data']['id'])) { ?>
+	
+	<p><?php echo __('Bitte speichern Sie das Produkt zuerst.', 'wpsg'); ?></p>
+	
+<?php } else {
+	
+	/** @var \wpsg_product $oProduct */
+	$oProduct = \wpsg_product::getInstance(intval($this->view['data']['id']));
+	
+	?>
+	
+	<?php echo wpsg_drawForm_AdminboxStart(__('Produktvarianten', 'wpsg')); ?>
+	
+		<?php echo $this->view['wpsg_mod_productvariants']['html']; ?>
+		<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktvarianten', 'wpsg'); ?></a>
+	
+	<?php echo wpsg_drawForm_AdminboxEnd(); ?>
 
-<?php if (wpsg_isSizedInt($this->view['data']['id'])) { ?>
+	<div id="wpsg_mod_productvars_combination">
+		
+		<div v-if="loading" class="loading_layer">
+			<img class="loading" src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+		</div>
+		
+		<div class="inner">
+			<div class="top_filter">
+				<div v-for="(variant, i) of arVariationen">
+					<select v-model="arFilter[i]">
+						<option :value="0">{{getVariantLabel(i)}} [ Alle ]</option>
+						<option :value="parseInt(variation)" v-for="(variation, j) of variant">{{getVariantLabel(i)}} [{{getVariationLabel(variation)}}]</option>
+					</select>
+				</div>
+			</div>
+			<div v-for="(combination, i) of arPossibleKeysFiltered" class="relative">
+			<div class="panel panel-default">
+				<div class="panel-heading clearfix">
+					<h3 class="panel-title">
+						{{combination.label}}
+						<span v-if="combination.id > 0" class="glyphicon glyphicon-pencil" @click.prevent="edit(combination)"></span>
+						<span v-else class="glyphicon glyphicon-plus" @click.prevent="add(combination)"></span>
+					</h3>
+				</div>
+				<div class="panel-body" v-if="combination.loaded">
+					
+					<div v-if="combination.loading" class="loading_layer">
+						<img class="loading" src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
+					</div>
+					
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">Artikelnummer</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.anr" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- EAN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">EAN (European Article Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.ean" maxlength="13" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- GTIN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">GTIN (Global Trade Item Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.gtin" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- MPN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">MPN (Manufacturer Part Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.mpn" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- PZN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">PZN (Pharmazentralnummer)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.pzn" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- SKU -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">SKU (Stock Keeping Unit)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.sku" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- UPC -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">UPC (Universal Product Code)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.upc" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- ISBN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">ISBN (International Standard Book Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.isbn" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- ISSN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">ISSN (International Standard Serial Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.issn" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<!-- ISIN -->
+					<div class="form-group form-group-sm ">
+						<label class="col-sm-6 control-label" for="detailname">ISIN (International Securities Identification Number)</label>
+						<div class="col-sm-6">
+							<div class="wpsg_field_wrap">
+								<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.isin" />
+							</div>
+						</div>
+						<div class="clearfix wpsg_clear"></div>
+					</div>
+					
+					<div class="mt-8 flex w-full justify-end">
+						<input type="submit" @click.prevent="save(combination)" class="button button-primary" value="speichern" />
+					</div>
+					
+				</div>
+			</div>
+		</div>
+		</div>
+	</div>
+	
+	<script src="<?php echo WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/views/js/vue-3.2.47.global.min.js'; ?>"></script>
+	<script>
+		
+		const ref = Vue.ref;
+		const computed = Vue.computed;
+		const onMounted = Vue.onMounted;
+	 
+		const app = Vue.createApp({
+			setup() {
+				
+				const product_id = ref(<?php echo $oProduct->getId(); ?>);
+				const loading = ref(true);
+				const arFilter = ref(undefined);
+				const arPossibleKeys = ref(undefined);
+				const arVariant = ref(undefined);
+				const arVariantLabel = ref(undefined);
+				const arVariationen = ref(undefined);
+				const arVariationLabel = ref(undefined);
+				
+				const arPossibleKeysFiltered = computed(() => {
+					
+					let r = [];
+					
+					if (!arPossibleKeys.value) return r;
+					
+					for (let var_key of arPossibleKeys.value) {
+						
+						const arKey = var_key.var_key.split('|');
+						const typedKey = {};
+						
+						for (let i of arKey) {
+							
+							const [var_id, vari_id] = i.split(':');
+							
+							typedKey[var_id] = parseInt(vari_id);
+							
+						}
+						
+						let set = true;
+						
+						for (let f in arFilter.value) {
+	
+							if (arFilter.value[f] !== 0 && typedKey[f] !== arFilter.value[f]) {
+								
+								set = false; break;
+								
+							}
+							
+						}
+						
+						if (set) r.push(var_key);
+						
+					}
+					
+					return r;
+					
+				});
+				
+				const getVariantLabel = (var_id) => {
+					
+					if (arVariantLabel.value[var_id.toString()] !== undefined) return arVariantLabel.value[var_id.toString()];
+					else '';
+					
+				};
+				const getVariationLabel = (var_id) => {
+					
+					if (arVariationLabel.value[var_id.toString()] !== undefined) return arVariationLabel.value[var_id.toString()];
+					else '';
+					
+				};
+				const xhr = (action_do, data, cb_success) => {
+				
+					const request = new XMLHttpRequest();
+					
+					data.action_do = action_do;
+					
+					request.open('POST', '<?php echo WPSG_URL_WP; ?>wp-admin/?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants&subaction=combination&noheader=1', true);
+					request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
+					request.onload = () => {
+						
+						if (request.status >= 200 && request.status < 400) {
+							
+							const response = JSON.parse(request.responseText);
+		  
+							cb_success(response);
+		
+						} else {
+		  
+							console.error('Error: ' + request.statusText);
+		
+						}
+	  
+					};
+	  
+					request.onerror = function() {
+		
+						console.error('Error: ' + request.statusText);
+	  
+					};
+	  
+					request.send(JSON.stringify(data));
+				
+				};
+				const save = (combination) => {
+					
+					xhr('save', {
+						var_key: combination.var_key,
+						product_id: combination.product_id,
+						combination: combination
+					}, (response) => {
+						
+						for (let i = 0; i < arPossibleKeys.value.length; i ++) {
+							
+							const var_key = arPossibleKeys.value[i];
+							
+							if (var_key.var_key === response.combination.var_key) {
+								
+								arPossibleKeys.value[i] = response.combination;
+	
+							}
+							
+						}
+						
+					});
+					
+					combination.loading = true;
+					
+				}
+				const updateCombinationData = () => {
 
-	<?php echo $this->view['wpsg_mod_productvariants']['html']; ?>
-
-	<script type="text/javascript">/* <![CDATA[ */
-
+					xhr('getCombination', {
+						product_id: product_id.value
+					}, (response) => {
+						
+						arFilter.value = response.arFilter;
+						arPossibleKeys.value = response.arPossibleKeys;
+						arVariant.value = response.arVariant;
+						arVariantLabel.value = response.arVariantLabel;
+						arVariationen.value = response.arVariationen;
+						arVariationLabel.value = response.arVariationLabel;
+						
+						loading.value = false;
+						
+					});
+					
+				};
+				const add = (combination) => {
+	
+					combination.loaded = true;
+					combination.loading = true;
+					
+					xhr('add', {
+						var_key: combination.var_key,
+						product_id: product_id.value
+					}, (response) => {
+						
+						for (let i = 0; i < arPossibleKeys.value.length; i ++) {
+							
+							const var_key = arPossibleKeys.value[i];
+							
+							if (var_key.var_key === response.combination.var_key) {
+								
+								arPossibleKeys.value[i] = response.combination;
+	
+							}
+							
+						}
+						
+					});
+					
+				};
+				const edit = (combination) => {
+				
+					combination.loaded = true;
+					combination.loading = true;
+					
+					xhr('edit', {
+						var_key: combination.var_key,
+						product_id: product_id.value
+					}, (response) => {
+	
+						for (let i = 0; i < arPossibleKeys.value.length; i ++) {
+							
+							const var_key = arPossibleKeys.value[i];
+							
+							if (var_key.var_key === response.combination.var_key) {
+								
+								arPossibleKeys.value[i] = response.combination;
+	
+							}
+							
+						}
+						
+					});
+					
+				}
+				
+				onMounted(() => {
+	
+					// updateCombinationData();
+					
+				});
+				
+				return {
+					arFilter, arPossibleKeys, arVariant, arVariantLabel, arVariationen, arVariationLabel, product_id, loading,
+					getVariantLabel, getVariationLabel,
+					arPossibleKeysFiltered,
+					add, edit, save, updateCombinationData
+				};
+				
+			}
+		}).mount('#wpsg_mod_productvars_combination');
+	
+		window.wpsg_mod_productvariants = app;
+		
 		jQuery(document).ready(function() {
-
+	
 			wpsg_mod_productvariants_show(<?php echo $this->view['data']['id']; ?>);
 			
 		} );
+		
+	</script>
+	
+	<style>
+	
+		#wpsg_mod_productvars_combination { width:100%; position:relative; }
+		#wpsg_mod_productvars_combination .top_filter { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); row-gap:1rem; column-gap:1rem; margin-bottom:2rem; }
+		#wpsg_mod_productvars_combination .top_filter select { width:100%; }
+		#wpsg_mod_productvars_combination .panel-title { display:flex; justify-content:space-between; align-items:center; }
+		#wpsg_mod_productvars_combination .panel-title .glyphicon { cursor:pointer; }
+		#wpsg_mod_productvars_combination .panel { margin-bottom:10px; }
+		#wpsg_mod_productvars_combination .loading_layer { z-index:10; position:absolute; left:0; top:0; width:100%; height:100%; background-color:rgba(255, 255, 255, 0.5); display:flex; justify-content:center; align-items:center; }
+		#wpsg_mod_productvars_combination > .inner { min-height:50px; width:100%; }
+		#wpsg_mod_productvars_combination .flex { display:flex; }
+		#wpsg_mod_productvars_combination .w-full { width:100%; }
+		#wpsg_mod_productvars_combination .justify-end { justify-content:flex-end; }
+		#wpsg_mod_productvars_combination .mt-4 { margin-top:1rem; }
+		#wpsg_mod_productvars_combination .relative { position:relative; }
+		#wpsg_mod_productvars_combination .mt-8 { margin-top:2rem; }
+	
+	</style>
 
-	/* ]]> */</script>
-
-<?php } else { ?>
-
-	<p><?php echo __('Bitte speichern Sie das Produkt zuerst.', 'wpsg'); ?></p>
-			
-<?php } ?>
-
-<a href="<?php echo WPSG_URL_WP; ?>wp-admin/admin.php?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants"><span class="wpsg-glyphicon glyphicon glyphicon-wrench"></span><?php echo __('Zur Konfiguration der Produktvarianten', 'wpsg'); ?></a>
-
-<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+<?php }
Index: ews/mods/mod_productvariants/produkt_addedit_content_combination.phtml
===================================================================
--- /views/mods/mod_productvariants/produkt_addedit_content_combination.phtml	(revision 8278)
+++ 	(revision )
@@ -1,305 +1,0 @@
-<?php
-	
-	declare(strict_types=1);
-	
-	/**
-	 * Template fÃŒr die Verwaltung der Produktvarianten innerhalb des Produktes
-	 * @author: Daniel Schmitzer (daschmi@daschmi.de)
-	 * @date: 20.04.23
-	 * @time: 11:30
-	 */
-	
-	namespace wpsg;
-
-	/** @var \wpsg_product $oProduct */
-	$oProduct = \wpsg_product::getInstance(intval($this->view['data']['id']));
-	
-	$arVariantInfo = $this->callMod('wpsg_mod_productvariants', 'getVariants', [$oProduct->getId(),  true, true, true]);
-	
-	$arVariant = []; $arVariantLabel = []; $arFilter = [];
-	$arVariationen = []; $arVariationLabel = [];
-	
-	foreach ($arVariantInfo as $var) {
-		
-		$arVariant[] = intval($var['id']);
-		$arVariationen[$var['id']] = [];
-		
-		foreach ($var['arVariation'] as $vari) {
-			
-			$arVariationen[intval($var['id'])][] = intval($vari['variation_id']);
-		
-			if (!in_array($var['id'], $arVariationLabel)) try { $arVariationLabel[$vari['variation_id']] = wpsg_variation::getInstance($vari['variation_id'])->getLabel(); } catch (\Exception $e) { $arVariationLabel[$vari['variation_id']] = $vari['variation_id']; }
-			
-		}
-		
-		if (!in_array($var['id'], $arVariantLabel)) try { $arVariantLabel[$var['id']] = wpsg_variant::getInstance($var['id'])->getLabel(); } catch (\Exception $e) {  $arVariantLabel[$var['id']] = $var['id']; }
-		
-		$arFilter[$var['id']] = 0;
-		
-	}
-	
-	$arPossibleKeys = $oProduct->getPossibleProductVariantKeys();
-	
-	foreach ($arPossibleKeys as $k => $v) {
-		
-		$arPossibleKeys[$k]['data'] = null;
-		
-		try {
-			
-			$arPossibleKeys[$k]['id'] = intval(wpsg_combination::findByProductAndKey($oProduct->getId(), $v['var_key'])->getId());
-			
-		} catch (\Throwable $e) { $arPossibleKeys[$k]['id'] = 0; }
-		
-	}
-	
-?>
-
-<div id="wpsg_mod_productvars_combination">
-	<div class="top_filter">
-		<div v-for="(variant, i) of arVariationen">
-			<select v-model="arFilter[i]">
-				<option :value="0">{{getVariantLabel(i)}} [ Alle ]</option>
-				<option :value="parseInt(variation)" v-for="(variation, j) of variant">{{getVariantLabel(i)}} [{{getVariationLabel(variation)}}]</option>
-			</select>
-		</div>
-	</div>
-	<div v-for="(combination, i) of arPossibleKeysFiltered" class="relative">
-		<div class="panel panel-default">
-			<div class="panel-heading clearfix">
-				<h3 class="panel-title">
-					{{combination.label}}
-					<span v-if="combination.id > 0" class="glyphicon glyphicon-pencil" @click.prevent="edit(combination)"></span>
-					<span v-else class="glyphicon glyphicon-plus" @click.prevent="add(combination)"></span>
-				</h3>
-			</div>
-			<div class="panel-body" v-if="combination.loaded">
-				
-				<div v-if="combination.loading" class="loading_layer">
-					<img class="loading" src="<?php echo WPSG_URL; ?>views/gfx/ajax-loader.gif" alt="<?php echo __('Bitte warten ...', 'wpsg'); ?>" />
-				</div>
-				
-				<div class="form-group form-group-sm ">
-					<label class="col-sm-6 control-label" for="detailname">Artikelnummer</label>
-					<div class="col-sm-6">
-						<div class="wpsg_field_wrap">
-							<input type="text" class="form-control input-sm " autocomplete="off" placeholder="" v-model="combination.anr">
-						</div>
-					</div>
-					<div class="clearfix wpsg_clear"></div>
-				</div>
-				
-				<div class="mt-8 flex w-full justify-end">
-					<input type="submit" @click.prevent="save(combination)" class="button button-primary" value="speichern" />
-				</div>
-				
-				<pre class="mt-8">{{combination}}</pre>
-				
-			</div>
-		</div>
-	</div>
-</div>
-
-<script src="<?php echo WPSG_URL_CONTENT.'plugins/'.WPSG_FOLDERNAME.'/views/js/vue-3.2.47.global.min.js'; ?>"></script>
-<script>
-	
-	const ref = Vue.ref;
-	const computed = Vue.computed;
- 
-	const app = Vue.createApp({
-		setup() {
-			
-			const product_id = ref(<?php echo $oProduct->getId(); ?>);
-			const arFilter = ref(<?php echo json_encode($arFilter); ?>);
-			const arPossibleKeys = ref(<?php echo json_encode($arPossibleKeys); ?>);
-			const arVariant = ref(<?php echo json_encode($arVariant); ?>);
-			const arVariantLabel = ref(<?php echo json_encode($arVariantLabel); ?>);
-			const arVariationen = ref(<?php echo json_encode($arVariationen); ?>);
-			const arVariationLabel = ref(<?php echo json_encode($arVariationLabel); ?>);
-			
-			const arPossibleKeysFiltered = computed(() => {
-				
-				let r = [];
-				
-				for (let var_key of arPossibleKeys.value) {
-					
-					const arKey = var_key.var_key.split('|');
-					const typedKey = {};
-					
-					for (let i of arKey) {
-						
-						const [var_id, vari_id] = i.split(':');
-						
-						typedKey[var_id] = parseInt(vari_id);
-						
-					}
-					
-					let set = true;
-					
-					for (let f in arFilter.value) {
-
-						if (arFilter.value[f] !== 0 && typedKey[f] !== arFilter.value[f]) {
-							
-							set = false; break;
-							
-						}
-						
-					}
-					
-					if (set) r.push(var_key);
-					
-				}
-				
-				return r;
-				
-			});
-			
-			const getVariantLabel = (var_id) => {
-				
-				if (arVariantLabel.value[var_id.toString()] !== undefined) return arVariantLabel.value[var_id.toString()];
-				else '';
-				
-			};
-			const getVariationLabel = (var_id) => {
-				
-				if (arVariationLabel.value[var_id.toString()] !== undefined) return arVariationLabel.value[var_id.toString()];
-				else '';
-				
-			};
-			const xhr = (action_do, data, cb_success) => {
-			
-				const request = new XMLHttpRequest();
-				
-				data.action_do = action_do;
-				
-				request.open('POST', '<?php echo WPSG_URL_WP; ?>wp-admin/?page=wpsg-Admin&action=module&modul=wpsg_mod_productvariants&subaction=combination&noheader=1', true);
-				request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
-				request.onload = () => {
-					
-					if (request.status >= 200 && request.status < 400) {
-						
-						const response = JSON.parse(request.responseText);
-      
-						cb_success(response);
-    
-					} else {
-      
-						console.error('Error: ' + request.statusText);
-    
-					}
-  
-				};
-  
-				request.onerror = function() {
-    
-					console.error('Error: ' + request.statusText);
-  
-				};
-  
-				request.send(JSON.stringify(data));
-			
-			};
-			const save = (combination) => {
-				
-				xhr('save', {
-					var_key: combination.var_key,
-					product_id: combination.product_id,
-					combination: combination
-				}, (response) => {
-					
-					for (let i = 0; i < arPossibleKeys.value.length; i ++) {
-						
-						const var_key = arPossibleKeys.value[i];
-						
-						if (var_key.var_key === response.combination.var_key) {
-							
-							arPossibleKeys.value[i] = response.combination;
-
-						}
-						
-					}
-					
-				});
-				
-				combination.loading = true;
-				
-			}
-			const add = (combination) => {
-
-				combination.loaded = true;
-				combination.loading = true;
-				
-				xhr('add', {
-					var_key: combination.var_key,
-					product_id: product_id.value
-				}, (response) => {
-					
-					for (let i = 0; i < arPossibleKeys.value.length; i ++) {
-						
-						const var_key = arPossibleKeys.value[i];
-						
-						if (var_key.var_key === response.combination.var_key) {
-							
-							arPossibleKeys.value[i] = response.combination;
-
-						}
-						
-					}
-					
-				});
-				
-			};
-			const edit = (combination) => {
-			
-				combination.loaded = true;
-				combination.loading = true;
-				
-				xhr('edit', {
-					var_key: combination.var_key,
-					product_id: product_id.value
-				}, (response) => {
-
-					for (let i = 0; i < arPossibleKeys.value.length; i ++) {
-						
-						const var_key = arPossibleKeys.value[i];
-						
-						if (var_key.var_key === response.combination.var_key) {
-							
-							arPossibleKeys.value[i] = response.combination;
-
-						}
-						
-					}
-					
-				});
-				
-			}
-			
-			return {
-				arFilter, arPossibleKeys, arVariant, arVariantLabel, arVariationen, arVariationLabel, product_id,
-				getVariantLabel, getVariationLabel,
-				arPossibleKeysFiltered,
-				add, edit, save
-			};
-			
-		}
-	}).mount('#wpsg_mod_productvars_combination');
-
-</script>
-
-<style>
-
-	#wpsg_mod_productvars_combination { width:100%; }
-	#wpsg_mod_productvars_combination .top_filter { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); row-gap:1rem; column-gap:1rem; margin-bottom:2rem; }
-	#wpsg_mod_productvars_combination .top_filter select { width:100%; }
-	#wpsg_mod_productvars_combination .panel-title { display:flex; justify-content:space-between; align-items:center; }
-	#wpsg_mod_productvars_combination .panel-title .glyphicon { cursor:pointer; }
-	#wpsg_mod_productvars_combination .panel { margin-bottom:10px; }
-	#wpsg_mod_productvars_combination .loading_layer { z-index:10; position:absolute; left:0; top:0; width:100%; height:100%; background-color:rgba(0, 0, 0, 0.5); display:flex; justify-content:center; align-items:center; }
-	#wpsg_mod_productvars_combination .flex { display:flex; }
-	#wpsg_mod_productvars_combination .w-full { width:100%; }
-	#wpsg_mod_productvars_combination .justify-end { justify-content:flex-end; }
-	#wpsg_mod_productvars_combination .mt-4 { margin-top:1rem; }
-	#wpsg_mod_productvars_combination .relative { position:relative; }
-	#wpsg_mod_productvars_combination .mt-8 { margin-top:2rem; }
-
-</style>
Index: /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml
===================================================================
--- /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml	(revision 8278)
+++ /views/mods/mod_produktartikel/produkt_edit_allgemein.phtml	(revision 8279)
@@ -9,9 +9,2 @@
 <?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel[path]', __('URL Path Segment', 'wpsg'), wpsg_getStr($this->view['data']['post_name']), array('help' => 'wpsg_mod_produktartikel_url_path_seg')); ?>
 
-<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_ean'))) { ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel[ean]', __('EAN', 'wpsg'), wpsg_getStr($this->view['data']['ean']), array('help' => 'wpsg_mod_produktartikel_ean')); ?>
-<?php } ?>
-
-<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_gtin'))) { ?>
-<?php echo wpsg_drawForm_Input('wpsg_mod_produktartikel[gtin]', __('GTIN', 'wpsg'), wpsg_getStr($this->view['data']['gtin']), array('help' => 'wpsg_mod_produktartikel_gtin')); ?>
-<?php } ?>
Index: /views/mods/mod_produktartikel/settings_edit.phtml
===================================================================
--- /views/mods/mod_produktartikel/settings_edit.phtml	(revision 8278)
+++ /views/mods/mod_produktartikel/settings_edit.phtml	(revision 8279)
@@ -19,9 +19,4 @@
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_showFeed', __('Direkt in den Feeds anzeigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_showFeed'), array('help' => 'wpsg_mod_produktartikel_showFeed')); ?>
 <?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_onlyMainQuery', __('Nur Main Query berÃŒcksichtigen', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_onlyMainQuery'), array('help' => 'wpsg_mod_produktartikel_onlyMainQuery')); ?>
-
-<br />
-
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_ean', __('Darstellung der EAN aktivieren', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_ean'), array('help' => 'wpsg_mod_produktartikel_ean')); ?>
-<?php echo wpsg_drawForm_Checkbox('wpsg_mod_produktartikel_gtin', __('Darstellung der GTIN aktivieren', 'wpsg'), $this->get_option('wpsg_mod_produktartikel_gtin'), array('help' => 'wpsg_mod_produktartikel_gtin')); ?>
 
 <br />
Index: /views/mods/mod_rechnungen/multi_invoice_pdf.phtml
===================================================================
--- /views/mods/mod_rechnungen/multi_invoice_pdf.phtml	(revision 8278)
+++ /views/mods/mod_rechnungen/multi_invoice_pdf.phtml	(revision 8279)
@@ -287,5 +287,5 @@
             if ($this->get_option('wpsg_mod_rechnungen_anr') == '1') {
                 
-                $pdf->Cell(10, 8,  $oOrderProduct->getProduct()->getProductNr(), 0, 0, 'C');
+                $pdf->Cell(10, 8,  $oOrderProduct->getProduct()->getNr(), 0, 0, 'C');
                 
             } else {
Index: /views/produkt/addedit_productcodes.phtml
===================================================================
--- /views/produkt/addedit_productcodes.phtml	(revision 8279)
+++ /views/produkt/addedit_productcodes.phtml	(revision 8279)
@@ -0,0 +1,65 @@
+<?php
+	
+	declare(strict_types=1);
+	
+	/**
+	 * Template fÃŒr die Anzeige der Produktcodes
+	 * @author: Daniel Schmitzer (daschmi@daschmi.de)
+	 * @date: 24.04.23
+	 * @time: 13:16
+	 */
+		
+	namespace wpsg;
+	
+?>
+
+<div class="general-panel-block">
+	<div class="general-panel-general">
+		<?php echo wpsg_drawForm_AdminboxStart(__('Productcodes', 'wpsg')); ?>
+	
+			<?php if (intval($this->view['data']['id']) > 0) {
+				
+				/** @var \wpsg_product $oProduct */
+				$oProduct = \wpsg_product::getInstance(intval($this->view['data']['id']));
+				
+			?>
+		
+				<?php echo wpsg_drawForm_Select('meta[code_mode]', __('Modus', 'wpsg'), [
+					'0' => __('Erster definierter Code', 'wpsg'),
+					'ean' => __('EAN als Standard', 'wpsg'),
+					'gtin' => __('GTIN als Standard', 'wpsg'),
+					'mpn' => __('MPN als Standard', 'wpsg'),
+					'pzn' => __('PZN als Standard', 'wpsg'),
+					'sku' => __('SKU als Standard', 'wpsg'),
+					'upc' => __('UPC als Standard', 'wpsg'),
+					'isbn' => __('ISBN als Standard', 'wpsg'),
+					'issn' => __('ISSN als Standard', 'wpsg'),
+					'isin' => __('ISIN als Standard', 'wpsg')
+				], $oProduct->getMeta('code_mode', false, '0'), ['help' => 'code_mode']); ?>
+				<?php echo wpsg_drawForm_Input('meta[ean]', __('EAN', 'wpsg'),  $oProduct->getMeta('ean'), ['help' => 'ean']); ?>
+				<?php echo wpsg_drawForm_Input('meta[gtin]', __('GTIN', 'wpsg'),  $oProduct->getMeta('gtin'), ['help' => 'gtin']); ?>
+				<?php echo wpsg_drawForm_Input('meta[mpn]', __('MPN', 'wpsg'), $oProduct->getMeta('mpn'), ['help' => 'mpn']); ?>
+				<?php echo wpsg_drawForm_Input('meta[pzn]', __('PZN', 'wpsg'), $oProduct->getMeta('pzn'), ['help' => 'pzn']); ?>
+				<?php echo wpsg_drawForm_Input('meta[sku]', __('SKU', 'wpsg'), $oProduct->getMeta('sku'), ['help' => 'sku']); ?>
+				<?php echo wpsg_drawForm_Input('meta[upc]', __('UPC', 'wpsg'), $oProduct->getMeta('upc'), ['help' => 'upc']); ?>
+				<?php echo wpsg_drawForm_Input('meta[isbn]', __('ISBN', 'wpsg'), $oProduct->getMeta('isbn'), ['help' => 'isbn']); ?>
+				<?php echo wpsg_drawForm_Input('meta[issn]', __('ISSN', 'wpsg'), $oProduct->getMeta('issn'), ['help' => 'issn']); ?>
+				<?php echo wpsg_drawForm_Input('meta[isin]', __('ISIN', 'wpsg'), $oProduct->getMeta('isin'), ['help' => 'isin']); ?>
+
+				<?php if (\wpsg_ShopController::getShop()->hasMod('wpsg_mod_productvariants')) { ?>
+				
+					<br />
+					
+					<p class="wpsg_hinweis">Ist das Produkt ein Variantenprodukt, kÃ¶nnen die Codes unter Produktvarianten fÃŒr einzelne Variationen ÃŒberschrieben werden.</p>
+					
+				<?php } ?>
+				
+			<?php } else { ?>
+			
+				<p><?php echo __('Bitte Produkt erst speichern.', 'wpsg'); ?></p>
+			
+			<?php } ?>
+			
+		<?php echo wpsg_drawForm_AdminboxEnd(); ?>
+	</div>
+</div>
Index: /views/produkt/index.phtml
===================================================================
--- /views/produkt/index.phtml	(revision 8278)
+++ /views/produkt/index.phtml	(revision 8279)
@@ -202,12 +202,4 @@
                         <?php } ?>
                         
-						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_gtin') == '1') { ?>
-						<th class="wpsg_order" data-order="gtin-nr"><?php echo __("GTIN", "wpsg"); ?></th>						
-						<?php } ?>
-	
-						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_ean') == '1') { ?>
-						<th class="wpsg_order" data-order="ean-nr"><?php echo __("EAN", "wpsg"); ?></th>
-						<?php } ?>
-	
 						<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_productindex') == '1') { ?>
 						<th class="wpsg_order" data-order="deliverytime"><?php echo __("Lieferzeit", 'wpsg'); ?></th>
@@ -337,10 +329,4 @@
                         </td>
                         <?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_gtin') == '1') { ?>
-							<td><?php echo wpsg_hspc($d['gtin']); ?></td>
-						<?php } ?>
-						<?php if ($this->hasMod('wpsg_mod_produktartikel') && $this->get_option('wpsg_mod_produktartikel_ean') == '1') { ?>
-							<td><?php echo wpsg_hspc($d['ean']); ?></td>
-						<?php } ?>
 						<?php if ($this->hasMod('wpsg_mod_deliverytime') && $this->get_option('wpsg_mod_deliverytime_productindex') == '1') { ?>
                         <td>
Index: /views/produkttemplates/standard.phtml
===================================================================
--- /views/produkttemplates/standard.phtml	(revision 8278)
+++ /views/produkttemplates/standard.phtml	(revision 8279)
@@ -20,5 +20,5 @@
 	<input type="hidden" name="wpsg_post_id" value="<?php echo get_the_ID(); ?>" />
 	<input type="hidden" name="titleDisplayed" value="<?php echo $this->titleDisplayed; ?>" />
-
+ 
 	<div class="wpsg_produkt wpsg_product_name">
 
@@ -36,9 +36,13 @@
 	<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'])); ?>" />
-        <meta itemprop="sku" content="<?php echo wpsg_hspc($oProduct->getProductNr()); ?>" />
-        <meta itemprop="gtin13" content="<?php echo wpsg_hspc($oProduct->getEAN()); ?>" />
-        <meta itemprop="detailname" content="<?php echo wpsg_hspc($this->view['data']['detailname']); ?>" />
-
+		<meta itemprop="name" content="<?php echo wpsg_hspc($this->getProductName($this->view['data']['id'])); ?>" />
+		<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) { ?>
+			<meta itemprop="<?php echo $product_code['itemprop']; ?>" content="<?php echo $product_code['code']; ?>" />
+			<?php } ?>
+		<?php } ?>
+		
 		<?php /* Block fÃŒr die Produktbilder START */ ?>
 		<?php 
@@ -80,11 +84,21 @@
 		<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
 		<div class="wpsg_artikelnummer">
-			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span><br />
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_ean'))) {?>
-				<?php echo __('EAN','wpsg');?>:<span class="wpsg_ean"><?php echo wpsg_hspc($this->view['data']['ean']); ?></span><br />
-			<?php } ?>
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_gtin'))) {?>
-				<?php echo __('GTIN','wpsg');?>:<span class="wpsg_gtin"><?php echo wpsg_hspc($this->view['data']['gtin']); ?></span><br />
-			<?php }?></div>
+			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
+		</div>
+		<?php } ?>
+		
+		<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
+		<?php if (sizeof($arProductCodes) > 0) { ?>
+			<div class="product_code_wrap">
+			<?php foreach ($arProductCodes as $product_code) { ?>
+				<?php if ($product_code !== null) { ?>
+					
+					<div class="product_code <?php echo $product_code['code_key']; ?>">
+						<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
+					</div>
+					
+				<?php } ?>
+			<?php } ?>
+			</div>
 		<?php } ?>
 
@@ -165,5 +179,5 @@
 		<?php }?>
 		<?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt ENDE */ ?>
-
+		
 		<div itemprop="description" class="wpsg_produkt_shortdescription">
 		
Index: /views/produkttemplates/standard2.phtml
===================================================================
--- /views/produkttemplates/standard2.phtml	(revision 8278)
+++ /views/produkttemplates/standard2.phtml	(revision 8279)
@@ -11,4 +11,5 @@
 //$this->noReleatedProducts = true;
 
+	/** @var wpsg_product $oProduct */
 	$oProduct = $this->view['oProduct'];
 
@@ -86,11 +87,21 @@
 		<?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
 		<div class="wpsg_artikelnummer">
-			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span><br />
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_ean'))) {?>
-				<?php echo __('EAN','wpsg');?>:<span class="wpsg_ean"><?php echo wpsg_hspc($this->view['data']['ean']); ?></span><br />
-			<?php } ?>
-			<?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_gtin'))) {?>
-				<?php echo __('GTIN','wpsg');?>:<span class="wpsg_gtin"><?php echo wpsg_hspc($this->view['data']['gtin']); ?></span><br />
-			<?php }?></div>
+			<?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
+		</div>
+		<?php } ?>
+		
+		<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
+		<?php if (sizeof($arProductCodes) > 0) { ?>
+			<div class="product_code_wrap">
+			<?php foreach ($arProductCodes as $product_code) { ?>
+				<?php if ($product_code !== null) { ?>
+					
+					<div class="product_code <?php echo $product_code['code_key']; ?>">
+						<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
+					</div>
+					
+				<?php } ?>
+			<?php } ?>
+			</div>
 		<?php } ?>
 
Index: /views/produkttemplates/standard3.phtml
===================================================================
--- /views/produkttemplates/standard3.phtml	(revision 8278)
+++ /views/produkttemplates/standard3.phtml	(revision 8279)
@@ -70,13 +70,22 @@
                 <?php if ($this->get_option('wpsg_showArticelnumber') == '1') { ?>
                     <div class="wpsg_artikelnummer">
-                        <?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($this->view['data']['anr']); ?></span><br />
-                        <?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_ean'))) {?>
-                            <?php echo __('EAN','wpsg');?>:<span class="wpsg_ean"><?php echo wpsg_hspc($this->view['data']['ean']); ?></span><br />
-                        <?php } ?>
-                        <?php if (wpsg_isSizedInt($this->get_option('wpsg_mod_produktartikel_gtin'))) {?>
-                            <?php echo __('GTIN','wpsg');?>:<span class="wpsg_gtin"><?php echo wpsg_hspc($this->view['data']['gtin']); ?></span><br />
-                        <?php }?>
-                    </div>
-                <?php } ?>
+                        <?php echo __('Artikelnummer', 'wpsg'); ?>: <span class="wpsg_anr"><?php echo wpsg_hspc($oProduct->getNr()); ?></span><br />
+					</div>
+				<?php } ?>
+				
+				<?php $arProductCodes = $oProduct->getAllProductCodes(); ?>
+				<?php if (sizeof($arProductCodes) > 0) { ?>
+					<div class="product_code_wrap">
+					<?php foreach ($arProductCodes as $product_code) { ?>
+						<?php if ($product_code !== null) { ?>
+							
+							<div class="product_code <?php echo $product_code['code_key']; ?>">
+								<span class="label"><?php echo $product_code['label']; ?></span>: <span class="code"><?php echo $product_code['code']; ?></span>
+							</div>
+							
+						<?php } ?>
+					<?php } ?>
+					</div>
+				<?php } ?>
 
                 <?php /* Abfrage Preisanzeige nur fÃŒr eingeloggte User aktiv und User eingeloggt START*/ ?>
