403Webshell
Server IP : 85.158.181.41  /  Your IP : 216.73.217.12
Web Server : Apache
System : Linux cloud9-vm129 6.1.178+1-ph #ph SMP PREEMPT_DYNAMIC Wed Jul 29 09:00:54 UTC 2026 x86_64
User : moncbefd ( 1024)
PHP Version : 7.3.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/moncbefd/www.moneta.at/system/classes/products/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/moncbefd/www.moneta.at/system/classes/products/ProductInfoContentView.inc.php
<?php
/* --------------------------------------------------------------
   ProductInfoContentView.inc.php 2019-10-30
   Gambio GmbH
   http://www.gambio.de
   Copyright (c) 2019 Gambio GmbH
   Released under the GNU General Public License (Version 2)
   [http://www.gnu.org/licenses/gpl-2.0.html]
   --------------------------------------------------------------


   based on:
   (c) 2000-2001 The Exchange Project  (earlier name of osCommerce)
   (c) 2002-2003 osCommerce(product_info.php,v 1.94 2003/05/04); www.oscommerce.com
   (c) 2003      nextcommerce (product_info.php,v 1.46 2003/08/25); www.nextcommerce.org
   (c) 2003 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: product_info.php 1320 2005-10-25 14:21:11Z matthias $)


   Released under the GNU General Public License
   -----------------------------------------------------------------------------------------
   Third Party contribution:
   Customers Status v3.x  (c) 2002-2003 Copyright Elari elari@free.fr | www.unlockgsm.com/dload-osc/ | CVS : http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/elari/?sortby=date#dirlist
   New Attribute Manager v4b                            Autor: Mike G | mp3man@internetwork.net | http://downloads.ephing.com
   Cross-Sell (X-Sell) Admin 1                          Autor: Joshua Dechant (dreamscape)
   Released under the GNU General Public License
   ---------------------------------------------------------------------------------------*/

// include needed functions
require_once DIR_FS_INC . 'xtc_get_download.inc.php';
require_once DIR_FS_INC . 'xtc_delete_file.inc.php';
require_once DIR_FS_INC . 'xtc_get_all_get_params.inc.php';
require_once DIR_FS_INC . 'xtc_date_long.inc.php';
require_once DIR_FS_INC . 'xtc_draw_hidden_field.inc.php';
require_once DIR_FS_INC . 'xtc_image_button.inc.php';
require_once DIR_FS_INC . 'xtc_draw_form.inc.php';
require_once DIR_FS_INC . 'xtc_draw_input_field.inc.php';
require_once DIR_FS_INC . 'xtc_image_submit.inc.php';
require_once DIR_FS_INC . 'xtc_check_categories_status.inc.php';
require_once DIR_FS_INC . 'xtc_get_products_mo_images.inc.php';
require_once DIR_FS_INC . 'xtc_get_vpe_name.inc.php';
require_once DIR_FS_INC . 'get_cross_sell_name.inc.php';
require_once DIR_FS_INC . 'xtc_get_products_stock.inc.php';
require_once DIR_FS_CATALOG . 'gm/inc/gm_prepare_number.inc.php';

/**
 * Class ProductInfoContentView
 */
class ProductInfoContentView extends ContentView
{
    protected $getArray = array(); // $_GET
    protected $postArray = array(); // $_POST

    protected $cheapestCombiArray = array();
    protected $combiId = 0;
    protected $currency = '';
    protected $currentCategoryId = 0;
    protected $currentCombiArray = array();
    protected $customerDiscount = 0.0;
    protected $fsk18DisplayAllowed = true;
    protected $fsk18PurchaseAllowed = true;
    protected $customerStatusId = -1;
    protected $hasProperties = false;
    protected $languageId = 0;
    protected $language = '';
    protected $lastListingSql = '';
    protected $main;
    protected $product;
    protected $productPriceArray = array();
    protected $showGraduatedPrices = false;
    protected $showPrice = true;
    protected $xtcPrice;
    /** @var GMSEOBoost_ORIGIN */
    protected $seoBoost;
    protected $maxImageHeight = 0;
    protected $additionalFields = array();
    protected $offerAggregationLimit = 100;
    protected $stockAllowCheckout = true;
    protected $stockCheck = true;
    protected $attributeStockCheck = true;
    protected $appendPropertiesModel = true;
    protected $showPriceTax = true;

    /**
     * @var VPEReadServiceInterface
     */
    protected $VPEReadService;
    /**
     * @var ManufacturerReadServiceInterface
     */
    protected $manufacturerReadService;

    /**
     * ProductInfoContentView constructor.
     * @param string $p_template
     */
    function __construct($p_template = 'default')
    {
        parent::__construct();
        $filepath = DIR_FS_CATALOG . 'templates/' . CURRENT_TEMPLATE . '/module/product_info/';

        // get default template
        $c_template = $this->get_default_template($filepath, $p_template);

        $this->set_content_template('module/product_info/' . $c_template);
        $this->set_flat_assigns(true);
    }

    /**
     *
     */
    function prepare_data()
    {
        if ($this->product instanceof product && $this->product->isProduct()) {
            $this->_setPriceData();

            $this->_assignProductData();

            $this->_assignProductNavigator();
            $this->_assignFormTagData();
            $this->_assignWidgets();
            $this->_assignReviews();
            $this->_assignProductLists();
            $this->_assignItemCondition();
            $this->_assignRichSnippetData();
            $this->_setPaypalEcButton();

            // TODO move to control
            $this->_updateProductViewsStatistic();
            $this->_updateTracking();

            // test google analytics json
            //$serializer = new GAProductSerializer();
            //
            //$productId  = new IdType($this->product->data['products_id']);
            //$languageId = new IdType($_SESSION['languages_id']);
            //
            //$this->set_content_data('easyJson', $serializer->encode(GoogleAnalyticsServiceFactory::frontendService()
            //                                                                                     ->getProductsDataById($productId,
            //                                                                                                           $languageId),
            //                                                        JSON_PRETTY_PRINT));
        }
    }


    public function get_html()
    {
        if (($this->product instanceof product) === false || !$this->product->isProduct()) {
            // product not found in database
            $error = TEXT_PRODUCT_NOT_FOUND;

            /* @var ErrorMessageContentView $coo_error_message */
            $errorView = MainFactory::create_object('ErrorMessageContentView');
            $errorView->set_error($error);
            $htmlOutput = $errorView->get_html();
        } else {
            $this->prepare_data();
            $htmlOutput = $this->build_html();
        }

        return $htmlOutput;
    }


    protected function _assignProductData()
    {
        // assign properties and set $this->hasProperties flag
        $this->_setPropertiesData();

        $this->_assignAttributes();
        $this->_assignDate();
        $this->_assignDeactivatedButtonFlag();
        $this->_assignGPrint();
        $this->_assignDescription();
        $this->_assignDiscount();
        $this->_assignEan();
        $this->_assignGraduatedPrices();
        $this->_assignId();
        $this->_assignImageData();
        $this->_assignImageMaxHeight();
        $this->_assignLegalAgeFlag();
        $this->_assignModelNumber();
        $this->_assignName();
        $this->_assignNumberOfOrders();
        $this->_assignPrice();
        $this->_assignProductUrl();
        $this->_assignQuantity();
        $this->_assignShippingTime();
        $this->_assignStatus();
        $this->_assignVpe();
        $this->_assignWeight();
        $this->_assignAdditionalFields();

        if ($this->_showPrice()) {
            $this->_assignShippingLink();
            $this->_assignTaxInfo();
        }

        if ($this->_productIsForSale()) {
            $this->_assignInputFieldQuantity();
            $this->_assignPayPalInstallments();
        } else {
            $this->_assignDeprecatedIdHiddenField();
        }

        $this->set_content_data('showManufacturerImages', gm_get_conf('SHOW_MANUFACTURER_IMAGE_PRODUCT_DETAILS'));
        $this->set_content_data('showProductRibbons', gm_get_conf('SHOW_PRODUCT_RIBBONS'));

        $showRating = false;
        if (gm_get_conf('ENABLE_RATING') === 'true') {
            $showRating = true;
        }
        $this->content_array['showRating'] = $showRating;
    }


    protected function _assignPayPalInstallments()
    {
        if (strtolower((string)@constant('MODULE_PAYMENT_PAYPAL3_INSTALLMENTS_STATUS')) == true) {
            $output = '';
            $paypalConfiguration = MainFactory::create('PayPalConfigurationStorage');
            $showSpecific = (bool)$paypalConfiguration->get('show_installments_presentment_specific_product');
            $hasAttributes = trim($this->content_array['MODULE_product_options']) !== '';
            $showComputed = $hasAttributes === false && $this->hasProperties === false
                && (bool)$paypalConfiguration->get('show_installments_presentment_specific_computed');
            $productPrice = $this->productPriceArray['plain'];
            $paypalInstallments = MainFactory::create('PayPalInstallments');
            if ($showSpecific && $productPrice >= $paypalInstallments->getMinimumAmount()['amount']
                && $productPrice <= $paypalInstallments->getMaximumAmount()['amount']) {
                if ($showComputed == true) {
                    try {
                        $response = $paypalInstallments->getInstallmentInfo($productPrice, $_SESSION['currency'], 'DE');
                        if (!empty($response->financing_options[0]->qualifying_financing_options)) {
                            $representativeOption = $paypalInstallments->getRepresentativeOption($response->financing_options[0]->qualifying_financing_options);
                            $specificContentView = MainFactory::create('PayPalInstallmentSpecificUpstreamPresentmentContentView');
                            $specificContentView->qualifyingOptions = $response->financing_options[0]->qualifying_financing_options;
                            $specificContentView->nonQualifyingOptions = $response->financing_options[0]->non_qualifying_financing_options;
                            $specificContentView->lender = implode(', ', [
                                COMPANY_NAME,
                                TRADER_STREET . ' ' . TRADER_STREET_NUMBER,
                                TRADER_ZIPCODE . ' ' . TRADER_LOCATION
                            ]);
                            $specificContentView->currency = $_SESSION['currency'];
                            $specificContentView->cashPurchasePrice = $productPrice;
                            $specificContentView->numberOfInstallments = $representativeOption->credit_financing->term;
                            $specificContentView->borrowingRate = $representativeOption->credit_financing->nominal_rate;
                            $specificContentView->annualPercentageRate = $representativeOption->credit_financing->apr;
                            $specificContentView->installmentAmount = $representativeOption->monthly_payment->value;
                            $specificContentView->totalAmount = $representativeOption->total_cost->value;
                            $specificContentView->representativeFinancingCode = $representativeOption->credit_financing->financing_code;
                            $output = $specificContentView->get_html();
                        }
                    } catch (Exception $e) {
                        $output = sprintf("<!-- PPI Exception -->\n");
                    }
                } else {
                    if ($this->hasProperties || $hasAttributes) {
                        $amount = 'dynamic';
                    } else {
                        $amount = $productPrice;
                    }
                    $contentView = MainFactory::create('ContentView');
                    $contentView->set_content_template('module/paypalinstallmentspecificstatic.html');
                    $contentView->set_flat_assigns(true);
                    $contentView->set_caching_enabled(false);
                    $contentView->set_content_data('amount', $amount);
                    $output = $contentView->get_html();
                }
            } else {
                $contentView = MainFactory::create('ContentView');
                $contentView->set_content_template('module/paypalinstallmentspecificoutofbounds.html');
                $contentView->set_flat_assigns(true);
                $contentView->set_caching_enabled(false);
                $output = $contentView->get_html();
            }
            $this->set_content_data('PayPalInstallments', $output);
        }
    }


