Code:
<?php
if ( !defined('XCART_START') ) { header("Location: ../"); die("Access denied"); }
#
# Search for products in products database
#
function func_search_random_products($query, $membershipid, $limit="") {
global $current_area, $user_account, $active_modules, $xcart_dir, $current_location, $single_mode;
global $store_language, $sql_tbl;
global $config;
global $cart, $login;
global $active_modules;
x_load('files','taxes');
#
# Initialize service arrays
#
$fields = array();
$from_tbls = array();
$inner_joins = array();
$left_joins = array();
$where = array();
$groupbys = array();
#
# Generate membershipid condition
#
$membershipid_condition = "";
$membershipid_string = ($membershipid == 0 || empty($active_modules['Wholesale_Trading'])) ? "= 0" : "IN ('$membershipid', 0)";
if ($current_area == "C") {
$where[] = "($sql_tbl[category_memberships].membershipid = '$membershipid' OR $sql_tbl[category_memberships].membershipid IS NULL)";
$where[] = "$sql_tbl[products].forsale='Y'";
$where[] = "($sql_tbl[product_memberships].membershipid = '$membershipid' OR $sql_tbl[product_memberships].membershipid IS NULL)";
}
#
# Generate products availability condition
#
if ($config["General"]["unlimited_products"]=="N" && (($current_area == "C" || $current_area == "B") && $config["General"]["disable_outofstock_products"] == "Y"))
$where[] = "$sql_tbl[products].avail > 0";
$from_tbls[] = "pricing";
$inner_joins = array(
"products_categories" => array(
"on" => "$sql_tbl[products_categories].productid = $sql_tbl[products].productid",
),
"categories" => array(
"on" => "$sql_tbl[categories].categoryid = $sql_tbl[products_categories].categoryid AND $sql_tbl[categories].avail = 'Y'",
)
);
$left_joins = array();
$fields[] = "$sql_tbl[products].productid";
if ($current_area == "C") {
$left_joins["products_lng"] = array(
"on" => "$sql_tbl[products].productid = $sql_tbl[products_lng].productid AND code = '$store_language'"
);
$fields[] = "IF($sql_tbl[products_lng].productid != '', $sql_tbl[products_lng].product, $sql_tbl[products].product) as product";
} else {
$fields[] = "$sql_tbl[products].product";
}
$fields[] = "$sql_tbl[products].productcode";
$fields[] = "$sql_tbl[products].avail";
$fields[] = "$sql_tbl[products].descr";
$fields[] = "$sql_tbl[products].min_amount";
$fields[] = "$sql_tbl[products].list_price";
if ($current_area != 'C') {
$fields[] = "MIN($sql_tbl[pricing].price) as price";
} else {
$fields[] = "$sql_tbl[pricing].price";
$left_joins['quick_prices'] = array(
"on" => "$sql_tbl[quick_prices].productid = $sql_tbl[products].productid AND $sql_tbl[quick_prices].membershipid $membershipid_string"
);
$where[] = "$sql_tbl[quick_prices].priceid = $sql_tbl[pricing].priceid";
}
if ($current_area == "C" && !$single_mode) {
$inner_joins["ACHECK"] = array(
"tblname" => "customers",
"on" => "$sql_tbl[products].provider=ACHECK.login AND ACHECK.activity='Y'",
);
}
$left_joins['category_memberships'] = array(
"on" => "$sql_tbl[category_memberships].categoryid = $sql_tbl[categories].categoryid",
"parent" => "categories"
);
$left_joins['product_memberships'] = array(
"on" => "$sql_tbl[product_memberships].productid = $sql_tbl[products].productid"
);
$where[] = "$sql_tbl[products].productid = $sql_tbl[products_categories].productid";
$where[] = "$sql_tbl[products_categories].categoryid = $sql_tbl[categories].categoryid";
$where[] = "$sql_tbl[products].productid = $sql_tbl[pricing].productid";
$where[] = "$sql_tbl[pricing].quantity = '1'";
if (empty($membershipid)) {
$where[] = "$sql_tbl[pricing].membershipid = 0";
} else {
$where[] = "$sql_tbl[pricing].membershipid IN ('$membershipid', 0)";
}
if ($current_area == 'C' && empty($active_modules['Product_Configurator'])) {
$where[] = "$sql_tbl[products].product_type <> 'C'";
$where[] = "$sql_tbl[products].forsale <> 'B'";
}
if ($current_area == 'C' && !empty($active_modules['Product_Options'])) {
$where[] = "($sql_tbl[pricing].variantid = 0 OR ($sql_tbl[variants].variantid = $sql_tbl[pricing].variantid".(($config["General"]["disable_outofstock_products"] == "Y" && $config["General"]["unlimited_products"] != "Y")?" AND $sql_tbl[variants].avail > 0":"")."))";
}
else {
$where[] = "$sql_tbl[pricing].variantid = '0'";
}
$groupbys[] = "$sql_tbl[products].productid";
#
# Check if product have prodyct class (Feature comparison)
#
if (!empty($active_modules['Feature_Comparison']) && $current_area == "C") {
global $comparison_list_ids;
$left_joins['product_features'] = array(
"on" => "$sql_tbl[product_features].productid = $sql_tbl[products].productid"
);
$fields[] = "$sql_tbl[product_features].fclassid";
if (($config['Feature_Comparison']['fcomparison_show_product_list'] == 'Y') && $config['Feature_Comparison']['fcomparison_max_product_list'] > @count((array)$comparison_list_ids)) {
$fields[] = "IF($sql_tbl[product_features].fclassid IS NULL || $sql_tbl[product_features].productid IN ('".@implode("','",@array_keys((array)$comparison_list_ids))."'),'','Y') as is_clist";
}
}
#
# Check if product have product options (Product options)
#
if (!empty($active_modules['Product_Options'])) {
$left_joins['classes'] = array(
"on" => "$sql_tbl[classes].productid = $sql_tbl[products].productid"
);
if ($current_area == 'C') {
$left_joins['variants'] = array(
"on" => "$sql_tbl[variants].productid = $sql_tbl[products].productid AND $sql_tbl[quick_prices].variantid = $sql_tbl[variants].variantid",
);
$fields[] = "$sql_tbl[quick_prices].variantid";
global $variant_properties;
foreach ($variant_properties as $property) {
$fields[] = "IFNULL($sql_tbl[variants].$property, $sql_tbl[products].$property) as ".$property;
}
} else {
$left_joins['variants'] = array(
"on" => "$sql_tbl[variants].productid = $sql_tbl[products].productid",
);
}
$fields[] = "IF($sql_tbl[classes].classid IS NULL,'','Y') as is_product_options";
$fields[] = "IF($sql_tbl[variants].variantid IS NULL,'','Y') as is_variant";
}
if ($config['setup_images']['T']['location'] == "FS") {
$left_joins['images_T'] = array(
"on" => "$sql_tbl[images_T].id = $sql_tbl[products].productid"
);
$fields[] = "IF($sql_tbl[images_T].id IS NULL, '', 'Y') as is_thumbnail";
$fields[] = "$sql_tbl[images_T].image_path";
}
if ($current_area == "C") {
$left_joins['product_taxes'] = array(
"on" => "$sql_tbl[product_taxes].productid = $sql_tbl[products].productid"
);
$fields[] = "$sql_tbl[product_taxes].taxid";
}
#
# Generate search query
#
foreach ($inner_joins as $j) {
if (!empty($j['fields']) && is_array($j['fields']))
$fields = func_array_merge($fields, $j['fields']);
}
foreach ($left_joins as $j) {
if (!empty($j['fields']) && is_array($j['fields']))
$fields = func_array_merge($fields, $j['fields']);
}
$search_query = "SELECT ".implode(", ", $fields)." FROM ";
if (!empty($from_tbls)) {
foreach ($from_tbls as $k => $v) {
$from_tbls[$k] = $sql_tbl[$v];
}
$search_query .= implode(", ", $from_tbls).", ";
}
$search_query .= $sql_tbl['products'];
foreach ($left_joins as $ljname => $lj) {
if (!empty($lj['parent']))
continue;
$search_query .= " LEFT JOIN ";
if (!empty($lj['tblname'])) {
$search_query .= $sql_tbl[$lj['tblname']]." as ".$ljname;
} else {
$search_query .= $sql_tbl[$ljname];
}
$search_query .= " ON ".$lj['on'];
}
foreach ($inner_joins as $ijname => $ij) {
$search_query .= " INNER JOIN ";
if (!empty($ij['tblname'])) {
$search_query .= $sql_tbl[$ij['tblname']]." as ".$ijname;
} else {
$search_query .= $sql_tbl[$ijname];
}
$search_query .= " ON ".$ij['on'];
foreach ($left_joins as $ljname => $lj) {
if ($lj['parent'] != $ijname)
continue;
$search_query .= " LEFT JOIN ";
if (!empty($lj['tblname'])) {
$search_query .= $sql_tbl[$lj['tblname']]." as ".$ljname;
} else {
$search_query .= $sql_tbl[$ljname];
}
$search_query .= " ON ".$lj['on'];
}
}
$search_query .= " WHERE ".implode(" AND ", $where).$query;
if (!empty($groupbys))
$search_query .= " GROUP BY ".implode(", ", $groupbys);
$limit = max(intval($limit), 0);
if (!empty($limit))
$search_query .= " LIMIT ".$limit;
db_query("SET OPTION SQL_BIG_SELECTS=1");
$result = func_query($search_query);
$ids = array();
if (!empty($result)) {
foreach($result as $v) {
$ids[] = $v['productid'];
}
}
if ($result && ($current_area=="C" || $current_area=="B") ) {
#
# Post-process the result products array
#
if (!empty($active_modules['Extra_Fields'])) {
$tmp = func_query("SELECT *, IF($sql_tbl[extra_fields_lng].field != '', $sql_tbl[extra_fields_lng].field, $sql_tbl[extra_fields].field) as field FROM $sql_tbl[extra_field_values], $sql_tbl[extra_fields] LEFT JOIN $sql_tbl[extra_fields_lng] ON $sql_tbl[extra_fields].fieldid = $sql_tbl[extra_fields_lng].fieldid AND $sql_tbl[extra_fields_lng].code = '$shop_language' WHERE $sql_tbl[extra_fields].fieldid = $sql_tbl[extra_field_values].fieldid AND $sql_tbl[extra_field_values].productid IN ('".implode("','", $ids)."') AND $sql_tbl[extra_fields].active = 'Y'");
$products_ef = array();
if (!empty($tmp) && is_array($tmp)) {
foreach($tmp as $v) {
$products_ef[$v['productid']][] = $v;
}
}
}
if (!empty($active_modules['Product_Options']) && !empty($ids)) {
$options_markups = func_get_default_options_markup_list($ids);
}