assign("LANG_DIR_LOC", $lang['viewCat']['location']); //////////////////////// // BUILD SUB CATEGORIES //////////////////////// if (isset($_GET['catId'])) { $_GET['catId'] = sanitizeVar($_GET['catId']); ## build query $emptyCat = ($config['show_empty_cat']) ? '' : ' AND noProducts >= 1'; $query = "SELECT * FROM ".$glob['dbprefix']."CubeCart_category WHERE cat_father_id = ".$db->mySQLSafe($_GET['catId'])." AND hide = '0'".$emptyCat." ORDER BY priority,cat_name ASC"; ## get category array in foreign innit $resultsForeign = $db->select("SELECT cat_master_id as cat_id, cat_name FROM ".$glob['dbprefix']."CubeCart_cats_lang WHERE cat_lang = '" . LANG_FOLDER . "'"); ## query database $subCategories = $db->select($query); } if (isset($_GET['catId']) && $_GET['catId']>0 && $subCategories) { ## loop results for ($i=0; $iassign("IMG_CATEGORY", $catImg); } else { $view_cat->assign("IMG_CATEGORY", $GLOBALS['rootRel']."skins/". SKIN_FOLDER . "/styleImages/catnophoto.gif"); } $view_cat->assign("TXT_LINK_CATID", $subCategories[$i]['cat_id']); $view_cat->assign("TXT_CATEGORY", validHTML($subCategories[$i]['cat_name'])); $view_cat->assign("NO_PRODUCTS", $subCategories[$i]['noProducts']); $view_cat->parse("view_cat.sub_cats.sub_cats_loop"); } $view_cat->parse("view_cat.sub_cats"); } //////////////////////////// // BUILD PRODUCTS //////////////////////////// ## New! Product sorting by field $allowedSort = array('price', 'description', 'name', 'productCode', 'date_added'); if (isset($_GET['sort_by']) && in_array($_GET['sort_by'], $allowedSort)) { switch ($_GET['sort_order']) { case 'high': $orderType = 'DESC'; $orderText = '&uarr'; $sortIcon = 'bullet_arrow_up.gif'; break; case 'low': $orderType = 'ASC'; $orderText = '&darr'; $sortIcon = 'bullet_arrow_down.gif'; break; default: $orderType = 'ASC'; $sortIcon = 'bullet_arrow_down.gif'; } $orderSort = sprintf(' ORDER BY %s %s', $_GET['sort_by'], $orderType); } else { if ($config['cat_newest_first']) { $orderSort = sprintf(' ORDER BY date_added DESC, name ASC'); } else { $orderSort = false; } } ## build query if (isset($_REQUEST['searchStr']) || !empty($_REQUEST['priceMin']) || !empty($_REQUEST['priceMax'])) { unset($_GET['Submit']); $_REQUEST['searchStr'] = trim($_REQUEST['searchStr']); /* LOG SEARCH PHRASE */ $searchwords = split ( "[ ,]", sanitizeVar($_REQUEST['searchStr'])); foreach ($searchwords as $word) { $searchArray[] = $word; } $noKeys = count($searchArray); for ($i=0; $i<$noKeys; $i++) { $ucSearchTerm = strtoupper($searchArray[$i]); if (($ucSearchTerm !== 'AND') && ($ucSearchTerm !== 'OR')) { ## Uppercase the search string $searchQuery = "SELECT id FROM ".$glob['dbprefix']."CubeCart_search WHERE searchstr='".$ucSearchTerm."'"; $searchLogs = $db->select($searchQuery); $insertStr['searchstr'] = $db->mySQLsafe($ucSearchTerm); $insertStr['hits'] = $db->mySQLsafe(1); $updateStr['hits'] = "hits+1"; if ($searchLogs) { $counted = $db->update($glob['dbprefix']."CubeCart_search", $updateStr,"id=".$searchLogs[0]['id'],$quote = ""); } else if (!empty($_REQUEST['searchStr'])) { $counted = $db->insert($glob['dbprefix']."CubeCart_search", $insertStr); } } } /* SPIFFING NEW SEARCH FUNCTIONALITY - Version 1.1 */ $indexes = $db->getFulltextIndex('inventory', 'I'); //array('inventory', 'inv_lang')); if (!empty($_REQUEST['priceMin']) && is_numeric($_REQUEST['priceMin'])) $where[] = sprintf("I.price >= %s", $_REQUEST['priceMin']); if (!empty($_REQUEST['priceMax']) && is_numeric($_REQUEST['priceMax'])) $where[] = sprintf("I.price <= %s", $_REQUEST['priceMax']); if (isset($_REQUEST['inStock'])) $where[] = "((I.useStockLevel = 0) OR (I.useStockLevel = 1 AND I.stock_level > 0))"; if (!empty($_REQUEST['category'])) { if (is_array($_REQUEST['category'])) { foreach ($_REQUEST['category'] as $cat_id) { if (is_numeric($cat_id)) $cats[] = $cat_id; } $where[] = sprintf("I.cat_id IN (%s)", implode(',', $cats)); } else if (is_numeric($_REQUEST['category'])) { $where[] = sprintf("I.cat_id = '%d'", $_REQUEST['category']); } } $where[] = "C.cat_id = I.cat_id"; $where[] = "C.hide = '0'"; $where[] = "(C.cat_desc != '##HIDDEN##' OR C.cat_desc IS NULL)"; $where[] = "I.disabled = '0'"; $whereString = sprintf('AND %s', implode(' AND ', $where)); if (is_array($indexes)) { sort($indexes); switch ($config['searchMode']) { case 'boolean': $mode = ' IN BOOLEAN MODE'; break; case 'expansion': $mode = ' WITH QUERY EXPANSION'; break; default: $mode = ''; } if (empty($orderSort)) { $orderSort = ' ORDER BY SearchScore DESC'; } //if (!empty($_REQUEST['searchStr'])) { if (isset($_REQUEST['searchStr'])) { $matchString = sprintf("MATCH (%s) AGAINST(%s%s)", implode(',', $indexes), $db->mySQLsafe($_REQUEST['searchStr']), $mode); $search = sprintf("SELECT DISTINCT(I.productId), I.*, %2\$s AS SearchScore FROM %1\$sCubeCart_inventory AS I, %1\$sCubeCart_category AS C WHERE (%2\$s) >= %4\$F AND C.cat_id > 0 %3\$s %5\$s", $glob['dbprefix'], $matchString, $whereString, 0.5, $orderSort); } else { $search = sprintf("SELECT DISTINCT(I.productId), I.* FROM %1\$sCubeCart_inventory AS I, %1\$sCubeCart_category AS C WHERE I.cat_id > 0 %2\$s %3\$s", $glob['dbprefix'], $whereString, $orderSort); } $productListQuery = $search; ## Moved into if to stop MySQL error on index failure $productResults = $db->select($productListQuery, $config['productPages'], $page); } ## FALLBACK - If search doesn't work, try the old v3 style search if (!$productResults) { if (!isset($searchArray)) { $searchwords = split ( "[ ,]", sanitizeVar($_REQUEST['searchStr'])); foreach ($searchwords as $word) { $searchArray[] = $word; } } $noKeys = count($searchArray); $like = ''; for ($i=0; $i<$noKeys; $i++) { ## Uppercase the search string $ucSearchTerm = strtoupper($searchArray[$i]); if (($ucSearchTerm !== 'AND') && ($ucSearchTerm !== 'OR')) { $like .= "(I.name LIKE '%".$searchArray[$i]."%' OR I.description LIKE '%".$searchArray[$i]."%' OR I.productCode LIKE '%".$searchArray[$i]."%') OR "; ## See if search term is in database /* Removed as it has already been counted above :-/ $searchQuery = "SELECT id FROM ".$glob['dbprefix']."CubeCart_search WHERE searchstr='".$ucSearchTerm."'"; $searchLogs = $db->select($searchQuery); $insertStr = array( 'searchstr' => $db->mySQLsafe($ucSearchTerm), 'hits' => 1, ); $updateStr = array( 'hits' => 'hits+1', ); if ($searchLogs) { $db->update($glob['dbprefix'].'CubeCart_search', $updateStr, 'id='.$searchLogs[0]['id'], ''); } else if (!empty($_REQUEST['searchStr'])) { $db->insert($glob['dbprefix'].'CubeCart_search', $insertStr); } */ } else { $like = substr($like, 0, strlen($like)-3); $like .= $ucSearchTerm; } } $like = substr($like, 0, strlen($like)-3); if (empty($orderSort) || strstr($orderSort, 'SearchScore')) $orderSort = sprintf(' ORDER BY name ASC'); $productListQuery = sprintf("SELECT DISTINCT(I.productId), I.*, I.name AS SearchScore FROM %1\$sCubeCart_inventory AS I, %1\$sCubeCart_category AS C WHERE %2\$s AND C.cat_id > 0 %3\$s ORDER BY %4\$s", $glob['dbprefix'], $like, $whereString, str_replace('ORDER BY', '', $orderSort)); $productResults = $db->select($productListQuery, $config['productPages'], $page); } } else if ($_GET['catId'] == 'saleItems' && $config['saleMode'] >= 1) { $productListQuery = sprintf("SELECT DISTINCT(I.productId), C.cat_id, I.productCode, I.quantity, I.description, I.image, I.price, I.name, I.popularity, I.sale_price, I.stock_level, I.useStockLevel FROM %1\$sCubeCart_cats_idx AS C INNER JOIN %1\$sCubeCart_inventory AS I ON C.productId = I.productId WHERE I.disabled = '0' AND I.sale_price != 0 AND C.cat_id > 0 GROUP BY I.productId %2\$s", $glob['dbprefix'], $orderSort); } else { $productListQuery = sprintf("SELECT DISTINCT(I.productId), C.cat_id, I.productCode, I.quantity, I.description, I.image, I.price, I.name, I.popularity, I.sale_price, I.stock_level, I.useStockLevel FROM %1\$sCubeCart_cats_idx AS C INNER JOIN %1\$sCubeCart_inventory AS I ON C.productId = I.productId WHERE I.disabled = '0' AND C.cat_id > 0 AND C.cat_id = '%2\$d' GROUP BY I.productId %3\$s", $glob['dbprefix'], $_GET['catId'], $orderSort); } ## Run query if we haven't already done a search if (!isset($productResults)) { $productResults = $db->select($productListQuery, $config['productPages'], $page); } ## Get different languages if ($productResults && LANG_FOLDER !== $config['defaultLang']) { for ($i=0;$inumrows($productListQuery); ## Get current category info if (isset($_GET['catId'])) { if ($config['seftags']) { if ($_GET['catId']>0) { $currentCatQuery = "SELECT cat_metatitle, cat_metadesc, cat_metakeywords, cat_name, cat_father_id, cat_id, cat_image, cat_desc FROM ".$glob['dbprefix']."CubeCart_category WHERE cat_id = ".$db->mySQLSafe($_GET['catId'])." ORDER BY priority,cat_name ASC"; $currentCat = $db->select($currentCatQuery); $prevDirSymbol = $config['dirSymbol']; $config['dirSymbol'] = ' - '; $meta['siteTitle'] = getCatDir($currentCat[0]['cat_name'],$currentCat[0]['cat_father_id'], $currentCat[0]['cat_id'], false, true, $config['sefprodnamefirst'] ? FALSE : TRUE); $config['dirSymbol'] = $prevDirSymbol; $meta['metaDescription'] = strip_tags($config['metaDescription']); $meta['sefSiteTitle'] = $currentCat[0]['cat_metatitle']; $meta['sefSiteDesc'] = $currentCat[0]['cat_metadesc']; $meta['sefSiteKeywords'] = $currentCat[0]['cat_metakeywords']; } else if (strcmp($_GET['catId'], "saleItems") == 0) { $meta['siteTitle'] = $lang['front']['boxes']['sale_items']; $meta['metaDescription'] = strip_tags($config['metaDescription']); } } else if (is_numeric($_GET['catId'])) { $currentCatQuery = "SELECT cat_name, cat_father_id, cat_id, cat_image, cat_desc FROM ".$glob['dbprefix']."CubeCart_category WHERE cat_id = ".$db->mySQLSafe($_GET['catId'])." AND (cat_desc != '##HIDDEN##' OR cat_desc IS NULL) ORDER BY priority,cat_name ASC"; $currentCat = $db->select($currentCatQuery); } # Get translations $resultForeign = $db->select("SELECT cat_master_id as cat_id, cat_name, cat_desc FROM ".$glob['dbprefix']."CubeCart_cats_lang WHERE cat_lang = '".LANG_FOLDER."' AND cat_master_id = ".$db->mySQLSafe($_GET['catId'])); if ($resultForeign) { $currentCat[0]['cat_name'] = $resultForeign[0]['cat_name']; $currentCat[0]['cat_desc'] = $resultForeign[0]['cat_desc']; } } if (!empty($currentCat[0]['cat_image'])) { $view_cat->assign("IMG_CURENT_CATEGORY", imgPath($currentCat[0]['cat_image'], false, 'rel')); $view_cat->assign("TXT_CURENT_CATEGORY", validHTML($currentCat[0]['cat_name'])); $view_cat->parse("view_cat.cat_img"); } if (isset($_REQUEST['searchStr']) || isset($_REQUEST['priceMin']) || isset($_REQUEST['priceMax'])) { $view_cat->assign("TXT_CAT_TITLE", $lang['viewCat']['search_results']); $view_cat->assign("CURRENT_LOC", $config['dirSymbol'].$lang['viewCat']['search_results']); } else if ($_GET['catId']=="saleItems" && $config['saleMode']>0) { $view_cat->assign("TXT_CAT_TITLE", $lang['viewCat']['sale_items']); $view_cat->assign("CURRENT_LOC", $config['dirSymbol'].$lang['viewCat']['sale_items']); } else { $view_cat->assign("TXT_CAT_TITLE", validHTML($currentCat[0]['cat_name'])); $view_cat->assign("CURRENT_LOC", getCatDir($currentCat[0]['cat_name'], $currentCat[0]['cat_father_id'], $currentCat[0]['cat_id'], true)); } if (!empty($currentCat[0]['cat_desc'])) { $view_cat->assign("TXT_CAT_DESC", $currentCat[0]['cat_desc']); $view_cat->parse("view_cat.cat_desc"); } $view_cat->assign("LANG_IMAGE", $lang['viewCat']['image']); $view_cat->assign("LANG_DESC", $lang['viewCat']['description']); $view_cat->assign("LANG_NAME", $lang['viewCat']['name']); $view_cat->assign("LANG_PRICE", $lang['viewCat']['price']); $view_cat->assign("LANG_DATE", $lang['viewCat']['date_added']); $pagination = paginate($totalNoProducts, $config['productPages'], $page, 'page', 'txtLink', 5, array('Submit' => 1)); if (!empty($pagination)) { $view_cat->assign("PAGINATION", $pagination); $view_cat->parse("view_cat.pagination_top"); $view_cat->parse("view_cat.pagination_bot"); } ## create the links for product sorting - need improving later $sort_order = (!isset($_GET['sort_order']) || $_GET['sort_order'] == 'high') ? 'low' : 'high'; switch($_GET['sort_by']) { case 'name': $view_cat->assign('SORT_NAME_SELECTED', ' selected="selected"'); break; case 'price': $view_cat->assign('SORT_PRICE_SELECTED', ' selected="selected"'); break; case 'date_added': $view_cat->assign('SORT_PRICE_SELECTED', ' selected="selected"'); break; } # $view_cat->assign('SORT_DIRECTION_TEXT', $orderText); unset($_GET['sort_by'], $_GET['sort_order']); $currPage = currentPage(); if ($config['sef']) { $currPage = '?'; } $sortTypes = array( 'SORT_PROD_CODE'=> 'productCode', 'SORT_PRICE' => 'price', 'SORT_DESC' => 'description', 'SORT_NAME' => 'name', 'SORT_DATE' => 'date_added', ); $queryString = parse_url(html_entity_decode(currentPage()), PHP_URL_QUERY); parse_str($queryString, $currentQuery); //ksort($currentQuery); REMOVED AS _a first invokes SEO which we don't want on pagiation foreach ($sortTypes as $assign_key => $field) { $currentQuery['sort_by'] = $field; $currentQuery['sort_order'] = $sort_order; // str_replace is a hack to fix pagination seo rewrite $view_cat->assign($assign_key, $currPage.http_build_query($currentQuery, '', '&')); } #$view_cat->assign('SORT_PROD_CODE', $currPage."&sort_by=productCode&sort_order=".$sort_order); #$view_cat->assign('SORT_PRICE', $currPage."&sort_by=price&sort_order=".$sort_order); #$view_cat->assign('SORT_DESC', $currPage."&sort_by=description&sort_order=".$sort_order); #$view_cat->assign('SORT_NAME', $currPage."&sort_by=name&sort_order=".$sort_order); #$view_cat->assign('SORT_DATE', $currPage."&sort_by=date_added&sort_order=".$sort_order); if (!empty($sortIcon) && file_exists('skins'.CC_DS.SKIN_FOLDER.CC_DS.'styleImages'.CC_DS.'icons'.CC_DS.$sortIcon)) { $view_cat->assign('SORT_ICON', sprintf('', 'skins'.CC_DS.SKIN_FOLDER.CC_DS.'styleImages'.CC_DS.'icons'.CC_DS.$sortIcon)); } ## repeated region if ($productResults) { for ($i=0; $iassign("CLASS", cellColor($i, "tdEven", "tdOdd")); $thumbRoot = imgPath($productResults[$i]['image'], true, 'root'); $thumbRootRel = imgPath($productResults[$i]['image'], true, 'rel'); if (file_exists($thumbRoot)) { $view_cat->assign("SRC_PROD_THUMB", $thumbRootRel); } else { $view_cat->assign("SRC_PROD_THUMB", $GLOBALS['rootRel']."skins/". SKIN_FOLDER . "/styleImages/thumb_nophoto.gif"); } $view_cat->assign("TXT_TITLE", validHTML(stripslashes($productResults[$i]['name']))); if (strlen($productResults[$i]['description']) > $config['productPrecis']) { $view_cat->assign("TXT_DESC", substr(strip_tags($productResults[$i]['description']), 0, $config['productPrecis'])."…"); } else { $view_cat->assign("TXT_DESC", $productResults[$i]['description']); } if (salePrice($productResults[$i]['price'], $productResults[$i]['sale_price']) == false) { $view_cat->assign("TXT_PRICE", priceFormat($productResults[$i]['price'], true)); $view_cat->assign("TXT_SALE_PRICE", ''); } else { $view_cat->assign("TXT_PRICE","".priceFormat($productResults[$i]['price'], true).""); $salePrice = salePrice($productResults[$i]['price'], $productResults[$i]['sale_price']); $view_cat->assign("TXT_SALE_PRICE", priceFormat($salePrice, true)); } if (isset($_GET['add']) && isset($_GET['quan'])) { $view_cat->assign("CURRENT_URL", str_replace(array("&add=".$_GET['add'], "&quan=".$_GET['quan']), '', currentPage())); } else { $view_cat->assign("CURRENT_URL", currentPage()); } if ($config['outofstockPurchase'] == true) { $view_cat->assign("BTN_BUY", $lang['viewCat']['buy']); $view_cat->assign("PRODUCT_ID", $productResults[$i]['productId']); $view_cat->parse("view_cat.productTable.products.buy_btn"); } else if ($productResults[$i]['useStockLevel'] == true && $productResults[$i]['stock_level']>0) { $view_cat->assign("BTN_BUY", $lang['viewCat']['buy']); $view_cat->assign("PRODUCT_ID", $productResults[$i]['productId']); $view_cat->parse("view_cat.productTable.products.buy_btn"); } else if ($productResults[$i]['useStockLevel'] == false) { $view_cat->assign("BTN_BUY", $lang['viewCat']['buy']); $view_cat->assign("PRODUCT_ID", $productResults[$i]['productId']); $view_cat->parse("view_cat.productTable.products.buy_btn"); } $view_cat->assign("BTN_MORE", $lang['viewCat']['more']); $view_cat->assign("PRODUCT_ID", $productResults[$i]['productId']); if ($productResults[$i]['stock_level']<1 && $productResults[$i]['useStockLevel'] == true && $productResults[$i]['digital'] == false) { $view_cat->assign("TXT_OUTOFSTOCK", $lang['viewCat']['out_of_stock']); } else { $view_cat->assign("TXT_OUTOFSTOCK", ''); } $view_cat->parse("view_cat.productTable.products"); } } $view_cat->assign("LANG_SORT", $lang['viewCat']['sort']); $view_cat->parse("view_cat.productTable"); } else if (!$productResults && isset($_REQUEST['searchStr'])) { $view_cat->assign("TXT_NO_PRODUCTS", sprintf($lang['viewCat']['no_products_match'], sanitizeVar($_REQUEST['searchStr']))); $view_cat->parse("view_cat.noProducts"); } else { $view_cat->assign("TXT_NO_PRODUCTS", $lang['viewCat']['no_prods_in_cat']); $view_cat->parse("view_cat.noProducts"); } $view_cat->parse("view_cat"); $page_content = $view_cat->text("view_cat"); ?>