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; }
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); }