public function getFrontFeatures($id_lang) { return Product::getFrontFeaturesStatic($id_lang, $this->id); }
public static function getProductProperties($id_lang, $row) { if (!$row['id_product']) { return false; } // 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_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if ((!isset($row['id_product_attribute']) or !$row['id_product_attribute']) and (isset($row['cache_default_attribute']) and ($ipa_default = $row['cache_default_attribute']) !== NULL or $ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp']))) { $row['id_product_attribute'] = $ipa_default; } if (!isset($row['id_product_attribute'])) { $row['id_product_attribute'] = 0; } // Tax $usetax = Tax::excludeTaxeOption(); $cacheKey = $row['id_product'] . '-' . $row['id_product_attribute'] . '-' . $id_lang . '-' . (int) $usetax; if (array_key_exists($cacheKey, self::$producPropertiesCache)) { return self::$producPropertiesCache[$cacheKey]; } // Datas $link = new Link(); $row['category'] = Category::getLinkRewrite((int) $row['id_category_default'], (int) $id_lang); $row['link'] = $link->getProductLink((int) $row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); $row['attribute_price'] = (isset($row['id_product_attribute']) and $row['id_product_attribute']) ? (double) Product::getProductAttributePrice($row['id_product_attribute']) : 0; $row['price_tax_exc'] = Product::getPriceStatic((int) $row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, self::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6); if (self::$_taxCalculationMethod == PS_TAX_EXC) { $row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2); $row['price'] = Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 6); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 2, NULL, false, false); } else { $row['price'] = Tools::ps_round(Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 2), 2); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 6, NULL, false, false); } $row['reduction'] = Product::getPriceStatic((int) $row['id_product'], (bool) $usetax, (int) $row['id_product_attribute'], 6, NULL, true, true, 1, true, NULL, NULL, NULL, $specific_prices); $row['specific_prices'] = $specific_prices; if ($row['id_product_attribute']) { $row['quantity_all_versions'] = $row['quantity']; $row['quantity'] = Product::getQuantity((int) $row['id_product'], $row['id_product_attribute'], isset($row['cache_is_pack']) ? $row['cache_is_pack'] : NULL); } $row['id_image'] = Product::defineProductImage($row, $id_lang); $row['features'] = Product::getFrontFeaturesStatic((int) $id_lang, $row['id_product']); $row['attachments'] = (!isset($row['cache_has_attachments']) or $row['cache_has_attachments']) ? Product::getAttachmentsStatic((int) $id_lang, $row['id_product']) : array(); // Pack management $row['pack'] = !isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int) $row['cache_is_pack']; $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; if ($row['pack'] and !Pack::isInStock($row['id_product'])) { $row['quantity'] = 0; } self::$producPropertiesCache[$cacheKey] = $row; return self::$producPropertiesCache[$cacheKey]; }
public function process() { parent::process(); if (!($id_category = (int) Tools::getValue('id_category')) or !Validate::isUnsignedId($id_category)) { $this->errors[] = Tools::displayError('Missing category ID'); } else { if (!Validate::isLoadedObject($this->category)) { $this->errors[] = Tools::displayError('Category does not exist'); } elseif (!$this->category->checkAccess((int) self::$cookie->id_customer)) { $this->errors[] = Tools::displayError('You do not have access to this category.'); } elseif (!$this->category->active) { self::$smarty->assign('category', $this->category); } else { $rewrited_url = self::$link->getCategoryLink((int) $this->category->id, $this->category->link_rewrite); /* Scenes (could be externalised to another controler if you need them */ self::$smarty->assign('scenes', Scene::getScenes((int) $this->category->id, (int) self::$cookie->id_lang, true, false)); /* Scenes images formats */ if ($sceneImageTypes = ImageType::getImagesTypes('scenes')) { foreach ($sceneImageTypes as $sceneImageType) { if ($sceneImageType['name'] == 'thumb_scene') { $thumbSceneImageType = $sceneImageType; } elseif ($sceneImageType['name'] == 'large_scene') { $largeSceneImageType = $sceneImageType; } } self::$smarty->assign('thumbSceneImageType', isset($thumbSceneImageType) ? $thumbSceneImageType : NULL); self::$smarty->assign('largeSceneImageType', isset($largeSceneImageType) ? $largeSceneImageType : NULL); } $this->category->description = nl2br2($this->category->description); $subCategories = $this->category->getSubCategories((int) self::$cookie->id_lang); self::$smarty->assign('category', $this->category); if (Db::getInstance()->numRows()) { self::$smarty->assign('subcategories', $subCategories); self::$smarty->assign(array('subcategories_nb_total' => sizeof($subCategories), 'subcategories_nb_half' => ceil(sizeof($subCategories) / 2))); } if ($this->category->id != 1) { $nbProducts = $this->category->getProducts(NULL, NULL, NULL, $this->orderBy, $this->orderWay, true); $this->pagination((int) $nbProducts); self::$smarty->assign('nb_products', (int) $nbProducts); $cat_products = $this->category->getProducts((int) self::$cookie->id_lang, (int) $this->p, (int) $this->n, $this->orderBy, $this->orderWay); if ($cat_products) { foreach ($cat_products as $cat_product) { $prod_features[$cat_product["id_product"]] = Product::getFrontFeaturesStatic(self::$cookie->id_lang, $cat_product['id_product']); $aux_product = new Product($cat_product["id_product"], true, self::$cookie->id_lang); $aux_attributesGroups = $aux_product->getAttributesGroups((int) self::$cookie->id_lang); foreach ($aux_attributesGroups as $k => $row) { $aux_combinations[$row['attribute_name']]['price'] = (double) $row['price']; } $prod_combinations[$cat_product["id_product"]] = $aux_combinations; unset($aux_combinations); } } } if (isset($prod_features)) { self::$smarty->assign('prod_features', $prod_features); } if (isset($prod_combinations)) { self::$smarty->assign('prod_combinations', $prod_combinations); } self::$smarty->assign(array('products' => (isset($cat_products) and $cat_products) ? $cat_products : NULL, 'id_category' => (int) $this->category->id, 'id_category_parent' => (int) $this->category->id_parent, 'return_category_name' => Tools::safeOutput($this->category->name), 'path' => Tools::getPath((int) $this->category->id), 'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'), 'categorySize' => Image::getSize('category'), 'mediumSize' => Image::getSize('medium'), 'thumbSceneSize' => Image::getSize('thumb_scene'), 'homeSize' => Image::getSize('home'))); foreach ($subCategories as $subCat) { $secondLevelCats[$subCat["id_category"]] = $this->getSubCats($subCat["id_category"]); } if (isset($secondLevelCats)) { self::$smarty->assign('secondLevelCats', $secondLevelCats); } } } self::$smarty->assign(array('allow_oosp' => (int) Configuration::get('PS_ORDER_OUT_OF_STOCK'), 'comparator_max_item' => (int) Configuration::get('PS_COMPARATOR_MAX_ITEM'), 'suppliers' => Supplier::getSuppliers())); }
public function ajaxshowCalendar() { $id_lang = Context::getContext()->language->id; $id_shop = Tools::getValue('ids'); $shop = new AphStore($id_shop, Context::getContext()->language->id); $shop->hours = json_decode($shop->hours, true); $id_currency = Validate::isLoadedObject(Context::getContext()->currency) ? (int) Context::getContext()->currency->id : (int) Configuration::get('PS_CURRENCY_DEFAULT'); $context = Context::getContext(); $context->shop->id = $id_shop; $dates = array(); $dday = Tools::getValue('date'); for ($i = 2; $i > 0; $i--) { if (date('Y-m-d', strtotime('-' . $i . ' day', strtotime($dday))) >= date('Y-m-d')) { $dates[] = date('Y-m-d', strtotime('-' . $i . ' day', strtotime($dday))); } } $dates[] = $dday; for ($d = sizeof($dates), $i = 1; $d < 5; $d++, $i++) { $dates[] = date('Y-m-d', strtotime('+' . $i . ' day', strtotime($dday))); } $id_product = Tools::getValue('id_product'); $product = new Product($id_product, true, $id_lang, $id_shop); $product_need_tools = false; $product_need_employees = true; $service_duration = 0; $_features = Product::getFrontFeaturesStatic($id_lang, $id_product); foreach ($_features as &$feature) { if ($product->id_service_duration > 0 && $feature['id_feature'] == $product->id_service_duration) { $service_duration = (int) substr($feature['value'], 0, -1); } if ($product->id_service_duration < 1 && $feature['id_feature'] == Configuration::get('APH_FEATURE_DURATION')) { $service_duration = (int) substr($feature['value'], 0, -1); } if ($feature['id_feature'] == Configuration::get('APH_FEATURE_SERVICE_BY')) { if ((int) $feature['value'] == (int) Configuration::get('APH_FEATURE_SERVICE_BY_NO_EMPLOYEE')) { $product_need_employees = false; } } $service_duration = (int) substr($feature['value'], 0, -1); } $id_tool = 0; $necessary_quantity_of_tool = 0; $products_use_this_tool = array(); $tool = AphTool::getByShopAndProduct($id_shop, $id_product); if (!empty($tool)) { $id_tool = $tool[0]['id_tool']; $necessary_quantity_of_tool = $tool[0]['quantity']; $product_need_tools = true; $_products = AphTool::getProducts($id_tool); if (!empty($_products)) { foreach ($_products as &$_product) { $products_use_this_tool[] = $_product['id_product']; } } } $employees = array(); if ($product_need_employees) { $_employees = AphEmployeeProduct::getEmployeesByShopAndProduct($id_shop, $id_product); foreach ($_employees as &$employee) { $employees[] = $employee['id_employee']; } } $time_slice = (int) Configuration::get('APH_CALENDAR_TIME_SLICE_ONLINE'); if ($service_duration > $time_slice) { for ($t = 1; $t <= 4; $t++) { if ($time_slice * $t >= $service_duration) { $time_slice = $time_slice * $t; break; } } } /*$attributues_by_value = array(); $attributues = $product->getAttributesResume($id_lang, ': ', ', '); foreach ($attributues as &$attribute) { list($giorno, $orario) = explode(', ', $attribute['attribute_designation']); list(, $giorno) = explode(': ', $giorno); list(, $giorno) = explode(' ', $giorno); list(, $orario) = explode(': ', $orario); list(, $orario) = explode(' ', $orario); if (!array_key_exists($giorno, $attributues_by_value)) $attributues_by_value[$giorno] = array(); $attributues_by_value[$giorno][strval($orario)] = $attribute['id_product_attribute']; }*/ $first_day = $last_day = NULL; $days = array(); foreach ($dates as $day) { if (empty($first_day)) { $first_day = $day; } $last_day = $day; $days[$day] = array('date' => $day, 'date_ts' => strtotime($day), 'class' => 'store_opened', 'status' => 'opened', 'available' => true, 'price_from' => $product->price, 'times_tot' => 0, 'times_not_available' => 0, 'times_full' => 0, 'times' => array()); $days[$day]['date_lang'] = date('d/m/Y', $days[$day]['date_ts']); $days[$day]['week_day'] = date('w', $days[$day]['date_ts']); $days[$day]['week_day_lang'] = $this->week_days[(int) date('w', $days[$day]['date_ts'])]; $days[$day]['month_lang'] = $this->months[(int) date('w', $days[$day]['date_ts'])]; if (!empty($shop->hours[date('w', $days[$day]['date_ts'])])) { $hour_1 = $shop->hours[date('w', $days[$day]['date_ts'])][1]; $hour_2 = $shop->hours[date('w', $days[$day]['date_ts'])][2]; if ($hour_1['o'] == 'X' && $hour_1['c'] == 'X' && $hour_2['o'] == 'X' && $hour_2['c'] == 'X') { $days[$day]['status'] = 'closed'; $days[$day]['available'] = false; } else { $time_start = $hour_1['o'] == 'X' ? $hour_2['o'] : $hour_1['o']; $time_end = $hour_2['c'] == 'X' ? $hour_1['c'] : $hour_2['c']; $pause_start = $hour_1['c'] == 'X' ? false : $hour_1['c']; $pause_end = $hour_2['o'] == 'X' ? false : $hour_2['o']; } } else { $days[$day]['status'] = 'closed'; $days[$day]['available'] = false; } if (!empty($shop->rights_hasCalendar)) { if ($days[$day]['status'] == 'closed') { // apertura straordinaria $shop_availability = AphAvailability::getByDate($id_shop, 0, $day, 1); if (!empty($shop_availability)) { $days[$day]['status'] = 'opened'; $days[$day]['available'] = true; } } else { // chiusura straordinaria $shop_availability = AphAvailability::getByDate($id_shop, 0, $day, -1); if (!empty($shop_availability)) { $days[$day]['status'] = 'closed'; $days[$day]['available'] = false; } } if ($days[$day]['status'] == 'closed') { $days[$day]['class'] = 'store_closed'; $days[$day]['available'] = false; continue; } } // almeno un'offerta disponibile nel giorno $shop_offers = AphOffer::getByDate($id_shop, $id_product, $day, 1); if (!empty($shop_offers)) { $days[$day]['status'] = 'promoted'; $days[$day]['class'] = 'store_promoted'; } print_r($days[$day]['available']); if (!empty($days[$day]['available'])) { $times = array(); for ($hours = substr($time_start, 0, 2); $hours < substr($time_end, 0, 2); $hours++) { // the interval for hours is '1' for ($mins = 0; $mins < 60; $mins += $time_slice) { // the interval for mins is 'APH_CALENDAR_TIME_SLICE' $t = str_pad($hours, 2, '0', STR_PAD_LEFT) . ':' . str_pad($mins, 2, '0', STR_PAD_LEFT); // se sto valutanto l'orario nella pausa allora lo ignoro if (!empty($pause_start) && !empty($pause_end) && $t >= $pause_start && $t < $pause_end) { continue; } $times[$t] = array('time' => $t, 'available' => false, 'status' => 'available', 'class' => $days[$day]['class']); $times[$t]['from'] = $t; $time = new DateTime($day . ' ' . $times[$t]['from']); $time->add(new DateInterval('PT' . $service_duration . 'M')); $times[$t]['to'] = $time->format('H:i'); if ($times[$t]['to'] > $time_end) { $times[$t]['available'] = false; $times[$t]['status'] = 'available'; $times[$t]['class'] .= ' time_notavailable'; $days[$day]['times_not_available']++; } $days[$day]['times_tot']++; if (!empty($shop->rights_hasCalendar)) { $completed_orders = AphOrderDetail::getBetweenTimes($id_shop, 0, 0, $days[$day]['date_ts'], $times[$t]['from'], $times[$t]['to']); if ($product_need_tools && !empty($products_use_this_tool)) { $completed_orders_about_tool = AphOrderDetail::getBetweenTimes($id_shop, 0, $products_use_this_tool, $days[$day]['date_ts'], $times[$t]['from'], $times[$t]['to']); $t = AphTool::getByDate($id_tool, $available_date); $tool_is_availability = !empty($t) ? true : false; } else { $completed_orders_about_tool = array(); } $availabilies_of_shop = AphAvailability::getBetweenTimes($id_shop, 0, strtotime($day . ' ' . $times[$t]['from']), strtotime($day . ' ' . $times[$t]['to']), 1); $not_availabilies_of_shop = AphAvailability::getBetweenTimes($id_shop, 0, strtotime($day . ' ' . $times[$t]['from']), strtotime($day . ' ' . $times[$t]['to']), 0); if ($product_need_employees && empty($not_availabilies_of_shop)) { $working_employees = AphWorkingDay::getByEmployeeAndDateBetweenTimes($id_shop, $employees, $day, $times[$t]['from'], $times[$t]['to'], 1); $availabilies_of_employees = AphAvailability::getBetweenTimes($id_shop, $employees, strtotime($day . ' ' . $times[$t]['from']), strtotime($day . ' ' . $times[$t]['to']), 1); $not_availabilies_of_employees = AphAvailability::getBetweenTimes($id_shop, $employees, strtotime($day . ' ' . $times[$t]['from']), strtotime($day . ' ' . $times[$t]['to']), 0); } else { $working_employees = $availabilies_of_employees = $not_availabilies_of_employees = array(); } } // chiusura straordinaria if (!empty($not_availabilies_of_shop)) { $times[$t]['available'] = false; $times[$t]['status'] = 'closed'; $times[$t]['class'] .= ' time_closed'; $days[$day]['times_not_available']++; continue; } // slot di tempo esaurito per mancanza di dipendenti if ($product_need_employees && !empty($completed_orders) && !empty($working_employees) && sizeof($completed_orders) >= sizeof($working_employees) - sizeof($not_availabilies_of_employees)) { $times[$t]['available'] = false; $times[$t]['status'] = 'full'; $times[$t]['class'] .= ' time_full'; $days[$day]['times_full']++; continue; } // slot di tempo esaurito per mancanza di macchinari if ($product_need_tools && !$tool_is_availability || !empty($necessary_quantity_of_tool) && !empty($completed_orders_about_tool) && sizeof($completed_orders_about_tool) >= $necessary_quantity_of_tool) { $times[$t]['available'] = false; $times[$t]['status'] = 'full'; $times[$t]['class'] .= ' time_full'; $days[$day]['times_full']++; continue; } // apertura straordinaria (i macchinari sono sempre disponibili) if ($product_need_employees && !empty($availabilies_of_employees) && !empty($completed_orders) && !empty($availabilies_of_employees) && sizeof($completed_orders) >= sizeof($availabilies_of_employees) - sizeof($not_availabilies_of_employees)) { $times[$t]['available'] = false; $times[$t]['status'] = 'full'; $times[$t]['class'] .= ' time_full'; $days[$day]['times_full']++; continue; } $times[$t]['available'] = true; $times[$t]['status'] = 'available'; $times[$t]['class'] .= ' time_available'; if (!empty($times[$t]['available'])) { //error_log(var_export(__LINE__,true)); //$price = Product::getPriceStatic($id_product, true, 0, 2, null, false, true, 1, false, null, null, null, $specific_price, true, true, $context, true, $day, $times[$t]['from'], $times[$t]['to']); //$times[$t]['price'] = $price; $times[$t]['price'] = 0; $times[$t]['price_label'] = Tools::displayPrice($times[$t]['price'], $id_currency); if ($times[$t]['price'] < $days[$day]['price_from']) { $days[$day]['price_from'] = $times[$t]['price']; } } } } $days[$day]['times'] = $times; $days[$day]['price_from_label'] = Tools::displayPrice($days[$day]['price_from'], $id_currency); if ($days[$day]['times_full'] == $days[$day]['times']) { $days[$day]['available'] = false; $days[$day]['status'] = 'full'; $days[$day]['class'] = 'store_full'; } elseif ($days[$day]['times_not_available'] == $days[$day]['times']) { $days[$day]['available'] = false; $days[$day]['status'] = 'closed'; $days[$day]['class'] = 'store_closed'; } } } $jsVars = array(); $jsVars['calendar_params'] = array('ajax' => 1, 'ajaxCall' => 'ajaxshowCalendar', 'id_product' => $id_product, 'ids' => $id_shop, 'date' => $dday, 'id_city' => empty($id_city) ? $shop->id_city : $id_city); $this->context->smarty->assign(array('days' => $days, 'dday' => $dday, 'first_day' => $days[$first_day], 'last_day' => $days[$last_day], 'jsVars' => $jsVars)); // $jsVars = array( // 'language' => $this->context->language->iso_code, // 'slotDuration' => '00:'.Configuration::get('APH_CALENDAR_TIME_SLICE').':00' // ); // $this->content .= '<script>var admin_aphcalendar = '.json_encode($jsVars).';</script>'; return $this->display(__FILE__, 'availability_calendar.tpl', $this->getCacheId('blockmobilecart-column')); }
public static function getProductProperties($id_lang, $row) { if (!$row['id_product']) { return false; } $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if ((!isset($row['id_product_attribute']) or !$row['id_product_attribute']) and $ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp'])) { $row['id_product_attribute'] = $ipa_default; } if (!isset($row['id_product_attribute'])) { $row['id_product_attribute'] = 0; } // Tax $usetax = true; $tax = floatval(Tax::getApplicableTax(intval($row['id_tax']), floatval($row['rate']))); if (Tax::excludeTaxeOption() or !$tax) { $usetax = false; } $cacheKey = $row['id_product'] . '-' . $row['id_product_attribute'] . '-' . $id_lang . '-' . intval($usetax); if (array_key_exists($cacheKey, self::$producPropertiesCache)) { return self::$producPropertiesCache[$cacheKey]; } // Datas $link = new Link(); $row['category'] = Category::getLinkRewrite($row['id_category_default'], intval($id_lang)); $row['link'] = $link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); $row['attribute_price'] = (isset($row['id_product_attribute']) and $row['id_product_attribute']) ? floatval(Product::getProductAttributePrice($row['id_product_attribute'])) : 0; $row['price_tax_exc'] = Product::getPriceStatic($row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 6); if (self::$_taxCalculationMethod == PS_TAX_EXC) { $row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2); $row['price'] = Product::getPriceStatic($row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 6); } else { $row['price'] = Tools::ps_round(Product::getPriceStatic($row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 6), 2); } $row['reduction'] = self::getReductionValue($row['reduction_price'], $row['reduction_percent'], $row['reduction_from'], $row['reduction_to'], $row['price'], $usetax, floatval($row['rate'])); $row['price_without_reduction'] = Product::getPriceStatic($row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 6, NULL, false, false); $row['quantity'] = Product::getQuantity($row['id_product']); $row['id_image'] = Product::defineProductImage($row); $row['features'] = Product::getFrontFeaturesStatic(intval($id_lang), $row['id_product']); $row['attachments'] = Product::getAttachmentsStatic(intval($id_lang), $row['id_product']); $row['pack'] = Pack::isPack($row['id_product']); $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; self::$producPropertiesCache[$cacheKey] = $row; return self::$producPropertiesCache[$cacheKey]; }
public static function getProductProperties($id_lang, $row, Context $context = null) { if (!$row['id_product']) { return false; } if ($context == null) { $context = Context::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_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if (Combination::isFeatureActive() && (!isset($row['id_product_attribute']) || !$row['id_product_attribute']) && (isset($row['cache_default_attribute']) && ($ipa_default = $row['cache_default_attribute']) !== null || ($ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp'])))) { $row['id_product_attribute'] = $ipa_default; } if (!Combination::isFeatureActive() || !isset($row['id_product_attribute'])) { $row['id_product_attribute'] = 0; } // Tax $usetax = Tax::excludeTaxeOption(); $cache_key = $row['id_product'] . '-' . $row['id_product_attribute'] . '-' . $id_lang . '-' . (int) $usetax; if (isset($row['id_product_pack'])) { $cache_key .= '-pack' . $row['id_product_pack']; } if (isset(self::$cacheProducProperties[$cache_key])) { return array_merge($row, self::$cacheProducProperties[$cache_key]); } // Datas $row['category'] = Category::getLinkRewrite((int) $row['id_category_default'], (int) $id_lang); $row['link'] = $context->link->getProductLink((int) $row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); $row['attribute_price'] = 0; if (isset($row['id_product_attribute']) && $row['id_product_attribute']) { $row['attribute_price'] = (double) Product::getProductAttributePrice($row['id_product_attribute']); } $row['price_tax_exc'] = Product::getPriceStatic((int) $row['id_product'], false, isset($row['id_product_attribute']) && !empty($row['id_product_attribute']) ? (int) $row['id_product_attribute'] : null, self::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6); if (self::$_taxCalculationMethod == PS_TAX_EXC) { $row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2); $row['price'] = Product::getPriceStatic((int) $row['id_product'], true, isset($row['id_product_attribute']) && !empty($row['id_product_attribute']) ? (int) $row['id_product_attribute'] : null, 6); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], false, isset($row['id_product_attribute']) && !empty($row['id_product_attribute']) ? (int) $row['id_product_attribute'] : null, 2, null, false, false); } else { $row['price'] = Tools::ps_round(Product::getPriceStatic((int) $row['id_product'], true, isset($row['id_product_attribute']) && !empty($row['id_product_attribute']) ? (int) $row['id_product_attribute'] : null, 2), 2); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], true, isset($row['id_product_attribute']) && !empty($row['id_product_attribute']) ? (int) $row['id_product_attribute'] : null, 6, null, false, false); } $row['reduction'] = Product::getPriceStatic((int) $row['id_product'], (bool) $usetax, (int) $row['id_product_attribute'], 6, null, true, true, 1, true, null, null, null, $specific_prices); $row['specific_prices'] = $specific_prices; $row['quantity'] = Product::getQuantity((int) $row['id_product'], 0, isset($row['cache_is_pack']) ? $row['cache_is_pack'] : null); $row['quantity_all_versions'] = $row['quantity']; if ($row['id_product_attribute']) { $row['quantity'] = Product::getQuantity((int) $row['id_product'], $row['id_product_attribute'], isset($row['cache_is_pack']) ? $row['cache_is_pack'] : null); } $row['id_image'] = Product::defineProductImage($row, $id_lang); $row['features'] = Product::getFrontFeaturesStatic((int) $id_lang, $row['id_product']); $row['attachments'] = array(); if (!isset($row['cache_has_attachments']) || $row['cache_has_attachments']) { $row['attachments'] = Product::getAttachmentsStatic((int) $id_lang, $row['id_product']); } $row['virtual'] = !isset($row['is_virtual']) || $row['is_virtual'] ? 1 : 0; // Pack management $row['pack'] = !isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int) $row['cache_is_pack']; $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; if ($row['pack'] && !Pack::isInStock($row['id_product'])) { $row['quantity'] = 0; } $row['customization_required'] = false; if (isset($row['customizable']) && $row['customizable'] && Customization::isFeatureActive()) { if (count(Product::getRequiredCustomizableFieldsStatic((int) $row['id_product']))) { $row['customization_required'] = true; } } $row = Product::getTaxesInformations($row, $context); self::$cacheProducProperties[$cache_key] = $row; return self::$cacheProducProperties[$cache_key]; }
/** * Get product meta tags * * @since 1.5.0 * @param int $id_product * @param int $id_lang * @param string $page_name * @return array */ public static function getProductMetas($id_product, $id_lang, $page_name) { $sql = 'SELECT `name`, `meta_title`, `meta_description`, `meta_keywords`, `reference`, `description_short` FROM `' . _DB_PREFIX_ . 'product` p LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ON (pl.`id_product` = p.`id_product`' . Shop::addSqlRestrictionOnLang('pl') . ') ' . Shop::addSqlAssociation('product', 'p') . ' WHERE pl.id_lang = ' . (int) $id_lang . ' AND pl.id_product = ' . (int) $id_product . ' AND product_shop.active = 1'; if ($row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql)) { $features = Product::getFrontFeaturesStatic($id_lang, $id_product); foreach ($features as $feature) { switch ($feature['id_feature']) { case '17': $color = mb_convert_case($feature["value"], MB_CASE_LOWER); break; case '16': $material = mb_convert_case($feature["value"], MB_CASE_LOWER); break; case '20': $design = $feature["value"]; break; } } $price = Product::getPriceStatic($id_product, true, null, 6); if (Product::$_taxCalculationMethod == PS_TAX_INC) { $price = Tools::ps_round($price, 2); } if (empty($row['meta_description'])) { $row['meta_description'] = $row['name'] . ". Материал {$material}. Цвет {$color}. Артикул " . $row['reference'] . ". Цена " . $price . " руб."; } if (empty($row['meta_title'])) { $row['meta_title'] = $row['name'] . ": цвет {$color}, {$material}, {$design} - артикул " . $row['reference']; } return Meta::completeMetaTags($row, $row['name']); } return Meta::getHomeMetas($id_lang, $page_name); }
public static function getProductProperties($id_lang, $row) { if (!$row['id_product']) { return false; } // 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_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if ((!isset($row['id_product_attribute']) or !$row['id_product_attribute']) and (isset($row['cache_default_attribute']) and ($ipa_default = $row['cache_default_attribute']) !== NULL or $ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp']))) { $row['id_product_attribute'] = $ipa_default; } if (!isset($row['id_product_attribute'])) { $row['id_product_attribute'] = 0; } // Tax $usetax = Tax::excludeTaxeOption(); $cacheKey = $row['id_product'] . '-' . $row['id_product_attribute'] . '-' . $id_lang . '-' . (int) $usetax; if (array_key_exists($cacheKey, self::$producPropertiesCache)) { return self::$producPropertiesCache[$cacheKey]; } // Datas $row['category'] = Category::getLinkRewrite((int) $row['id_category_default'], (int) $id_lang); if (!preg_match("/^1.3.*/", _PS_VERSION_)) { // Not available in Prestashop 1.3.x $row['reduction'] = Product::getPriceStatic((int) $row['id_product'], (bool) $usetax, (int) $row['id_product_attribute'], 6, NULL, true, true, 1, true, NULL, NULL, NULL, $specific_prices); $row['specific_prices'] = $specific_prices; } if ($row['id_product_attribute']) { $row['quantity_all_versions'] = $row['quantity']; $row['quantity'] = Product::getQuantity((int) $row['id_product'], $row['id_product_attribute'], isset($row['cache_is_pack']) ? $row['cache_is_pack'] : NULL); } $row['id_image'] = Product::defineProductImage($row, $id_lang); $row['features'] = Product::getFrontFeaturesStatic((int) $id_lang, $row['id_product']); // Pack management $row['pack'] = !isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int) $row['cache_is_pack']; $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; if ($row['pack'] and !Pack::isInStock($row['id_product'])) { $row['quantity'] = 0; } $sql_combination = ' SELECT pa.id_product_attribute, pa.price, pa.quantity, pa.id_product FROM `' . _DB_PREFIX_ . 'product` p LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute` pa ON (p.`id_product` = pa.`id_product`) WHERE p.`id_product` =' . $row['id_product']; $result_combination = ProductExtended::getDbInstance()->ExecuteS($sql_combination); $row['combinations'] = array(); if ($result_combination) { foreach ($result_combination as $combination) { $combination['attributes'] = array(); /* New combinations system Prestashop 1.5.x */ if (!preg_match("/^1.(3|4).*/", _PS_VERSION_)) { $combination['quantity'] = StockAvailable::getQuantityAvailableByProduct($row['id_product'], $combination['id_product_attribute']); } if (isset($combination['id_product_attribute'])) { $sql_attribute = ' SELECT pa.id_product_attribute, agl.id_attribute_group, al.name as name_value, agl.name as name_option FROM `' . _DB_PREFIX_ . 'product_attribute` pa LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute_combination` pac ON (pac.`id_product_attribute` = pa.`id_product_attribute`) LEFT JOIN `' . _DB_PREFIX_ . 'attribute` a ON (a.`id_attribute` = pac.`id_attribute`) LEFT JOIN `' . _DB_PREFIX_ . 'attribute_lang` al ON (al.`id_attribute` = a.`id_attribute` AND al.`id_lang` = ' . $id_lang . ') LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group` ag ON (ag.`id_attribute_group` = a.`id_attribute_group`) LEFT JOIN `' . _DB_PREFIX_ . 'attribute_group_lang` agl ON (agl.`id_attribute_group` = ag.`id_attribute_group` AND agl.`id_lang` = ' . $id_lang . ') WHERE pa.`id_product_attribute` =' . $combination['id_product_attribute']; $result_attribute = ProductExtended::getDbInstance()->ExecuteS($sql_attribute); if ($result_attribute) { foreach ($result_attribute as $attribute) { array_push($combination['attributes'], $attribute); } } array_push($row['combinations'], $combination); } } } $sql_image = ' SELECT DISTINCT i.*, pl.link_rewrite FROM `' . _DB_PREFIX_ . 'product` p LEFT JOIN `' . _DB_PREFIX_ . 'image` i ON (p.`id_product` = i.`id_product`) LEFT JOIN `' . _DB_PREFIX_ . 'product_lang` pl ON (p.`id_product` = pl.`id_product`) WHERE p.`id_product` =' . $row['id_product']; $result_image = ProductExtended::getDbInstance()->ExecuteS($sql_image); $row['images'] = array(); $lang = new Language($id_lang); $row['url_locale'] = $lang->iso_code; if ($result_image) { $link = preg_match("/^1.(3|4).*/", _PS_VERSION_) ? new Link() : Context::getContext()->link; foreach ($result_image as $image) { if (!preg_match("/^1.3.*/", _PS_VERSION_)) { // Image URL gives relative version using 1.3.x- $image['image_url'] = $link->getImageLink($image['link_rewrite'], $image['id_product'] . '-' . $image['id_image']); } array_push($row['images'], $image); } } self::$producPropertiesCache[$cacheKey] = $row; return self::$producPropertiesCache[$cacheKey]; }
public static function getProductProperties($id_lang, $row) { if (!$row['id_product']) { return false; } // 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_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if ((!isset($row['id_product_attribute']) or !$row['id_product_attribute']) and (isset($row['cache_default_attribute']) and ($ipa_default = $row['cache_default_attribute']) !== NULL or $ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp']))) { $row['id_product_attribute'] = $ipa_default; } if (!isset($row['id_product_attribute'])) { $row['id_product_attribute'] = 0; } // Tax $usetax = Tax::excludeTaxeOption(); $cacheKey = $row['id_product'] . '-' . $row['id_product_attribute'] . '-' . $id_lang . '-' . (int) $usetax; if (array_key_exists($cacheKey, self::$producPropertiesCache)) { return self::$producPropertiesCache[$cacheKey]; } // Datas mbj $link = new Link(); $row['category'] = Category::getLinkRewrite((int) $row['id_category_default'], (int) $id_lang); $row['link'] = $link->getProductLink((int) $row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); //usado link //init foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.* FROM `' . _DB_PREFIX_ . 'product` p INNER JOIN ' . _DB_PREFIX_ . 'product_lang pl ON p.id_product = pl.id_product WHERE p.id_product = ' . (int) $ro1w['supplier_reference']) as $subrow) { $row_us['id_category_default'] = $subrow['id_category_default']; $row_us['link_rewrite'] = $subrow['link_rewrite']; $row_us['ean13'] = $subrow['ean13']; } $row['category_used'] = Category::getLinkRewrite((int) $row_us['id_category_default'], (int) $id_lang); $row['link_used'] = $link->getProductLink((int) $row['supplier_reference'], $row_us['link_rewrite'], $row['category_used'], $row_us['ean13']); $row['link_extr'] = 'id::' . $row['id_product']; //precio mall - distribuidor - lista - internet foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT pa.price FROM `' . _DB_PREFIX_ . 'product_attribute` pa INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute WHERE pac.id_attribute = 25 and pa.id_product = ' . (int) $row['id_product']) as $subrow) { $row['price_distribuidor_p'] = round($subrow['price']); } foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT pa.price FROM `' . _DB_PREFIX_ . 'product_attribute` pa INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute WHERE pac.id_attribute = 24 and pa.id_product = ' . (int) $row['id_product']) as $subrow) { $row['price_distribuidor'] = round($subrow['price']); } foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT pa.price FROM `' . _DB_PREFIX_ . 'product_attribute` pa INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute WHERE pac.id_attribute = 23 and pa.id_product = ' . (int) $row['id_product']) as $subrow) { $row['price_tienda'] = round($subrow['price']); } foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT pa.price FROM `' . _DB_PREFIX_ . 'product_attribute` pa INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute WHERE pac.id_attribute = 22 and pa.id_product = ' . (int) $row['id_product']) as $subrow) { $row['price_mall'] = round($subrow['price']); } foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT pa.price FROM `' . _DB_PREFIX_ . 'product_attribute` pa INNER JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute WHERE pac.id_attribute = 21 and pa.id_product = ' . (int) $row['id_product']) as $subrow) { $row['price_internet'] = round($subrow['price']); } $row['attribute_price'] = (isset($row['id_product_attribute']) and $row['id_product_attribute']) ? (double) Product::getProductAttributePrice($row['id_product_attribute']) : 0; $row['price_tax_exc'] = Product::getPriceStatic((int) $row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, self::$_taxCalculationMethod == PS_TAX_EXC ? 2 : 6); if (self::$_taxCalculationMethod == PS_TAX_EXC) { $row['price_tax_exc'] = Tools::ps_round($row['price_tax_exc'], 2); $row['price'] = Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 6); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 2, NULL, false, false); } else { $row['price'] = Tools::ps_round(Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 2), 2); $row['price_without_reduction'] = Product::getPriceStatic((int) $row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? (int) $row['id_product_attribute'] : NULL, 6, NULL, false, false); } $row['reduction'] = Product::getPriceStatic((int) $row['id_product'], (bool) $usetax, (int) $row['id_product_attribute'], 6, NULL, true, true, 1, true, NULL, NULL, NULL, $specific_prices); $row['specific_prices'] = $specific_prices; if ($row['id_product_attribute']) { $row['quantity_all_versions'] = $row['quantity']; $row['quantity'] = Product::getQuantity((int) $row['id_product'], $row['id_product_attribute'], isset($row['cache_is_pack']) ? $row['cache_is_pack'] : NULL); } $row['id_image'] = Product::defineProductImage($row, $id_lang); $row['features'] = Product::getFrontFeaturesStatic((int) $id_lang, $row['id_product']); $row['attachments'] = (!isset($row['cache_has_attachments']) or $row['cache_has_attachments']) ? Product::getAttachmentsStatic((int) $id_lang, $row['id_product']) : array(); // Pack management $row['pack'] = !isset($row['cache_is_pack']) ? Pack::isPack($row['id_product']) : (int) $row['cache_is_pack']; $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; if ($row['pack'] and !Pack::isInStock($row['id_product'])) { $row['quantity'] = 0; } self::$producPropertiesCache[$cacheKey] = $row; return self::$producPropertiesCache[$cacheKey]; }
public function getProductByFilters($selectedFilters = array(), &$prod_features = array()) { global $cookie; $whereLikeFilter = $this->getSelectedFiltersByQ(); if (!$whereLikeFilter or $whereLikeFilter == '' or $whereLikeFilter == 0) { $whereLikeFilter = $_SESSION['search_q']; } $whereLikeFilter = str_replace("+", " ", $whereLikeFilter); //echo $whereLikeFilter; if (!empty($this->products)) { return $this->products; } /* If the current category isn't defined or if it's homepage, we have nothing to display */ $id_parent = (int) Tools::getValue('id_category', Tools::getValue('id_category_layered', 1)); if ($id_parent != 4012) { $whereLikeFilter = ''; } if ($id_parent == 4017) { $usado = true; } if ($id_parent == 1) { return false; } $queryFiltersWhere = ' AND p.active = 1'; $queryFiltersFrom = ''; foreach (Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT value FROM `' . _DB_PREFIX_ . 'configuration_lang` clan WHERE id_configuration = 46 and id_lang = 3 ') as $subrow) { $row_us['letters'] = $subrow['value']; } $tmp_lett = explode('|', $row_us['letters']); $descrypt_reg = ""; //echo var_dump($tmp_lett); $wLikeArr = explode(" ", ltrim(rtrim($whereLikeFilter))); if ($wLikeArr[0] != "") { $descrypt_reg = ' pl.description REGEXP "[[:<:]]' . $wLikeArr[0] . '[[:>:]]" '; if ($wLikeArr[1] != "") { $descrypt_reg .= ' AND pl.description REGEXP "[[:<:]]' . $wLikeArr[1] . '[[:>:]]" '; } if ($wLikeArr[2] != "") { $descrypt_reg .= ' AND pl.description REGEXP "[[:<:]]' . $wLikeArr[2] . '[[:>:]]" '; } if ($wLikeArr[3] != "") { $descrypt_reg .= ' AND pl.description REGEXP "[[:<:]]' . $wLikeArr[3] . '[[:>:]]" '; } } $parent = new Category((int) $id_parent); if (!count($selectedFilters['category'])) { if ($whereLikeFilter != '' || $usado === true) { $queryFiltersFrom .= ' INNER JOIN ' . _DB_PREFIX_ . 'category_product cp ON p.id_product = cp.id_product INNER JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category)'; } else { $queryFiltersFrom .= ' INNER JOIN ' . _DB_PREFIX_ . 'category_product cp ON p.id_product = cp.id_product INNER JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category AND c.nleft >= ' . (int) $parent->nleft . ' AND c.nright <= ' . (int) $parent->nright . ')'; } } foreach ($selectedFilters as $key => $filterValues) { if (!count($filterValues)) { continue; } preg_match('/^(.*[^_0-9])/', $key, $res); $key = $res[1]; switch ($key) { case 'id_feature': $subQueries = array(); foreach ($filterValues as $filterValue) { $filterValueArray = explode('_', $filterValue); if (!isset($subQueries[$filterValueArray[0]])) { $subQueries[$filterValueArray[0]] = array(); } $subQueries[$filterValueArray[0]][] = 'fp.`id_feature_value` = ' . (int) $filterValueArray[1]; } foreach ($subQueries as $subQuery) { $queryFiltersWhere .= ' AND p.id_product IN (SELECT `id_product` FROM `' . _DB_PREFIX_ . 'feature_product` fp WHERE '; $queryFiltersWhere .= implode(' OR ', $subQuery) . ') '; } break; case 'id_attribute_group': $subQueries = array(); foreach ($filterValues as $filterValue) { $filterValueArray = explode('_', $filterValue); if (!isset($subQueries[$filterValueArray[0]])) { $subQueries[$filterValueArray[0]] = array(); } $subQueries[$filterValueArray[0]][] = 'pac.`id_attribute` = ' . (int) $filterValueArray[1]; } foreach ($subQueries as $subQuery) { $queryFiltersWhere .= ' AND p.id_product IN (SELECT pa.`id_product` FROM `' . _DB_PREFIX_ . 'product_attribute_combination` pac LEFT JOIN `' . _DB_PREFIX_ . 'product_attribute` pa ON (pa.`id_product_attribute` = pac.`id_product_attribute`) WHERE '; $queryFiltersWhere .= implode(' OR ', $subQuery) . ') '; } break; case 'category': $queryFiltersWhere .= ' AND p.id_product IN (SELECT id_product FROM ' . _DB_PREFIX_ . 'category_product cp WHERE '; foreach ($selectedFilters['category'] as $id_category) { $queryFiltersWhere .= 'cp.`id_category` = ' . (int) $id_category . ' OR '; } $queryFiltersWhere = rtrim($queryFiltersWhere, 'OR ') . ')'; break; case 'quantity': if (count($selectedFilters['quantity']) == 2) { break; } $queryFiltersWhere .= ' AND p.quantity ' . (!$selectedFilters['quantity'][0] ? '=' : '>') . ' 0'; break; case 'manufacturer': $queryFiltersWhere .= ' AND p.id_manufacturer IN (' . implode($selectedFilters['manufacturer'], ',') . ')'; break; case 'condition': if (count($selectedFilters['condition']) == 3) { break; } $queryFiltersWhere .= ' AND p.condition IN ('; foreach ($selectedFilters['condition'] as $cond) { $queryFiltersWhere .= '\'' . $cond . '\','; } $queryFiltersWhere = rtrim($queryFiltersWhere, ',') . ')'; break; case 'weight': if ($selectedFilters['weight'][0] != 0 || $selectedFilters['weight'][1] != 0) { $queryFiltersWhere .= ' AND p.`weight` BETWEEN ' . (double) ($selectedFilters['weight'][0] - 0.001) . ' AND ' . (double) ($selectedFilters['weight'][1] + 0.001); } case 'price': if (isset($selectedFilters['price'])) { if ($selectedFilters['price'][0] != 0 || $selectedFilters['price'][1] != 0) { $priceFilter = array(); $priceFilter['min'] = (double) $selectedFilters['price'][0]; $priceFilter['max'] = (double) $selectedFilters['price'][1]; } } else { $priceFilter = false; } break; } } $Oway = ''; $Oby = ''; if (Tools::getProductsOrder('by', Tools::getValue('orderby'), true) == 'position' && Tools::getProductsOrder('way', Tools::getValue('orderway')) == 'asc') { $Oway = ''; $Oby = ''; } else { $Oway = Tools::getProductsOrder('way', Tools::getValue('orderway')); $Oby = Tools::getProductsOrder('by', Tools::getValue('orderby'), true); } $idCurrency = Currency::getCurrent()->id; $priceFilterQueryIn = ''; // All products with price range between price filters limits $priceFilterQueryOut = ''; // All products with a price filters limit on it price range if (isset($priceFilter) && $priceFilter) { $priceFilterQueryIn = 'INNER JOIN `' . _DB_PREFIX_ . 'layered_price_index` psi ON psi.price_min >= ' . (int) $priceFilter['min'] . ' AND psi.price_max <= ' . (int) $priceFilter['max'] . ' AND psi.`id_product` = p.`id_product` AND psi.`id_currency` = ' . (int) $idCurrency; $priceFilterQueryOut = 'INNER JOIN `' . _DB_PREFIX_ . 'layered_price_index` psi ON ((psi.price_min <= ' . (int) $priceFilter['min'] . ' AND psi.price_max >= ' . (int) $priceFilter['min'] . ') OR (psi.price_max >= ' . (int) $priceFilter['max'] . ' AND psi.price_min <= ' . (int) $priceFilter['max'] . ')) AND psi.`id_product` = p.`id_product` AND psi.`id_currency` = ' . (int) $idCurrency; } if ($whereLikeFilter != '') { $allProductsOut = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryOut . ' ' . $queryFiltersFrom . ' LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON p.id_product = pl.id_product LEFT JOIN ' . _DB_PREFIX_ . 'category_lang cl ON p.`id_category_default` = cl.id_category WHERE 1 ' . $queryFiltersWhere . ' AND ( ( ' . $descrypt_reg . ' ) OR (p.id_product ="' . $whereLikeFilter . '" OR p.reference = "' . $whereLikeFilter . '") OR (cl.name REGEXP "[[:<:]]' . $whereLikeFilter . '[[:>:]]") ) GROUP BY id_product', false); $allProductsIn = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryIn . ' ' . $queryFiltersFrom . ' LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON p.id_product = pl.id_product LEFT JOIN ' . _DB_PREFIX_ . 'category_lang cl ON p.`id_category_default` = cl.id_category WHERE 1 ' . $queryFiltersWhere . ' AND ( ( ' . $descrypt_reg . ' ) OR (p.id_product ="' . $whereLikeFilter . '" OR p.reference = "' . $whereLikeFilter . '") OR (cl.name REGEXP "[[:<:]]' . $whereLikeFilter . '[[:>:]]") ) GROUP BY id_product', false); } else { if ($usado === true) { $allProductsOut = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryOut . ' ' . $queryFiltersFrom . ' WHERE 1 ' . $queryFiltersWhere . ' AND p.condition = "used" GROUP BY id_product', false); $allProductsIn = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryIn . ' ' . $queryFiltersFrom . ' WHERE 1 ' . $queryFiltersWhere . ' AND p.condition = "used" GROUP BY id_product', false); } else { $allProductsOut = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryOut . ' ' . $queryFiltersFrom . ' WHERE 1 ' . $queryFiltersWhere . ' GROUP BY id_product', false); $allProductsIn = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.`id_product` id_product FROM `' . _DB_PREFIX_ . 'product` p ' . $priceFilterQueryIn . ' ' . $queryFiltersFrom . ' WHERE 1 ' . $queryFiltersWhere . ' GROUP BY id_product', false); } } $productIdList = array(); while ($product = DB::getInstance()->nextRow($allProductsIn)) { $productIdList[] = (int) $product['id_product']; $prod_features[$product['id_product']] = Product::getFrontFeaturesStatic($cookie->id_lang, $product['id_product']); } while ($product = DB::getInstance()->nextRow($allProductsOut)) { if (isset($priceFilter) && $priceFilter) { $price = (int) Product::getPriceStatic($product['id_product']); // Cast to int because we don't care about cents if ($price < $priceFilter['min'] || $price > $priceFilter['max']) { continue; } $productIdList[] = (int) $product['id_product']; } } if ($whereLikeFilter != '') { $products_cnt = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'category_lang cl ON p.`id_category_default` = cl.id_category LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) WHERE p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND ( ( ' . $descrypt_reg . ' ) OR (p.id_product ="' . $whereLikeFilter . '" OR p.reference = "' . $whereLikeFilter . '") OR (cl.name REGEXP "[[:<:]]' . $whereLikeFilter . '[[:>:]]") ) AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true)); } else { if ($usado === true) { $products_cnt = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) WHERE p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true)); } else { $products_cnt = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) WHERE p.`active` = 1 AND c.nleft >= ' . (int) $parent->nleft . ' AND c.nright <= ' . (int) $parent->nright . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true)); } } $this->nbr_products = count($products_cnt); if ($this->nbr_products == 0) { $this->products = array(); } else { if ($whereLikeFilter != '') { if (Tools::getValue('orderby') == 'price') { $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute ppat ON (p.id_product = ppat.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pcat ON (ppat.id_product_attribute = pcat.id_product_attribute) WHERE pcat.id_attribute = 21 AND p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ppat.price ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); } else { echo "vvv:::aaaa<br><br>"; $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute ppat ON (p.id_product = ppat.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pcat ON (ppat.id_product_attribute = pcat.id_product_attribute) WHERE pcat.id_attribute = 21 and (p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' ) AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ppat.price desc LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); echo ' SELECT p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute ppat ON (p.id_product = ppat.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pcat ON (ppat.id_product_attribute = pcat.id_product_attribute) WHERE pcat.id_attribute = 21 and (p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' ) AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ppat.price desc LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n); } } else { if ($usado === true) { if (Tools::getValue('orderby') == 'price') { $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.supplier_reference,p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute ppat ON (p.id_product = ppat.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pcat ON (ppat.id_product_attribute = pcat.id_product_attribute) WHERE pcat.id_attribute = 21 AND p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ppat.price ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); } else { $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.supplier_reference,p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) WHERE p.`active` = 1 AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); } } else { if (Tools::getValue('orderby') == 'price') { $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.supplier_reference,p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute ppat ON (p.id_product = ppat.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'product_attribute_combination pcat ON (ppat.id_product_attribute = pcat.id_product_attribute) WHERE pcat.id_attribute = 21 AND p.`active` = 1 AND c.nleft >= ' . (int) $parent->nleft . ' AND c.nright <= ' . (int) $parent->nright . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ppat.price ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); } else { $n = (int) Tools::getValue('n', Configuration::get('PS_PRODUCTS_PER_PAGE')); $this->products = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS(' SELECT p.supplier_reference,p.reference,p.id_product, p.on_sale, p.out_of_stock, p.available_for_order, p.quantity, p.minimal_quantity, p.id_category_default, p.customizable, p.show_price, p.`weight`, p.ean13, pl.available_later, pl.description_short, pl.link_rewrite, pl.name, i.id_image, il.legend, m.name manufacturer_name, p.condition, p.id_manufacturer, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL ' . (Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20) . ' DAY)) > 0 AS new FROM `' . _DB_PREFIX_ . 'category_product` cp LEFT JOIN ' . _DB_PREFIX_ . 'category c ON (c.id_category = cp.id_category) LEFT JOIN `' . _DB_PREFIX_ . 'product` p ON p.`id_product` = cp.`id_product` LEFT JOIN ' . _DB_PREFIX_ . 'product_lang pl ON (pl.id_product = p.id_product) LEFT JOIN ' . _DB_PREFIX_ . 'image i ON (i.id_product = p.id_product AND i.cover = 1) LEFT JOIN ' . _DB_PREFIX_ . 'image_lang il ON (i.id_image = il.id_image AND il.id_lang = ' . (int) $cookie->id_lang . ') LEFT JOIN ' . _DB_PREFIX_ . 'manufacturer m ON (m.id_manufacturer = p.id_manufacturer) WHERE p.`active` = 1 AND c.nleft >= ' . (int) $parent->nleft . ' AND c.nright <= ' . (int) $parent->nright . ' AND pl.id_lang = ' . (int) $cookie->id_lang . ' AND p.id_product IN (' . implode(',', $productIdList) . ')' . ' GROUP BY p.id_product ORDER BY ' . Tools::getProductsOrder('by', Tools::getValue('orderby'), true) . ' ' . Tools::getProductsOrder('way', Tools::getValue('orderway')) . ' LIMIT ' . (((int) Tools::getValue('p', 1) - 1) * $n . ',' . $n)); } } } } return $this->products; }
/** * prepare properties * * @return array */ protected function prepareProperties() { $result = array(); $properties = Product::getFrontFeaturesStatic($this->getPlugin()->getLanguageId(), $this->currentProduct->id); foreach ($properties as $property) { $propertyItemObject = new Shopgate_Model_Catalog_Property(); $propertyItemObject->setUid($property['id_feature']); $propertyItemObject->setLabel($property['name']); $propertyItemObject->setValue($property['value']); $result[] = $propertyItemObject; } return $result; }
public function DataForFrontSearch($date_from, $date_to, $id_hotel, $id_product = 0, $for_room_type = 0, $adult = 0, $children = 0, $ratting = -1, $amenities = 0, $price = 0, $id_cart = 0, $id_guest = 0) { require_once _PS_MODULE_DIR_ . 'productcomments/ProductComment.php'; $this->context = Context::getContext(); $booking_data = $this->getBookingData($date_from, $date_to, $id_hotel, $id_product, $adult, $children, 0, 0, 1, 0, 0, 0, $id_cart, $id_guest); // ddd($booking_data); if (!$for_room_type) { if (!empty($booking_data)) { $obj_rm_type = new HotelRoomType(); foreach ($booking_data['rm_data'] as $key => $value) { if (empty($value['data']['available'])) { unset($booking_data['rm_data'][$key]); } else { $prod_ratting = ProductComment::getAverageGrade($value['id_product'])['grade']; if ($prod_ratting === NULL) { $prod_ratting = 0; } if ($prod_ratting < $ratting && $ratting != -1) { unset($booking_data['rm_data'][$key]); } else { $product = new Product($value['id_product'], false, $this->context->language->id); $product_feature = $product->getFrontFeaturesStatic($this->context->language->id, $value['id_product']); $prod_amen = array(); if (!empty($amenities) && $amenities) { $prod_amen = $amenities; foreach ($product_feature as $a_key => $a_val) { if (($pa_key = array_search($a_val['id_feature'], $prod_amen)) !== false) { unset($prod_amen[$pa_key]); if (empty($prod_amen)) { break; } } } if (!empty($prod_amen)) { unset($booking_data['rm_data'][$key]); } } if (empty($prod_amen)) { $prod_price = Product::getPriceStatic($value['id_product']); if (empty($price) || $price['from'] <= $prod_price && $price['to'] >= $prod_price) { $cover_image_arr = $product->getCover($value['id_product']); if (!empty($cover_image_arr)) { $cover_img = $this->context->link->getImageLink($product->link_rewrite, $product->id . '-' . $cover_image_arr['id_image'], 'home_default'); } else { $cover_img = $this->context->link->getImageLink($product->link_rewrite, $this->context->language->iso_code . "-default", 'home_default'); } $room_left = count($booking_data['rm_data'][$key]['data']['available']); $rm_dtl = $obj_rm_type->getRoomTypeInfoByIdProduct($value['id_product']); $booking_data['rm_data'][$key]['name'] = $product->name; $booking_data['rm_data'][$key]['image'] = $cover_img; $booking_data['rm_data'][$key]['description'] = $product->description_short; $booking_data['rm_data'][$key]['feature'] = $product_feature; $booking_data['rm_data'][$key]['price'] = $prod_price; if ($room_left <= (int) Configuration::get('WK_ROOM_LEFT_WARNING_NUMBER')) { $booking_data['rm_data'][$key]['room_left'] = $room_left; } $booking_data['rm_data'][$key]['adult'] = $rm_dtl['adult']; $booking_data['rm_data'][$key]['children'] = $rm_dtl['children']; $booking_data['rm_data'][$key]['ratting'] = $prod_ratting; $booking_data['rm_data'][$key]['num_review'] = ProductComment::getCommentNumber($value['id_product']); if (Configuration::get('PS_REWRITING_SETTINGS')) { $booking_data['rm_data'][$key]['product_link'] = $this->context->link->getProductLink($product) . '?date_from=' . $date_from . '&date_to=' . $date_to; } else { $booking_data['rm_data'][$key]['product_link'] = $this->context->link->getProductLink($product) . '&date_from=' . $date_from . '&date_to=' . $date_to; } } else { unset($booking_data['rm_data'][$key]); } } } } } } } return $booking_data; }
/** * Assign template vars related to page content * @see FrontController::initContent() */ public function initContent() { parent::initContent(); $flag_pack = true; if (!$this->errors) { // if(!isset($_GET['quick_view'])) // if (Pack::isPack((int)$this->product->id) && !Pack::isInStock((int)$this->product->id)) // if (Pack::isPack((int)$this->product->id)) // $this->product->quantity = 0; // else // $flag_pack = false; // else // $flag_pack = false; if (!Pack::isPack((int) $this->product->id)) { $flag_pack = false; } $this->product->description = $this->transformDescriptionWithImg($this->product->description); // Assign to the template the id of the virtual product. "0" if the product is not downloadable. $this->context->smarty->assign('virtual', ProductDownload::getIdFromIdProduct((int) $this->product->id)); $this->context->smarty->assign('customizationFormTarget', Tools::safeOutput(urldecode($_SERVER['REQUEST_URI']))); if (Tools::isSubmit('submitCustomizedDatas')) { // If cart has not been saved, we need to do it so that customization fields can have an id_cart // We check that the cookie exists first to avoid ghost carts if (!$this->context->cart->id && isset($_COOKIE[$this->context->cookie->getName()])) { $this->context->cart->add(); $this->context->cookie->id_cart = (int) $this->context->cart->id; } $this->pictureUpload(); $this->textRecord(); $this->formTargetFormat(); } else { if (Tools::getIsset('deletePicture') && !$this->context->cart->deleteCustomizationToProduct($this->product->id, Tools::getValue('deletePicture'))) { $this->errors[] = Tools::displayError('An error occurred while deleting the selected picture.'); } } $pictures = array(); $text_fields = array(); if ($this->product->customizable) { $files = $this->context->cart->getProductCustomization($this->product->id, Product::CUSTOMIZE_FILE, true); foreach ($files as $file) { $pictures['pictures_' . $this->product->id . '_' . $file['index']] = $file['value']; } $texts = $this->context->cart->getProductCustomization($this->product->id, Product::CUSTOMIZE_TEXTFIELD, true); foreach ($texts as $text_field) { $text_fields['textFields_' . $this->product->id . '_' . $text_field['index']] = str_replace('<br />', "\n", $text_field['value']); } } $this->context->smarty->assign(array('pictures' => $pictures, 'textFields' => $text_fields)); // Assign template vars related to the category + execute hooks related to the category $this->assignCategory(); // Assign template vars related to the price and tax $this->assignPriceAndTax(); // Assign template vars related to the images $this->assignImages(); $this->assign3dImages(); // Assign attribute groups to the template $this->assignAttributesGroups(); // Assign attributes combinations to the template $this->assignAttributesCombinations(); // Pack management $pack_items = $this->product->cache_is_pack ? Pack::getItemTable($this->product->id, $this->context->language->id, true) : array(); if (is_array($pack_items) && count($pack_items)) { foreach ($pack_items as &$pack_item) { $pack_item['features'] = Product::getFrontFeaturesStatic($this->context->language->id, $pack_item['id_product']); } } $this->context->smarty->assign('packItems', $pack_items); $this->context->smarty->assign('packs', Pack::getPacksTable($this->product->id, $this->context->language->id, true, 1)); if (isset($this->category->id) && $this->category->id) { $return_link = Tools::safeOutput($this->context->link->getCategoryLink($this->category)); } else { $return_link = 'javascript: history.back();'; } //reviews // $average = ProductComment::getAverageGrade((int)Tools::getValue('id_product')); $nbComments = (int) ProductComment::getCommentNumber((int) Tools::getValue('id_product')); $act_pack = 0; //паки if (!$flag_pack) { $sql = "SELECT DISTINCT(id_product_pack) FROM " . _DB_PREFIX_ . "pack WHERE id_product_item={$this->product->id}"; $pack_products = array(); $result_packs = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); if (is_array($result_packs) && count($result_packs)) { foreach ($result_packs as $k => $id_product_pack) { $prod = new Product($id_product_pack['id_product_pack'], $this->context->language->id, true); $cover = $prod->getCover((int) $prod->id); if ($cover) { $pack_products[$k]['id_image'] = $cover['id_image']; } else { $pack_products[$k]['id_image'] = null; } $price = $prod->getPrice(true, null, 2); $price_old = $prod->getPriceWithoutReduct(false, null, 2); if (isset($prod->specificPrice) && is_array($prod->specificPrice)) { $pack_products[$k]['sale_percentage'] = $prod->specificPrice['reduction_type'] == 'percentage' ? $prod->specificPrice['reduction'] * 100 : $prod->specificPrice['reduction'] / $price_old * 100; } $pack_products[$k]['active'] = $prod->active; if ($prod->active) { $act_pack = 1; } $pack_products[$k]['count_reviews'] = (int) ProductComment::getCommentNumber((int) $prod->id); $pack_products[$k]['star_reviews'] = ProductComment::getRatings((int) $prod->id); $pack_products[$k]['price'] = $price; $pack_products[$k]['price_old'] = $price_old; $pack_products[$k]['on_sale'] = (bool) ($price != $price_old); $pack_products[$k]['id_product_pack'] = $prod->id; $pack_products[$k]['link'] = $this->context->link->getProductLink($prod); $pack_products[$k]['name'] = $prod->name; $pack_products[$k]['link_rewrite'] = $prod->link_rewrite; $pack_products[$k]['items'] = Pack::getItemTable($prod->id, $this->context->language->id, true); unset($prod); } } } else { $pack_products = null; } //var_dump($pack_products);exit(); //текстовой блок доставка $cms_block = ''; $cms = new CMS($this->block_cms_id, $this->context->language->id); if (is_object($cms)) { $cms_block = $cms->content; } $sql = "SELECT id_category FROM ps_category_product WHERE id_product={$this->product->id}"; $result_cats = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); $params_image = null; foreach ($result_cats as $cat) { $params_image = file_exists(_PS_IMG_DIR_ . '/c_icon/' . $cat['id_category'] . '.png') ? '/img/c_icon/' . $cat['id_category'] . '.png' : null; if (!$params_image) { $params_image = file_exists(_PS_IMG_DIR_ . '/c_icon/' . $cat['id_category'] . '.jpg') ? '/img/c_icon/' . $cat['id_category'] . '.jpg' : null; } if ($params_image) { break; } } //{if $product->minimal_quantity > 1}{$product->minimal_quantity}{else}1{/if} $this->context->smarty->assign(array('is_bestsaler' => ProductSale::isBestsaler($this->product->id), 'og_type' => 'product', 'params_image' => $params_image, 'cms_block' => $cms_block, 'pack_products' => $pack_products, 'act_pack' => $act_pack, 'url' => $this->context->link->getProductLink($this->product), 'minimal_quantity' => $this->product->minimal_quantity > 1 ? $this->product->minimal_quantity : 1, 'nbComments' => $nbComments, 'stock_management' => Configuration::get('PS_STOCK_MANAGEMENT'), 'customizationFields' => $this->product->customizable ? $this->product->getCustomizationFields($this->context->language->id) : false, 'accessories' => $this->product->getAccessories($this->context->language->id), 'return_link' => $return_link, 'product' => $this->product, 'product_manufacturer' => new Manufacturer((int) $this->product->id_manufacturer, $this->context->language->id), 'token' => Tools::getToken(false), 'features' => $this->product->getFrontFeatures($this->context->language->id), 'attachments' => $this->product->cache_has_attachments ? $this->product->getAttachments($this->context->language->id) : array(), 'allow_oosp' => $this->product->isAvailableWhenOutOfStock((int) $this->product->out_of_stock), 'last_qties' => (int) Configuration::get('PS_LAST_QTIES'), 'HOOK_EXTRA_LEFT' => Hook::exec('displayLeftColumnProduct'), 'HOOK_EXTRA_RIGHT' => Hook::exec('displayRightColumnProduct'), 'HOOK_PRODUCT_OOS' => Hook::exec('actionProductOutOfStock', array('product' => $this->product)), 'HOOK_PRODUCT_ACTIONS' => Hook::exec('displayProductButtons', array('product' => $this->product)), 'HOOK_PRODUCT_TAB' => Hook::exec('displayProductTab', array('product' => $this->product)), 'HOOK_PRODUCT_TAB_CONTENT' => Hook::exec('displayProductTabContent', array('product' => $this->product)), 'HOOK_PRODUCT_CONTENT' => Hook::exec('displayProductContent', array('product' => $this->product)), 'display_qties' => (int) Configuration::get('PS_DISPLAY_QTIES'), 'display_ht' => !Tax::excludeTaxeOption(), 'currencySign' => $this->context->currency->sign, 'currencyRate' => $this->context->currency->conversion_rate, 'currencyFormat' => $this->context->currency->format, 'currencyBlank' => $this->context->currency->blank, 'jqZoomEnabled' => Configuration::get('PS_DISPLAY_JQZOOM'), 'ENT_NOQUOTES' => ENT_NOQUOTES, 'outOfStockAllowed' => (int) Configuration::get('PS_ORDER_OUT_OF_STOCK'), 'errors' => $this->errors, 'body_classes' => array($this->php_self . '-' . $this->product->id, $this->php_self . '-' . $this->product->link_rewrite, 'category-' . (isset($this->category) ? $this->category->id : ''), 'category-' . (isset($this->category) ? $this->category->getFieldByLang('link_rewrite') : '')), 'display_discount_price' => Configuration::get('PS_DISPLAY_DISCOUNT_PRICE'))); } if (isset($_GET['quick_view'])) { $this->ajax = true; if ($flag_pack) { $this->setTemplate(_PS_THEME_DIR_ . 'preview_pack.tpl'); } else { $this->setTemplate(_PS_THEME_DIR_ . 'preview.tpl'); } } else { if ($flag_pack) { $this->setTemplate(_PS_THEME_DIR_ . 'product-pack.tpl'); } else { $this->setTemplate(_PS_THEME_DIR_ . 'product.tpl'); } } }
protected function _assignSummaryInformations() { $summary = $this->context->cart->getSummaryDetails(); $customizedDatas = Product::getAllCustomizedDatas($this->context->cart->id); // override customization tax rate with real tax (tax rules) if ($customizedDatas) { foreach ($summary['products'] as &$productUpdate) { $productId = (int) (isset($productUpdate['id_product']) ? $productUpdate['id_product'] : $productUpdate['product_id']); $productAttributeId = (int) (isset($productUpdate['id_product_attribute']) ? $productUpdate['id_product_attribute'] : $productUpdate['product_attribute_id']); if (isset($customizedDatas[$productId][$productAttributeId])) { $productUpdate['tax_rate'] = Tax::getProductTaxRate($productId, $this->context->cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')}); } } Product::addCustomizationPrice($summary['products'], $customizedDatas); } $cart_product_context = Context::getContext()->cloneContext(); foreach ($summary['products'] as $key => &$product) { $product['quantity'] = $product['cart_quantity']; // for compatibility with 1.2 themes if ($cart_product_context->shop->id != $product['id_shop']) { $cart_product_context->shop = new Shop((int) $product['id_shop']); } $product['price_without_specific_price'] = Product::getPriceStatic($product['id_product'], !Product::getTaxCalculationMethod(), $product['id_product_attribute'], 2, null, false, false, 1, false, null, null, null, $null, true, true, $cart_product_context); if (Product::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 = CartRule::getCustomerCartRules($this->context->language->id, isset($this->context->customer->id) ? $this->context->customer->id : 0, true, true, true, $this->context->cart); $cart_cart_rules = $this->context->cart->getCartRules(); foreach ($available_cart_rules as $key => $available_cart_rule) { if (!$available_cart_rule['highlight'] || 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['id_cart_rule'] == $cart_cart_rule['id_cart_rule']) { unset($available_cart_rules[$key]); continue 2; } } } $show_option_allow_separate_package = !$this->context->cart->isAllProductsInStock(true) && Configuration::get('PS_SHIP_WHEN_AVAILABLE'); $features = array(); //print_r($summary); foreach ($summary['products'] as $key => $pr) { $summary['products'][$key]['features_value'] = Product::getFrontFeaturesStatic($this->context->language->id, $pr['id_product']); } //print_r($summary['products']); $this->context->smarty->assign($summary); $this->context->smarty->assign(array('token_cart' => Tools::getToken(false), 'isLogged' => $this->isLogged, 'isVirtualCart' => $this->context->cart->isVirtualCart(), 'productNumber' => $this->context->cart->nbProducts(), 'voucherAllowed' => CartRule::isFeatureActive(), 'shippingCost' => $this->context->cart->getOrderTotal(true, Cart::ONLY_SHIPPING), 'shippingCostTaxExc' => $this->context->cart->getOrderTotal(false, Cart::ONLY_SHIPPING), 'customizedDatas' => $customizedDatas, 'CUSTOMIZE_FILE' => Product::CUSTOMIZE_FILE, 'CUSTOMIZE_TEXTFIELD' => Product::CUSTOMIZE_TEXTFIELD, 'lastProductAdded' => $this->context->cart->getLastProduct(), 'displayVouchers' => $available_cart_rules, 'currencySign' => $this->context->currency->sign, 'currencyRate' => $this->context->currency->conversion_rate, 'currencyFormat' => $this->context->currency->format, 'currencyBlank' => $this->context->currency->blank, 'show_option_allow_separate_package' => $show_option_allow_separate_package, 'smallSize' => Image::getSize(ImageType::getFormatedName('small')))); $this->context->smarty->assign(array('HOOK_SHOPPING_CART' => Hook::exec('displayShoppingCartFooter', $summary), 'HOOK_SHOPPING_CART_EXTRA' => Hook::exec('displayShoppingCart', $summary))); }
public static function getProductProperties($id_lang, $row) { if (!$row['id_product']) { return false; } $link = new Link(); // Tax $usetax = true; $tax = floatval(Tax::getApplicableTax(intval($row['id_tax']), floatval($row['rate']))); if (Tax::excludeTaxeOption() or !$tax) { $usetax = false; } // Datas $row['category'] = Category::getLinkRewrite($row['id_category_default'], intval($id_lang)); $row['link'] = $link->getProductLink($row['id_product'], $row['link_rewrite'], $row['category'], $row['ean13']); $row['allow_oosp'] = Product::isAvailableWhenOutOfStock($row['out_of_stock']); if ((!isset($row['id_product_attribute']) or !$row['id_product_attribute']) and $ipa_default = Product::getDefaultAttribute($row['id_product'], !$row['allow_oosp'])) { $row['id_product_attribute'] = $ipa_default; } $row['attribute_price'] = isset($row['id_product_attribute']) and $row['id_product_attribute'] ? floatval(Product::getProductAttributePrice($row['id_product_attribute'])) : 0; $row['price_tax_exc'] = Product::getPriceStatic($row['id_product'], false, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 2); $row['price'] = Product::getPriceStatic($row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 2); $row['reduction'] = self::getReductionValue($row['reduction_price'], $row['reduction_percent'], $row['reduction_from'], $row['reduction_to'], $row['price'], $usetax, floatval($row['rate'])); $row['price_without_reduction'] = Product::getPriceStatic($row['id_product'], true, (isset($row['id_product_attribute']) and !empty($row['id_product_attribute'])) ? intval($row['id_product_attribute']) : NULL, 2, NULL, false, false); $row['quantity'] = Product::getQuantity($row['id_product']); $row['id_image'] = Product::defineProductImage($row); $row['features'] = Product::getFrontFeaturesStatic(intval($id_lang), $row['id_product']); $row['attachments'] = Product::getAttachmentsStatic(intval($id_lang), $row['id_product']); $row['pack'] = Pack::isPack($row['id_product']); $row['packItems'] = $row['pack'] ? Pack::getItemTable($row['id_product'], $id_lang) : array(); $row['nopackprice'] = $row['pack'] ? Pack::noPackPrice($row['id_product']) : 0; return $row; }