    protected function _assignProductLists()
    {
        $this->_assignAlsoPurchased();
        $this->_assignCrossSelling();
        $this->_assignReverseCrossSelling();
        $this->_assignYoochoose();
    }


    protected function _assignWidgets()
    {
        $this->_assignWishlist();

        $this->_assignSocialServices();
        $this->_assignTellAFriend();
        $this->_assignPriceOffer();
        $this->_assignPrintLink();
    }


    protected function _assignProductNavigator()
    {
        if (ACTIVATE_NAVIGATOR == 'true') {
            /* @var ProductNavigatorContentView $view */
            $view = MainFactory::create_object('ProductNavigatorContentView');
            $view->setProduct($this->product);
            $view->setCategoryId($this->currentCategoryId);
            $view->setLastListingSql($this->lastListingSql);
            $view->setFSK18DisplayAllowed((int)$this->fsk18DisplayAllowed);
            $view->setCustomerStatusId($this->customerStatusId);
            $view->setLanguageId($this->languageId);
            $html = $view->get_html();
            $this->set_content_data('PRODUCT_NAVIGATOR', $html);
        }
    }


    protected function _updateProductViewsStatistic()
    {
        $query = 'UPDATE ' . TABLE_PRODUCTS_DESCRIPTION . '
					SET products_viewed = products_viewed+1
					WHERE
						products_id = ' . (int)$this->product->data['products_id'] . ' AND
						language_id = ' . (int)$this->languageId;

        xtc_db_query($query);
    }


    protected function _setPriceData()
    {
        $query = 'SELECT products_properties_combis_id
					FROM products_properties_combis
					WHERE products_id = ' . (int)$this->product->data['products_id'];
        $result = xtc_db_query($query);

        if (xtc_db_num_rows($result) >= 1) {
            if (xtc_db_num_rows($result) == 1) {
                $row = xtc_db_fetch_array($result);
                $this->combiId = $row['products_properties_combis_id'];
            }

            $coo_properties_control = MainFactory::create_object('PropertiesControl');
            if ($this->combiId > 0) {
                // GET selected combi (GET)
                $this->currentCombiArray = $coo_properties_control->get_combis_full_struct($this->combiId,
                    $this->languageId);
            }
            if ($this->currentCombiArray == false) {
                // GET CHEAPEST COMBI
                $this->cheapestCombiArray = $coo_properties_control->get_cheapest_combi($this->product->data['products_id'],
                    $this->languageId);
                $this->xtcPrice->showFrom_Attributes = true;
            }
        }

        $this->productPriceArray = $this->xtcPrice->xtcGetPrice($this->product->data['products_id'], true, 1,
            $this->product->data['products_tax_class_id'],
            $this->product->data['products_price'], 1);

        if (!empty($this->cheapestCombiArray) && $this->cheapestCombiArray['combi_price'] != 0) {
            $this->productPriceArray = $this->xtcPrice->xtcGetPrice($this->product->data['products_id'], true, 1,
                $this->product->data['products_tax_class_id'],
                $this->product->data['products_price'], 1, 0, true,
                true,
                $this->cheapestCombiArray['products_properties_combis_id']);
        }

        if (!empty($this->currentCombiArray) && $this->currentCombiArray['combi_price'] != 0) {
            $this->productPriceArray = $this->xtcPrice->xtcGetPrice($this->product->data['products_id'], true, 1,
                $this->product->data['products_tax_class_id'],
                $this->product->data['products_price'], 1, 0, true,
                true,
                $this->currentCombiArray['products_properties_combis_id']);
        }
    }


    protected function _assignAlsoPurchased()
    {
        /* @var AlsoPurchasedContentView $view */
        $view = MainFactory::create_object('AlsoPurchasedContentView');
        $view->set_coo_product($this->product);
        $html = $view->get_html();
        $this->set_content_data('MODULE_also_purchased', $html);
    }


    protected function _assignYoochoose()
    {
        if (defined('YOOCHOOSE_ACTIVE') && YOOCHOOSE_ACTIVE) {
            include_once(DIR_WS_INCLUDES . 'yoochoose/recommendations.php');
            include_once(DIR_WS_INCLUDES . 'yoochoose/functions.php');

            /* @var YoochooseAlsoInterestingContentView $view */
            $view = MainFactory::create_object('YoochooseAlsoInterestingContentView');
            $view->setProduct($this->product);
            $html = $view->get_html();
            $this->set_content_data('MODULE_yoochoose_also_interesting', $html);

            $yooHtml = '<img src="' . getTrackingURL('click', $this->product) . '" width="0" height="0" alt="">';

            if (array_key_exists('ycr', $this->getArray)) {
                $yooHtml .= '<img src="' . getTrackingURL('follow', $this->product) . '" width="0" height="0" alt="">';
            }

            $this->set_content_data('MODULE_yoochoose_product_tracking', $yooHtml . "\n");
        }
    }


    protected function _assignAttributes()
    {
        // CREATE ProductAttributesContentView OBJECT
        /* @var ProductAttributesContentView $view */
        $view = MainFactory::create_object('ProductAttributesContentView');

        // SET TEMPLATE
        $filepath = DIR_FS_CATALOG . 'templates/' . CURRENT_TEMPLATE . '/module/product_options/';
        $c_template = $view->get_default_template($filepath, $this->product->data['options_template']);
        $view->set_content_template('module/product_options/' . $c_template);

        // SET DATA
        $view->set_coo_product($this->product);
        $view->set_language_id($this->languageId);

        // GET HTML
        $html = $view->get_html();
        $this->set_content_data('MODULE_product_options', $html);
    }


    protected function _assignCrossSelling()
    {
        /* @var CrossSellingContentView $view */
        $view = MainFactory::create_object('CrossSellingContentView');
        $view->set_type('cross_selling');
        $view->set_coo_product($this->product);
        $html = $view->get_html();
        $this->set_content_data('MODULE_cross_selling', $html);
    }


