/** * Return cart products * * @result array Products * @param bool $refresh * @param bool $product_id * @param null $country_id * @return array|null */ public function getProducts($refresh = false, $product_id = false, $country_id = null) { if (!$this->cart_id) { return array(); } // Product cache must be strictly compared to NULL, or else an empty cart will add dozens of queries if ($this->_products !== null && !$refresh) { // Return product row with specified ID if it exists if (is_int($product_id)) { foreach ($this->_products as $product) { if ($product->product_id == $product_id) { return array($product); } } return array(); } return $this->_products; } $db = JFactory::getDBO(); $select = $leftJoin = ""; if (JeproshopCustomization::isFeaturePublished()) { $select .= 'cu.`id_customization`, cu.`quantity` AS customization_quantity'; $leftJoin .= " LEFT JOIN " . $db->quoteName('#__jeproshop_customization') . " AS customization "; /* 'p.`id_product` = cu.`id_product` AND cart_product.`id_product_attribute` = cu.`id_product_attribute` AND cu.`id_cart` = '.(int)$this->id); */ } else { $select .= 'NULL AS customization_quantity, NULL AS id_customization'; } if (JeproshopCombinationModelCombination::isFeaturePublished()) { $select .= ' product_attribute_shop.`price` AS price_attribute, product_attribute_shop.`ecotax` AS ecotax_attr, IF (IFNULL(pa.`reference`, \'\') = \'\', p.`reference`, pa.`reference`) AS reference, (p.`weight`+ pa.`weight`) weight_attribute, IF (IFNULL(pa.`ean13`, \'\') = \'\', p.`ean13`, pa.`ean13`) AS ean13, IF (IFNULL(pa.`upc`, \'\') = \'\', p.`upc`, pa.`upc`) AS upc, pai.`id_image` as pai_id_image, il.`legend` as pai_legend, IFNULL(product_attribute_shop.`minimal_quantity`, product_shop.`minimal_quantity`) as minimal_quantity '; /*$sql->leftJoin('product_attribute', 'pa', 'pa.`id_product_attribute` = cart_product.`id_product_attribute`'); $sql->leftJoin('product_attribute_shop', 'product_attribute_shop', '(product_attribute_shop.`id_shop` = cart_product.`id_shop` AND product_attribute_shop.`id_product_attribute` = pa.`id_product_attribute`)'); $sql->leftJoin('product_attribute_image', 'pai', 'pai.`id_product_attribute` = pa.`id_product_attribute`'); $sql->leftJoin('image_lang', 'il', 'il.`id_image` = pai.`id_image` AND il.`id_lang` = '.(int)$this->id_lang); */ } else { $select .= 'p.`reference` AS reference, p.`ean13`, p.`upc` AS upc, product_shop.`minimal_quantity` AS minimal_quantity'; } $query = "SELECT cart_product." . $db->quoteName('product_attribute_id') . ", cart_product." . $db->quoteName('product_id') . ", cart_product."; $query .= $db->quoteName('quantity') . " AS cart_quantity, cart_product." . $db->quoteName('shop_id') . ", product_lang." . $db->quoteName('name'); $query .= ", product." . $db->quoteName('is_virtual') . ", product_lang." . $db->quoteName('short_description') . ", product_lang." . $db->quoteName('available_now'); $query .= ", product_lang." . $db->quoteName('available_later') . ", product_shop." . $db->quoteName('default_category_id') . ", product."; $query .= $db->quoteName('supplier_id') . ", product." . $db->quoteName('manufacturer_id') . ", product_shop." . $db->quoteName('on_sale') . ", product_shop."; $query .= $db->quoteName('ecotax') . ", product_shop." . $db->quoteName('additional_shipping_cost') . ", product_shop." . $db->quoteName('available_for_order'); $query .= ", product_shop." . $db->quoteName('price') . ", product_shop." . $db->quoteName('published') . ", product_shop." . $db->quoteName('unity'); $query .= ", product_shop." . $db->quoteName('unit_price_ratio') . ", stock." . $db->quoteName('quantity') . " AS quantity_available, product." . $db->quoteName('width'); $query .= ", product." . $db->quoteName('height') . ", product." . $db->quoteName('depth') . ", stock." . $db->quoteName('out_of_stock') . ", product."; $query .= $db->quoteName('weight') . ", product." . $db->quoteName('date_add') . ", product." . $db->quoteName('date_upd') . ", IFNULL(stock.quantity, 0) as quantity, "; $query .= "product_lang." . $db->quoteName('link_rewrite') . ", category_lang." . $db->quoteName('link_rewrite') . " AS category, CONCAT(LPAD(cart_product."; $query .= $db->quoteName('product_id') . ", 10, 0), LPAD(IFNULL(cart_product." . $db->quoteName('product_attribute_id') . ", 0), 10, 0), IFNULL(cart_product."; $query .= $db->quoteName('address_delivery_id') . ", 0)) AS unique_id, cart_product.address_delivery_id, product_shop." . $db->quoteName('wholesale_price'); $query .= ", product_shop.advanced_stock_management, product_supplier.product_supplier_reference supplier_reference, IFNULL(specific_price." . $db->quoteName('reduction_type'); $query .= ", 0) AS reduction_type FROM " . $db->quoteName('#__jeproshop_cart_product') . " AS cart_product LEFT JOIN " . $db->quoteName('#__jeproshop_product') . " AS product "; $query .= " ON (product." . $db->quoteName('product_id') . " = cart_product." . $db->quoteName('product_id') . ") INNER JOIN " . $db->quoteName('#__jeproshop_product_shop'); $query .= " AS product_shop ON (product_shop." . $db->quoteName('shop_id') . " = cart_product." . $db->quoteName('shop_id') . " AND product_shop." . $db->quoteName('product_id'); $query .= " = product." . $db->quoteName('product_id') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_product_lang') . " AS product_lang ON (product." . $db->quoteName('product_id'); $query .= " = product_lang." . $db->quoteName('product_id') . "\tAND product_lang." . $db->quoteName('lang_id') . " = " . (int) $this->lang_id; $query .= JeproshopShopModelShop::addSqlRestrictionOnLang('product_lang', 'cart_product.shop_id') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_category_lang'); $query .= " AS category_lang ON(product_shop." . $db->quoteName('default_category_id') . " = category_lang." . $db->quoteName('category_id') . " AND category_lang." . $db->quoteName('lang_id'); $query .= " = " . (int) $this->lang_id . JeproshopShopModelShop::addSqlRestrictionOnLang('category_lang', 'cart_product.shop_id') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_product_supplier'); $query .= " AS product_supplier ON (product_supplier." . $db->quoteName('product_id') . " = cart_product." . $db->quoteName('product_id') . " AND product_supplier."; $query .= $db->quoteName('product_attribute_id') . " = cart_product." . $db->quoteName('product_attribute_id') . " AND product_supplier." . $db->quoteName('supplier_id'); $query .= " = product." . $db->quoteName('supplier_id') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_specific_price') . " AS specific_price ON (specific_price."; $query .= $db->quoteName('product_id') . " = cart_product." . $db->quoteName('product_id') . ") " . JeproshopProductModelProduct::sqlStock('cart_product'); // AND 'sp.`id_shop` = cart_product.`id_shop` // @todo test if everything is ok, then refactorise call of this method //$sql->join(Product::sqlStock('cart_product', 'cart_product')); $query .= " WHERE cart_product." . $db->quoteName('cart_id') . " = " . (int) $this->cart_id; if ($product_id) { $query .= " AND cart_product." . $db->quoteName('product_id') . " = " . (int) $product_id; } $query .= " AND product." . $db->quoteName('product_id') . " IS NOT NULL GROUP BY unique_id ORDER BY cart_product." . $db->quoteName('date_add'); $query .= ", product." . $db->quoteName('product_id') . ", cart_product." . $db->quoteName('product_attribute_id') . " ASC"; $db->setQuery($query); $result = $db->loadObjectList(); // Reset the cache before the following return, or else an empty cart will add dozens of queries $products_ids = array(); $product_attribute_ids = array(); if ($result) { foreach ($result as $row) { $products_ids[] = $row->product_id; $product_attribute_ids[] = $row->product_attribute_id; } } // Thus you can avoid one query per product, because there will be only one query for all the products of the cart JeproshopProductModelProduct::cacheProductsFeatures($products_ids); JeproshopCartModelCart::cacheSomeAttributesLists($product_attribute_ids, $this->lang_id); $this->_products = array(); if (empty($result)) { return array(); } $cart_shop_context = JeproshopContext::getContext()->cloneContext(); foreach ($result as &$row) { if (isset($row->ecotax_attr) && $row->ecotax_attr > 0) { $row->ecotax = (double) $row->ecotax_attr; } $row->stock_quantity = (int) $row->quantity; // for compatibility with 1.2 themes $row->quantity = (int) $row->cart_quantity; if (isset($row->product_attribute_id) && (int) $row->product_attribute_id && isset($row->weight_attribute)) { $row->weight = (double) $row->weight_attribute; } if (JeproshopSettingModelSetting::getValue('tax_address_type') == 'address_invoice_id') { $address_id = (int) $this->address_invoice_id; } else { $address_id = (int) $row->address_delivery_id; } if (!JeproshopAddressModelAddress::addressExists($address_id)) { $address_id = null; } if ($cart_shop_context->shop->shop_id != $row->shop_id) { $cart_shop_context->shop = new JeproshopShopModelShop((int) $row->shop_id); } $specific_price_output = null; $null = null; if ($this->_taxCalculationMethod == COM_JEPROSHOP_TAX_EXCLUDED) { $row->price = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, false, isset($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 2, null, false, true, (int) $row->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $specific_price_output, true, true, $cart_shop_context); // Here taxes are computed only once the quantity has been applied to the product price $row->price_wt = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, true, isset($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 2, null, false, true, (int) $row->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $null, true, true, $cart_shop_context); $tax_rate = JeproshopTaxModelTax::getProductTaxRate((int) $row->product_id, (int) $address_id); $row->total_wt = JeproshopTools::roundPrice($row->price * (double) $row->cart_quantity * (1 + (double) $tax_rate / 100), 2); $row->total = $row->price * (int) $row->cart_quantity; } else { $row->price = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, false, (int) $row->product_attribute_id, 2, null, false, true, $row->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $specific_price_output, true, true, $cart_shop_context); $row->price_wt = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, true, (int) $row->product_attribute_id, 2, null, false, true, $row->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $null, true, true, $cart_shop_context); // In case when you use QuantityDiscount, getPriceStatic() can be return more of 2 decimals $row->price_wt = JeproshopTools::roundPrice($row->price_wt, 2); $row->total_wt = $row->price_wt * (int) $row->cart_quantity; $row->total = JeproshopTools::roundPrice($row->price * (int) $row->cart_quantity, 2); $row->description_short = JeproshopTools::nl2br($row->short_description); } if (!isset($row->product_attribute_id_image_id) || $row->product_attribute_id_image_id == 0) { $cache_id = 'jeproshop_cart_get_products_product_attribute_id_image_id_' . (int) $row->product_id . '_' . (int) $this->lang_id . '_' . (int) $row->shop_id; if (!JeproshopCache::isStored($cache_id)) { $db = JFactory::getDBO(); $query = "SELECT image_shop." . $db->quoteName('image_id') . " AS image_id, image_lang." . $db->quoteName('legend') . " FROM "; $query .= $db->quoteName('#__jeproshop_image') . " AS image JOIN " . $db->quoteName('#__jeproshop_image_shop') . " AS image_shop ON ("; $query .= " image.image_id = image_shop.image_id AND image_shop.cover=1 AND image_shop.shop_id = " . (int) $row->shop_id . ") LEFT JOIN "; $query .= $db->quoteName('#__jeproshop_image_lang') . " AS image_lang ON (image_shop." . $db->quoteName('image_id') . " = image_lang."; $query .= $db->quoteName('image_id') . " AND image_lang." . $db->quoteName('lang_id') . " = " . (int) $this->lang_id . ") WHERE image."; $query .= $db->quoteName('product_id') . " = " . (int) $row->product_id . " AND image_shop." . $db->quoteName('cover') . " = 1"; $db->setQuery($query); $row2 = $db->loadObject(); JeproshopCache::store($cache_id, $row2); } $row2 = JeproshopCache::retrieve($cache_id); if (!$row2) { $row2 = new JObject(); $row2->image_id = false; $row2->legend = false; } else { $row = array_merge($row, $row2); } } else { $row->image_id = $row->product_attribute_id_image_id; $row->legend = $row->product_attribute_legend; } $row->reduction_applies = $specific_price_output && (double) $specific_price_output->reduction; $row->quantity_discount_applies = $specific_price_output && $row->cart_quantity >= (int) $specific_price_output->from_quantity; $row->image_id = JeproshopProductModelProduct::defineProductImage($row, $this->lang_id); $row->allow_out_of_sp = JeproshopProductModelProduct::isAvailableWhenOutOfStock($row->out_of_stock); $row->features = JeproshopProductModelProduct::getStaticFeatures((int) $row->product_id); if (array_key_exists($row->product_attribute_id . '_' . $this->lang_id, self::$_attributesLists)) { $row = array_merge($row, self::$_attributesLists[$row->product_attribute_id . '_' . $this->lang_id]); } $row = JeproshopProductModelProduct::getTaxesInformations($row, $cart_shop_context); $this->_products[] = $row; } return $this->_products; }
public static function getProductProperties($lang_id, $row, JeproshopContext $context = null) { if (!$row->product_id) { return false; } if ($context == null) { $context = JeproshopContext::getContext(); } // Product::getDefaultAttribute is only called if id_product_attribute is missing from the SQL query at the origin of it: // consider adding it in order to avoid unnecessary queries $row->allow_out_of_stock_ordering = JeproshopProductModelProduct::isAvailableWhenOutOfStock($row->out_of_stock); if (JeproshopCombinationModelCombination::isFeaturePublished() && (!isset($row->product_attribute_id) || !$row->product_attribute_id) && (isset($row->cache_default_attribute) && ($default_product_attribute_id = $row->cache_default_attribute) !== null || ($default_product_attribute_id = JeproshopProductModelProduct::getDefaultAttribute($row->product_id, !$row->allow_out_of_stock_ordering)))) { $row->product_attribute_id = $default_product_attribute_id; } if (!JeproshopCombinationModelCombination::isFeaturePublished() || !isset($row->product_attribute_id)) { $row->product_attribute_id = 0; } // Tax $useTax = JeproshopTaxModelTax::taxExcludedOption(); $cache_key = $row->product_id . '_' . $row->product_attribute_id . '_' . $lang_id . '_' . (int) $useTax; if (isset($row->product_pack_id)) { $cache_key .= '_pack_' . $row->product_pack_id; } if (isset(self::$_productPropertiesCache[$cache_key])) { return JeproshopTools::updateObjectData($row, self::$_productPropertiesCache[$cache_key]); } // Datas $row->category = JeproshopCategoryModelCategory::getLinkRewrite((int) $row->default_category_id, (int) $lang_id); $row->link = $context->controller->getProductLink((int) $row->product_id, $row->link_rewrite, $row->category, $row->ean13); $row->attribute_price = 0; if (isset($row->product_attribute_id) && $row->product_attribute_id) { $row->attribute_price = (double) JeproshopProductModelProduct::getProductAttributePrice($row->product_attribute_id); } $row->price_tax_exc = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, false, isset($row->product_attribute_id) && !empty($row->product_attribute_id) ? (int) $row->product_attribute_id : null, self::$_taxCalculationMethod == COM_JEPROSHOP_TAX_EXCLUDED ? 2 : 6); if (self::$_taxCalculationMethod == COM_JEPROSHOP_TAX_EXCLUDED) { $row->price_tax_exc = JeproshopTools::roundPrice($row->price_tax_exc, 2); $row->price = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, true, isset($row->product_attribute_id) && !empty($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 6); $row->price_without_reduction = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, false, isset($row->product_attribute_id) && !empty($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 2, null, false, false); } else { $row->price = JeproshopTools::roundPrice(JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, true, isset($row->product_attribute_id) && !empty($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 2), 2); $row->price_without_reduction = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, true, isset($row->product_attribute_id) && !empty($row->product_attribute_id) ? (int) $row->product_attribute_id : null, 6, null, false, false); } $specific_prices = null; $row->reduction = JeproshopProductModelProduct::getStaticPrice((int) $row->product_id, (bool) $useTax, (int) $row->product_attribute_id, 6, null, true, true, 1, true, null, null, null, $specific_prices); $row->specific_prices = $specific_prices; $row->quantity = JeproshopProductModelProduct::getQuantity((int) $row->product_id, 0, isset($row->cache_is_pack) ? $row->cache_is_pack : null); $row->quantity_all_versions = $row->quantity; if ($row->product_attribute_id) { $row->quantity = JeproshopProductModelProduct::getQuantity((int) $row->product_id, $row->product_attribute_id, isset($row->cache_is_pack) ? $row->cache_is_pack : null); } $row->image_id = JeproshopProductModelProduct::defineProductImage($row, $lang_id); $row->features = JeproshopProductModelProduct::getFrontStaticFeatures((int) $lang_id, $row->product_id); $row->attachments = array(); if (!isset($row->cache_has_attachments) || $row->cache_has_attachments) { $row->attachments = JeproshopProductModelProduct::getStaticAttachments((int) $lang_id, $row->product_id); } $row->virtual = !isset($row->is_virtual) || $row->is_virtual ? 1 : 0; // Pack management $row->pack = !isset($row->cache_is_pack) ? JeproshopProductPack::isPack($row->product_id) : (int) $row->cache_is_pack; $row->packItems = $row->pack ? JeproshopProductPack::getItemTable($row->product_id, $lang_id) : array(); $row->no_pack_price = $row->pack ? JeproshopProductPack::noPackPrice($row->product_id) : 0; if ($row->pack && !JeproshopProductPack::isInStock($row->product_id)) { $row->quantity = 0; } $row->customization_required = false; if (isset($row->customizable) && $row->customizable && JeproshopCustomization::isFeaturePublished()) { if (count(JeproshopProductModelProduct::getStaticRequiredCustomizableFields((int) $row->product_id))) { $row->customization_required = true; } } $row = JeproshopProductModelProduct::getTaxesInformations($row, $context); self::$_productPropertiesCache[$cache_key] = $row; return self::$_productPropertiesCache[$cache_key]; }
public function assignSummaryInformations() { $context = JeproshopContext::getContext(); $summary = $context->cart->getSummaryDetails(); $customizedDatas = JeproshopProductModelProduct::getAllCustomizedDatas($context->cart->cart_id); // override customization tax rate with real tax (tax rules) if ($customizedDatas) { foreach ($summary['products'] as &$productUpdate) { $productId = (int) (isset($productUpdate->product_id) ? $productUpdate->product_id : $productUpdate->product_id); $productAttributeId = (int) (isset($productUpdate->product_attribute_id) ? $productUpdate->product_attribute_id : $productUpdate->product_attribute_id); if (isset($customizedDatas[$productId][$productAttributeId])) { $productUpdate->tax_rate = JeproshopTaxModelTax::getProductTaxRate($productId, $context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')}); } } JeproshopProductModelProduct::addCustomizationPrice($summary->products, $customizedDatas); } $cart_product_context = JeproshopContext::getContext()->cloneContext(); foreach ($summary['products'] as $key => $product) { $product->quantity = $product->cart_quantity; // for compatibility with 1.2 themes if ($cart_product_context->shop->shop_id != $product->shop_id) { $cart_product_context->shop = new JeproshopModelShop((int) $product->shop_id); } $null = null; $product->price_without_specific_price = JeproshopProductModelProduct::getStaticPrice($product->product_id, !JeproshopProductModelProduct::getTaxCalculationMethod(), $product->product_attribute_id, 2, null, false, false, 1, false, null, null, null, $null, true, true, $cart_product_context); if (JeproshopProductModelProduct::getTaxCalculationMethod()) { $product->is_discounted = $product->price_without_specific_price != $product->price; } else { $product->is_discounted = $product->price_without_specific_price != $product->price_wt; } } // Get available cart rules and unset the cart rules already in the cart $available_cart_rules = JeproshopCartRuleModelCartRule::getCustomerCartRules($this->context->language->lang_id, isset($this->context->customer->customer_id) ? $this->context->customer->customer_id : 0, true, true, true, $this->context->cart); $cart_cart_rules = $context->cart->getCartRules(); foreach ($available_cart_rules as $key => $available_cart_rule) { if (!$available_cart_rule->high_light || strpos($available_cart_rule->code, 'BO_ORDER_') === 0) { unset($available_cart_rules[$key]); continue; } foreach ($cart_cart_rules as $cart_cart_rule) { if ($available_cart_rule->cart_rule_id == $cart_cart_rule->cart_rule_id) { unset($available_cart_rules[$key]); continue 2; } } } $show_option_allow_separate_package = !$this->context->cart->isAllProductsInStock(true) && JeproshopSettingModelSetting::getValue('ship_when_available'); $this->assign($summary); //$this->assign('token_cart', Tools::getToken(false)); $this->assign('is_logged', $this->context->controller->isLogged); $this->assign('is_virtual_cart', $this->context->cart->isVirtualCart()); $this->assign('product_number', $this->context->cart->numberOfProducts()); $this->assign('voucher_allowed', JeproshopCartRuleModelCartRule::isFeaturePublished()); $this->assign('shipping_cost', $this->context->cart->getOrderTotal(true, JeproshopCartModelCart::ONLY_SHIPPING)); $this->assign('shipping_cost_tax_excluded', $this->context->cart->getOrderTotal(false, JeproshopCartModelCart::ONLY_SHIPPING)); $this->assign('customizedDatas', $customizedDatas); $this->assign('CUSTOMIZE_FILE', JeproshopProductModelProduct::CUSTOMIZE_FILE); $this->assign('CUSTOMIZE_TEXT_FIELD', JeproshopProductModelProduct::CUSTOMIZE_TEXT_FIELD); $this->assign('last_product_added', $this->context->cart->getLastProduct()); $this->assign('display_vouchers', $available_cart_rules); $this->assign('currency_sign', $this->context->currency->sign); $this->assign('currency_rate', $this->context->currency->conversion_rate); $this->assign('currency_format', $this->context->currency->format); $this->assign('currency_blank', $this->context->currency->blank); $this->assign('show_option_allow_separate_package', $show_option_allow_separate_package); $this->assign('small_size', JeproshopImageModelImage::getSize(JeproshopImageTypeModelImageType::getFormatName('small'))); /* $this->context->smarty->assign(array( 'HOOK_SHOPPING_CART' => Hook::exec('displayShoppingCartFooter', $summary), 'HOOK_SHOPPING_CART_EXTRA' => Hook::exec('displayShoppingCart', $summary) ));*/ }
/** * Assign price and tax to the template */ protected function assignPriceAndTax() { $customer_id = isset($this->context->customer) ? (int) $this->context->customer->customer_id : 0; $group_id = (int) JeproshopGroupModelGroup::getCurrent()->group_id; $country_id = (int) $customer_id ? JeproshopCustomerModelCustomer::getCurrentCountry($customer_id) : JeproshopSettingModelSetting::getValue('default_country'); $group_reduction = JeproshopGroupReductionModelGroupReduction::getValueForProduct($this->product->product_id, $group_id); if ($group_reduction === false) { $group_reduction = JeproshopGroupModelGroup::getReduction((int) $this->context->cookie->customer_id) / 100; } // Tax $tax = (double) $this->product->getTaxesRate(new JeproshopAddressModelAddress((int) $this->context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')})); $this->assignRef('tax_rate', $tax); $product_price_with_tax = JeproshopProductModelProduct::getStaticPrice($this->product->product_id, true, null, 6); if (JeproshopProductModelProduct::$_taxCalculationMethod == COM_JEPROSHOP_TAX_INCLUDED) { $product_price_with_tax = JeproshopTools::roundPrice($product_price_with_tax, 2); } $product_price_without_eco_tax = (double) $product_price_with_tax - $this->product->ecotax; $ecotax_rate = (double) JeproshopTaxModelTax::getProductEcotaxRate($this->context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')}); $ecotax_tax_amount = JeproshopTools::roundPrice($this->product->ecotax, 2); if (JeproshopProductModelProduct::$_taxCalculationMethod == COM_JEPROSHOP_TAX_INCLUDED && (int) JeproshopSettingModelSetting::getValue('use_tax')) { $ecotax_tax_amount = JeproshopTools::roundPrice($ecotax_tax_amount * (1 + $ecotax_rate / 100), 2); } $currency_id = (int) $this->context->cookie->currency_id; $product_id = (int) $this->product->product_id; $shop_id = $this->context->shop->shop_id; $quantity_discounts = JeproshopSpecificPriceModelSpecificPrice::getQuantityDiscounts($product_id, $shop_id, $currency_id, $country_id, $group_id, null, true, (int) $this->context->customer->customer_id); foreach ($quantity_discounts as &$quantity_discount) { if ($quantity_discount->product_attribute_id) { $combination = new JeproshopCombinationModelCombination((int) $quantity_discount->product_attribute_id); $attributes = $combination->getAttributesName((int) $this->context->language->lang_id); foreach ($attributes as $attribute) { $quantity_discount->attributes = $attribute->name . ' - '; } $quantity_discount->attributes = rtrim($quantity_discount->attributes, ' - '); } if ((int) $quantity_discount->currency_id == 0 && $quantity_discount->reduction_type == 'amount') { $quantity_discount->reduction = JeproshopTools::convertPriceFull($quantity_discount->reduction, null, JeproshopContext::getContext()->currency); } } $product_price = $this->product->getPrice(JeproshopProductModelProduct::$_taxCalculationMethod == COM_JEPROSHOP_TAX_INCLUDED, false); $address = new JeproshopAddressModelAddress($this->context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')}); $quantity_discounts = $this->formatQuantityDiscounts($quantity_discounts, $product_price, (double) $tax, $ecotax_tax_amount); $this->assignRef('quantity_discounts', $quantity_discounts); $this->assignRef('ecotax_tax_included', $ecotax_tax_amount); $ecotax_tax_excluded = JeproshopTools::roundPrice($this->product->ecotax, 2); $this->assignRef('ecotax_tax_excluded', $ecotax_tax_excluded); $this->assignRef('ecotaxTax_rate', $ecotax_rate); $display_price = JeproshopSettingModelSetting::getValue('display_price'); $this->assignRef('display_price', $display_price); $product_price_without_eco_tax = (double) $product_price_without_eco_tax; $this->assignRef('product_price_without_ecotax', $product_price_without_eco_tax); $this->assignRef('group_reduction', $group_reduction); $no_tax = JeproshopTaxModelTax::taxExcludedOption() || !$this->product->getTaxesRate($address); $this->assignRef('no_tax', $no_tax); $ecotax = !count($this->errors) && $this->product->ecotax > 0 ? JeproshopTools::convertPrice((double) $this->product->ecotax) : 0; $this->assignRef('ecotax', $ecotax); $tax_enabled = JeproshopSettingModelSetting::getValue('use_tax'); $this->assignRef('tax_enabled', $tax_enabled); $customer_group_without_tax = JeproshopGroupModelGroup::getPriceDisplayMethod($this->context->customer->default_group_id); $this->assignRef('customer_group_without_tax', $customer_group_without_tax); }
/** * This function returns the total cart amount * * Possible values for $type: * JeproshopCartModelCart::ONLY_PRODUCTS * JeproshopCartModelCart::ONLY_DISCOUNTS * JeproshopCartModelCart::BOTH * JeproshopCartModelCart::BOTH_WITHOUT_SHIPPING * JeproshopCartModelCart::ONLY_SHIPPING * JeproshopCartModelCart::ONLY_WRAPPING * JeproshopCartModelCart::ONLY_PRODUCTS_WITHOUT_SHIPPING * JeproshopCartModelCart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING * * @param bool $with_taxes * @param integer $type Total type * @param null $products * @param null $carrier_id * @param boolean $use_cache Allow using cache of the method CartRule::getContextualValue * @internal param bool $withTaxes With or without taxes * @return float Order total */ public function getOrderTotal($with_taxes = true, $type = JeproshopCartModelCart::BOTH, $products = null, $carrier_id = null, $use_cache = true) { if (!$this->cart_id) { return 0; } $type = (int) $type; $array_type = array(JeproshopCartModelCart::ONLY_PRODUCTS, JeproshopCartModelCart::ONLY_DISCOUNTS, JeproshopCartModelCart::BOTH, JeproshopCartModelCart::BOTH_WITHOUT_SHIPPING, JeproshopCartModelCart::ONLY_SHIPPING, JeproshopCartModelCart::ONLY_WRAPPING, JeproshopCartModelCart::ONLY_PRODUCTS_WITHOUT_SHIPPING, JeproshopCartModelCart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING); // Define virtual context to prevent case where the cart is not the in the global context $virtual_context = JeproshopContext::getContext()->cloneContext(); $virtual_context->cart = $this; if (!in_array($type, $array_type)) { die(Tools::displayError()); } $with_shipping = in_array($type, array(JeproshopCartModelCart::BOTH, JeproshopCartModelCart::ONLY_SHIPPING)); // if cart rules are not used if ($type == JeproshopCartModelCart::ONLY_DISCOUNTS && !JeproshopCartRuleModelCartRule::isFeaturePublished()) { return 0; } // no shipping cost if is a cart with only virtual products $virtual = $this->isVirtualCart(); if ($virtual && $type == JeproshopCartModelCart::ONLY_SHIPPING) { return 0; } if ($virtual && $type == JeproshopCartModelCart::BOTH) { $type = JeproshopCartModelCart::BOTH_WITHOUT_SHIPPING; } if ($with_shipping || $type == JeproshopCartModelCart::ONLY_DISCOUNTS) { if (is_null($products) && is_null($carrier_id)) { $shipping_fees = $this->getTotalShippingCost(null, (bool) $with_taxes); } else { $shipping_fees = $this->getPackageShippingCost($carrier_id, (bool) $with_taxes, null, $products); } } else { $shipping_fees = 0; } if ($type == JeproshopCartModelCart::ONLY_SHIPPING) { return $shipping_fees; } if ($type == JeproshopCartModelCart::ONLY_PRODUCTS_WITHOUT_SHIPPING) { $type = JeproshopCartModelCart::ONLY_PRODUCTS; } $param_product = true; if (is_null($products)) { $param_product = false; $products = $this->getProducts(); } if ($type == JeproshopCartModelCart::ONLY_PHYSICAL_PRODUCTS_WITHOUT_SHIPPING) { foreach ($products as $key => $product) { if ($product['is_virtual']) { unset($products[$key]); } } $type = JeproshopCartModelCart::ONLY_PRODUCTS; } $order_total = 0; if (JeproshopTaxModelTax::taxExcludedOption()) { $with_taxes = false; } foreach ($products as $product) { if ($virtual_context->shop->shop_id != $product->shop_id) { $virtual_context->shop = new JeproshopShopModelShop((int) $product->shop_id); } if (JeproshopSettingModelSetting::getValue('tax_address_type') == 'address_invoice_id') { $address_id = (int) $this->address_invoice_id; } else { $address_id = (int) $product->address_delivery_id; } // Get delivery address of the product from the cart if (!JeproshopAddressModelAddress::addressExists($address_id)) { $address_id = null; } if ($this->_taxCalculationMethod == COM_JEPROSHOP_TAX_EXCLUDED) { $null = null; // Here taxes are computed only once the quantity has been applied to the product price $price = JeproshopProductModelProduct::getStaticPrice((int) $product->product_id, false, (int) $product->product_attribute_id, 2, null, false, true, $product->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, $address_id, $null, true, true, $virtual_context); $total_ecotax = $product->ecotax * (int) $product->cart_quantity; $total_price = $price * (int) $product->cart_quantity; if ($with_taxes) { $product_tax_rate = (double) JeproshopTaxModelTax::getProductTaxRate((int) $product->product_id, (int) $address_id, $virtual_context); $product_eco_tax_rate = JeproshopTaxModelTax::getProductEcotaxRate((int) $address_id); $total_price = ($total_price - $total_ecotax) * (1 + $product_tax_rate / 100); $total_ecotax = $total_ecotax * (1 + $product_eco_tax_rate / 100); $total_price = JeproshopValidator::roundPrice($total_price + $total_ecotax, 2); } } else { $null = null; if ($with_taxes) { $price = JeproshopProductModelProduct::getStaticPrice((int) $product->product_id, true, (int) $product->product_attribute_id, 2, null, false, true, $product->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $null, true, true, $virtual_context); } else { $price = JeproshopProductModelProduct::getStaticPrice((int) $product->product_id, false, (int) $product->product_attribute_id, 2, null, false, true, $product->cart_quantity, false, (int) $this->customer_id ? (int) $this->customer_id : null, (int) $this->cart_id, (int) $address_id ? (int) $address_id : null, $null, true, true, $virtual_context); } $total_price = JeproshopValidator::roundPrice($price * (int) $product->cart_quantity, 2); } $order_total += $total_price; } $order_total_products = $order_total; if ($type == JeproshopCartModelCart::ONLY_DISCOUNTS) { $order_total = 0; } // Wrapping Fees $wrapping_fees = 0; if ($this->gift) { $wrapping_fees = JeproshopValidator::convertPrice(JeproshopValidator::roundPrice($this->getGiftWrappingPrice($with_taxes), 2), JeproshopCurrencyModelCurrency::getCurrencyInstance((int) $this->currency_id)); } if ($type == JeproshopCartModelCart::ONLY_WRAPPING) { return $wrapping_fees; } $order_total_discount = 0; if (!in_array($type, array(JeproshopCartModelCart::ONLY_SHIPPING, JeproshopCartModelCart::ONLY_PRODUCTS)) && JeproshopCartRuleModelCartRule::isFeaturePublished()) { // First, retrieve the cart rules associated to this "getOrderTotal" if ($with_shipping || $type == JeproshopCartModelCart::ONLY_DISCOUNTS) { $cart_rules = $this->getCartRules(JeproshopCartRuleModelCartRule::JEPROSHOP_FILTER_ACTION_ALL); } else { $cart_rules = $this->getCartRules(JeproshopCartRuleModelCartRule::JEPROSHOP_FILTER_ACTION_REDUCTION); // Cart Rules array are merged manually in order to avoid doubles foreach ($this->getCartRules(JeproshopCartRuleModelCartRule::JEPROSHOP_FILTER_ACTION_GIFT) as $tmp_cart_rule) { $flag = false; foreach ($cart_rules as $cart_rule) { if ($tmp_cart_rule->cart_rule_id == $cart_rule->cart_rule_id) { $flag = true; } } if (!$flag) { $cart_rules[] = $tmp_cart_rule; } } } $address_delivery_id = 0; if (isset($products[0])) { $address_delivery_id = is_null($products) ? $this->address_delivery_id : $products[0]->address_delivery_id; } $package = array('carrier_id' => $carrier_id, 'address_id' => $address_delivery_id, 'products' => $products); // Then, calculate the contextual value for each one foreach ($cart_rules as $cart_rule) { // If the cart rule offers free shipping, add the shipping cost if (($with_shipping || $type == Cart::ONLY_DISCOUNTS) && $cart_rule->obj->free_shipping) { $order_total_discount += JeproshopValidator::roundPrice($cart_rule->obj->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_SHIPPING, $param_product ? $package : null, $use_cache), 2); } // If the cart rule is a free gift, then add the free gift value only if the gift is in this package if ((int) $cart_rule['obj']->gift_product) { $in_order = false; if (is_null($products)) { $in_order = true; } else { foreach ($products as $product) { if ($cart_rule['obj']->gift_product == $product['id_product'] && $cart_rule['obj']->gift_product_attribute == $product['id_product_attribute']) { $in_order = true; } } } if ($in_order) { $order_total_discount += $cart_rule->obj->getContextualValue($with_taxes, $virtual_context, JeproshopCartRuleModelCartRule::FILTER_ACTION_GIFT, $package, $use_cache); } } // If the cart rule offers a reduction, the amount is prorated (with the products in the package) if ($cart_rule['obj']->reduction_percent > 0 || $cart_rule['obj']->reduction_amount > 0) { $order_total_discount += JeproshopValidator::roundPrice($cart_rule['obj']->getContextualValue($with_taxes, $virtual_context, CartRule::FILTER_ACTION_REDUCTION, $package, $use_cache), 2); } } $order_total_discount = min(JeproshopValidator::roundPrice($order_total_discount, 2), $wrapping_fees + $order_total_products + $shipping_fees); $order_total -= $order_total_discount; } if ($type == JeproshopCartModelCart::BOTH) { $order_total += $shipping_fees + $wrapping_fees; } if ($order_total < 0 && $type != JeproshopCartModelCart::ONLY_DISCOUNTS) { return 0; } if ($type == JeproshopCartModelCart::ONLY_DISCOUNTS) { return $order_total_discount; } return JeproshopValidator::roundPrice((double) $order_total, 2); }
private function initPriceForm() { if ($this->context == null) { $this->context = JeproshopContext::getContext(); } if ($this->product->product_id) { $shops = JeproshopShopModelShop::getShops(); $countries = JeproshopCountryModelCountry::getStaticCountries($this->context->language->lang_id); $groups = JeproshopGroupModelGroup::getStaticGroups($this->context->language->lang_id); $currencies = JeproshopCurrencyModelCurrency::getStaticCurrencies(); $attributes = $this->product->getAttributesGroups((int) $this->context->language->lang_id); $combinations = array(); if (count($attributes)) { foreach ($attributes as $attribute) { $combinations[$attribute->product_attribute_id] = new JObject(); $combinations[$attribute->product_attribute_id]->product_attribute_id = $attribute->product_attribute_id; if (!isset($combinations[$attribute->product_attribute_id]->attributes)) { $combinations[$attribute->product_attribute_id]->attributes = ''; } if (isset($combinations[$attribute->product_attribute_id])) { $combinations[$attribute->product_attribute_id]->attributes .= $attribute->attribute_name . ' - '; $combinations[$attribute->product_attribute_id]->price = JeproshopTools::displayPrice(JeproshopTools::convertPrice(JeproshopProductModelProduct::getStaticPrice((int) $this->product->product_id, false, $attribute->product_attribute_id), $this->context->currency), $this->context->currency); } } foreach ($combinations as $combination) { if (isset($combination->attributes)) { $combination->attributes = rtrim($combination->attributes, ' - '); } } } $specificPriceModificationForm = $this->displaySpecificPriceModificationForm($this->context->currency, $shops, $currencies, $countries, $groups); $this->assignRef('specific_price_modification_form', $specificPriceModificationForm); $this->assignRef('ecotax_tax_excluded', $this->product->ecotax); //$this->applyTaxToEcotax(); $this->assignRef('shops', $shops); /*$admin_one_shop = count($this->context->employee->getAssociatedShops()) == 1; $this->assignRef('admin_one_shop', $admin_one_shop); */ $this->assignRef('currencies', $currencies); $this->assignRef('currency', $this->context->currency); $this->assignRef('countries', $countries); $this->assignRef('groups', $groups); $this->assignRef('combinations', $combinations); $multiShop = JeproshopShopModelShop::isFeaturePublished(); $this->assignRef('multi_shop', $multiShop); } else { JError::raiseWarnig(JText::_('COM_JEPROSHOP_YOU_MUST_SAVE_THIS_PRODUCT_BEFORE_ADDING_SPECIFIC_PRICING_MESSAGE')); $this->product->tax_rules_group_id = JeproshopProductModelProduct::getTaxRulesMostUsedGroupId(); $this->assignRef('ecotax_tax_excluded', 0); } $use_tax = JeproshopSettingModelSetting::getValue('use_tax'); $this->assignRef('use_tax', $use_tax); $use_ecotax = JeproshopSettingModelSetting::getValue('use_eco_tax'); $this->assignRef('use_ecotax', $use_ecotax); $tax_rules_groups = JeproshopTaxRulesGroupModelTaxRulesGroup::getTaxRulesGroups(true); $this->assignRef('tax_rules_groups', $tax_rules_groups); $taxesRatesByGroup = JeproshopTaxRulesGroupModelTaxRulesGroup::getAssociatedTaxRatesByCountryId($this->context->country->country_id); $this->assignRef('taxesRatesByGroup', $taxesRatesByGroup); $ecotaxTaxRate = JeproshopTaxModelTax::getProductEcotaxRate(); $this->assignRef('ecotaxTaxRate', $ecotaxTaxRate); $tax_exclude_tax_option = JeproshopTaxModelTax::taxExcludedOption(); $this->assignRef('tax_exclude_tax_option', $tax_exclude_tax_option); $this->product->price = JeproshopTools::convertPrice($this->product->price, $this->context->currency, true, $this->context); if ($this->product->unit_price_ratio != 0) { $unit_price = JeproshopTools::roundPrice($this->product->price / $this->product->unit_price_ratio, 2); } else { $unit_price = 0; } $this->assignRef('unit_price', $unit_price); }
public function __construct($product_id = NULL, $full = FALSE, $lang_id = NULL, $shop_id = NULL, JeproshopContext $context = NULL) { $db = JFactory::getDBO(); if ($lang_id !== NULL) { $this->lang_id = JeproshopLanguageModelLanguage::getLanguage($lang_id) ? (int) $lang_id : JeproshopSettingModelSetting::getValue('default_lang'); } if ($shop_id && $this->isMultiShop()) { $this->shop_id = (int) $shop_id; $this->getShopFromContext = FALSE; } if ($this->isMultiShop() && !$this->shop_id) { $this->shop_id = JeproshopContext::getContext()->shop->shop_id; } if ($product_id) { $cache_id = 'jeproshop_product_model_' . $product_id . '_' . $lang_id . '_' . $shop_id; if (!JeproshopCache::isStored($cache_id)) { $query = "SELECT * FROM " . $db->quoteName('#__jeproshop_product') . " AS product "; $where = ""; /** get language information **/ if ($lang_id) { $query .= "LEFT JOIN " . $db->quoteName('#__jeproshop_product_lang') . " AS product_lang ON (product.product_id = product_lang.product_id AND product_lang.lang_id = " . (int) $lang_id . ") "; if ($this->shop_id && !empty($this->multiLangShop)) { $where = " AND product_lang.shop_id = " . $this->shop_id; } } /** Get shop informations **/ if (JeproshopShopModelShop::isTableAssociated('product')) { $query .= " LEFT JOIN " . $db->quoteName('#__jeproshop_product_shop') . " AS product_shop ON ("; $query .= "product.product_id = product_shop.product_id AND product_shop.shop_id = " . (int) $this->shop_id . ")"; } $query .= " WHERE product.product_id = " . (int) $product_id . $where; $db->setQuery($query); $product_data = $db->loadObject(); if ($product_data) { if (!$lang_id && isset($this->multiLang) && $this->multiLang) { $query = "SELECT * FROM " . $db->quoteName('#__jeproshop_product_lang'); $query .= " WHERE product_id = " . (int) $product_id; $db->setQuery($query); $product_lang_data = $db->loadObjectList(); if ($product_lang_data) { foreach ($product_lang_data as $row) { foreach ($row as $key => $value) { if (array_key_exists($key, $this) && $key != 'product_id') { if (!isset($product_data->{$key}) || !is_array($product_data->{$key})) { $product_data->{$key} = array(); } $product_data->{$key}[$row->lang_id] = $value; } } } } } JeproshopCache::store($cache_id, $product_data); } } else { $product_data = JeproshopCache::retrieve($cache_id); } if ($product_data) { $product_data->product_id = $product_id; foreach ($product_data as $key => $value) { if (array_key_exists($key, $this)) { $this->{$key} = $value; } } } } if (!$context) { $context = JeproshopContext::getContext(); } if ($full && $this->product_id) { $this->isFullyLoaded = $full; $this->manufacturer_name = JeproshopManufacturerModelManufacturer::getNameById((int) $this->manufacturer_id); $this->supplier_name = JeproshopSupplierModelSupplier::getNameById((int) $this->supplier_id); if ($this->getType() == self::VIRTUAL_PRODUCT) { $this->developer_name = JeproshopDeveloperModelDeveloper::getNameById((int) $this->developer_id); } $address = NULL; if (is_object($context->cart) && $context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')} != null) { $address = $context->cart->{JeproshopSettingModelSetting::getValue('tax_address_type')}; } $this->tax_rate = $this->getTaxesRate(new JeproshopAddressModelAddress($address)); $this->is_new = $this->isNew(); $this->base_price = $this->price; $this->price = JeproshopProductModelProduct::getStaticPrice((int) $this->product_id, false, null, 6, null, false, true, 1, false, null, null, null, $this->specific_price); $this->unit_price = $this->unit_price_ratio != 0 ? $this->price / $this->unit_price_ratio : 0; if ($this->product_id) { $this->tags = JeproshopTagModelTag::getProductTags((int) $this->product_id); } $this->loadStockData(); } if ($this->default_category_id) { $this->category = JeproshopCategoryModelCategory::getLinkRewrite((int) $this->default_category_id, (int) $lang_id); } }
/** * Create a link to a product * * @param mixed $product Product object (can be an ID product, but deprecated) * @param string $alias * @param string $category * @param string $ean13 * @param null $lang_id * @param null $shop_id * @param int $product_attribute_id ID product attribute * @param bool $force_routes * @throws JException * @internal param int $id_lang * @internal param int $id_shop (since 1.5.0) ID shop need to be used when we generate a product link for a product in a cart * @return string */ public function getProductLink($product, $alias = null, $category = null, $ean13 = null, $lang_id = null, $shop_id = null, $product_attribute_id = 0, $force_routes = false) { if (!$lang_id) { $lang_id = JeproshopContext::getContext()->language->lang_id; } if (!is_object($product)) { if (is_array($product) && isset($product['product_id'])) { $product = new JeproshopProductModelProduct($product['product_id'], false, $lang_id, $shop_id); } elseif ((int) $product) { $product = new JeproshopProductModelProduct((int) $product, false, $lang_id, $shop_id); } else { throw new JException(JText::_('COM_JEPROSHOP_INVALID_PRODUCT_VARS_MESSAGE')); } } // Set available keywords $anchor = '&task=view&product_id=' . $product->product_id . (!$alias ? '&rewrite=' . $product->getFieldByLang('link_rewrite') : $alias) . (!$ean13 ? '&ean13=' . $product->ean13 : $ean13); $anchor .= '&meta_keywords=' . JeproshopTools::str2url($product->getFieldByLang('meta_keywords')) . '&meta_title=' . JeproshopTools::str2url($product->getFieldByLang('meta_title')); if ($this->hasKeyword('product', $lang_id, 'manufacturer', $shop_id)) { $params['manufacturer'] = JeproshopTools::str2url($product->isFullyLoaded ? $product->manufacturer_name : JeproshopManufacturerModelManufacturer::getNameById($product->manufacturer_id)); } if ($this->hasKeyword('product', $lang_id, 'supplier', $shop_id)) { $params['supplier'] = JeproshopTools::str2url($product->isFullyLoaded ? $product->supplier_name : JeproshopSupplierModelSupplier::getNameById($product->supplier_id)); } if ($this->hasKeyword('product', $lang_id, 'price', $shop_id)) { $params['price'] = $product->isFullyLoaded ? $product->price : JeproshopProductModelProduct::getStaticPrice($product->product_id, false, null, 6, null, false, true, 1, false, null, null, null, $product->specific_price); } if ($this->hasKeyword('product', $lang_id, 'tags', $shop_id)) { $params['tags'] = JeproshopTools::str2url($product->getTags($lang_id)); } if ($this->hasKeyword('product', $lang_id, 'category', $shop_id)) { $params['category'] = !is_null($product->category) && !empty($product->category) ? JeproshopTools::str2url($product->category) : JeproshopTools::str2url($category); } if ($this->hasKeyword('product', $lang_id, 'reference', $shop_id)) { $params['reference'] = JeproshopTools::str2url($product->reference); } if ($this->hasKeyword('product', $lang_id, 'categories', $shop_id)) { $params['category'] = !$category ? $product->category : $category; $cats = array(); foreach ($product->getParentCategories() as $cat) { if (!in_array($cat->category_id, Link::$category_disable_rewrite)) { //remove root and home category from the URL $cats[] = $cat->link_rewrite; } } $params['categories'] = implode('/', $cats); } $anchor .= $product_attribute_id ? '&product_attribute_id=' . $product_attribute_id : ''; return JRoute::_('index.php?option=com_jeproshop&view=product' . $anchor); }