/** * For a given product, tells if it depends on the physical (usable) stock * * @param int $product_id * @param int $shop_id Optional : gets context if null @see Context::getContext() * @return bool : depends on stock @see $depends_on_stock */ public static function dependsOnStock($product_id, $shop_id = null) { if (!JeproshopTools::isUnsignedInt($product_id)) { return false; } $db = JFactory::getDBO(); $query = "SELECT depends_on_stock FROM " . $db->quoteName('#__jeproshop_stock_available') . " WHERE product_id = " . (int) $product_id; $query .= " AND product_attribute_id = 0 " . JeproshopStockAvailableModelStockAvailable::addShopRestriction($shop_id); $db->setQuery($query); return $db->loadResult(); }
/** * @param type $product_alias * @param int|\type $product_attribute * @param bool|\type $inner_join * @param JeproshopShopModelShop $shop * @return string */ public static function sqlStock($product_alias, $product_attribute = 0, $inner_join = FALSE, JeproshopShopModelShop $shop = NULL) { $db = JFactory::getDBO(); $shop_id = $shop !== NULL ? (int) $shop->shop_id : NULL; $query = ($inner_join ? " INNER " : " LEFT ") . "JOIN " . $db->quoteName('#__jeproshop_stock_available'); $query .= " AS stock ON(stock.product_id = " . $db->escape($product_alias) . ".product_id"; if (!is_null($product_attribute)) { if (!JeproshopCombinationModelCombination::isFeaturePublished()) { $query .= " AND stock.product_attribute_id = 0"; } elseif (is_numeric($product_attribute)) { $query .= " AND stock.product_attribute_id = " . $product_attribute; } elseif (is_string($product_attribute)) { $query .= " AND stock.product_attribute_id = IFNULL(" . $db->quoteName($db->escape($product_attribute)) . ".product_attribute_id, 0)"; } } $query .= JeproshopStockAvailableModelStockAvailable::addShopRestriction($shop_id, 'stock') . ")"; return $query; }
/** * Removes a given product from the stock available * * @param int $product_id * @param int $product_attribute_id Optional * @param mixed $shop shop id or shop object Optional */ public static function removeProductFromStockAvailable($product_id, $product_attribute_id = null, $shop = null) { if (!JeproshopTools::isUnsignedInt($product_id)) { return false; } $db = JFactory::getDBO(); if (JeproshopShopModelShop::getShopContext() == JeproshopShopModelShop::CONTEXT_SHOP) { if (JeproshopShopModelShop::getContextShopGroup()->share_stock == 1) { $product_attribute_sql = ''; if ($product_attribute_id !== null) { $product_attribute_sql = '_attribute'; $product_attribute_id_sql = $product_attribute_id; } else { $product_attribute_id_sql = $product_id; } $query = "SELECT COUNT(*) FROM " . $db->quoteName('#__jeproshop_product' . $product_attribute_sql . '_shop') . " WHERE " . $db->quoteName('product' . $product_attribute_sql . '_id') . " = "; $query .= (int) $product_attribute_id_sql . " AND " . $db->quoteName('shop_id') . " IN (" . implode(',', array_map('intval', JeproshopShopModelShop::getContextListShopIds(JeproshopShopModelShop::SHARE_STOCK))) . ")"; $db->setQuery($query); $result = (int) $db->loadResult(); if ($result) { return true; } } } $query = "DELETE FROM " . $db->quoteName('#__jeproshop_stock_available') . " WHERE " . $db->quoteName('product_id') . " = " . (int) $product_id; $query .= ($product_attribute_id ? " AND " . $db->quoteName('product_attribute_id') . " = " . (int) $product_attribute_id : "") . JeproshopStockAvailableModelStockAvailable::addShopRestriction(null, $shop); $db->setQuery($query); $res = $db->query(); if ($product_attribute_id) { if ($shop === null || !JeproshopTools::isLoadedObject($shop, 'shop_id')) { $shop_datas = new Object(); JeproshopStockAvailableModelStockAvailable::addSqlShopParams($shop_datas); $shop_id = (int) $shop_datas->shop_id; } else { $shop_id = (int) $shop->shop_id; } $stock_available = new JeproshopStockAvailableModelStockAvailable(); $stock_available->product_id = (int) $product_id; $stock_available->product_attribute_id = (int) $product_id; $stock_available->shop_id = (int) $shop_id; $stock_available->postSave(); } JeproshopCache::clean('jeproshop_stock_available_get-quantity_Available_by_product_' . (int) $product_id . '_*'); return $res; }
function getProductList(JeproshopContext $context = NULL) { jimport('joomla.html.pagination'); $db = JFactory::getDBO(); $app = JFactory::getApplication(); $option = $app->input->get('option'); $view = $app->input->get('view'); if (!$context) { $context = JeproshopContext::getContext(); } $limit = $app->getUserStateFromRequest('global.list.limit', 'limit', $app->getCfg('list_limit'), 'int'); $limit_start = $app->getUserStateFromRequest($option . $view . '.limitstart', 'limitstart', 0, 'int'); $lang_id = $app->getUserStateFromRequest($option . $view . '.lang_id', 'lang_id', $context->language->lang_id, 'int'); $shop_id = $app->getUserStateFromRequest($option . $view . '.shop_id', 'shop_id', $context->shop->shop_id, 'int'); $shop_group_id = $app->getUserStateFromRequest($option . $view . '.shop_group_id', 'shop_group_id', $context->shop->shop_group_id, 'int'); $category_id = $app->getUserStateFromRequest($option . $view . '.cat_id', 'cat_id', 0, 'int'); $order_by = $app->getUserStateFromRequest($option . $view . '.order_by', 'order_by', 'date_add', 'string'); $order_way = $app->getUserStateFromRequest($option . $view . '.order_way', 'order_way', 'ASC', 'string'); $published = $app->getUserStateFromRequest($option . $view . '.published', 'published', 0, 'string'); $product_attribute_id = $app->getUserStateFromRequest($option . $view . '.product_attribute_id', 'product_attribute_id', 0, 'int'); if (JeproshopShopModelShop::isFeaturePublished() && $context->cookie->products_filter_category_id) { $category = new JeproshopCategoryModelCategory((int) $context->cookie->products_filter_category_id); if (!$category->inShop()) { $context->cookie->products_filter_category_id = null; $app->redirect('index.php?option=com_jeproshop&view=product'); } } //Join categories table $category_id = (int) $app->input->get('product_filter_category_lang!name'); if ($category_id) { $category = new JeproshopCategoryModelCategory($category_id); $app->input->set('product_filter_category_lang!name', $category->name[$context->language->lang_id]); } else { $category_id = $app->input->get('category_id'); $current_category_id = null; if ($category_id) { $current_category_id = $category_id; $context->cookie->products_filter_category_id = $category_id; } elseif ($category_id = $context->cookie->products_filter_category_id) { $current_category_id = $category_id; } if ($current_category_id) { $category = new JeproshopCategoryModelCategory((int) $current_category_id); } else { $category = new JeproshopCategoryModelCategory(); } } $join_category = false; if (JeproshopTools::isLoadedObject($category, 'category_id') && empty($filter)) { $join_category = true; } $shop_id = JeproshopShopModelShop::isFeaturePublished() && JeproshopShopModelShop::getShopContext() == JeproshopShopModelShop::CONTEXT_SHOP ? (int) $this->context->shop->shop_id : "product." . $db->quoteName('default_shop_id'); $join = " LEFT JOIN " . $db->quoteName('#__jeproshop_image') . " AS image ON (image." . $db->quoteName('product_id') . " = product."; $join .= $db->quoteName('product_id') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_stock_available') . " AS stock_available ON (stock_available."; $join .= $db->quoteName('product_id') . " = product." . $db->quoteName('product_id') . " AND stock_available." . $db->quoteName('product_attribute_id'); $join .= " = 0 " . JeproshopStockAvailableModelStockAvailable::addShopRestriction(null, 'stock_available') . ") LEFT JOIN " . $db->quoteName('#__jeproshop_product_shop'); $join .= " AS product_shop ON (product." . $db->quoteName('product_id') . " = product_shop." . $db->quoteName('product_id') . " AND product_shop." . $db->quoteName('shop_id'); $join .= " = " . $shop_id . ") LEFT JOIN " . $db->quoteName('#__jeproshop_category_lang') . " AS category_lang ON (product_shop." . $db->quoteName('default_category_id'); $join .= " = category_lang." . $db->quoteName('category_id') . " AND product_lang." . $db->quoteName('lang_id') . " = category_lang." . $db->quoteName('lang_id') . " AND category_lang."; $join .= $db->quoteName('shop_id') . " = " . $shop_id . ") LEFT JOIN " . $db->quoteName('#__jeproshop_shop') . " AS shop ON (shop." . $db->quoteName('shop_id') . " = " . $shop_id; $join .= ")\tLEFT JOIN " . $db->quoteName('#__jeproshop_image_shop') . " AS image_shop ON (image_shop." . $db->quoteName('image_id') . " = image." . $db->quoteName('image_id'); $join .= " AND image_shop." . $db->quoteName('cover') . " = 1 AND image_shop." . $db->quoteName('shop_id') . " = " . $shop_id . ") LEFT JOIN " . $db->quoteName('#__jeproshop_product_download'); $join .= " AS product_download ON (product_download." . $db->quoteName('product_id') . " = product." . $db->quoteName('product_id') . ") "; $select = "shop." . $db->quoteName('shop_name') . " AS shop_name, product." . $db->quoteName('default_shop_id') . ", MAX(image_shop." . $db->quoteName('image_id') . ") AS image_id, category_lang."; $select .= $db->quoteName('name') . " AS category_name, product_shop." . $db->quoteName('price') . ", 0 AS final_price, product." . $db->quoteName('is_virtual') . ", product_download."; $select .= $db->quoteName('nb_downloadable') . ", stock_available." . $db->quoteName('quantity') . " AS stock_available_quantity, product_shop." . $db->quoteName('published'); $select .= ", IF(stock_available." . $db->quoteName('quantity') . " <= 0, 1, 0) badge_danger"; if ($join_category) { $join .= " INNER JOIN " . $db->quoteName('#__jeproshop_category_product') . " product_category ON (product_category." . $db->quoteName('product_id') . " = product."; $join .= $db->quoteName('product_id') . " AND product_category." . $db->quoteName('category_id') . " = " . (int) $category->category_id . ") "; $select .= " , product_category." . $db->quoteName('position') . ", "; } $group = " GROUP BY product_shop." . $db->quoteName('product_id'); $use_limit = true; if ($limit === false) { $use_limit = false; } // Add SQL shop restriction $select_shop = $join_shop = $where_shop = $where = $filter = ""; if ($context->controller->shopLinkType) { $select_shop = ", shop.shop_name AS shopname "; $join_shop = ") LEFT JOIN " . $db->quoteName('#__jeproshop_shop') . " AS shop ON product.shop_id = shop.shop_id"; $where_shop = JeproshopShopModelShop::addSqlRestriction($this->shopShareDatas, 'product'); //, $this->shopLinkType } /* Query in order to get results with all fields */ $lang_join = ''; if ($lang_id) { $lang_join = " LEFT JOIN " . $db->quoteName('#__jeproshop_product_lang') . " AS product_lang ON (product_lang."; $lang_join .= $db->quoteName('product_id') . " = product." . $db->quoteName('product_id') . " AND product_lang."; $lang_join .= $db->quoteName('lang_id') . " = " . (int) $lang_id; if (!JeproshopShopModelShop::isFeaturePublished()) { $lang_join .= " AND product_lang." . $db->quoteName('shop_id') . " = 1"; } elseif (JeproshopShopModelShop::getShopContext() == JeproshopShopModelShop::CONTEXT_SHOP) { //$lang_join .= " AND product_lang." . $db->quoteName('shop_id') . " = " . (int)$shop_lang_id; } else { $lang_join .= " AND product_lang." . $db->quoteName('shop_id') . " = product.default_shop_id"; } $lang_join .= ")"; } if ($context->controller->multishop_context && JeproshopShopModelShop::isTableAssociated('product')) { if (JeproshopShopModelShop::getShopContext() != JeproshopShopModelShop::CONTEXT_ALL || !$this->context->employee->isSuperAdmin()) { $test_join = !preg_match('/`?' . preg_quote('#__jeproshop_product_shop') . '`? *product_shop/', $join); if (JeproshopShopModelShop::isFeaturePublished() && $test_join && JeproshopShopModelShop::isTableAssociated('product')) { $where .= " AND product.product_id IN (\tSELECT product_shop.product_id FROM " . $db->quoteName('#__jeproshop_product_shop'); $where .= " AS product_shop WHERE product_shop.shop_id IN ("; $where .= implode(', ', JeproshopShopModelShop::getContextListShopIds()) . "))"; } } } $having_clause = ''; if (isset($filterHaving) || isset($having)) { $having_clause = " HAVING "; if (isset($filterHaving)) { $having_clause .= ltrim($filterHaving, " AND "); } if (isset($having)) { $having_clause .= $having . " "; } } do { $query = "SELECT SQL_CALC_FOUND_ROWS product." . $db->quoteName('product_id') . ", product_lang." . $db->quoteName('name') . ", product."; $query .= $db->quoteName('reference') . ", " . $select . $select_shop . " FROM " . $db->quoteName('#__jeproshop_product') . " AS product "; $query .= $lang_join . $join . $join_shop . " WHERE 1 " . $where . $filter . $where_shop . $group . $having_clause . " ORDER BY "; $query .= (str_replace('`', '', $order_by) == 'product_id' ? "product." : " product.") . $db->quoteName($order_by) . " " . $db->escape($order_way); $db->setQuery($query); $total = count($db->loadObjectList()); $query .= $use_limit === true ? " LIMIT " . (int) $limit_start . ", " . (int) $limit : ""; $db->setQuery($query); $products = $db->loadObjectList(); if ($use_limit == true) { $limit_start = (int) $limit_start - (int) $limit; if ($limit_start < 0) { break; } } else { break; } } while (empty($products)); $this->pagination = new JPagination($total, $limit_start, $limit); return $products; }