    protected function _assignReverseCrossSelling()
    {
        if (ACTIVATE_REVERSE_CROSS_SELLING == 'true') {
            /* @var CrossSellingContentView $view */
            $view = MainFactory::create_object('CrossSellingContentView');
            $view->set_type('reverse_cross_selling');
            $view->set_coo_product($this->product);
            $html = $view->get_html();
            $this->set_content_data('MODULE_reverse_cross_selling', $html);
        }
    }
    
    
    protected function _assignRichSnippetData()
    {
        $isActive = (bool)$this->product->data['products_fsk18'] === false
                    && ($this->stockAllowCheckout
                        || (($this->product->data['products_quantity'] > 0)
                            && !$this->stockAllowCheckout))
                    && (string)$this->product->data['gm_price_status'] === '0';
        if (!$isActive) {
            return;
        }
        
        $db = StaticGXCoreLoader::getDatabaseQueryBuilder();
        /** @var \LanguageHelper $languageHelper */
        $languageHelper = MainFactory::create('LanguageHelper', $db);
        $languageCode   = $languageHelper->getLanguageCodeById(new IdType((int)$this->languageId));
        $taxIncluded    = $this->showPriceTax;
        
        $itemCondition = 'NewCondition';
        if ($this->content_array['ITEM_CONDITION'] === 'refurbished') {
            $itemCondition = 'RefurbishedCondition';
        } elseif ($this->content_array['ITEM_CONDITION'] === 'used') {
            $itemCondition = 'UsedCondition';
        }
        
        $productsQuantity = xtc_get_products_stock($this->product->data['products_id']);
        $availability     = ($productsQuantity > 0 || !$this->stockCheck) ? 'InStock' : 'OutOfStock';
        
        $descriptionTabs = preg_split('/\[TAB.+?\]/', $this->product->data['products_description']);
        do {
            $description = array_shift($descriptionTabs);
        } while (empty($description) && !empty($descriptionTabs));
        $description = strtr($description, ["\n" => ' ', "\r" => ' ']);
        $description = strip_tags($description);
        if ($this->getSeoBoost()->boost_products === true) {
            $productUrl = xtc_href_link($this->getSeoBoost()
                                            ->get_boosted_product_url($this->product->data['products_id'],
                                                                      $this->product->data['products_name']));
        } else {
            $productUrl = xtc_href_link(FILENAME_PRODUCT_INFO,
                                        xtc_product_link($this->product->data['products_id'],
                                                         $this->product->data['products_name']) . '&no_boost=1');
        }
        
        $productImage = GM_HTTP_SERVER . DIR_WS_CATALOG . DIR_WS_INFO_IMAGES . rawurlencode($this->product->data['products_image']);
        $linkedData = [
            '@context'      => 'http://schema.org',
            '@type'         => 'Product',
            'name'          => $this->product->data['products_name'],
            'description'   => $description,
            'image'         => [ $productImage, ],
            'url'           => $productUrl,
            'itemCondition' => $itemCondition,
        ];
        
        /** @var \xtcPrice_ORIGIN $xtPrice */
        $xtPrice  = $this->xtcPrice;
        $priceRaw = $xtPrice->xtcGetPrice($this->product->data['products_id'],
                                          false,
                                          1,
                                          $this->product->data['products_tax_class_id'],
                                          $this->product->data['products_price']);
        if (is_float($priceRaw)) {
            $price            = number_format($priceRaw, 2, '.', '');
            $priceValidUntil = '2100-01-01 00:00:00';
            $specialPriceData = $db->get_where('specials',
                                               [
                                                   'products_id' => (int)$this->product->data['products_id'],
                                                   'status'      => 1
                                               ])->row_array();
            $priceValidUntil = '2100-01-01 00:00:00';
            try {
                if (($specialPriceData !== null)) {
                    $expiresDateTime = new DateTime($specialPriceData['expires_date']);
                    if ($expiresDateTime->getTimestamp() > time()) {
                        $priceValidUntil = $expiresDateTime->format('c');
                    }
                }
            } catch (Exception $e) {
                $priceValidUntil = '2100-01-01 00:00:00';
            }
    
            $linkedData['offers'] = [
                '@type'              => 'Offer',
                'availability'       => $availability,
                'price'              => $price,
                'priceCurrency'      => $this->getCurrency(),
                'priceSpecification' => [
                    '@type'                 => 'http://schema.org/PriceSpecification',
                    'price'                 => $price,
                    'priceCurrency'         => $this->getCurrency(),
                    'valueAddedTaxIncluded' => $taxIncluded,
                ],
                'url'                => $productUrl,
            ];
        }
        
        if (!empty($priceValidUntil)) {
            $linkedData['offers']['priceValidUntil'] = $priceValidUntil;
        }
        
        $additionalImagesArray = xtc_get_products_mo_images($this->product->data['products_id']);
        if (is_array($additionalImagesArray) && !empty($additionalImagesArray)) {
            foreach ($additionalImagesArray as $imageArray) {
                $linkedData['image'][] = GM_HTTP_SERVER . DIR_WS_CATALOG . DIR_WS_INFO_IMAGES
                                         . rawurlencode($imageArray['image_name']);
            }
        }
        
        if (!empty($this->product->data['products_model'])) {
            $linkedData['model'] = $this->product->data['products_model'];
            $linkedData['sku']   = $this->product->data['products_model'];
        }
        
        if ((float)$this->product->data['gm_min_order'] === 0) {
            $linkedData['offers']['availability'] = 'http://schema.org/OutOfStock';
        }
        
        if ($this->content_array['ITEM_CONDITION'] === 'refurbished') {
            $linkedData['offers']['itemCondition'] = 'http://schema.org/RefurbishedCondition';
        } elseif ($this->content_array['ITEM_CONDITION'] === 'used') {
            $linkedData['offers']['itemCondition'] = 'http://schema.org/UsedCondition';
        }
        
        if (in_array(strlen($this->product->data['products_ean']), [8, 12, 13, 14], true)) {
            $linkedData['offers']['gtin'
                                  . strlen($this->product->data['products_ean'])] = $this->product->data['products_ean'];
            $linkedData['gtin'
                        . strlen($this->product->data['products_ean'])]           = $this->product->data['products_ean'];
        }
        
        if (!empty($this->product->data['manufacturers_id'])
            && $manufacturer = $this->getManufacturerById($this->product->data['manufacturers_id'])) {
            
            $linkedData['manufacturer'] = [
                '@type' => 'Organization',
                'name'  => $manufacturer->getName(),
            ];
        }
        
        $db               = StaticGXCoreLoader::getDatabaseQueryBuilder();
        $productItemCodes = $db->where('products_id',
                                       (int)$this->product->data['products_id'])
            ->get('products_item_codes')
            ->row_array();
        if (!empty($productItemCodes['brand_name'])) {
            $brand = [
                '@type' => 'Brand',
                'name'  => $productItemCodes['brand_name'],
            ];
            $linkedData['brand'] = $brand;
        }
        
        if (!empty($productItemCodes['code_isbn'])) {
            $linkedData['productId'] = 'isbn:' . $productItemCodes['code_isbn'];
        }
        
        if (!empty($productItemCodes['code_mpn'])) {
            $linkedData['mpn'] = $productItemCodes['code_mpn'];
        }
        
        if ($this->product->data['products_vpe_value'] > 0 && (int)$this->product->data['products_vpe']
            && $vpe = $this->getVPEById($this->product->data['products_vpe'])) {
            $linkedData['offers']['priceSpecification']['@type']             = 'http://schema.org/UnitPriceSpecification';
            $linkedData['offers']['priceSpecification']['referenceQuantity'] = [
                '@type'    => 'QuantitativeValue',
                'value'    => $this->product->data['products_vpe_value'],
                'unitText' => $vpe->getName($languageCode),
            ];
        }
        
        /** @var \xtcPrice_ORIGIN $xtcPrice */
        $xtcPrice = $this->getXtcPrice();
        
        $totalVariants = $this->getNumberOfVariants((int)$this->product->data['products_id']);
        if ($totalVariants < $this->getOfferAggregationLimit()) {
            $propertiesCombis = $this->getProductPropertiesCombis((int)$this->product->data['products_id']);
            if (!empty($propertiesCombis)) {
                $linkedData['model'] = [];
                foreach ($propertiesCombis as $combi) {
                    $productPrice      = $this->product->data['products_price'];
                    $combiProductId    = empty($combi['unique_products_id']) ? $this->product->data['products_id'] : $combi['unique_products_id'];
                    $combiPropertiesId = empty($combi['products_properties_combis_id']) ? 0 : (int)$combi['products_properties_combis_id'];
                    if (!empty($combiPropertiesId)) {
                        $combiPrice = $xtPrice->xtcGetPrice($combiProductId,
                                                            false,
                                                            1,
                                                            $this->product->data['products_tax_class_id'],
                                                            $productPrice,
                                                            0,
                                                            0,
                                                            true,
                                                            $combiPropertiesId > 0,
                                                            $combiPropertiesId);
                    }
                    if (!empty($combi['unique_products_id'])) {
                        $combiPrice = $xtPrice->getPprice($combiProductId);
                        if ($specialPriceData !== null) {
                            $combiPrice = $specialPriceData['specials_new_product_price'];
                        }
                        if ($combi['combi_price_type'] === 'calc') {
                            $combiPrice += $combi['combi_price'];
                        }
                        if ($combi['combi_price_type'] === 'fix') {
                            $combiPrice = $combi['combi_price'];
                        }
                        $combiPrice = $xtcPrice->xtcFormat($combiPrice,
                                                           false,
                                                           $this->product->data['products_tax_class_id'],
                                                           true);
                    }
                    $baseModel = !empty($this->product->data['products_model']) ? $this->product->data['products_model'] : '';
    
                    if (!empty($combi['combi_image'])) {
                        $combiImage = GM_HTTP_SERVER . DIR_WS_CATALOG . DIR_WS_IMAGES . 'product_images/properties_combis_images/'
                                      . rawurlencode($combi['combi_image']);
                    } else {
                        $combiImage = $productImage;
                    }
    
                    /*
                     * $this->product->data['use_properties_combis_quantity']
                     * 0 - global default
                     * 1 - product quantity
                     * 2 - combi quantity
                     * 3 - no check
                     */
                    $combiAvailability = null;
                    if (!empty($combi['products_properties_combis_id'])) {
                        // product variants via properties
                        $variantProductsId = $this->product->data['products_id'] . 'x'
                                             . $combi['products_properties_combis_id'];
                        if ($this->stockCheck
                            && (int)$this->product->data['use_properties_combis_quantity'] !== 3) {
                            if ((int)$this->product->data['use_properties_combis_quantity'] === 1
                                || ((int)$this->product->data['use_properties_combis_quantity'] === 0
                                    && !$this->attributeStockCheck)) {
                                // use product quantity
                                $combiAvailability = $availability;
                            } elseif ((int)$this->product->data['use_properties_combis_quantity'] === 2
                                      || ((int)$this->product->data['use_properties_combis_quantity'] === 0
                                          && $this->attributeStockCheck)) {
                                // use combi quantity
                                $combiAvailability = $combi['combi_quantity'] > 0 ? 'InStock' : 'OutOfStock';
                            }
                        } else {
                            // stock checks are disabled, assume InStock
                            $combiAvailability = 'InStock';
                        }
                    } else {
                        // product variants via attributes
                        $variantProductsId = $combi['unique_products_id'];
                        if ($this->stockCheck) {
                            if ($this->attributeStockCheck) {
                                $combiAvailability = $combi['combi_quantity'] > 0 ? 'InStock' : 'OutOfStock';
                            } else {
                                $combiAvailability = $availability;
                            }
                        } else {
                            $combiAvailability = 'InStock';
                        }
                    }
    
                    $variantUrl = xtc_href_link(FILENAME_PRODUCT_INFO,
                                                xtc_product_link($variantProductsId,
                                                                 $this->product->data['products_name'])
                                                . '&no_boost=1');
                    if (!empty($combi['products_properties_combis_id']) && $this->getSeoBoost()->boost_products === true) {
                        $variantUrl = xtc_href_link($this->getSeoBoost()
                                                        ->get_boosted_product_url($this->product->data['products_id'],
                                                                                  $this->product->data['products_name']),
                        'combi_id=' . $combi['products_properties_combis_id']);
                    }
                    
                    if (is_float($combiPrice)) {
                        $model = [
                            '@type'       => 'ProductModel',
                            'name'        => $this->product->data['products_name'],
                            //'description' => $description,
                            'model'       => $baseModel . ($this->appendPropertiesModel ? '-'
                                                                                          . $combi['combi_model'] : ''),
                            'sku'         => $baseModel . ($this->appendPropertiesModel ? '-'
                                                                                          . $combi['combi_model'] : ''),
                            'offers'      => [
                                '@type'              => 'Offer',
                                'price'              => number_format($combiPrice, 2, '.', ''),
                                'priceCurrency'      => $this->getCurrency(),
                                'priceSpecification' => [
                                    '@type'                 => 'http://schema.org/PriceSpecification',
                                    'price'                 => number_format($combiPrice, 2, '.', ''),
                                    'priceCurrency'         => $this->getCurrency(),
                                    'valueAddedTaxIncluded' => $taxIncluded,
                                ],
                                'url'         => $variantUrl,
                            ],
                            'url'         => $variantUrl,
                        ];
                        
                        if (!empty($combiImage)) {
                            $model['image'] = $combiImage;
                        }
    
                        if (!empty($brand)) {
                            $model['brand'] = $brand;
                        }
                        
                        if (!empty($priceValidUntil)) {
                            $model['offers']['priceValidUntil'] = $priceValidUntil;
                        }
                        
                        if (!empty($combiAvailability)) {
                            $model['offers']['availability'] = $combiAvailability;
                        }
                        
                        if (in_array(strlen($combi['combi_ean']), [8, 12, 13, 14], true)) {
                            $model['gtin' . strlen($combi['combi_ean'])] = $combi['combi_ean'];
                        }
                        
                        if ((int)$combi['products_vpe_id'] !== 0
                            && $vpe = $this->getVPEById((int)$combi['products_vpe_id'])) {
                            $model['offers']['priceSpecification']['@type']             = 'http://schema.org/UnitPriceSpecification';
                            $model['offers']['priceSpecification']['referenceQuantity'] = [
                                '@type'    => 'QuantitativeValue',
                                'value'    => $combi['vpe_value'],
                                'unitText' => $vpe->getName($languageCode),
                            ];
                        }
                        $linkedData['model'][] = $model;
                    }
                    unset($linkedData['availability']);
                }
            }
        } else {
            $productPrice                   = $this->product->data['products_price'];
            $db                             = StaticGXCoreLoader::getDatabaseQueryBuilder();
            $maxPropertiesCombisPriceResult = $db->query('SELECT products_id, MAX(IF(combi_price_type = \'fix\', combi_price, combi_price + '
                                                         . $productPrice
                                                         . ')) AS max_price FROM `products_properties_combis` WHERE products_id = '
                                                         . (int)$this->product->data['products_id']
                                                         . ' GROUP BY products_id');
            $minPropertiesCombisPriceResult = $db->query('SELECT products_id, MIN(IF(combi_price_type = \'fix\', combi_price, combi_price + '
                                                         . $productPrice
                                                         . ')) AS min_price FROM `products_properties_combis` WHERE products_id = '
                                                         . (int)$this->product->data['products_id']
                                                         . ' GROUP BY products_id');
            if ($maxPropertiesCombisPriceResult->num_rows() > 0 && $minPropertiesCombisPriceResult->num_rows() > 0) {
                $maxPropertiesCombisPriceRow = $maxPropertiesCombisPriceResult->row_array();
                $maxPropertiesCombisPrice    = $maxPropertiesCombisPriceRow['max_price'];
                $minPropertiesCombisPriceRow = $minPropertiesCombisPriceResult->row_array();
                $minPropertiesCombisPrice    = $minPropertiesCombisPriceRow['min_price'];
                $minCombiPrice               = $xtcPrice->xtcFormat($minPropertiesCombisPrice,
                                                                    false,
                                                                    $this->product->data['products_tax_class_id'],
                                                                    true);
                $maxCombiPrice               = $xtcPrice->xtcFormat($maxPropertiesCombisPrice,
                                                                    false,
                                                                    $this->product->data['products_tax_class_id'],
                                                                    true);
            } else {
                $maxAttributesPriceOffsetResult = $db->query('SELECT options_id, MAX(if(price_prefix = \'-\', -1, 1) * options_values_price) AS max_modifier FROM `products_attributes` where products_id = '
                                                             . (int)$this->product->data['products_id']
                                                             . ' GROUP BY options_id');
                $minAttributesPriceOffsetResult = $db->query('SELECT options_id, MIN(if(price_prefix = \'-\', -1, 1) * options_values_price) AS min_modifier FROM `products_attributes` where products_id = '
                                                             . (int)$this->product->data['products_id']
                                                             . ' GROUP BY options_id');
                
                $maxAttributesPriceOffset = 0;
                foreach ($maxAttributesPriceOffsetResult->result_array() as $maxAttributesPriceOffsetRow) {
                    $maxAttributesPriceOffset += $maxAttributesPriceOffsetRow['max_modifier'];
                }
                $minAttributesPriceOffset = 0;
                foreach ($minAttributesPriceOffsetResult->result_array() as $minAttributesPriceOffsetRow) {
                    $minAttributesPriceOffset += $minAttributesPriceOffsetRow['min_modifier'];
                }
                
                $minCombiPrice = $xtcPrice->xtcFormat($productPrice + $minAttributesPriceOffset,
                                                      false,
                                                      $this->product->data['products_tax_class_id'],
                                                      true);
                $maxCombiPrice = $xtcPrice->xtcFormat($productPrice + $maxAttributesPriceOffset,
                                                      false,
                                                      $this->product->data['products_tax_class_id'],
                                                      true);
            }
            
            $linkedData['offers'] = [
                '@type'         => 'AggregateOffer',
                'lowPrice'      => $minCombiPrice,
                'highPrice'     => $maxCombiPrice,
                'priceCurrency' => $_SESSION['currency'],
                'offerCount'    => $totalVariants,
                //'valueAddedTaxIncluded' => $taxIncluded,
            ];
        }
        
        $aggregateRating = $this->product->getAggregateRatingData();
        if ($aggregateRating['count'] > 0) {
            $linkedData['aggregateRating'] = [
                '@type'       => 'http://schema.org/AggregateRating',
                'ratingCount' => $aggregateRating['count'],
                'ratingValue' => $aggregateRating['averageRating'],
                'bestRating'  => 5,
                'worstRating' => 1,
            ];
            if (!empty($linkedData['model']) && is_array($linkedData['model'])) {
                foreach ($linkedData['model'] as $modelIdx => $model) {
                    $linkedData['model'][$modelIdx]['aggregateRating'] = $linkedData['aggregateRating'];
                }
            }
        }
        
        $reviews = $this->product->getReviews(PRODUCT_REVIEWS_VIEW);
        if (count($reviews) > 0) {
            $linkedData['review'] = [];
            foreach ($reviews as $review) {
                $linkedData['review'][] = [
                    '@type'         => 'http://schema.org/Review',
                    'datePublished' => $review['DATE_CLEAN'],
                    'author'        => [
                        '@type' => 'http://schema.org/Person',
                        'name'  => $review['AUTHOR'],
                    ],
                    'url'           => $review['URL'],
                    'reviewBody'    => $review['TEXT'],
                    'reviewRating'  => [
                        '@type'       => 'http://schema.org/Rating',
                        'ratingValue' => $review['RATING_CLEAN'],
                        'bestRating'  => 5,
                        'worstRating' => 1,
                    ]
                ];
            }
        }
        
        $jsonLD = json_encode($linkedData/*, JSON_PRETTY_PRINT*/);
        
        $this->set_content_data('JSONLD', $jsonLD);
    }
    
    
    /**
     * @param IdType $id
     * @return null|ManufacturerInterface
     */
    protected function getManufacturerById($id)
    {
        try {
            return $this->manufacturerReader()->getById(new IdType($id));
        } catch (EntityNotFoundException $e) {
            return null;
        }
    }

