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]; }
private function initQuantitiesForm() { if (!$this->context->controller->default_form_language) { $this->languages = $this->context->controller->getLanguages(); } if ($this->product->product_id) { if ($this->product_exists_in_shop) { //Get all product_attribute_id $attributes = $this->product->getAttributesResume($this->context->language->lang_id); if (empty($attributes)) { $attributes[] = new JObject(); $attributes[0]->set('product_attribute_id', 0); $attributes[0]->set('attribute_designation', ''); } /** get available quantities **/ $available_quantity = array(); $product_designation = array(); foreach ($attributes as $attribute) { $product_attribute_id = is_object($attribute) ? $attribute->product_attribute_id : $attribute['product_attribute_id']; $attribute_designation = is_object($attribute) ? $attribute->attribute_designation : $attribute['attribute_designation']; // Get available quantity for the current product attribute in the current shop $available_quantity[$product_attribute_id] = JeproshopStockAvailableModelStockAvailable::getQuantityAvailableByProduct((int) $this->product->product_id, $product_attribute_id); // Get all product designation $product_designation[$product_attribute_id] = rtrim($this->product->name[$this->context->language->lang_id] . ' - ' . $attribute_designation, ' - '); } $show_quantities = true; $shop_context = JeproshopShopModelShop::getShopContext(); $shop_group = new JeproshopShopGroupModelShopGroup((int) JeproshopShopModelShop::getContextShopGroupID()); // if we are in all shops context, it's not possible to manage quantities at this level if (JeproshopShopModelShop::isFeaturePublished() && $shop_context == JeproshopShopModelShop::CONTEXT_ALL) { $show_quantities = false; // if we are in group shop context } elseif (JeproshopShopModelShop::isFeaturePublished() && $shop_context == JeproshopShopModelShop::CONTEXT_GROUP) { // if quantities are not shared between shops of the group, it's not possible to manage them at group level if (!$shop_group->share_stock) { $show_quantities = false; } } else { // if we are in shop context // if quantities are shared between shops of the group, it's not possible to manage them for a given shop if ($shop_group->share_stock) { $show_quantities = false; } } $stock_management = JeproshopSettingModelSetting::getValue('stock_management'); $this->assignRef('stock_management', $stock_management); $has_attribute = $this->product->hasAttributes(); $this->assignRef('has_attribute', $has_attribute); // Check if product has combination, to display the available date only for the product or for each combination $db = JFactory::getDBO(); if (JeproshopCombinationModelCombination::isFeaturePublished()) { $query = "SELECT COUNT(product_id) FROM " . $db->quoteName('#__jeproshop_product_attribute') . " WHERE "; $query .= " product_id = " . (int) $this->product->product_id; $db->setQuery($query); $countAttributes = (int) $db->loadResult(); } else { $countAttributes = false; } $this->assignRef('count_attributes', $countAttributes); // if advanced stock management is active, checks associations $advanced_stock_management_warning = false; if (JeproshopSettingModelSetting::getValue('advanced_stock_management') && $this->product->advanced_stock_management) { $product_attributes = JeproshopProductModelProduct::getProductAttributesIds($this->product->product_id); $warehouses = array(); if (!$product_attributes) { $warehouses[] = JeproshopWarehouseModelWarehouse::getProductWarehouseList($this->product->product_id, 0); } foreach ($product_attributes as $product_attribute) { $ws = JeproshopWarehouseModelWarehouse::getProductWarehouseList($this->product->product_id, $product_attribute->product_attribute_id); if ($ws) { $warehouses[] = $ws; } } $warehouses = JeproshopTools::arrayUnique($warehouses); if (empty($warehouses)) { $advanced_stock_management_warning = true; } } if ($advanced_stock_management_warning) { JError::raiseWarning(500, JText::_('If you wish to use the advanced stock management, you must:')); JError::raiseWarning(500, '- ' . JText::_('associate your products with warehouses.')); JError::raiseWarning(500, '- ' . JText::_('associate your warehouses with carriers.')); JError::raiseWarning(500, '- ' . JText::_('associate your warehouses with the appropriate shops.')); } $pack_quantity = null; // if product is a pack if (JeproshopProductPack::isPack($this->product->product_id)) { $items = JeproshopProductPack::getItems((int) $this->product->product_id, JeproshopSettingModelSetting::getValue('default_lang')); // gets an array of quantities (quantity for the product / quantity in pack) $pack_quantities = array(); foreach ($items as $item) { if (!$item->isAvailableWhenOutOfStock((int) $item->out_of_stock)) { $pack_id_product_attribute = JeproshopProductModelProduct::getDefaultAttribute($item->product_id, 1); $pack_quantities[] = JeproshopProductModelProduct::getQuantity($item->id, $pack_id_product_attribute) / ($item->pack_quantity !== 0 ? $item->pack_quantity : 1); } } // gets the minimum if (count($pack_quantities)) { $pack_quantity = $pack_quantities[0]; foreach ($pack_quantities as $value) { if ($pack_quantity > $value) { $pack_quantity = $value; } } } if (!JeproshopWarehouseModelWarehouse::getPackWarehouses((int) $this->product->product_id)) { $this->displayWarning($this->l('You must have a common warehouse between this pack and its product.')); } } $this->assignRef('attributes', $attributes); $this->assignRef('available_quantity', $available_quantity); $this->assignRef('pack_quantity', $pack_quantity); $stock_management_active = JeproshopSettingModelSetting::getValue('advanced_stock_management'); $this->assignRef('stock_management_active', $stock_management_active); $this->assignRef('product_designation', $product_designation); $this->assignRef('show_quantities', $show_quantities); $order_out_of_stock = JeproshopSettingModelSetting::getValue('allow_out_of_stock_ordering'); $this->assignRef('order_out_of_stock', $order_out_of_stock); /*'token_preferences' => Tools::getAdminTokenLite('AdminPPreferences'), 'token' => $this->token, 'languages' => $this->_languages, 'id_lang' => $this->context->language->id ));*/ } else { JError::raiseWarning(500, JText::_('You must save the product in this shop before managing quantities.')); } } else { JError::raiseWarning(500, JText::_('You must save this product before managing quantities.')); } }