Example #1
0
    public function hookDisplayPpropertiesProduct($params)
    {
        if (!$this->integrated) {
            return;
        }
        $product = $params['product'];
        if (!Validate::isLoadedObject($product)) {
            return;
        }
        $has_discounts = isset($params['ppDiscounts']) && (bool) $params['ppDiscounts'];
        $product_properties = $product->productProperties();
        $pp_product_properties = array();
        $quotes = array();
        foreach ($product_properties as $key => $value) {
            if (strpos($key, 'pp_') === 0 && strpos($key, 'pp_bo_') !== 0 && strpos($key, '_text') > 0) {
                $pp_product_properties[$key] = $value;
                $quotes[$key] = true;
            }
        }
        foreach ($this->getTranslations('ProductController') as $key => $value) {
            $pp_product_properties[$key] = $value;
            $quotes[$key] = true;
        }
        $pp_product_properties = PP::safeOutputJS($pp_product_properties);
        $pp_product_properties['id_pp_template'] = $product_properties['id_pp_template'];
        $pp_product_properties['pp_qty_policy'] = $product_properties['pp_qty_policy'];
        $pp_product_properties['pp_display_mode'] = $product_properties['pp_display_mode'];
        $pp_product_properties['pp_price_display_mode'] = $product_properties['pp_price_display_mode'];
        $pp_product_properties['pp_minimal_price_ratio'] = $product_properties['pp_minimal_price_ratio'];
        $pp_product_properties['pp_qty_step'] = $product_properties['pp_qty_step'];
        $pp_product_properties['minQty'] = $product->minQty();
        $pp_product_properties['defaultQty'] = isset($this->context->smarty->tpl_vars['quantityBackup']) ? $this->context->smarty->tpl_vars['quantityBackup'] : $product->defaultQty();
        $pp_product_properties['explanation'] = PP::safeOutputLenientJS($product_properties['pp_explanation']);
        $quotes['explanation'] = true;
        $pp_product_properties['pp_css'] = PP::safeOutputJS($product_properties['pp_css']);
        $quotes['pp_css'] = true;
        if ((int) (($product_properties['pp_display_mode'] & 2) == 2)) {
            $pp_product_properties['display_mode_retail_price'] = Product::getRetailPrice($product);
        }
        if (!$this->multidimensional_plugin) {
            $product_properties['pp_ext'] = 0;
        }
        $pp_product_properties['pp_ext'] = $product_properties['pp_ext'];
        $script = '
		<script type="text/javascript">
			$("body").addClass("' . $product_properties['pp_css'] . ' pp_template_' . $product_properties['id_pp_template'] . (Configuration::get('PP_SHOW_POSITIONS') ? ' pp-positions-visible' : '') . '");
			var ppProductProperties = [];';
        foreach ($pp_product_properties as $key => $value) {
            if (isset($quotes[$key])) {
                $value = '"' . $value . '"';
            }
            $script .= '
			ppProductProperties["' . $key . '"] = ' . $value . ';';
        }
        if ($product_properties['pp_ext'] == 1) {
            $script .= '
			ppProductProperties["pp_ext_policy"] = ' . $product_properties['pp_ext_policy'] . ';';
            $script .= '
			ppProductProperties["pp_ext_method"] = ' . $product_properties['pp_ext_method'] . ';';
            $script .= '
			ppProductProperties["pp_ext_title"] = "' . PP::safeOutputLenientJS($product_properties['pp_ext_title']) . '";';
            $script .= '
			ppProductProperties["pp_ext_property"] = "' . PP::safeOutputLenientJS($product_properties['pp_ext_property']) . '";';
            $script .= '
			ppProductProperties["pp_ext_text"] = "' . PP::safeOutputLenientJS($product_properties['pp_ext_text']) . '";';
            $script .= '
			ppProductProperties["pp_ext_prop"] = [];';
            foreach ($product_properties['pp_ext_prop'] as $position => $arr) {
                $s = '{';
                $s .= 'property:"' . PP::safeOutputLenientJS($arr['property']) . '"';
                $s .= ',text:"' . PP::safeOutputLenientJS($arr['text']) . '"';
                $s .= ',minimum_quantity:' . (double) $arr['minimum_quantity'];
                $s .= ',maximum_quantity:' . (double) $arr['maximum_quantity'];
                $s .= ',default_quantity:' . (double) $arr['default_quantity'];
                $s .= ',qty_step:' . (double) $arr['qty_step'];
                $s .= ',qty_ratio:' . (double) $arr['qty_ratio'];
                $s .= '}';
                $script .= '
				ppProductProperties["pp_ext_prop"][' . $position . '] = ' . $s . ';';
            }
            if ($product_properties['pp_ext_policy'] == 2) {
                $script .= '
				ppProduct.fallback_ext_quantity = 1;
				ppProduct.prop = ' . Tools::jsonEncode($product->productProp()) . ';';
            }
        }
        $actions = array('price' => $this->context->link->getModuleLink($this->name, 'product', array('process' => 'price')));
        $script .= '
			ppProduct.actions = ' . Tools::jsonEncode($actions) . ';
			ppProduct.hasAttributes = ' . ($product->hasAttributes() ? 'true' : 'false') . ';
			ppProduct.priceObserver = ' . ($has_discounts || PSM::getPlugin('ppropertiessmartprice') ? 'true' : 'false') . ';';
        $script .= '
		</script>';
        return $script;
    }