    /**
     * @return ManufacturerReadServiceInterface
     */
    protected function manufacturerReader()
    {
        if ($this->manufacturerReadService === null) {
            $this->manufacturerReadService = StaticGXCoreLoader::getService('ManufacturerRead');
        }
        return $this->manufacturerReadService;

    }

    /**
     * @param int $id
     * @return null|VPEInterface
     */
    protected function getVPEById($id)
    {
        try {
            return $this->VPEReadService()->getById(new IdType($id));
        } catch (EntityNotFoundException $e) {
            return null;
        }
    }

    /**
     * @return VPEReadServiceInterface
     */
    protected function VPEReadService()
    {
        if ($this->VPEReadService === null) {
            $this->VPEReadService = StaticGXCoreLoader::getService('VPERead');
        }
        return $this->VPEReadService;

    }

    /**
     * @param $productsId
     * @return int
     */
    protected function getNumberOfVariants($productsId)
    {
        $db = StaticGXCoreLoader::getDatabaseQueryBuilder();
        /* properties */
        $propertiesCountRow = $db->select('COUNT(*) AS num_combis')
            ->where('products_id', (int)$productsId)
            ->get('products_properties_combis')
            ->row_array();
        if ((int)$propertiesCountRow['num_combis'] > 0) {
            return (int)$propertiesCountRow['num_combis'];
        }

        $attribsCounts = $db->select('`options_id`, COUNT(`options_id`) AS num_values')
            ->where('products_id', (int)$productsId)
            ->group_by('options_id')
            ->get('products_attributes')
            ->result_array();
        $totalAttributes = 0;
        if (!empty($attribsCounts)) {
            $totalAttributes = 1;
            foreach ($attribsCounts as $attribCount) {
                $totalAttributes *= $attribCount['num_values'];
            }
        }

        return $totalAttributes;
    }

    /**
     * @param $productsId
     * @return array
     */
    protected function getProductPropertiesCombis($productsId)
    {
        /* properties */
        $db = StaticGXCoreLoader::getDatabaseQueryBuilder();
        $combis = $db->where('products_id', (int)$productsId)
            ->order_by('sort_order', 'ASC')
            ->get('products_properties_combis')
            ->result_array();
        if (!empty($combis)) {
            return $combis;
        }

        /* attributes */
        $attributes = $db->where('products_id', (int)$productsId)
            ->order_by('options_values_id', 'ASC')
            ->order_by('sortorder', 'ASC')
            ->get('products_attributes')
            ->result_array();
        if (!empty($attributes)) {
            $attributesLists = [];
            $attributeModels = [];
            $attributePrices = [];
            $attributeStocks = [];
            $attributeEans = [];
            $optionsWithEans = [];
            $combiVpeId = 0;
            $combiVpeValue = 0.0;
            foreach ($attributes as $attribute) {
                $optionsId = $attribute['options_id'];
                $valuesId = $attribute['options_values_id'];
                if (!array_key_exists($optionsId, $attributesLists)) {
                    $attributesLists[$optionsId] = [];
                }
                $attributesLists[$optionsId][] = $valuesId;
                $attributeModels[$optionsId . '-' . $valuesId] = $attribute['attributes_model'];
                $priceFactor = $attribute['price_prefix'] === '-' ? -1 : 1;
                $attributePrices[$optionsId . '-' . $valuesId] = $priceFactor * $attribute['options_values_price'];
                $attributeStocks[$optionsId . '-' . $valuesId] = $attribute['attributes_stock'];
                $gmEan = trim($attribute['gm_ean']);
                if (!empty($gmEan)) {
                    $optionsWithEans[$optionsId] = true;
                    $attributeEans[$optionsId . '-' . $valuesId] = $gmEan;
                }
                if ($combiVpeId === 0 && (int)$attribute['products_vpe_id'] !== 0) {
                    $combiVpeId = (int)$attribute['products_vpe_id'];
                    $combiVpeValue = (float)$attribute['gm_vpe_value'];
                }
            }
            if (count($optionsWithEans) > 1) {
                $attributeEans = [];
            }
            $options = array_keys($attributesLists);
            $counts = [];
            foreach ($options as $optionId) {
                $counts[] = count($attributesLists[$optionId]);
            }

            $attribSet = array_fill(0, count($attributesLists), 0);
            $attributeCombis = [];
            do {
                $optionsToValues = [];
                foreach ($options as $oIndex => $optionId) {
                    $valuesId = $attributesLists[$options[$oIndex]][$attribSet[$oIndex]];
                    $optionsToValues[$optionId] = $valuesId;
                }
                $uPID = (string)$productsId;
                $combiModel = '';
                $combiPrice = 0.0;
                $combiQuantity = 999999;
                $combiEan = '';
                foreach ($optionsToValues as $optionsId => $valuesId) {
                    $uPID .= '{' . $optionsId . '}' . $valuesId;
                    $combiModel .= empty($combiModel) ? '' : '-';
                    $combiModel .= $attributeModels[$optionsId . '-' . $valuesId];
                    $combiPrice += $attributePrices[$optionsId . '-' . $valuesId];
                    $combiQuantity = min($combiQuantity, (float)$attributeStocks[$optionsId . '-' . $valuesId]);
                    $combiEan = !empty($attributeEans[$optionsId . '-' . $valuesId]) ? $attributeEans[$optionsId . '-' . $valuesId] : $combiEan;
                }
                $attributeCombis[] = [
                    'products_id' => $productsId,
                    'unique_products_id' => $uPID,
                    'combi_model' => $combiModel,
                    'combi_ean' => $combiEan,
                    'combi_quantity' => $combiQuantity,
                    'combi_price_type' => 'calc',
                    'combi_price' => $combiPrice,
                    'products_vpe_id' => $combiVpeId,
                    'vpe_value' => $combiVpeValue,
                ];
            } while ($this->incrementArray($attribSet, $counts) !== false);

            return $attributeCombis;
        }

        return [];
    }


