250 lines
12 KiB
PHP
250 lines
12 KiB
PHP
<?php require $_SERVER['DOCUMENT_ROOT'].'/api/private/core.php';
|
|
|
|
use pizzaboxer\ProjectPolygon\Database;
|
|
use pizzaboxer\ProjectPolygon\Users;
|
|
use pizzaboxer\ProjectPolygon\Polygon;
|
|
use pizzaboxer\ProjectPolygon\Catalog;
|
|
use pizzaboxer\ProjectPolygon\Thumbnails;
|
|
use pizzaboxer\ProjectPolygon\PageBuilder;
|
|
|
|
Users::RequireLogin();
|
|
|
|
// this is a catastrophe
|
|
|
|
$cats =
|
|
[
|
|
1 => ["name" => "All Categories", "price" => true],
|
|
3 => ["name" => "Clothing", "subcategories" => [8, 11, 2, 12], "price" => true],
|
|
4 => ["name" => "Body Parts", "subcategories" => [17, 18], "price" => true],
|
|
5 => ["name" => "Gear", "type" => 19, "price" => true],
|
|
6 => ["name" => "Models", "type" => 10, "price" => false],
|
|
8 => ["name" => "Decals", "type" => 13, "price" => false],
|
|
9 => ["name" => "Audio", "type" => 3, "price" => false],
|
|
];
|
|
|
|
$sorts =
|
|
[
|
|
0 => "sales DESC",
|
|
1 => "updated DESC",
|
|
2 => "price DESC",
|
|
3 => "price"
|
|
];
|
|
|
|
function getUrl($strings)
|
|
{
|
|
global $cat, $subcat;
|
|
$url = "?";
|
|
if($subcat) $url .= "Subcategory=".$subcat."&";
|
|
$url .= "CurrencyType=%currency%&SortType=%sort%&Category=".$cat;
|
|
|
|
return str_replace(["%currency%", "%sort%"], $strings, $url);
|
|
}
|
|
|
|
$cat = $_GET['Category'] ?? 3;
|
|
$subcat = $_GET['Subcategory'] ?? false;
|
|
$keyword = $_GET['Keyword'] ?? "";
|
|
$currency = $_GET['CurrencyType'] ?? 0;
|
|
$sort = $_GET['SortType'] ?? 1;
|
|
$page = $_GET['PageNumber'] ?? 1;
|
|
|
|
if($cat == 3 && !isset($_GET['Category']))
|
|
$subcat = 8;
|
|
|
|
if(!isset($cats[$cat]))
|
|
die(header("Location: /catalog"));
|
|
|
|
if($subcat && ($cat == 1 || isset($cats[$cat]["type"]) || !is_numeric($subcat) || !in_array($subcat, $cats[$cat]["subcategories"])))
|
|
die(header("Location: /catalog?Category=".$cat));
|
|
|
|
if(!in_array($currency, [0, 1, 2]))
|
|
die(header("Location: ".getUrl([0, $sort])));
|
|
|
|
if(!isset($sorts[$sort]))
|
|
die(header("Location: ".getUrl([$currency, 0])));
|
|
|
|
$queryparam = "";
|
|
$type = $subcat ?: $cats[$cat]["type"] ?? 2;
|
|
|
|
// adding "is not null" fetches the item even if the price is 0
|
|
$unavailable = isset($_GET['IncludeNotForSale']) && $_GET['IncludeNotForSale'] == "true";
|
|
if($unavailable) $queryparam .= "IS NOT NULL ";
|
|
|
|
// process query parameters for the item type
|
|
$queryparam .= "AND type";
|
|
if($cat == 1) $queryparam .= " IN (2, 3, 8, 10, 11, 12, 13, 17, 18, 19)";
|
|
elseif(isset($cats[$cat]["type"]) || $subcat) $queryparam .= " = ".($cats[$cat]["type"] ?? $subcat);
|
|
else $queryparam .= " IN (".implode(", ", $cats[$cat]["subcategories"]).")";
|
|
|
|
// process query parameters for the item price
|
|
$queryparam .= " AND price";
|
|
if(is_numeric($currency) && $currency == 0) $queryparam .= " IS NOT NULL";
|
|
elseif($currency == 2) $queryparam .= " = 0";
|
|
|
|
// get the number of assets matching the query
|
|
$results = Database::singleton()->run(
|
|
"SELECT COUNT(*) FROM assets WHERE type != 1 AND name LIKE :keywd AND approved != 2 AND sale $queryparam",
|
|
[":keywd" => "%{$keyword}%"]
|
|
)->fetchColumn();
|
|
|
|
$pagination = Pagination($page, $results, 18);
|
|
|
|
$query = Database::singleton()->run(
|
|
"SELECT assets.*, users.username FROM assets
|
|
INNER JOIN users ON creator = users.id
|
|
WHERE type != 1 AND name LIKE :keywd AND approved != 2 AND sale $queryparam
|
|
ORDER BY ".$sorts[$sort]." LIMIT 18 OFFSET :offset",
|
|
[":keywd" => "%{$keyword}%", ":offset" => $pagination->Offset]
|
|
);
|
|
|
|
$pageBuilder = new PageBuilder(["title" => "Avatar Items, Virtual Avatars, Virtual Goods"]);
|
|
$pageBuilder->addResource("polygonScripts", "/js/polygon/catalog.js");
|
|
$pageBuilder->buildHeader();
|
|
?>
|
|
<script>
|
|
polygon.catalog =
|
|
{
|
|
PageNumber: <?=isset($_GET['PageNumber']) ? $page : "null"?>,
|
|
Subcategory: <?=$subcat ?: "null"?>,
|
|
Category: <?=$cat?>,
|
|
Keyword: <?='"'.urlencode($keyword).'"' ?: "null"?>,
|
|
CurrencyType: <?=$currency?>,
|
|
SortType: <?=$sort?>,
|
|
IncludeNotForSale: <?=$unavailable ? "true" : "null"?>,
|
|
};
|
|
</script>
|
|
<div class="row">
|
|
<div class="col-xl-2 col-lg-3 col-md-3">
|
|
<h2 class="font-weight-normal">Catalog</h2>
|
|
</div>
|
|
<div class="col-xl-10 col-lg-9 col-md-9">
|
|
<div class="input-group CatalogSearchBar">
|
|
<input type="text" class="form-control mb-2 keywordTextbox" value="<?=htmlspecialchars($keyword)?>" placeholder="Search...">
|
|
<div class="input-group-append">
|
|
<select class="form-control mb-2 categoriesForKeyword rounded-0" style="width:auto">
|
|
<?php if(isset($cats[$cat]["subcategories"]) && $subcat) { ?>
|
|
<option value="Custom" selected="selected"><?=plural(Catalog::GetTypeByNum($type))?></option>
|
|
<?php } foreach($cats as $cat_id => $cat_data) { ?>
|
|
<option value="<?=$cat_id?>"<?=!isset($_GET['Subcategory']) && $cat==$cat_id?' selected':''?>><?=$cat_data["name"]?></option>
|
|
<?php } ?>
|
|
</select>
|
|
<button class="btn btn-light mb-2 submitSearchButton"><i class="far fa-search"></i></button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row mt-3">
|
|
<div class="col-xl-2 col-lg-3 col-md-3 pb-4 pl-3 pr-0 divider-right">
|
|
<div class="dropdown show mr-3 mb-4">
|
|
<a class="btn btn-secondary btn-block text-left"<?=isset($_GET['Category'])?' href="#" role="button" id="browseByCategory" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"':''?>>
|
|
<h5 class="font-weight-normal m-0">Category <i class="mt-1 ml-2 mr-1 fas fa-caret-down float-right"></i></h5>
|
|
</a>
|
|
<div class="bg-cardpanel dropdown-menu w-100<?=!isset($_GET['Category'])?' d-block':''?>" style="min-width:5rem;<?=!isset($_GET['Category'])?'position:relative;':''?>" aria-labelledby="browseByCategory">
|
|
<?php foreach($cats as $dropdown_id => $dropdown_cat) { ?>
|
|
<a href="#category=<?=strtolower(str_replace(' ', '', $dropdown_cat["name"]))?>" class="dropdown-item assetTypeFilter" data-category="<?=$dropdown_id?>"><?=$dropdown_cat["name"]?></a>
|
|
<?php } ?>
|
|
</div>
|
|
</div>
|
|
<?php if(isset($_GET['Category'])) { ?>
|
|
<h3 class="font-weight-normal pb-0">Filters</h3>
|
|
<div class="filters mt-1">
|
|
<?php if(strlen($keyword)) { ?>
|
|
<h6 class="ml-2 font-weight-normal mb-1">Category</h6>
|
|
<div class="ml-3 filter-category">
|
|
<?php if(isset($cats[$cat]["subcategories"]) && $subcat) { ?>
|
|
<p class="m-0"><?=plural(Catalog::GetTypeByNum($type))?></p>
|
|
<?php } foreach($cats as $cat_id => $cat_data) { ?>
|
|
<p class="m-0"><a href="#category=<?=$cat_data["name"]?>" class="assetTypeFilter<?=$cat==$cat_id?' text-dark text-decoration-none':''?>" data-keepfilters="true" data-category="<?=$cat_id?>"><?=$cat_data["name"]?></a></p>
|
|
<?php } ?>
|
|
</div>
|
|
<div class="divider-bottom my-3"></div>
|
|
<?php } elseif(isset($cats[$cat]["subcategories"])) { ?>
|
|
<h6 class="ml-2 font-weight-normal mb-1"><?=$cats[$cat]["name"]?> Type</h6>
|
|
<div class="ml-3 filter-subcategory">
|
|
<p class="m-0"><a href="#category=All <?=$cats[$cat]["name"]?>" class="assetTypeFilter<?=!$subcat?' text-dark text-decoration-none':''?>" data-types="3">All <?=$cats[$cat]["name"]?></a></p>
|
|
<?php foreach($cats[$cat]["subcategories"] as $cat_id) { ?>
|
|
<p class="m-0"><a href="#category=<?=plural(Catalog::GetTypeByNum($cat_id))?>" class="assetTypeFilter<?=$subcat==$cat_id?' text-dark text-decoration-none':''?>" data-types="<?=$cat_id?>"><?=plural(Catalog::GetTypeByNum($cat_id))?></a></p>
|
|
<?php } ?>
|
|
</div>
|
|
<div class="divider-bottom my-3"></div>
|
|
<?php } ?>
|
|
<h6 class="ml-2 font-weight-normal mb-1">Currency / Price</h6>
|
|
<div class="ml-3 filter-clothing-type">
|
|
<p class="m-0"><a href="#price=0" class="priceFilter<?=$currency==0?' text-dark text-decoration-none':''?>" data-currencytype="0">All Currency</a></p>
|
|
<?php if($cats[$cat]["price"]){ ?>
|
|
<p class="m-0"><a href="#price=1"class="priceFilter<?=$currency==1?' text-dark text-decoration-none':''?>" data-currencytype="1">Pizzas</a></p>
|
|
<?php } ?>
|
|
<p class="m-0"><a href="#price=2" class="priceFilter<?=$currency==2?' text-dark text-decoration-none':''?>" data-currencytype="2">Free</a></p>
|
|
<div class="form-check">
|
|
<input type="checkbox" class=" form-check-input" id="includeNotForSaleCheckbox"<?=$unavailable?' checked="checked"':''?>>
|
|
<label class="form-check-label col-form-label-sm pt-0" for="includeNotForSaleCheckbox">Show off-sale items</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php } ?>
|
|
</div>
|
|
<div class="col-xl-10 col-lg-9 col-md-9 p-0 pl-3 pr-4">
|
|
<nav aria-label="breadcrumb">
|
|
<ol class="breadcrumb p-0 m-0" style="background-color:transparent">
|
|
<?php if(!$subcat || isset($cats[$cat]["type"])) { ?>
|
|
<li class="breadcrumb-item text-dark active"><?=$cats[$cat]["name"]?></li>
|
|
<?php } else { ?>
|
|
<li class="breadcrumb-item text-dark"><a href="?SortType=1&SortCurrency=0&Category=<?=$cat?>"><?=$cats[$cat]["name"]?></a></li>
|
|
<li class="breadcrumb-item text-dark active"><?=plural(Catalog::GetTypeByNum($type))?></li>
|
|
<?php } ?>
|
|
</ol>
|
|
</nav>
|
|
<div class="catalog-container">
|
|
<?php if($query->rowCount()) { ?>
|
|
<div class="row">
|
|
<div class="col-xl-9 col-lg-8 col-md-6">
|
|
<p>Showing <?=number_format($pagination->Offset+1)?> - <?=number_format($pagination->Offset+$query->rowCount())?> of <?=number_format($results)?> results</p>
|
|
</div>
|
|
<div class="col-xl-3 col-lg-4 col-md-6 pr-2 mb-2 d-flex">
|
|
<label class="form-label form-label-sm" for="sortBy" style="width:6rem;">Sort by: </label>
|
|
<select class="Sort form-control form-control-sm" id="sortBy">
|
|
<option value="0"<?=$sort==0?' selected="selected"':''?>>Bestselling</option>
|
|
<option value="1"<?=$sort==1?' selected="selected"':''?>>Recently updated</option>
|
|
<option value="2"<?=$sort==2?' selected="selected"':''?>>Price (High to Low)</option>
|
|
<option value="3"<?=$sort==3?' selected="selected"':''?>>Price (Low to High)</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
<?php } else { ?>
|
|
<p class="text-center">No results matched your criteria</p>
|
|
<?php } ?>
|
|
<div class="items row pl-2">
|
|
<?php while($item = $query->fetch(\PDO::FETCH_OBJ)) { ?>
|
|
<div class="item col-xl-2 col-lg-3 col-md-3 col-sm-4 col-6 pb-3 px-2" style="line-height:normal">
|
|
<div class="card info hover">
|
|
<a href="/<?=encode_asset_name($item->name)?>-item?id=<?=$item->id?>"><img src="<?=Thumbnails::GetStatus("rendering")?>" data-src="<?=Thumbnails::GetAsset($item)?>" class="card-img-top img-fluid p-2" title="<?=Polygon::FilterText($item->name)?>" alt="<?=Polygon::FilterText($item->name)?>"></a>
|
|
<div class="card-body p-2">
|
|
<p class="text-truncate m-0" title="<?=Polygon::FilterText($item->name)?>"><a href="/<?=encode_asset_name($item->name)?>-item?id=<?=$item->id?>" style="color:inherit"><?=Polygon::FilterText($item->name)?></a></p>
|
|
<?php if($item->sale) { ?><p class="m-0 text-success"><?=$item->price ? '<i class="fal fa-pizza-slice"></i> '.number_format($item->price):'Free'?></p><?php } ?>
|
|
</div>
|
|
</div>
|
|
<div class="details-wrapper">
|
|
<div class="card details d-none">
|
|
<div class="card-body pt-0 px-2 pb-2">
|
|
<p class="text-truncate m-0"><small class="text-muted">Creator: <a href="/user?ID=<?=$item->creator?>"><?=$item->username?></a></small></p>
|
|
<p class="text-truncate m-0"><small class="text-muted">Updated: <span class="text-dark"><?=timeSince($item->updated)?></span></small></p>
|
|
<p class="text-truncate m-0"><small class="text-muted">Sales: <span class="text-dark"><?=number_format($item->Sales)?></span></small></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php } ?>
|
|
</div>
|
|
<?php if($pagination->Pages > 1) { ?>
|
|
<div class="pagination form-inline justify-content-center">
|
|
<button type="button" class="btn btn-light mx-3 back"<?=$page<=1?' disabled':''?>><h5 class="mb-0"><i class="fal fa-caret-left"></i></h5></button>
|
|
<span>Page</span>
|
|
<input class="form-control form-control-sm text-center mx-1 page" type="text" style="width:30px" value="<?=$page?>">
|
|
<span>of <?=$pagination->Pages?></span>
|
|
<button type="button" class="btn btn-light mx-3 next"<?=$page>=$pagination->Pages?' disabled':''?>><h5 class="mb-0"><i class="fal fa-caret-right"></i></h5></button>
|
|
</div>
|
|
<?php } ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<?php $pageBuilder->buildFooter(); ?>
|