Example #2
0
 public static function calcProductDisplayPrice($product, $product_properties = null, $price = null, $mode = null)
 {
     $key = null;
     $product_object = self::productAsObject($product);
     if ($product_object != null) {
         if ($product_properties === null) {
             $product_properties = PP::getProductProperties($product_object);
         }
         $display_retail_price = ($product_properties['pp_display_mode'] & 2) == 2 && (($product_properties['pp_display_mode'] & 1) == 1 && $mode != 'unit_price' || !(($product_properties['pp_display_mode'] & 1) == 1) && $mode == 'unit_price');
         if ($display_retail_price) {
             $price = Product::getRetailPrice($product_object);
         } elseif (($product_properties['pp_display_mode'] & 1) == 1) {
             if ($product_object->unit_price_ratio > 0) {
                 if ($price === null) {
                     $price = self::calcProductPrice($product_object);
                 }
                 if ($mode == 'unit_price') {
                     $price = Tools::ps_round((double) $price * $product_object->unit_price_ratio, _PS_PRICE_COMPUTE_PRECISION_);
                 } else {
                     if (is_array($product) && isset($product['price_tax_exc']) && $product['price_tax_exc'] > 0 && round($price, 8) > round($product['price_tax_exc'], 8)) {
                         $tax = $price / $product['price_tax_exc'];
                     }
                     // we use $product_object->price because unit price is calculated based on the base price, without attribute impact on the price
                     $price = Tools::ps_round($product_object->price / $product_object->unit_price_ratio, _PS_PRICE_COMPUTE_PRECISION_);
                     if (($attribute = Product::getDefaultAttribute($product_object->id)) > 0) {
                         $combination = $product_object->getAttributeCombinationsById($attribute, Context::getContext()->language->id);
                         $price += Tools::ps_round($combination[0]['unit_price_impact'], _PS_PRICE_COMPUTE_PRECISION_);
                     }
                     if (isset($tax)) {
                         $price = Tools::ps_round($price * $tax, _PS_PRICE_COMPUTE_PRECISION_);
                     }
                 }
             }
         }
         if (($product_properties['pp_display_mode'] & 1) == 1) {
             if ($mode == 'unit_price') {
                 if (!empty($product_properties['pp_price_text'])) {
                     $key = 'pp_price_text';
                 }
             } else {
                 if (!empty($product_properties['pp_unity_text'])) {
                     $key = 'pp_unity_text';
                 }
             }
         } else {
             if ($mode == 'unit_price') {
                 if (!empty($product_properties['pp_unity_text'])) {
                     $key = 'pp_unity_text';
                 }
             } else {
                 if (!empty($product_properties['pp_price_text'])) {
                     $key = 'pp_price_text';
                 }
             }
         }
         if ($price === null) {
             $price = self::calcProductPrice($product_object);
         }
     }
     return array($key, $price);
 }