    /**
     * Helper for iterating through combinations of attributes.
     *
     * @param $attribSet
     * @param $counts
     *
     * @return bool
     */
    protected function incrementArray(&$attribSet, $counts)
    {
        $incPos = 0;
        while (true) {
            if ($attribSet[$incPos] < $counts[$incPos] - 1) {
                $attribSet[$incPos]++;
                break;
            } else {
                if ($incPos < count($counts) - 1) {
                    $attribSet[$incPos] = 0;
                    $incPos++;
                } else {
                    return false;
                }
            }
        }

        return true;
    }


    protected function _assignItemCondition()
    {
        $itemCondition = 'new';

        $query = 'SELECT `google_export_condition`
                  FROM `products_item_codes`
                  WHERE `products_id` = ' . (int)$this->product->data['products_id'];

        $result = xtc_db_query($query);

        if (xtc_db_num_rows($result)) {
            $row = xtc_db_fetch_array($result);

            if ($row['google_export_condition'] === 'gebraucht') {
                $itemCondition = 'used';
            } elseif ($row['google_export_condition'] === 'erneuert') {
                $itemCondition = 'refurbished';
            }
        }

        $this->set_content_data('ITEM_CONDITION', $itemCondition);
    }


    protected function _assignReviews()
    {
        // Aggregate review data
        $this->set_content_data('AGGREGATE_REVIEW_DATA', $this->product->getAggregateRatingData());

        /* @var ProductReviewsContentView $view */
        $view = MainFactory::create_object('ProductReviewsContentView');
        $view->setProduct($this->product);
        $html = $view->get_html();
        if (trim($html) !== '') {
            $this->set_content_data('MODULE_products_reviews', $html);
        }
    }


    protected function _assignProductUrl()
    {
        if (xtc_not_null($this->product->data['products_url'])) {
            $this->set_content_data('PRODUCTS_URL', sprintf(TEXT_MORE_INFORMATION, xtc_href_link(FILENAME_REDIRECT,
                'action=product&id='
                . $this->product->data['products_id'],
                'NONSSL', true)));
        }
    }


    protected function _assignDate()
    {
        if ($this->product->data['products_date_available'] > date('Y-m-d H:i:s')) {
            $this->set_content_data('PRODUCTS_DATE_AVIABLE', sprintf(TEXT_DATE_AVAILABLE,
                xtc_date_long($this->product->data['products_date_available'])));
        } else {
            if ($this->product->data['products_date_added'] != '1000-01-01 00:00:00'
                && $this->product->data['gm_show_date_added'] == 1) {
                $this->set_content_data('PRODUCTS_ADDED', sprintf(TEXT_DATE_ADDED,
                    xtc_date_long($this->product->data['products_date_added'])));
            }
        }
    }


    protected function _assignGraduatedPrices()
    {
        /* @var GraduatedPricesContentView $view */
        $view = MainFactory::create_object('GraduatedPricesContentView');
        $view->set_coo_product($this->product);
        $view->set_customers_status_graduated_prices((int)$this->showGraduatedPrices);
        $html = $view->get_html();
        $this->set_content_data('MODULE_graduated_price', $html);
    }


    // TODO move out of view into control
    protected function _updateTracking()
    {
        $i = is_array($_SESSION['tracking']['products_history']) ? count($_SESSION['tracking']['products_history']) : 0;
        if ($i > 6) {
            array_shift($_SESSION['tracking']['products_history']);
            $_SESSION['tracking']['products_history'][6] = $this->product->data['products_id'];
            $_SESSION['tracking']['products_history'] = array_unique($_SESSION['tracking']['products_history']);
        } else {
            $_SESSION['tracking']['products_history'][$i] = $this->product->data['products_id'];
            $_SESSION['tracking']['products_history'] = array_unique($_SESSION['tracking']['products_history']);
        }
    }


    protected function _assignPrintLink()
    {
        if (gm_get_conf('SHOW_PRINT') == 'true') {
            $this->set_content_data('SHOW_PRINT', 1);
        }

        $this->_assignDeprecatedPrintLink();
    }


    protected function _assignSocialServices()
    {
        $this->_assignFacebook();
        $this->_assignWhatsApp();
        $this->_assignTwitter();
        $this->_assignPinterest();
    }


    protected function _assignFacebook()
    {
        if (gm_get_conf('SHOW_FACEBOOK') == 'true') {
            $this->set_content_data('SHOW_FACEBOOK', 1);
        }
    }


    protected function _assignWhatsApp()
    {
        if (gm_get_conf('SHOW_WHATSAPP') == 'true') {
            $this->set_content_data('SHOW_WHATSAPP', 1);
        }
    }


    protected function _assignTwitter()
    {
        if (gm_get_conf('SHOW_TWITTER') == 'true') {
            $this->set_content_data('SHOW_TWITTER', 1);
        }
    }


    protected function _assignPinterest()
    {
        if (gm_get_conf('SHOW_PINTEREST') == 'true') {
            $this->set_content_data('SHOW_PINTEREST', 1);
        }
    }


    protected function _assignImageMaxHeight()
    {
        $this->set_content_data('IMAGE_MAX_HEIGHT', $this->maxImageHeight);
    }


    protected function _assignImageData()
    {
        $imagesDataArray = [];
        $thumbnailsDataArray = [];

        /* @var GMAltText $altTextManager */
        $altTextManager = MainFactory::create_object('GMAltText');

        if ($this->product->data['products_image'] != '' && $this->product->data['gm_show_image'] == '1') {
            $imageArray = array(
                'image_name' => $this->product->data['products_image'],
                'image_id' => 0,
                'image_nr' => 0
            );

            $imagesDataArray[] = $this->_buildImageArray($imageArray, $altTextManager);
            $thumbnailsDataArray[] = $this->_buildThumbnailArray($imageArray, $altTextManager);
        }

        $additionalImagesArray = xtc_get_products_mo_images($this->product->data['products_id']);

        if (is_array($additionalImagesArray) && !empty($additionalImagesArray)) {
            foreach ($additionalImagesArray as $imageArray) {
                $imagesDataArray[] = $this->_buildImageArray($imageArray, $altTextManager);
                $thumbnailsDataArray[] = $this->_buildThumbnailArray($imageArray, $altTextManager);
            }
        }

        $this->set_content_data('images', $imagesDataArray);
        $this->set_content_data('thumbnails', $thumbnailsDataArray);

        $this->_assignGMotion();

        $this->_assignDeprecatedDimensionValues();
    }


    protected function _assignGMotion()
    {
        /* @var GMGMotion $gMotion */
        $gMotion = MainFactory::create_object('GMGMotion');
        $this->set_content_data('GMOTION', $gMotion->check_status($this->product->data['products_id']));
    }


    /**
     * GX-Customizer
     */
    protected function _assignGPrint()
    {
        $gPrintProductManager = new GMGPrintProductManager();

        if ($gPrintProductManager->get_surfaces_groups_id($this->product->data['products_id']) !== false) {
            $gPrintConfiguration = new GMGPrintConfiguration($this->languageId);
            
            $this->set_content_data('GM_GPRINT', 1);

            if (gm_get_conf('CUSTOMIZER_POSITION') == '2' && gm_get_env_info('TEMPLATE_VERSION') < 3) {
                $customizerTabHtml = '[TAB:Customize]<div id="customizer_tab_container"></div>';
                $this->product->data['products_description'] .= $customizerTabHtml;
            }
        }
    }


    /**
     * assign formated price or link to contact form if price status is "Preis auf Anfrage"
     */
    protected function _assignPrice()
    {
        $this->set_content_data('PRODUCTS_PRICE', $this->productPriceArray['formated']);

        if ($this->product->data['gm_price_status'] == 1) {
            $seoBoost = MainFactory::create_object('GMSEOBoost', [], true);
            $sefParameter = '';

            $query = "SELECT
							content_id,
							content_title
						FROM " . TABLE_CONTENT_MANAGER . "
						WHERE
							languages_id = '" . (int)$this->languageId . "' AND
							content_group = '7'";
            $result = xtc_db_query($query);
            if (xtc_db_num_rows($result)) {
                $row = xtc_db_fetch_array($result);
                $contactContentId = $row['content_id'];
                $contactContentTitle = $row['content_title'];

                if (defined('SEARCH_ENGINE_FRIENDLY_URLS') && SEARCH_ENGINE_FRIENDLY_URLS === 'false') {
                    $sefParameter = '&content=' . xtc_cleanName($contactContentTitle);
                }
            }
            if ($seoBoost->boost_content) {
                $contactUrl = xtc_href_link($seoBoost->get_boosted_content_url($contactContentId, $this->languageId)
                    . '?subject=' . rawurlencode(GM_SHOW_PRICE_ON_REQUEST . ': '
                        . $this->product->data['products_name']));
            } else {
                $contactUrl = xtc_href_link(FILENAME_CONTENT,
                    'coID=7&subject=' . rawurlencode(GM_SHOW_PRICE_ON_REQUEST . ': '
                        . $this->product->data['products_name'])
                    . $sefParameter);
            }

            $contactLinkHtml = '<a href="' . $contactUrl . '" class="btn btn-lg btn-price-on-request price-on-request">'
                . GM_SHOW_PRICE_ON_REQUEST . '</a>';

            $this->set_content_data('PRODUCTS_PRICE', $contactLinkHtml);
        }
    }


    protected function _assignDiscount()
    {
        if ($this->customerDiscount != 0) {
            $discount = $this->customerDiscount;

            if ($this->product->data['products_discount_allowed'] < $this->customerDiscount) {
                $discount = (double)$this->product->data['products_discount_allowed'];
            }

            if ($discount != 0) {
                $this->set_content_data('PRODUCTS_DISCOUNT', $discount . '%');
            }
        }
    }


    protected function _assignDescription()
    {
        /* @var GMTabTokenizer $tabTokenizer */
        $tabTokenizer = MainFactory::create_object('GMTabTokenizer',
            array(stripslashes($this->product->data['products_description'])));
        $description = $tabTokenizer->get_prepared_output();

        $this->set_content_data('PRODUCTS_DESCRIPTION', $description);
        $this->set_content_data('description', $tabTokenizer->head_content);

        $tabs = array();
        foreach ($tabTokenizer->tab_content as $key => $value) {
            $tabs[] = array('title' => strip_tags($value), 'content' => $tabTokenizer->panel_content[$key]);
        }

        $mediaContent = $this->_getMediaContentHtml();
        if (trim($mediaContent) !== '') {
            $languageTextManager = MainFactory::create_object('LanguageTextManager',
                array('products_media', $this->languageId));
            $tabs[] = array(
                'title' => $languageTextManager->get_text('text_media_content_tab'),
                'content' => $mediaContent
            );
        }

        $this->set_content_data('tabs', $tabs);
    }


