<?php
namespace Klaravik\includes;
use Klaravik\Breadcrumb\Breadcrumb;
use Klaravik\Category\Cache\CategoryCache;
use Klaravik\Category\Cache\Model\CacheCategory;
use Klaravik\Category\Cache\SearchCategoryCache;
use Klaravik\Common\Formatter\StringFormatter;
use Klaravik\Enum\ReservePriceStatusEnum;
use Klaravik\Exception\CategoryCacheException;
use Klaravik\Logger\PageListLogger;
use Klaravik\Translate\Trans;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class PageListPartials
{
private $url = '';
private $pages = 1;
private $page = 1;
private $sortflag = null;
private $perpage = null;
private $sessionVarName = '';
private $showClosed = false;
private $activeCounties = array();
private $activeMunicipalities = array();
private $totalNbrMatchedObjects = 0;
private $searchText = null;
private $formUrl = null;
private $searchFormUrl = null;
private $idNumbers = array();
private $perPageOptions = null;
private $sortOrderOptions = null;
private $countyOptions = null;
private $municipalityOptions = null;
private $pagingOptions = null;
private $objects;
/** @var Categories */
private $categories;
/** @var Breadcrumb */
private $breadcrumb;
/** @var CategoryCache|null $categoryCache*/
private ?CategoryCache $categoryCache = null;
private Trans $trans;
private UrlGeneratorInterface $urlGenerator;
private ?ReservePriceStatusEnum $reservePriceStatus = null;
public function __construct(UrlGeneratorInterface $urlGenerator, Trans $trans)
{
$this->breadcrumb = new Breadcrumb($trans, $urlGenerator);
$this->categories = new Categories($trans, $urlGenerator);
$this->urlGenerator = $urlGenerator;
$this->trans = $trans;
}
/**
* @return string
*/
public function getUrl()
{
return $this->url;
}
/**
* @param string $url
*/
public function setUrl($url)
{
$this->url = $url;
return $this;
}
/**
* @return int
*/
public function getPages()
{
return $this->pages;
}
/**
* @param int $pages
*/
public function setPages($pages)
{
$this->pages = (int)$pages;
return $this;
}
/**
* @return int
*/
public function getPage()
{
return $this->page;
}
/**
* @param int $page
*/
public function setPage($page)
{
$this->page = (int)$page;
return $this;
}
/**
* @return int
*/
public function getSortflag()
{
if (is_null($this->sortflag)) {
$this->sortflag = array_key_exists($this->sessionVarName . 'sortflag', $_SESSION) ?
$_SESSION[$this->sessionVarName . 'sortflag'] : 4;
}
return $this->sortflag;
}
/**
* @param int $sortflag
*/
public function setSortflag($sortflag)
{
$this->sortflag = $sortflag;
return $this;
}
/**
* @return int
*/
public function getPerpage()
{
if (is_null($this->perpage)) {
$this->perpage = array_key_exists($this->sessionVarName . 'perpage', $_SESSION) ?
$_SESSION[$this->sessionVarName . 'perpage'] : 30;
}
return $this->perpage;
}
/**
* @param int $perpage
*/
public function setPerpage($perpage)
{
$this->perpage = $perpage;
return $this;
}
/**
* @return string
*/
public function getSessionVarName()
{
return $this->sessionVarName;
}
/**
* @param string $sessionVarName
*/
public function setSessionVarName($sessionVarName)
{
$this->sessionVarName = $sessionVarName;
return $this;
}
/**
* @return bool
*/
public function isShowClosed()
{
return $this->showClosed;
}
/**
* @param bool $showClosed
*/
public function setShowClosed($showClosed)
{
$this->showClosed = (bool)$showClosed;
return $this;
}
/**
* @return array
*/
public function getActiveCounties()
{
return $this->activeCounties;
}
/**
* @param array $activeCounties
*/
public function setActiveCounties($activeCounties)
{
$this->activeCounties = $activeCounties;
return $this;
}
/**
* @return array
*/
public function getActiveMunicipalities()
{
return $this->activeMunicipalities;
}
/**
* @param array $activeMunicipalities
*/
public function setActiveMunicipalities($activeMunicipalities)
{
$this->activeMunicipalities = $activeMunicipalities;
return $this;
}
/**
* @return int
*/
public function getTotalNbrMatchedObjects()
{
return $this->totalNbrMatchedObjects;
}
/**
* @param int $totalNbrMatchedObjects
*/
public function setTotalNbrMatchedObjects($totalNbrMatchedObjects)
{
$this->totalNbrMatchedObjects = $totalNbrMatchedObjects;
return $this;
}
/**
* @param array $productObjects
*
* @return PageListPartials
*/
public function setListObjects(array $productObjects)
{
$this->objects = $productObjects;
return $this;
}
/**
* @return null|string
*/
public function getSearchText()
{
if (is_null($this->searchText)) {
if (isset($_REQUEST['searchtext']) && $_REQUEST['searchtext'] !== '') {
$this->searchText = $_REQUEST['searchtext'];
}
}
return $this->searchText;
}
/**
* @param string $searchText
*/
public function setSearchText($searchText)
{
$this->searchText = $searchText;
}
/**
* @return null|string
* @throws \Klaravik\Exception\CategoryCacheException
*/
public function getFormUrl()
{
if (is_null($this->categoryCache)) {
return $this->url;
}
if (is_null($this->formUrl)) {
$categories = $this->categoryCache->cachedCategories();
$this->formUrl = $this->url;
if (isset($_REQUEST['catid']) && $_REQUEST['catid'] > 0) {
$categoryId = $_REQUEST['catid'];
if (isset($_REQUEST['subcatid']) && (int)$_REQUEST['subcatid'] > 0) {
$categoryId = $_REQUEST['subcatid'];
}
$urlName = $categories->findById($categoryId)->getUrl();
$this->formUrl = $this->urlGenerator->generate('app.legacy.auction.listing.category', ['caturlname' => $urlName]);
if ((bool)$this->showClosed) {
$this->formUrl = $this->urlGenerator->generate('app.legacy.auction.listing.closed.category', ['caturlname' => $urlName]);
}
}
}
return $this->formUrl;
}
/**
* @param string $formUrl
*/
public function setFormUrl($formUrl)
{
$this->formUrl = $formUrl;
}
/**
* @return null|string
* @throws CategoryCacheException
*/
public function getSearchFormUrl()
{
if (is_null($this->searchFormUrl)) {
$this->searchFormUrl = $this->getFormUrl();
if (isset($_REQUEST['specialcat']) && ($_REQUEST['specialcat'] !== 'all' && $_REQUEST['specialcat'] !== '' && $_REQUEST['specialcat'] !== 'closed')) {
switch ($_REQUEST['specialcat']) {
case 'bankruptcy':
$this->searchFormUrl = $this->urlGenerator->generate('app.legacy.auction.listing.bankruptcy');
break;
case 'promoted':
$this->searchFormUrl = $this->urlGenerator->generate('app.legacy.auction.listing.promoted');
break;
}
}
}
return $this->searchFormUrl;
}
/**
* @param string $searchFormUrl
*/
public function setSearchFormUrl($searchFormUrl)
{
$this->searchFormUrl = $searchFormUrl;
}
/**
* @param CategoryCache|null $categoryCache
*
* @return PageListPartials
*/
public function setCategoryCache(?CategoryCache $categoryCache)
{
$this->categoryCache = $categoryCache;
return $this;
}
public function getReservePriceStatus(): ?ReservePriceStatusEnum
{
return $this->reservePriceStatus;
}
public function setReservePriceStatus(?ReservePriceStatusEnum $reservePriceStatus): self
{
$this->reservePriceStatus = $reservePriceStatus;
return $this;
}
private function getIdNumber()
{
$randomNumber = rand(50,455);
if (in_array($randomNumber, $this->idNumbers)) {
$randomNumber = $this->getIdNumber();
}
$this->idNumbers[] = $randomNumber;
return $randomNumber;
}
private function renderSearchText()
{
if (!is_null($this->getSearchText())) {
return sprintf('<input type="hidden" name="searchtext" value="%s" />',
htmlentities($this->getSearchText(), ENT_QUOTES | ENT_HTML401, 'utf-8')
);
}
return '';
}
private function getRequestDataAsArray(string $requestName, bool $filterNumberAndAll = false): ?array
{
$request = $_REQUEST[$requestName] ?? null;
if (!$request) {
return null;
}
$data[] = $request;
if (is_array($request)) {
$data = $request;
}
if ($filterNumberAndAll) {
$data = array_filter($data, fn($v) => (is_numeric($v) || "all" === $v || "countyclose" === $v));
}
return $data;
}
private function getRequestSetCountyFlag(): ?array
{
return $this->getRequestDataAsArray('setcountyflag', true);
}
private function getRequestSetMunicipality(): ?array
{
return $this->getRequestDataAsArray('setmunicipality', true);
}
private function renderHiddenCountyFlag()
{
$hiddenField = null;
$requestSetCountyFlag = $this->getRequestSetCountyFlag();
if ($requestSetCountyFlag && !in_array('all', $requestSetCountyFlag)) {
foreach ($requestSetCountyFlag as $item) {
$hiddenField .= sprintf(
'<input type="hidden" name="setcountyflag[]" value="%s">', $item
);
}
}
return $hiddenField;
}
private function renderHiddenMunicipality()
{
$hiddenField = null;
$requestSetMunicipality = $this->getRequestSetMunicipality();
if ($requestSetMunicipality && !in_array('all', $requestSetMunicipality)) {
foreach ($requestSetMunicipality as $item) {
$hiddenField .= sprintf(
'<input type="hidden" name="setmunicipality[]" value="%s">', $item
);
}
}
return $hiddenField;
}
private function renderHiddenReservePriceFilter(): string
{
$hiddenField = "";
if ($this->getReservePriceStatus()) {
$hiddenField = sprintf('<input type="hidden" name="reserve" value="%s">',
strtolower($this->getReservePriceStatus()->value));
}
return $hiddenField;
}
public function renderPerPage()
{
$options = $this->getPerPageOptions();
$idNumber = $this->getIdNumber();
return sprintf('
<form action="%s" method="GET" class="sortform_pp hide-for-small">
%s
<div class="nice-select">
<label for="setperpage%d" class="secondary-sortbar-label">%s:</label>
<span></span>
<select class="secondary-sortbar-select" id="setperpage%d" name="setperpage" onChange="this.form.submit();">
%s
</select>
</div>
%s
%s
%s
</form>
',
$this->getSearchFormUrl(),
$this->renderSearchText(),
$idNumber,
$this->trans->get('text_label_page-list-partials_per-page'),
$idNumber,
$options,
$this->renderHiddenCountyFlag(),
$this->renderHiddenMunicipality(),
$this->renderHiddenReservePriceFilter()
);
}
private function getPerPageOptions()
{
if (is_null($this->perPageOptions)) {
$this->perPageOptions = '';
for ($i = 30; $i <= 120; $i += 30) {
$selected = null;
if ((int)$this->getPerpage() === $i) {
$selected = ' selected="selected"';
}
$this->perPageOptions .= sprintf(
'<option value="%d"%s>%s</option>',
$i,
$selected,
$this->trans->get('text_label_page-list-partials_amount-of-pages', ['pages' => $i])
);
}
}
return $this->perPageOptions;
}
public function renderSortOrder()
{
$options = $this->getSortOrderOptions();
$idNumber = $this->getIdNumber();
return sprintf('
<form action="%s" method="GET" class="sortform_sf">
%s
<div class="nice-select">
<label for="setsortflag%d" class="secondary-sortbar-label">%s:</label>
<span></span>
<select class="secondary-sortbar-select" id="setsortflag%d" name="setsortflag" onChange="this.form.submit();">
%s
</select>
</div>
%s
%s
%s
</form>
',
$this->getSearchFormUrl(),
$this->renderSearchText(),
$idNumber,
$this->trans->get('text_label_page-list-partials_sort-by'),
$idNumber,
$options,
$this->renderHiddenCountyFlag(),
$this->renderHiddenMunicipality(),
$this->renderHiddenReservePriceFilter()
);
}
private function getSortOrderOptions()
{
if (is_null($this->sortOrderOptions)) {
$sortFlagsOptions = array(
4 => $this->trans->get('text_label_page-list-partials_highest-price'),
3 => $this->trans->get('text_label_page-list-partials_lowest-price'),
1 => $this->trans->get('text_label_page-list-partials_shortest-time-left'),
2 => $this->trans->get('text_label_page-list-partials_last-received'),
5 => $this->trans->get('text_label_page-list-partials_least-amount-of-bids'),
6 => $this->trans->get('text_label_page-list-partials_most-amount-of-bids'),
);
if ((bool)$this->showClosed) {
$sortFlagsOptions = array(
7 => $this->trans->get('text_label_page-list-partials_latest_ends'),
4 => $this->trans->get('text_label_page-list-partials_highest-price'),
3 => $this->trans->get('text_label_page-list-partials_lowest-price'),
5 => $this->trans->get('text_label_page-list-partials_least-amount-of-bids'),
6 => $this->trans->get('text_label_page-list-partials_most-amount-of-bids'),
);
}
$this->sortOrderOptions = '';
foreach ($sortFlagsOptions as $key => $option) {
$selected = null;
if ((int)$this->getSortflag() === $key) {
$selected = ' selected="selected"';
}
$this->sortOrderOptions .= sprintf('<option value="%d"%s>%s</option>', $key, $selected, $option);
}
}
return $this->sortOrderOptions;
}
public function renderReservePrice()
{
return sprintf(
'<k-dropdown id="reserve-price-dropdown" class-list="k-dropdown--rounded" default-label="%s" input-name="reserve" filter-placeholder="%s"></k-dropdown>',
$this->trans->get('text_label_page-list-partials_reserve_filter_label'),
$this->trans->get('text_label_page-list-partials_reserve_filter_label')
);
}
public function renderCountyRedis()
{
return sprintf('
<k-dropdown
id="county-dropdown"
class-list="k-dropdown--redis"
default-label="%s"
multiple-label="%s"
input-name="setcountyflag"
filter-placeholder=" "
>
<div class="redis-search-footer" slot="footer">
<k-switch-component
label="%s"
id="nearbyCounties"
></k-switch-component>
<button type="button" id="redis-search__county-clear" class="button button--medium button--outlined">%s</button>
<button type="submit" id="redis-search__county-submit" class="button button--medium button--primary">
<span class="keep-ratio">%s</span>
<div class="send-animation-center">
<div class="wave">
<span class="dot"></span><span class="dot"></span><span class="dot"></span>
</div>
</div>
</button>
</div>
</k-dropdown>',
$this->trans->get('text_label_page-list-partials_all-counties'),
$this->trans->get('text_label_page-list-partials_multiple-counties'),
$this->trans->get('text_label_page-list-partials_bordering-counties'),
$this->trans->get('text_label_page-list-partials_all-clear'),
$this->trans->get('text_label_page-list-partials_show-results'),
);
}
public function renderCounty()
{
$options = $this->getCountyOptions();
$idNumber = $this->getIdNumber();
return sprintf('
<form class="sortflag_form" action="%s" method="GET">
%s
<div class="dropdown-select-wrapper" id="dd-second" data-stay-open="true">
<div class="dropdown-select">
<div class="dropdown-select__trigger location-icon"><span></span>
</div>
<div class="dropdown-options">
</div>
</div>
<label for="setcountyflag%d" class="dropdown-label">%s:</label>
<select id="setcountyflag%d" name="setcountyflag" class="select_list" onChange="this.form.submit();">
%s
</select>
</div>
</form>
',
$this->getFormUrl(),
$this->renderSearchText(),
$idNumber,
$this->trans->get('text_label_page-list-partials_county'),
$idNumber,
$options);
}
private function getCountyOptions()
{
if (is_null($this->countyOptions)) {
$requestCountyFlag = $this->getRequestSetCountyFlag();
$this->countyOptions = '<option value="all">' .
$this->trans->get('text_label_page-list-partials_all-counties') .
'</option>';
foreach ($this->activeCounties as $countyId => $county) {
$selected = null;
if ($requestCountyFlag && in_array($countyId, $requestCountyFlag)) {
$selected = ' selected="selected"';
}
$this->countyOptions .= sprintf(
'<option value="%s"%s>%s</option>',
$countyId,
$selected,
StringFormatter::mb_ucfirst($county)
);
}
}
return $this->countyOptions;
}
public function renderMunicipalityRedis()
{
return sprintf('
<k-dropdown
id="municipality-dropdown"
class-list="k-dropdown--redis"
default-label="%s"
multiple-label="%s"
input-name="municipality-dropdown"
filter-placeholder=" "
is-filterable
is-disabled
>
<div class="redis-search-footer" slot="footer">
<button type="button" id="redis-search__muni-clear" class="button button--medium button--outlined">%s</button>
<button type="submit" id="redis-search__muni-submit" class="button button--medium button--primary">
<span class="keep-ratio">%s</span>
<div class="send-animation-center">
<div class="wave">
<span class="dot"></span><span class="dot"></span><span class="dot"></span>
</div>
</div>
</button>
</div>
</k-dropdown>',
$this->trans->get('text_label_page-list-partials_all-municipalities'),
$this->trans->get('text_label_page-list-partials_multiple-municipalities'),
$this->trans->get('text_label_page-list-partials_all-clear'),
$this->trans->get('text_label_page-list-partials_show-results'),
);
}
public function renderMunicipality()
{
$options = $this->getMunicipalityOptions();
$idNumber = $this->getIdNumber();
return sprintf('
<form class="sortflag_form" action="%s" method="GET">
%s
<div class="dropdown-select-wrapper dropdown-select-search" id="dd-third" data-stay-open="true">
<div class="dropdown-select">
<div class="dropdown-select__trigger divider-icon"><span></span>
</div>
<div class="dropdown-select-search__input-wrapper">
<input type="text" name="dropDownSearch" class="dropdown-select-search__input" autocomplete="off"/>
<span class="form-clear-field"></span>
<span class="DD-no-results">%s</span>
</div>
<div class="dropdown-options">
</div>
</div>
<label for="setmunicipality%d" class="dropdown-label">%s:</label>
<select id="setmunicipality%d" name="setmunicipality" class="select_list" onChange="this.form.submit();">
%s
</select>
</div>
%s
</form>',
$this->getFormUrl(),
$this->renderSearchText(),
$this->trans->get('text_label_page-list-partials_municipality-no-result'),
$idNumber,
$this->trans->get('text_label_page-list-partials_municipality'),
$idNumber,
$options,
$this->renderHiddenCountyFlag()
);
}
private function getMunicipalityOptions()
{
if (is_null($this->municipalityOptions)) {
$this->municipalityOptions = '<option value="all">' .
$this->trans->get('text_label_page-list-partials_all-municipalities') . '</option>';
$requestSetMunicipality = $this->getRequestSetMunicipality();
$requestSetCountyFlag = $this->getRequestSetCountyFlag();
if ($requestSetCountyFlag && !in_array('all', $requestSetCountyFlag)) {
$selected = null;
if ($requestSetMunicipality && in_array('countyclose', $requestSetMunicipality)) {
$selected = ' selected="selected"';
}
$this->municipalityOptions .= sprintf(
'<option value="countyclose"%s>%s</option>',
$selected,
$this->trans->get('text_label_page-list-partials_close-counties')
);
}
// If the user somehow have selected more than one county combined with more than one municipality, then reset municipalities.
if (
$requestSetCountyFlag && count($requestSetCountyFlag) > 1 &&
$requestSetMunicipality && count($requestSetMunicipality) > 1
) {
$requestSetMunicipality = null;
}
foreach ($this->activeMunicipalities as $locationId => $location) {
$selected = null;
if ($requestSetMunicipality && in_array($locationId, $requestSetMunicipality)) {
$selected = ' selected="selected"';
}
$this->municipalityOptions .= sprintf(
'<option value="%s"%s>%s</option>',
$locationId,
$selected,
StringFormatter::mb_ucfirst($location['name'])
);
}
}
return $this->municipalityOptions;
}
public function renderPaging()
{
$options = $this->getPagingOptions();
$lastPage = $this->getPages();
if ($lastPage <= 1) {
return '';
}
$hiddenSetCountyFlag = null;
$requestSetCountyFlag = $this->getRequestSetCountyFlag();
if ($requestSetCountyFlag) {
foreach ($requestSetCountyFlag as $countyFlagItem) {
$hiddenSetCountyFlag .= sprintf(
'<input type="hidden" name="setcountyflag[]" value="%s">', $countyFlagItem
);
}
}
$hiddenSetMunicipalityFlag = null;
$requestSetMunicipality = $this->getRequestSetMunicipality();
if ($requestSetMunicipality) {
foreach ($requestSetMunicipality as $municipalityItem) {
$hiddenSetMunicipalityFlag .= sprintf(
'<input type="hidden" name="setmunicipality[]" value="%s">', $municipalityItem
);
}
}
$hiddenSearchTextFlag = null;
if (isset($_REQUEST['searchtext'])) {
$hiddenSearchTextFlag = sprintf(
'<input type="hidden" name="searchtext" value="%s">', $_REQUEST['searchtext']
);
}
return sprintf('
<ul class="paginator">
%s
</ul>
<form class="pagination__search" method="get">
<label for="pagination-input" class="pagination__label">%s: </label>
<input id="pagination-input" name="curpage" data-maxValue="%d" min="1" class="pagination__input" type="number" maxlength="3" />
<button class="pagination__submit" type="submit" disabled="disabled">
</button>
<span class="pagination__message"></span>
%s %s %s %s
</form>
',
$options,
$this->trans->get('text_label_page-list-partials_go-to-page'),
$lastPage,
$hiddenSetCountyFlag,
$hiddenSetMunicipalityFlag,
$hiddenSearchTextFlag,
$this->renderHiddenReservePriceFilter()
);
}
private function getPagingOptions()
{
if (is_null($this->pagingOptions)) {
$pagespan = 2;
$firstLast = 1;
$urlQuery = array(
'curpage' => 1,
);
if ($this->getSearchText() !== '') {
$urlQuery['searchtext'] = $this->getSearchText();
}
$requestSetCountyFlag = $this->getRequestSetCountyFlag();
$requestSetMunicipality = $this->getRequestSetMunicipality();
$requestReservePriceFilter = $this->getReservePriceStatus();
if ($requestSetCountyFlag && !in_array('all', $requestSetCountyFlag)) {
$urlQuery['setcountyflag'] = $requestSetCountyFlag;
}
if ($requestSetMunicipality && !in_array('all', $requestSetMunicipality)) {
$urlQuery['setmunicipality'] = $requestSetMunicipality;
}
if ($requestReservePriceFilter) {
$urlQuery['reserve'] = strtolower($requestReservePriceFilter->value);
}
$formUrl = $this->getFormUrl();
$addLength = 0;
if (($this->page - $pagespan) < 0) {
$addLength = ($pagespan - $this->page);
}
$this->pagingOptions = '';
if ($this->page > 1) {
$urlQuery['curpage'] = $this->page - 1;
$this->pagingOptions .= sprintf('<li><a class="pagination-arrow-left" href="%s?%s"><</a></li>',
$formUrl,
http_build_query($urlQuery)
);
}
$pagingItems = array();
$numberOfEllipses = 0;
for ($i = 1; $i <= $this->pages; $i++) {
if (
$i <= $firstLast ||
($i > ($this->page - $pagespan) && $i < ($this->page + $pagespan + $addLength)) ||
$i > ($this->pages - $firstLast)
) {
$pagingItems[] = array(
'data' => $i,
'ellipse' => false
);
if (
($i === $firstLast && $this->page > ($pagespan -1 + $firstLast)) ||
($i === ($this->page + $pagespan + $addLength -1) && $this->page < ($this->pages - $firstLast) && (int)$this->pages > 4)
) {
$pagingItems[] = array(
'data' => null,
'ellipse' => true
);
$numberOfEllipses++;
}
}
}
$ellipseQuantity = 0;
foreach ($pagingItems as $index => $pagingItem) {
$urlQuery['curpage'] = $pagingItem['data'];
$activeClass = '';
if ($pagingItem['data'] === (int)$this->page) {
$activeClass = 'selected';
} elseif (
$numberOfEllipses > 1 &&
!in_array($pagingItem['data'], array(1, $this->page, $this->pages)) &&
(
(isset($pagingItems[$index - 1]) && $pagingItems[$index - 1]['ellipse']) ||
(isset($pagingItems[$index + 1]) && $pagingItems[$index + 1]['ellipse'])
)
) {
$activeClass = 'mobile-hide';
}
$html = sprintf('<li><a class="%s" href="%s?%s">%d</a></li>',
$activeClass,
$formUrl,
http_build_query($urlQuery),
$pagingItem['data']
);
$ellipseClass = array('paginator__ellipsis');
if ($pagingItem['ellipse']) {
$ellipseQuantity++;
// The ellipse is visible on desktop when page 3 or second last page is active, this is wrong on
// desktop and should only be shown on mobile.
if (
($ellipseQuantity === 1 && (((int)$this->page - 3) === 0)) ||
($ellipseQuantity === 2 && (((int)$this->pages - (int)$this->page) === 2))
) {
$ellipseClass[] = 'desktop-hide';
}
$html = sprintf('<li class="%s">...</li>', implode(' ', $ellipseClass));
}
$this->pagingOptions .= $html;
}
if ($this->page < $this->pages) {
$urlQuery['curpage'] = $this->page + 1;
$this->pagingOptions .= sprintf('<li><a class="pagination-arrow-right" href="%s?%s">></a></li>',
$formUrl,
http_build_query($urlQuery)
);
}
}
return $this->pagingOptions;
}
/**
* Render breadcrumb links
*
* @param int $categoryId
*/
public function breadcrumbs($categoryId)
{
$breadcrumbs = $this->breadcrumb->activeAuctionBreadcrumbs($categoryId);
$routeName = 'app.legacy.auction.listing';
$routeNameCategory = 'app.legacy.auction.listing.category';
if ($this->isShowClosed()) {
$breadcrumbs = $this->breadcrumb->closedAuctionBreadcrumbs($categoryId);
$routeName = 'app.legacy.auction.listing.closed';
$routeNameCategory = 'app.legacy.auction.listing.closed.category';
}
$urlParams = [];
if (!empty($_REQUEST['searchtext'])) {
$urlParams['searchtext'] = $_REQUEST['searchtext'];
$urlParams['dosearch'] = '';
$breadcrumbs = $this->breadcrumb->getBreadcrumbs($categoryId, array(
array(
'url' => '',
'name' => $this->trans->get('text_label_page-list-partials_all-search-results'),
),
));
}
$this->geoLocationUrlParams($urlParams);
$this->filterUrlParams($urlParams);
foreach($breadcrumbs as $index => $breadcrumbArray) {
if ($index === count($breadcrumbs)-1) {
echo '<span>'.$breadcrumbArray['name'].'</span>';
continue;
}
if ('' === $breadcrumbArray['url']) {
$url = $this->urlGenerator->generate($routeName, $urlParams);
} else {
$categoryUrlParams = $urlParams;
$categoryUrlParams['caturlname'] = $breadcrumbArray['url'];
$url = $this->urlGenerator->generate($routeNameCategory, $categoryUrlParams);
}
echo '<a href="' . $url . '">'.$breadcrumbArray['name'].'</a>';
}
}
/**
* @param int $categoryId
*
* @throws CategoryCacheException
*/
public function categoryButtons($categoryId)
{
if (is_null($this->categoryCache)) {
return;
}
$urlParams = [];
if (!empty($_REQUEST['searchtext'])) {
$searchCollection = new SearchCategoryCache($this->categoryCache->cachedCategories());
$categoriesCollection = $searchCollection->buildFromProductObjects($this->objects);
$urlParams['searchtext'] = $_REQUEST['searchtext'];
$urlParams['dosearch'] = '';
} else {
$categoriesCollection = $this->categoryCache->cachedCategories();
}
$this->geoLocationUrlParams($urlParams);
$this->filterUrlParams($urlParams);
$categoryButtons = $categoriesCollection->getTopLevel();
try {
if ($categoryId) {
$categoryButtons = $categoriesCollection
->findById($categoryId)
->getChildren()
->showOnlyInParent(false)
->sortByOrder();
if ($this->isShowClosed()) {
$categoryButtons = $categoryButtons->hasProductCount();
}
$categoryParent = $categoriesCollection->findById($categoryId)->getParent();
if ($categoryParent && !$categoryButtons->count()) {
$categoryButtons = $categoryParent
->getChildren()
->showOnlyInParent(false)
->sortByOrder();
if ($this->isShowClosed()) {
$categoryButtons = $categoryButtons->hasProductCount();
}
}
}
} catch (CategoryCacheException $e) {
PageListLogger::critical('Missing category and has not rendered category buttons above the list', array($e->__toString()));
}
/** @var CacheCategory $category */
foreach($categoryButtons as $category) {
$numberOfProducts = $category->getNumberOfProducts();
if ($category->getId() === $categoryId) {
echo '<button class="button--category-tag button--category-tag--filled">' . $category->getName() . '<span> (' . $numberOfProducts . ')</span></button>';
continue;
}
$urlParams['caturlname'] = $category->getUrl();
$routeName = $this->isShowClosed() ? 'app.legacy.auction.listing.closed.category' : 'app.legacy.auction.listing.category';
echo '<a href="' . $this->urlGenerator->generate($routeName, $urlParams) . '" class="button--category-tag">' . $category->getName() . '<span> (' . $numberOfProducts . ')</span></a>';
}
}
/**
* @param array $urlParams
*
* @return void
*
*/
public function geoLocationUrlParams(&$urlParams)
{
$requestSetMunicipality = $this->getRequestSetMunicipality();
$requestSetCountyFlag = $this->getRequestSetCountyFlag();
if ($requestSetMunicipality) {
$urlParams['setmunicipality'] = $requestSetMunicipality;
}
if ($requestSetCountyFlag) {
$urlParams['setcountyflag'] = $requestSetCountyFlag;
}
}
/**
* @param $urlParams
* @return void
*/
public function filterUrlParams(&$urlParams)
{
$reserve = $this->getReservePriceStatus();
if ($reserve) {
$urlParams['reserve'] = strtolower($reserve->value);
}
}
/**
* @param null|int $selectedCategoryId
*
* @return string
* @throws CategoryCacheException
*/
public function totalNumberOfProducts($selectedCategoryId = null)
{
if (is_null($this->categoryCache)) {
return '';
}
$categoriesCollection = $this->categoryCache->cachedCategories();
if (!empty($_REQUEST['searchtext'])) {
$searchCollection = new SearchCategoryCache($this->categoryCache->cachedCategories());
$categoriesCollection = $searchCollection->buildFromProductObjects($this->objects);
}
return number_format($categoriesCollection->totalNumberOfProducts($selectedCategoryId), 0, ',', ' ');
}
}