    /**
     * @return bool
     */
    protected function _productIsForSale()
    {
        return ($this->showPrice
                && $this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0)
            && ($this->product->data['products_fsk18'] == '0' || $this->fsk18PurchaseAllowed);
    }


    /**
     * @param array $imageArray
     * @param GMAltText $altTextManager
     *
     * @return array
     */
    protected function _buildImageArray(array $imageArray, GMAltText $altTextManager)
    {
        $imageMaxWidth = 369;
        $imageMaxHeight = 279;

        $infoImageSizeArray = @getimagesize(DIR_WS_INFO_IMAGES . $imageArray['image_name']);

        $imagePaddingLeft = 0;
        $imagePaddingTop = 0;

        if (isset($infoImageSizeArray[0]) && $infoImageSizeArray[0] < $imageMaxWidth) {
            $imagePaddingLeft = round(($imageMaxWidth - $infoImageSizeArray[0]) / 2);
        }

        if (isset($infoImageSizeArray[1]) && $infoImageSizeArray[1] < $imageMaxHeight) {
            $imagePaddingTop = round(($imageMaxHeight - $infoImageSizeArray[1]) / 2);
        }

        if ($this->maxImageHeight < $infoImageSizeArray[1]) {
            $this->maxImageHeight = $infoImageSizeArray[1];
        }

        $zoomImageFilepath = DIR_WS_POPUP_IMAGES . $imageArray['image_name'];

        if (file_exists(DIR_WS_ORIGINAL_IMAGES . $imageArray['image_name'])) {
            $zoomImageFilepath = DIR_WS_ORIGINAL_IMAGES . $imageArray['image_name'];
        }

        $imageDataArray = array(
            'IMAGE' => DIR_WS_INFO_IMAGES . $imageArray['image_name'],
            'IMAGE_ALT' => $altTextManager->get_alt($imageArray["image_id"], $imageArray['image_nr'],
                $this->product->data['products_id']),
            'IMAGE_NR' => $imageArray['image_nr'],
            'ZOOM_IMAGE' => $zoomImageFilepath,
            'PRODUCTS_NAME' => $this->product->data['products_name'],
            'PADDING_LEFT' => $imagePaddingLeft,
            'PADDING_TOP' => $imagePaddingTop,
            'IMAGE_POPUP_URL' => DIR_WS_POPUP_IMAGES . $imageArray['image_name'],
            'WIDTH' => $infoImageSizeArray[0],
            'HEIGHT' => $infoImageSizeArray[1]

        );

        return $imageDataArray;
    }


    /**
     * @param array $imageArray
     * @param GMAltText $altTextManager
     *
     * @return array
     */
    protected function _buildThumbnailArray(array $imageArray, GMAltText $altTextManager)
    {
        $thumbnailMaxWidth = 86;
        $thumbnailMaxHeight = 86;

        $thumbnailImageSizeArray = @getimagesize(DIR_WS_IMAGES . 'product_images/gallery_images/'
            . $imageArray['image_name']);

        $thumbnailPaddingLeft = 0;
        $thumbnailPaddingTop = 0;

        if (isset($thumbnailImageSizeArray[0]) && $thumbnailImageSizeArray[0] < $thumbnailMaxWidth) {
            $thumbnailPaddingLeft = round(($thumbnailMaxWidth - $thumbnailImageSizeArray[0]) / 2);
        }

        if (isset($thumbnailImageSizeArray[1]) && $thumbnailImageSizeArray[1] < $thumbnailMaxHeight) {
            $thumbnailPaddingTop = round(($thumbnailMaxHeight - $thumbnailImageSizeArray[1]) / 2);
        }

        $zoomImageFilepath = DIR_WS_POPUP_IMAGES . $imageArray['image_name'];

        if (file_exists(DIR_WS_ORIGINAL_IMAGES . $imageArray['image_name'])) {
            $zoomImageFilepath = DIR_WS_ORIGINAL_IMAGES . $imageArray['image_name'];
        }

        $thumbnailDataArray = array(
            'IMAGE' => DIR_WS_IMAGES . 'product_images/gallery_images/' . $imageArray['image_name'],
            'IMAGE_ALT' => $altTextManager->get_alt($imageArray["image_id"], $imageArray['image_nr'],
                $this->product->data['products_id']),
            'IMAGE_NR' => $imageArray['image_nr'],
            'ZOOM_IMAGE' => $zoomImageFilepath,
            'INFO_IMAGE' => DIR_WS_INFO_IMAGES . $imageArray['image_name'],
            'PRODUCTS_NAME' => $this->product->data['products_name'],
            'PADDING_LEFT' => $thumbnailPaddingLeft,
            'PADDING_TOP' => $thumbnailPaddingTop
        );

        return $thumbnailDataArray;
    }


    protected function _assignInputFieldQuantity()
    {
        $this->set_content_data('QUANTITY', gm_convert_qty($this->product->data['gm_min_order'], true));
        $this->set_content_data('DISABLED_QUANTITY', 0);

        if ((double)$this->product->data['gm_min_order'] != 1) {
            $this->set_content_data('GM_MIN_ORDER', gm_convert_qty($this->product->data['gm_min_order'], false));
        }

        $quantityStepping = (double)$this->product->data['gm_graduated_qty'];
        if ((double)$this->product->data['gm_graduated_qty'] != 1) {
            $this->set_content_data('GM_GRADUATED_QTY',
                gm_convert_qty($this->product->data['gm_graduated_qty'], false));
        }
        $this->set_content_data('QTY_STEPPING', $quantityStepping);

        $this->_assignDeprecatedPurchaseData();
    }


    protected function _assignWishlist()
    {
        if (gm_get_conf('GM_SHOW_WISHLIST') == 'true') {
            $this->set_content_data('SHOW_WISHLIST', 1);
        } else {
            $this->set_content_data('SHOW_WISHLIST', 0);
        }

        $this->_assignDeprecatedWishlist();
    }


    protected function _assignLegalAgeFlag()
    {
        if ($this->product->data['products_fsk18'] == '1') {
            $this->set_content_data('PRODUCTS_FSK18', 'true');
        }
    }


    /**
     * @return bool
     */
    protected function _showPrice()
    {
        return $this->showPrice
            && ($this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0
                || ($this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 2
                    && $this->product->data['products_price'] > 0));
    }


    protected function _assignTaxInfo()
    {
        // price incl tax
        $tax_rate = $this->xtcPrice->TAX[$this->product->data['products_tax_class_id']];
        $tax_info = $this->main->getTaxInfo($tax_rate);
        $this->set_content_data('PRODUCTS_TAX_INFO', $tax_info);
    }


    protected function _assignShippingLink()
    {
        if ($this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0) {
            $this->set_content_data('PRODUCTS_SHIPPING_LINK',
                $this->main->getShippingLink(true, $this->product->data['products_id']));
        }
    }


    protected function _assignTellAFriend()
    {
        if (gm_get_conf('GM_TELL_A_FRIEND') == 'true') {
            $this->set_content_data('GM_TELL_A_FRIEND', 1);
        }
    }


    protected function _assignPriceOffer()
    {
        if ($this->product->data['gm_show_price_offer'] == 1
            && $this->showPrice
            && $this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0) {
            $this->set_content_data('GM_PRICE_OFFER', 1);
        }
    }


    protected function _assignStatus()
    {
        $this->set_content_data('PRODUCTS_STATUS', $this->product->data['products_status']);
    }


    protected function _assignNumberOfOrders()
    {
        $this->set_content_data('PRODUCTS_ORDERED', $this->product->data['products_ordered']);
    }


    protected function _assignFormTagData()
    {
        $this->set_content_data('FORM_ACTION_URL', xtc_href_link(FILENAME_PRODUCT_INFO,
            xtc_get_all_get_params(array('action'))
            . 'action=add_product', 'NONSSL', true, true, true));
        $this->set_content_data('FORM_ID', 'cart_quantity');
        $this->set_content_data('FORM_NAME', 'cart_quantity');
        $this->set_content_data('FORM_METHOD', 'post');

        $this->_assignDeprecatedFormTagData();
    }


    protected function _setPropertiesData()
    {
        $coo_stop_watch = LogControl::get_instance()->get_stop_watch();
        $coo_stop_watch->start('PropertiesView get_selection_form');

        $propertiesSelectionForm = $this->_buildPropertiesSelectionForm();
        $this->_assignPropertiesSelectionForm($propertiesSelectionForm);

        $coo_stop_watch->stop('PropertiesView get_selection_form');
        //$coo_stop_watch->log_total_time('PropertiesView get_selection_form');

        $this->hasProperties = trim($propertiesSelectionForm) != "";
    }


    protected function _assignModelNumber()
    {
        $modelNumber = $this->product->data['products_model'];

        if ($this->hasProperties) {
            // OVERRIDE PRODUCTS MODEL
            if ($this->currentCombiArray != false) {
                if (APPEND_PROPERTIES_MODEL == "true" && trim($this->currentCombiArray['combi_model']) != '') {
                    if (trim($modelNumber) != '') {
                        $modelNumber .= '-';
                    }
                    $modelNumber .= $this->currentCombiArray['combi_model'];
                } else {
                    if (APPEND_PROPERTIES_MODEL == "false" && trim($this->currentCombiArray['combi_model']) != '') {
                        $modelNumber = $this->currentCombiArray['combi_model'];
                    }
                }
            }
        }

        $this->set_content_data('SHOW_PRODUCTS_MODEL',
            gm_get_conf('SHOW_PRODUCTS_MODEL_IN_PRODUCT_DETAILS') === 'true');
        $this->set_content_data('PRODUCTS_MODEL', $modelNumber);
    }


    protected function _assignQuantity()
    {
        $quantity = 0;
        $quantityUnit = '';

        if ($this->product->data['gm_show_qty_info'] == 1) {
            $quantity = gm_convert_qty(xtc_get_products_stock($this->product->data['products_id']), false);
        }

        if ($this->product->data['quantity_unit_id'] > 0) {
            $quantityUnit = $this->product->data['unit_name'];
        }

        if ($this->hasProperties && $this->product->data['gm_show_qty_info'] == 1) {
            // OVERRIDE PRODUCTS QUANTITY
            if (($this->product->data['use_properties_combis_quantity'] == 0
                    && STOCK_CHECK == 'true'
                    && ATTRIBUTE_STOCK_CHECK == 'true')
                || $this->product->data['use_properties_combis_quantity'] == 2) {
                $quantity = $this->currentCombiArray['combi_quantity'];
                $this->set_content_data('SHOW_PRODUCTS_QUANTITY', true);

                if (empty($this->currentCombiArray)) {
                    $this->set_content_data('SHOW_PRODUCTS_QUANTITY', true);
                    $quantity = '-';
                }
            }
        }

        $this->set_content_data('PRODUCTS_QUANTITY', $quantity);
        $this->set_content_data('PRODUCTS_QUANTITY_UNIT', $quantityUnit);
    }


    protected function _assignDeactivatedButtonFlag()
    {
        $deactivateButton = false;

        if ($this->hasProperties) {
            if ($this->currentCombiArray == false) {
                $deactivateButton = true;
            } else {
                if ($this->product->data['gm_show_qty_info'] == 1) {
                    if (($this->product->data['use_properties_combis_quantity'] == 0
                            && STOCK_CHECK == 'true'
                            && ATTRIBUTE_STOCK_CHECK == 'true')
                        || $this->product->data['use_properties_combis_quantity'] == 2) {
                        if ($this->currentCombiArray['combi_quantity'] < gm_convert_qty($this->product->data['gm_min_order'],
                                false)
                            && STOCK_ALLOW_CHECKOUT == 'false') {
                            $deactivateButton = true;
                        }
                    }
                }
            }
        }

        $this->set_content_data('DEACTIVATE_BUTTON', $deactivateButton);
    }


    protected function _assignWeight()
    {
        $showWeight = 0;
        $weight = 0;

        if ($this->product->data['gm_show_weight'] == '1') {
            $showWeight = 1;
            $weight = gm_prepare_number($this->product->data['products_weight'],
                $this->xtcPrice->currencies[$this->xtcPrice->actualCurr]['decimal_point']);

            if ($this->hasProperties) {
                // OVERRIDE WEIGHT
                $weight = '-';

                if ($this->currentCombiArray != false) {
                    if ($this->product->data['use_properties_combis_weight'] == 0) {
                        $weight = gm_prepare_number($this->currentCombiArray['combi_weight']
                            + $this->product->data['products_weight'],
                            $this->xtcPrice->currencies[$this->xtcPrice->actualCurr]['decimal_point']);
                    } else {
                        $weight = gm_prepare_number($this->currentCombiArray['combi_weight'],
                            $this->xtcPrice->currencies[$this->xtcPrice->actualCurr]['decimal_point']);
                    }
                }
            }
        }

        $this->set_content_data('SHOW_PRODUCTS_WEIGHT', $showWeight);
        $this->set_content_data('PRODUCTS_WEIGHT', $weight);
    }


    protected function _assignVpe()
    {
        $vpeHtml = '';

        if ($this->product->data['products_vpe_status'] == 1 && $this->product->data['products_vpe_value'] != 0.0
            && $this->productPriceArray['plain'] > 0) {
            $price = $this->productPriceArray['plain'] * (1 / $this->product->data['products_vpe_value']);
            $priceFormatted = $this->xtcPrice->xtcFormat($price, true);
            $vpeName = xtc_get_vpe_name($this->product->data['products_vpe']);
            $vpeHtml = $priceFormatted . TXT_PER . $vpeName;

            if ($this->hasProperties) {
                $propertiesControl = MainFactory::create('PropertiesControl');

                // OVERRIDE VPE
                if (!empty($this->currentCombiArray) && $this->currentCombiArray['products_vpe_id'] > 0
                    && $this->currentCombiArray['vpe_value'] != 0) {
                    $vpeHtml = $this->_buildVpeHtml($this->productPriceArray['plain'],
                        $this->currentCombiArray['products_vpe_id'],
                        $this->currentCombiArray['vpe_value']);
                } elseif ($this->cheapestCombiArray['products_vpe_id'] > 0 && $this->cheapestCombiArray['vpe_value'] != 0
                    && !$propertiesControl->has_non_linear_combi_surcharge((int)$this->product->data['products_id'])) {
                    $vpeHtml = $this->_buildVpeHtml($this->productPriceArray['plain'],
                        $this->cheapestCombiArray['products_vpe_id'],
                        $this->cheapestCombiArray['vpe_value']);
                } elseif ($propertiesControl->has_non_linear_combi_surcharge((int)$this->product->data['products_id'])) {
                    $vpeHtml = '';
                }
            }
        }

        $this->set_content_data('PRODUCTS_VPE', $vpeHtml);
    }


    protected function _buildVpeHtml($price, $vpeId, $vpeValue)
    {
        $vpePrice = $price * (1 / $vpeValue);
        $priceFormatted = $this->xtcPrice->xtcFormat($vpePrice, true);
        $vpeName = xtc_get_vpe_name($vpeId);

        return $priceFormatted . TXT_PER . $vpeName;
    }

    /**
     *
     */
    protected function _assignShippingTime()
    {
        $languageTextManager = MainFactory::create('LanguageTextManager', 'product_info');

        $name = '';
        $image = '';
        $imageAlt = '';

        if (ACTIVATE_SHIPPING_STATUS == 'true'
            && $this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0) {
            $name = $this->main->getShippingStatusName($this->product->data['products_shippingtime']);
            $image = $this->main->getShippingStatusImage($this->product->data['products_shippingtime']);
        }

        if ($this->hasProperties) {

            // OVERRIDE SHIPPING STATUS
            if (ACTIVATE_SHIPPING_STATUS == 'true'
                && $this->xtcPrice->gm_check_price_status($this->product->data['products_id']) == 0
                && $this->product->data['use_properties_combis_shipping_time'] == 1) {
                if ($this->currentCombiArray != false) {
                    $name = $this->main->getShippingStatusName($this->currentCombiArray['combi_shipping_status_id']);
                    $image = $this->main->getShippingStatusImage($this->currentCombiArray['combi_shipping_status_id']);
                } else {
                    $name = '';
                    $image = 'images/icons/status/gray.png';
                }
                $this->set_content_data('SHOW_SHIPPING_TIME', true);
            }
        }

        $imageAlt = ($name !== '') ? $name : $languageTextManager->get_text('unknown_shippingtime');

        $this->set_content_data('SHIPPING_NAME', $name);
        $this->set_content_data('SHIPPING_IMAGE', $image);
        $this->set_content_data('SHIPPING_IMAGE_ALT', $imageAlt);
        $this->set_content_data('ABROAD_SHIPPING_INFO_LINK_ACTIVE',
            $this->main->getShippingStatusInfoLinkActive($this->product->data['products_shippingtime']));
        $this->set_content_data('ABROAD_SHIPPING_INFO_LINK', main::get_abroad_shipping_info_link());
    }


    protected function _assignEan()
    {
        $this->set_content_data('PRODUCTS_EAN', $this->product->data['products_ean']);
    }


    protected function _assignId()
    {
        $this->set_content_data('PRODUCTS_ID', $this->product->data['products_id']);
    }


    protected function _assignName()
    {
        $this->set_content_data('PRODUCTS_NAME', $this->product->data['products_name']);
    }


    /**
     * @return string
     */
    protected function _buildPropertiesSelectionForm()
    {
        /* @var PropertiesView $view */
        $view = MainFactory::create_object('PropertiesView',
            array($this->getArray, $this->postArray));
        $propertiesSelectionForm = $view->get_selection_form($this->product->data['products_id'], $this->languageId,
            false, $this->currentCombiArray);

        return $propertiesSelectionForm;
    }


    /**
     * @param $propertiesSelectionForm
     */
    protected function _assignPropertiesSelectionForm($propertiesSelectionForm)
    {
        $this->set_content_data('properties_selection_form', $propertiesSelectionForm);
    }


    protected function _assignAdditionalFields()
    {
        $additionalFieldsHtml = '';

        if (gm_get_conf('SHOW_ADDITIONAL_FIELDS_PRODUCT_DETAILS') === 'true') {
            $view = MainFactory::create_object('AdditionalFieldContentView');
            $view->setLanguageId($this->languageId);
            $view->setAdditionalFields($this->additionalFields);
            $additionalFieldsHtml = $view->get_html();
        }

        $this->set_content_data('additional_fields', $additionalFieldsHtml);
    }


    ##### SETTER / GETTER #####


    /**
     * @return array
     */
    public function getGetArray()
    {
        return $this->getArray;
    }


    /**
     * $_GET-Data
     *
     * @param array $getArray
     */
    public function setGetArray(array $getArray)
    {
        $this->getArray = $getArray;
    }


    /**
     * @return array
     */
    public function getPostArray()
    {
        return $this->postArray;
    }


    /**
     * $_POST-Data
     *
     * @param array $postArray
     */
    public function setPostArray(array $postArray)
    {
        $this->postArray = $postArray;
    }


    /**
     * @param product $product
     */
    public function setProduct(product $product)
    {
        $this->product = $product;
    }


    /**
     * @return product
     */
    public function getProduct()
    {
        return $this->product;
    }


    /**
     * @param int $p_categoryId
     */
    public function setCurrentCategoryId($p_categoryId)
    {
        $this->currentCategoryId = (int)$p_categoryId;
    }


    /**
     * @return int
     */
    public function getCurrentCategoryId()
    {
        return $this->currentCategoryId;
    }


    /**
     * @return int
     */
    public function getCombiId()
    {
        return $this->combiId;
    }


    /**
     * @param int $p_combiId
     */
    public function setCombiId($p_combiId)
    {
        $this->combiId = (int)$p_combiId;
    }


    /**
     * @return int
     */
    public function getLanguageId()
    {
        return $this->languageId;
    }


    /**
     * @param int $p_languageId
     */
    public function setLanguageId($p_languageId)
    {
        $this->languageId = (int)$p_languageId;
    }


    /**
     * @return main
     */
    public function getMain()
    {
        return $this->main;
    }


    /**
     * @param mixed $main
     */
    public function setMain(main $main)
    {
        $this->main = $main;
    }


    /**
     * @return xtcPrice
     */
    public function getXtcPrice()
    {
        return $this->xtcPrice;
    }


    /**
     * @param xtcPrice $xtcPrice
     */
    public function setXtcPrice(xtcPrice $xtcPrice)
    {
        $this->xtcPrice = $xtcPrice;
    }


    /**
     * @return string
     */
    public function getCurrency()
    {
        return $this->currency;
    }


    /**
     * @param string $p_currency
     */
    public function setCurrency($p_currency)
    {
        $this->currency = (string)$p_currency;
    }


    /**
     * @return boolean
     */
    public function getShowGraduatedPrices()
    {
        return $this->showGraduatedPrices;
    }


    /**
     * @param boolean $p_showGraduatedPrices
     */
    public function setShowGraduatedPrices($p_showGraduatedPrices)
    {
        $this->showGraduatedPrices = (bool)$p_showGraduatedPrices;
    }


    /**
     * @return double
     */
    public function getCustomerDiscount()
    {
        return $this->customerDiscount;
    }


    /**
     * @param double $p_customerDiscount
     */
    public function setCustomerDiscount($p_customerDiscount)
    {
        $this->customerDiscount = (double)$p_customerDiscount;
    }


    /**
     * @return boolean
     */
    public function getShowPrice()
    {
        return $this->showPrice;
    }


    /**
     * @param boolean $p_showPrice
     */
    public function setShowPrice($p_showPrice)
    {
        $this->showPrice = (bool)$p_showPrice;
    }


    /**
     * @return string
     */
    public function getLanguage()
    {
        return $this->language;
    }


    /**
     * @param string $p_language
     */
    public function setLanguage($p_language)
    {
        $this->language = basename((string)$p_language);
    }


    /**
     * @return boolean
     */
    public function getFSK18PurchaseAllowed()
    {
        return $this->fsk18PurchaseAllowed;
    }


    /**
     * @param boolean $p_FSK18PurchaseAllowed
     */
    public function setFSK18PurchaseAllowed($p_FSK18PurchaseAllowed)
    {
        $this->fsk18PurchaseAllowed = (bool)$p_FSK18PurchaseAllowed;
    }


    /**
     * @return boolean
     */
    public function getFSK18DisplayAllowed()
    {
        return $this->fsk18DisplayAllowed;
    }


    /**
     * @param boolean $p_FSK18DisplayAllowed
     */
    public function setFSK18DisplayAllowed($p_FSK18DisplayAllowed)
    {
        $this->fsk18DisplayAllowed = (bool)$p_FSK18DisplayAllowed;
    }


    /**
     * @return string
     */
    public function getLastListingSql()
    {
        return $this->lastListingSql;
    }


    /**
     * @param string $p_lastListingSql
     */
    public function setLastListingSql($p_lastListingSql)
    {
        $this->lastListingSql = (string)$p_lastListingSql;
    }


    /**
     * @return int
     */
    public function getCustomerStatusId()
    {
        return $this->customerStatusId;
    }


    /**
     * @param int $p_customerStatusId
     */
    public function setCustomerStatusId($p_customerStatusId)
    {
        $this->customerStatusId = (int)$p_customerStatusId;
    }


    /**
     * @return array
     */
    public function getAdditionalFields()
    {
        return $this->additionalFields;
    }


    /**
     * @param array $p_additionalFields
     */
    public function setAdditionalFields($p_additionalFields)
    {
        $this->additionalFields = $p_additionalFields;
    }
    
    
    /**
     * @return bool
     */
    public function isStockAllowCheckout()
    {
        return (bool)$this->stockAllowCheckout;
    }
    
    
    /**
     * @param bool $stockAllowCheckout
     *
     * @return ProductInfoContentView
     */
    public function setStockAllowCheckout($stockAllowCheckout)
    {
        $this->stockAllowCheckout = (bool)$stockAllowCheckout;
        
        return $this;
    }
    
    
    /**
     * @return bool
     */
    public function isStockCheck()
    {
        return $this->stockCheck;
    }
    
    
    /**
     * @param bool $stockCheck
     *
     * @return ProductInfoContentView
     */
    public function setStockCheck($stockCheck)
    {
        $this->stockCheck = (bool)$stockCheck;
    
        return $this;
    }
    
    
    /**
     * @return bool
     */
    public function isAttributeStockCheck()
    {
        return $this->attributeStockCheck;
    }
    
    
    /**
     * @param bool $attributeStockCheck
     *
     * @return ProductInfoContentView
     */
    public function setAttributeStockCheck($attributeStockCheck)
    {
        $this->attributeStockCheck = (bool)$attributeStockCheck;
    
        return $this;
    }
    
    
    /**
     * @return bool
     */
    public function isAppendPropertiesModel()
    {
        return $this->appendPropertiesModel;
    }
    
    
    /**
     * @param bool $appendPropertiesModel
     *
     * @return ProductInfoContentView
     */
    public function setAppendPropertiesModel($appendPropertiesModel)
    {
        $this->appendPropertiesModel = (bool)$appendPropertiesModel;
    
        return $this;
    }
    
    
    /**
     * @param bool $showPriceTax
     *
     * @return ProductInfoContentView
     */
    public function setShowPriceTax($showPriceTax)
    {
        $this->showPriceTax = (bool)$showPriceTax;
        
        return $this;
    }


    ##### DEPRECATED since GX2.2 #####

    protected function _assignDeprecatedPurchaseData()
    {
        $this->set_content_data('ADD_QTY', xtc_draw_input_field('products_qty', str_replace('.', ',',
                (double)$this->product->data['gm_min_order']),
                'id="gm_attr_calc_qty"') . ' '
            . xtc_draw_hidden_field('products_id', $this->product->data['products_id'],
                'id="gm_products_id"'), 2);

        $this->set_content_data('ADD_CART_BUTTON',
            xtc_image_submit('button_in_cart.gif', IMAGE_BUTTON_IN_CART, 'id="cart_button"'), 2);
    }


    protected function _assignDeprecatedWishlist()
    {
        if (gm_get_conf('GM_SHOW_WISHLIST') == 'true') {
            $this->set_content_data('ADD_WISHLIST_BUTTON',
                '<a href="javascript:submit_to_wishlist()" id="gm_wishlist_link">'
                . xtc_image_button('button_in_wishlist.gif', NC_WISHLIST) . '</a>', 2);
        }
    }


    protected function _assignDeprecatedPrintLink()
    {
        $this->set_content_data('PRODUCTS_PRINT',
            '<img src="templates/' . CURRENT_TEMPLATE . '/buttons/' . $this->language
            . '/print.gif"  style="cursor:hand;" onclick="javascript:window.open(\''
            . xtc_href_link(FILENAME_PRINT_PRODUCT_INFO,
                'products_id=' . $this->product->data['products_id'])
            . '\', \'popup\', \'toolbar=0, width=640, height=600\')" alt="" />');
    }


    protected function _assignDeprecatedFormTagData()
    {
        $this->set_content_data('FORM_ACTION', xtc_draw_form('cart_quantity', xtc_href_link(FILENAME_PRODUCT_INFO,
            xtc_get_all_get_params(array('action'))
            . 'action=add_product',
            'NONSSL', true, true, true),
            'post',
            'name="cart_quantity" onsubmit="gm_qty_check = new GMOrderQuantityChecker(); return gm_qty_check.check();"'),
            2);
        $this->set_content_data('FORM_END', '</form>', 2);
    }


    protected function _assignDeprecatedIdHiddenField()
    {
        $this->set_content_data('GM_PID', xtc_draw_hidden_field('products_id', $this->product->data['products_id'],
            'id="gm_products_id"'), 2);
    }


    protected function _assignDeprecatedDimensionValues()
    {
        if (PRODUCT_IMAGE_INFO_WIDTH < (190 - 16)) {
            $this->set_content_data('MIN_IMAGE_WIDTH', 188, 2);
            $this->set_content_data('MIN_INFO_BOX_WIDTH', 156 - 10, 2);
            $this->set_content_data('MARGIN_LEFT', 188 + 10, 2);
        } else {
            $this->set_content_data('MIN_IMAGE_WIDTH', PRODUCT_IMAGE_INFO_WIDTH + 16, 2);
            $this->set_content_data('MIN_INFO_BOX_WIDTH', PRODUCT_IMAGE_INFO_WIDTH + 16 - 32 - 10, 2);
            $this->set_content_data('MARGIN_LEFT', PRODUCT_IMAGE_INFO_WIDTH + 16 + 10, 2);
        }
    }


    /**
     * @return string
     */
    protected function _getMediaContentHtml()
    {
        /* @var ProductMediaContentView $view */
        $view = MainFactory::create_object('ProductMediaContentView');
        $view->setProductId($this->product->data['products_id']);
        $view->setLanguageId($this->languageId);
        $view->setCustomerStatusId($this->customerStatusId);
        $html = $view->get_html();

        return $html;
    }


    /**
     * @return int
     */
    public function getOfferAggregationLimit()
    {
        return $this->offerAggregationLimit;
    }


    /**
     * @param int $offerAggregationLimit
     */
    public function setOfferAggregationLimit($offerAggregationLimit)
    {
        $this->offerAggregationLimit = $offerAggregationLimit;
    }

    /**
     * Set Paypal EC-Button
     */
    protected function _setPaypalEcButton()
    {
        if (count($this->paypalEcButtonConfiguration()) > 0) {
            $this->set_content_data('PAYPAL_EC_BUTTON', $this->paypalEcButtonConfiguration());
        }
    }

    /**
     * Create Configuration Array for the Paypal EC-Button
     *
     * @return array
     */
    protected function paypalEcButtonConfiguration()
    {
        $configuration = [];
        $displayButton = (strpos((string)@constant('MODULE_PAYMENT_INSTALLED'), 'paypal3.php') !== false);
        $displayButton = $displayButton && (strtolower((string)@constant('MODULE_PAYMENT_PAYPAL3_STATUS')) === 'true');
        
        if (!$displayButton) {
            return $configuration;
        }
        
        $paypalConfiguration = MainFactory::create('PayPalConfigurationStorage');
        if ((bool)$paypalConfiguration->get('use_ecs_products') === true) {
            /** @var \LanguageHelper $languageHelper */
            $languageHelper = MainFactory::create('LanguageHelper', StaticGXCoreLoader::getDatabaseQueryBuilder());
            $languageCode = $languageHelper->getLanguageCodeById(new IdType($this->languageId))->asString();
            
            $supportedLanguages = ['DE', 'EN', 'ES', 'FR', 'IT', 'NL'];
            
            if (!in_array($languageCode, $supportedLanguages, true)) {
                $languageCode = 'EN';
            }
            
            $buttonStyle = $paypalConfiguration->get('ecs_button_style');
            $buttonImageUrl = GM_HTTP_SERVER . DIR_WS_CATALOG . 'images/icons/paypal/' . $buttonStyle . 'Btn_'
                              . $languageCode . '.png';
            $configuration = [
                'src'          => $buttonImageUrl,
                'widget'       => 'paypal_ec_button',
                'page'         => 'product',
                'redirect'     => isset($_SESSION['paypal_cart_ecs']) ? 'true' : 'false',
                'display_cart' => DISPLAY_CART,
            ];
        }
        
        return $configuration;
    }
    
    
    /**
     * @return GMSEOBoost_ORIGIN
     */
    public function getSeoBoost(): GMSEOBoost_ORIGIN
    {
        return $this->seoBoost;
    }
    
    
    /**
     * @param GMSEOBoost_ORIGIN $seoBoost
     */
    public function setSeoBoost(GMSEOBoost_ORIGIN $seoBoost): void
    {
        $this->seoBoost = $seoBoost;
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit