public/includes/PageListPartials.php line 288

Open in your IDE?
  1. <?php
  2. namespace Klaravik\includes;
  3. use Klaravik\Breadcrumb\Breadcrumb;
  4. use Klaravik\Category\Cache\CategoryCache;
  5. use Klaravik\Category\Cache\Model\CacheCategory;
  6. use Klaravik\Category\Cache\SearchCategoryCache;
  7. use Klaravik\Common\Formatter\StringFormatter;
  8. use Klaravik\Enum\ReservePriceStatusEnum;
  9. use Klaravik\Exception\CategoryCacheException;
  10. use Klaravik\Logger\PageListLogger;
  11. use Klaravik\Translate\Trans;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. class PageListPartials
  14. {
  15.     private $url '';
  16.     private $pages 1;
  17.     private $page 1;
  18.     private $sortflag null;
  19.     private $perpage null;
  20.     private $sessionVarName '';
  21.     private $showClosed false;
  22.     private $activeCounties = array();
  23.     private $activeMunicipalities = array();
  24.     private $totalNbrMatchedObjects 0;
  25.     private $searchText null;
  26.     private $formUrl null;
  27.     private $searchFormUrl null;
  28.     private $idNumbers = array();
  29.     private $perPageOptions null;
  30.     private $sortOrderOptions null;
  31.     private $countyOptions null;
  32.     private $municipalityOptions null;
  33.     private $pagingOptions null;
  34.     private $objects;
  35.     /** @var Categories */
  36.     private $categories;
  37.     /** @var Breadcrumb */
  38.     private $breadcrumb;
  39.     /** @var CategoryCache|null $categoryCache*/
  40.     private ?CategoryCache $categoryCache null;
  41.     private Trans $trans;
  42.     private UrlGeneratorInterface $urlGenerator;
  43.     private ?ReservePriceStatusEnum $reservePriceStatus null;
  44.     public function __construct(UrlGeneratorInterface $urlGeneratorTrans $trans)
  45.     {
  46.         $this->breadcrumb = new Breadcrumb($trans$urlGenerator);
  47.         $this->categories = new Categories($trans$urlGenerator);
  48.         $this->urlGenerator $urlGenerator;
  49.         $this->trans $trans;
  50.     }
  51.     /**
  52.      * @return string
  53.      */
  54.     public function getUrl()
  55.     {
  56.         return $this->url;
  57.     }
  58.     /**
  59.      * @param string $url
  60.      */
  61.     public function setUrl($url)
  62.     {
  63.         $this->url $url;
  64.         return $this;
  65.     }
  66.     /**
  67.      * @return int
  68.      */
  69.     public function getPages()
  70.     {
  71.         return $this->pages;
  72.     }
  73.     /**
  74.      * @param int $pages
  75.      */
  76.     public function setPages($pages)
  77.     {
  78.         $this->pages = (int)$pages;
  79.         return $this;
  80.     }
  81.     /**
  82.      * @return int
  83.      */
  84.     public function getPage()
  85.     {
  86.         return $this->page;
  87.     }
  88.     /**
  89.      * @param int $page
  90.      */
  91.     public function setPage($page)
  92.     {
  93.         $this->page = (int)$page;
  94.         return $this;
  95.     }
  96.     /**
  97.      * @return int
  98.      */
  99.     public function getSortflag()
  100.     {
  101.         if (is_null($this->sortflag)) {
  102.             $this->sortflag array_key_exists($this->sessionVarName 'sortflag'$_SESSION) ?
  103.                 $_SESSION[$this->sessionVarName 'sortflag'] : 4;
  104.         }
  105.         return $this->sortflag;
  106.     }
  107.     /**
  108.      * @param int $sortflag
  109.      */
  110.     public function setSortflag($sortflag)
  111.     {
  112.         $this->sortflag $sortflag;
  113.         return $this;
  114.     }
  115.     /**
  116.      * @return int
  117.      */
  118.     public function getPerpage()
  119.     {
  120.         if (is_null($this->perpage)) {
  121.             $this->perpage array_key_exists($this->sessionVarName 'perpage'$_SESSION) ?
  122.                 $_SESSION[$this->sessionVarName 'perpage'] : 30;
  123.         }
  124.         return $this->perpage;
  125.     }
  126.     /**
  127.      * @param int $perpage
  128.      */
  129.     public function setPerpage($perpage)
  130.     {
  131.         $this->perpage $perpage;
  132.         return $this;
  133.     }
  134.     /**
  135.      * @return string
  136.      */
  137.     public function getSessionVarName()
  138.     {
  139.         return $this->sessionVarName;
  140.     }
  141.     /**
  142.      * @param string $sessionVarName
  143.      */
  144.     public function setSessionVarName($sessionVarName)
  145.     {
  146.         $this->sessionVarName $sessionVarName;
  147.         return $this;
  148.     }
  149.     /**
  150.      * @return bool
  151.      */
  152.     public function isShowClosed()
  153.     {
  154.         return $this->showClosed;
  155.     }
  156.     /**
  157.      * @param bool $showClosed
  158.      */
  159.     public function setShowClosed($showClosed)
  160.     {
  161.         $this->showClosed = (bool)$showClosed;
  162.         return $this;
  163.     }
  164.     /**
  165.      * @return array
  166.      */
  167.     public function getActiveCounties()
  168.     {
  169.         return $this->activeCounties;
  170.     }
  171.     /**
  172.      * @param array $activeCounties
  173.      */
  174.     public function setActiveCounties($activeCounties)
  175.     {
  176.         $this->activeCounties $activeCounties;
  177.         return $this;
  178.     }
  179.     /**
  180.      * @return array
  181.      */
  182.     public function getActiveMunicipalities()
  183.     {
  184.         return $this->activeMunicipalities;
  185.     }
  186.     /**
  187.      * @param array $activeMunicipalities
  188.      */
  189.     public function setActiveMunicipalities($activeMunicipalities)
  190.     {
  191.         $this->activeMunicipalities $activeMunicipalities;
  192.         return $this;
  193.     }
  194.     /**
  195.      * @return int
  196.      */
  197.     public function getTotalNbrMatchedObjects()
  198.     {
  199.         return $this->totalNbrMatchedObjects;
  200.     }
  201.     /**
  202.      * @param int $totalNbrMatchedObjects
  203.      */
  204.     public function setTotalNbrMatchedObjects($totalNbrMatchedObjects)
  205.     {
  206.         $this->totalNbrMatchedObjects $totalNbrMatchedObjects;
  207.         return $this;
  208.     }
  209.     /**
  210.      * @param array $productObjects
  211.      *
  212.      * @return PageListPartials
  213.      */
  214.     public function setListObjects(array $productObjects)
  215.     {
  216.         $this->objects $productObjects;
  217.         return $this;
  218.     }
  219.     /**
  220.      * @return null|string
  221.      */
  222.     public function getSearchText()
  223.     {
  224.         if (is_null($this->searchText)) {
  225.             if (isset($_REQUEST['searchtext']) && $_REQUEST['searchtext'] !== '') {
  226.                 $this->searchText $_REQUEST['searchtext'];
  227.             }
  228.         }
  229.         return $this->searchText;
  230.     }
  231.     /**
  232.      * @param string $searchText
  233.      */
  234.     public function setSearchText($searchText)
  235.     {
  236.         $this->searchText $searchText;
  237.     }
  238.     /**
  239.      * @return null|string
  240.      * @throws \Klaravik\Exception\CategoryCacheException
  241.      */
  242.     public function getFormUrl()
  243.     {
  244.         if (is_null($this->categoryCache)) {
  245.             return $this->url;
  246.         }
  247.         if (is_null($this->formUrl)) {
  248.             $categories $this->categoryCache->cachedCategories();
  249.             $this->formUrl $this->url;
  250.             if (isset($_REQUEST['catid']) && $_REQUEST['catid'] > 0) {
  251.                 $categoryId $_REQUEST['catid'];
  252.                 if (isset($_REQUEST['subcatid']) && (int)$_REQUEST['subcatid'] > 0) {
  253.                     $categoryId $_REQUEST['subcatid'];
  254.                 }
  255.                 $urlName $categories->findById($categoryId)->getUrl();
  256.                 $this->formUrl $this->urlGenerator->generate('app.legacy.auction.listing.category', ['caturlname' => $urlName]);
  257.                 if ((bool)$this->showClosed) {
  258.                     $this->formUrl $this->urlGenerator->generate('app.legacy.auction.listing.closed.category', ['caturlname' => $urlName]);
  259.                 }
  260.             }
  261.         }
  262.         return $this->formUrl;
  263.     }
  264.     /**
  265.      * @param string $formUrl
  266.      */
  267.     public function setFormUrl($formUrl)
  268.     {
  269.         $this->formUrl $formUrl;
  270.     }
  271.     /**
  272.      * @return null|string
  273.      * @throws CategoryCacheException
  274.      */
  275.     public function getSearchFormUrl()
  276.     {
  277.         if (is_null($this->searchFormUrl)) {
  278.             $this->searchFormUrl $this->getFormUrl();
  279.             if (isset($_REQUEST['specialcat']) && ($_REQUEST['specialcat'] !== 'all' && $_REQUEST['specialcat'] !== '' && $_REQUEST['specialcat'] !== 'closed')) {
  280.                 switch ($_REQUEST['specialcat']) {
  281.                     case 'bankruptcy':
  282.                         $this->searchFormUrl $this->urlGenerator->generate('app.legacy.auction.listing.bankruptcy');
  283.                         break;
  284.                     case 'promoted':
  285.                         $this->searchFormUrl $this->urlGenerator->generate('app.legacy.auction.listing.promoted');
  286.                         break;
  287.                 }
  288.             }
  289.         }
  290.         return $this->searchFormUrl;
  291.     }
  292.     /**
  293.      * @param string $searchFormUrl
  294.      */
  295.     public function setSearchFormUrl($searchFormUrl)
  296.     {
  297.         $this->searchFormUrl $searchFormUrl;
  298.     }
  299.     /**
  300.      * @param CategoryCache|null $categoryCache
  301.      *
  302.      * @return PageListPartials
  303.      */
  304.     public function setCategoryCache(?CategoryCache $categoryCache)
  305.     {
  306.         $this->categoryCache $categoryCache;
  307.         return $this;
  308.     }
  309.     public function getReservePriceStatus(): ?ReservePriceStatusEnum
  310.     {
  311.         return $this->reservePriceStatus;
  312.     }
  313.     public function setReservePriceStatus(?ReservePriceStatusEnum $reservePriceStatus): self
  314.     {
  315.         $this->reservePriceStatus $reservePriceStatus;
  316.         return $this;
  317.     }
  318.     private function getIdNumber()
  319.     {
  320.         $randomNumber rand(50,455);
  321.         if (in_array($randomNumber$this->idNumbers)) {
  322.             $randomNumber $this->getIdNumber();
  323.         }
  324.         $this->idNumbers[] = $randomNumber;
  325.         return $randomNumber;
  326.     }
  327.     private function renderSearchText()
  328.     {
  329.         if (!is_null($this->getSearchText())) {
  330.             return sprintf('<input type="hidden" name="searchtext" value="%s" />',
  331.                 htmlentities($this->getSearchText(), ENT_QUOTES ENT_HTML401'utf-8')
  332.             );
  333.         }
  334.         return '';
  335.     }
  336.     private function getRequestDataAsArray(string $requestNamebool $filterNumberAndAll false): ?array
  337.     {
  338.         $request $_REQUEST[$requestName] ?? null;
  339.         if (!$request) {
  340.             return null;
  341.         }
  342.         $data[] = $request;
  343.         if (is_array($request)) {
  344.             $data $request;
  345.         }
  346.         if ($filterNumberAndAll) {
  347.             $data array_filter($data, fn($v) => (is_numeric($v) || "all" === $v || "countyclose" === $v));
  348.         }
  349.         return $data;
  350.     }
  351.     private function getRequestSetCountyFlag(): ?array
  352.     {
  353.         return $this->getRequestDataAsArray('setcountyflag'true);
  354.     }
  355.     private function getRequestSetMunicipality(): ?array
  356.     {
  357.         return $this->getRequestDataAsArray('setmunicipality'true);
  358.     }
  359.     private function renderHiddenCountyFlag()
  360.     {
  361.         $hiddenField null;
  362.         $requestSetCountyFlag $this->getRequestSetCountyFlag();
  363.         if ($requestSetCountyFlag && !in_array('all'$requestSetCountyFlag)) {
  364.             foreach ($requestSetCountyFlag as $item) {
  365.                 $hiddenField .= sprintf(
  366.                     '<input type="hidden" name="setcountyflag[]" value="%s">'$item
  367.                 );
  368.             }
  369.         }
  370.         return $hiddenField;
  371.     }
  372.     private function renderHiddenMunicipality()
  373.     {
  374.         $hiddenField null;
  375.         $requestSetMunicipality $this->getRequestSetMunicipality();
  376.         if ($requestSetMunicipality && !in_array('all'$requestSetMunicipality)) {
  377.             foreach ($requestSetMunicipality as $item) {
  378.                 $hiddenField .= sprintf(
  379.                     '<input type="hidden" name="setmunicipality[]" value="%s">'$item
  380.                 );
  381.             }
  382.         }
  383.         return $hiddenField;
  384.     }
  385.     private function renderHiddenReservePriceFilter(): string
  386.     {
  387.         $hiddenField "";
  388.         if ($this->getReservePriceStatus()) {
  389.             $hiddenField sprintf('<input type="hidden" name="reserve" value="%s">',
  390.                 strtolower($this->getReservePriceStatus()->value));
  391.         }
  392.         return $hiddenField;
  393.     }
  394.     public function renderPerPage()
  395.     {
  396.         $options $this->getPerPageOptions();
  397.         $idNumber $this->getIdNumber();
  398.         return sprintf('
  399.             <form action="%s" method="GET" class="sortform_pp hide-for-small">
  400.                 %s
  401.                 <div class="nice-select">
  402.                                     <label for="setperpage%d" class="secondary-sortbar-label">%s:</label>
  403.                                     <span></span>
  404.                                     <select class="secondary-sortbar-select" id="setperpage%d" name="setperpage" onChange="this.form.submit();">
  405.                                     %s
  406.                                     </select>
  407.                                 </div>
  408.                                 %s
  409.                                 %s
  410.                                 %s
  411.             </form>
  412.         ',
  413.             $this->getSearchFormUrl(),
  414.             $this->renderSearchText(),
  415.             $idNumber,
  416.             $this->trans->get('text_label_page-list-partials_per-page'),
  417.             $idNumber,
  418.             $options,
  419.             $this->renderHiddenCountyFlag(),
  420.             $this->renderHiddenMunicipality(),
  421.             $this->renderHiddenReservePriceFilter()
  422.         );
  423.     }
  424.     private function getPerPageOptions()
  425.     {
  426.         if (is_null($this->perPageOptions)) {
  427.             $this->perPageOptions '';
  428.             for ($i 30$i <= 120$i += 30) {
  429.                 $selected null;
  430.                 if ((int)$this->getPerpage() === $i) {
  431.                     $selected ' selected="selected"';
  432.                 }
  433.                 $this->perPageOptions .= sprintf(
  434.                     '<option value="%d"%s>%s</option>',
  435.                     $i,
  436.                     $selected,
  437.                     $this->trans->get('text_label_page-list-partials_amount-of-pages', ['pages' => $i])
  438.                 );
  439.             }
  440.         }
  441.         return $this->perPageOptions;
  442.     }
  443.     public function renderSortOrder()
  444.     {
  445.         $options $this->getSortOrderOptions();
  446.         $idNumber $this->getIdNumber();
  447.         return sprintf('
  448.             <form action="%s" method="GET" class="sortform_sf">
  449.                 %s
  450.                 <div class="nice-select">
  451.                 <label for="setsortflag%d" class="secondary-sortbar-label">%s:</label>
  452.                 <span></span>
  453.                 <select class="secondary-sortbar-select" id="setsortflag%d" name="setsortflag" onChange="this.form.submit();">
  454.                 %s
  455.                 </select>
  456.                                 </div>
  457.                                 %s
  458.                                 %s
  459.                                 %s
  460.             </form>
  461.         ',
  462.             $this->getSearchFormUrl(),
  463.             $this->renderSearchText(),
  464.             $idNumber,
  465.             $this->trans->get('text_label_page-list-partials_sort-by'),
  466.             $idNumber,
  467.             $options,
  468.             $this->renderHiddenCountyFlag(),
  469.             $this->renderHiddenMunicipality(),
  470.             $this->renderHiddenReservePriceFilter()
  471.         );
  472.     }
  473.     private function getSortOrderOptions()
  474.     {
  475.         if (is_null($this->sortOrderOptions)) {
  476.             $sortFlagsOptions = array(
  477.                 => $this->trans->get('text_label_page-list-partials_highest-price'),
  478.                 => $this->trans->get('text_label_page-list-partials_lowest-price'),
  479.                 => $this->trans->get('text_label_page-list-partials_shortest-time-left'),
  480.                 => $this->trans->get('text_label_page-list-partials_last-received'),
  481.                 => $this->trans->get('text_label_page-list-partials_least-amount-of-bids'),
  482.                 => $this->trans->get('text_label_page-list-partials_most-amount-of-bids'),
  483.             );
  484.             if ((bool)$this->showClosed) {
  485.                 $sortFlagsOptions = array(
  486.                     => $this->trans->get('text_label_page-list-partials_latest_ends'),
  487.                     => $this->trans->get('text_label_page-list-partials_highest-price'),
  488.                     => $this->trans->get('text_label_page-list-partials_lowest-price'),
  489.                     => $this->trans->get('text_label_page-list-partials_least-amount-of-bids'),
  490.                     => $this->trans->get('text_label_page-list-partials_most-amount-of-bids'),
  491.                 );
  492.             }
  493.             $this->sortOrderOptions '';
  494.             foreach ($sortFlagsOptions as $key => $option) {
  495.                 $selected null;
  496.                 if ((int)$this->getSortflag() === $key) {
  497.                     $selected ' selected="selected"';
  498.                 }
  499.                 $this->sortOrderOptions .= sprintf('<option value="%d"%s>%s</option>'$key$selected$option);
  500.             }
  501.         }
  502.         return $this->sortOrderOptions;
  503.     }
  504.     public function renderReservePrice()
  505.     {
  506.         return sprintf(
  507.             '<k-dropdown id="reserve-price-dropdown" class-list="k-dropdown--rounded" default-label="%s" input-name="reserve" filter-placeholder="%s"></k-dropdown>',
  508.             $this->trans->get('text_label_page-list-partials_reserve_filter_label'),
  509.             $this->trans->get('text_label_page-list-partials_reserve_filter_label')
  510.         );
  511.     }
  512.     public function renderCountyRedis()
  513.     {
  514.         return sprintf('
  515.             <k-dropdown
  516.                 id="county-dropdown"
  517.                 class-list="k-dropdown--redis"
  518.                 default-label="%s"
  519.                 multiple-label="%s"
  520.                 input-name="setcountyflag"
  521.                 filter-placeholder="&nbsp"
  522.             >
  523.                 <div class="redis-search-footer" slot="footer">
  524.                     <k-switch-component
  525.                     label="%s"
  526.                     id="nearbyCounties"
  527.                     ></k-switch-component>
  528.                     <button type="button" id="redis-search__county-clear" class="button button--medium button--outlined">%s</button>
  529.                     <button type="submit" id="redis-search__county-submit" class="button button--medium button--primary">
  530.                         <span class="keep-ratio">%s</span>
  531.                         <div class="send-animation-center">
  532.                             <div class="wave">
  533.                                 <span class="dot"></span><span class="dot"></span><span class="dot"></span>
  534.                             </div>
  535.                         </div>
  536.                     </button>
  537.                 </div>
  538.             </k-dropdown>',
  539.             $this->trans->get('text_label_page-list-partials_all-counties'),
  540.             $this->trans->get('text_label_page-list-partials_multiple-counties'),
  541.             $this->trans->get('text_label_page-list-partials_bordering-counties'),
  542.             $this->trans->get('text_label_page-list-partials_all-clear'),
  543.             $this->trans->get('text_label_page-list-partials_show-results'),
  544.         );
  545.     }
  546.     public function renderCounty()
  547.     {
  548.         $options $this->getCountyOptions();
  549.         $idNumber $this->getIdNumber();
  550.         return sprintf('
  551.             <form class="sortflag_form" action="%s" method="GET">
  552.                 %s
  553.                 <div class="dropdown-select-wrapper" id="dd-second" data-stay-open="true">
  554.                                         <div class="dropdown-select">
  555.                                                 <div class="dropdown-select__trigger location-icon"><span></span>
  556.                                                 </div>
  557.                                                 <div class="dropdown-options">
  558.                                                 </div>
  559.                                         </div>
  560.                                         <label for="setcountyflag%d" class="dropdown-label">%s:</label>
  561.                                         <select id="setcountyflag%d" name="setcountyflag" class="select_list" onChange="this.form.submit();">
  562.                                         %s
  563.                                         </select>
  564.                                 </div>
  565.             </form>
  566.        ',
  567.        $this->getFormUrl(),
  568.        $this->renderSearchText(),
  569.        $idNumber,
  570.        $this->trans->get('text_label_page-list-partials_county'),
  571.        $idNumber,
  572.        $options);
  573.     }
  574.     private function getCountyOptions()
  575.     {
  576.         if (is_null($this->countyOptions)) {
  577.             $requestCountyFlag $this->getRequestSetCountyFlag();
  578.             $this->countyOptions '<option value="all">' .
  579.                 $this->trans->get('text_label_page-list-partials_all-counties') .
  580.                 '</option>';
  581.             foreach ($this->activeCounties as $countyId => $county) {
  582.                 $selected null;
  583.                 if ($requestCountyFlag && in_array($countyId$requestCountyFlag)) {
  584.                     $selected ' selected="selected"';
  585.                 }
  586.                 $this->countyOptions .= sprintf(
  587.                     '<option value="%s"%s>%s</option>',
  588.                     $countyId,
  589.                     $selected,
  590.                     StringFormatter::mb_ucfirst($county)
  591.                 );
  592.             }
  593.         }
  594.         return $this->countyOptions;
  595.     }
  596.     public function renderMunicipalityRedis()
  597.     {
  598.         return sprintf('
  599.             <k-dropdown
  600.                 id="municipality-dropdown"
  601.                 class-list="k-dropdown--redis"
  602.                 default-label="%s"
  603.                 multiple-label="%s"
  604.                 input-name="municipality-dropdown"
  605.                 filter-placeholder="&nbsp"
  606.                 is-filterable
  607.                 is-disabled
  608.             >
  609.                 <div class="redis-search-footer" slot="footer">
  610.                     <button type="button" id="redis-search__muni-clear" class="button button--medium button--outlined">%s</button>
  611.                     <button type="submit" id="redis-search__muni-submit" class="button button--medium button--primary">
  612.                         <span class="keep-ratio">%s</span>
  613.                         <div class="send-animation-center">
  614.                             <div class="wave">
  615.                                 <span class="dot"></span><span class="dot"></span><span class="dot"></span>
  616.                             </div>
  617.                         </div>
  618.                     </button>
  619.                 </div>
  620.             </k-dropdown>',
  621.             $this->trans->get('text_label_page-list-partials_all-municipalities'),
  622.             $this->trans->get('text_label_page-list-partials_multiple-municipalities'),
  623.             $this->trans->get('text_label_page-list-partials_all-clear'),
  624.             $this->trans->get('text_label_page-list-partials_show-results'),
  625.         );
  626.     }
  627.     public function renderMunicipality()
  628.     {
  629.         $options $this->getMunicipalityOptions();
  630.         $idNumber $this->getIdNumber();
  631.         return sprintf('
  632.             <form class="sortflag_form" action="%s" method="GET">
  633.                 %s
  634.                 <div class="dropdown-select-wrapper dropdown-select-search" id="dd-third" data-stay-open="true">
  635.                                         <div class="dropdown-select">
  636.                                                 <div class="dropdown-select__trigger divider-icon"><span></span>
  637.                                                 </div>
  638.                                                 <div class="dropdown-select-search__input-wrapper">
  639.                                                         <input type="text" name="dropDownSearch" class="dropdown-select-search__input" autocomplete="off"/>
  640.                                                         <span class="form-clear-field"></span>
  641.                                                         <span class="DD-no-results">%s</span>
  642.                                                 </div>
  643.                                                 <div class="dropdown-options">
  644.                                                 </div>
  645.                                         </div>
  646.                                         <label for="setmunicipality%d" class="dropdown-label">%s:</label>
  647.                                         <select id="setmunicipality%d" name="setmunicipality" class="select_list" onChange="this.form.submit();">
  648.                                         %s
  649.                                         </select>
  650.                                 </div>
  651.                                 %s
  652.             </form>',
  653.            $this->getFormUrl(),
  654.            $this->renderSearchText(),
  655.            $this->trans->get('text_label_page-list-partials_municipality-no-result'),
  656.            $idNumber,
  657.            $this->trans->get('text_label_page-list-partials_municipality'),
  658.            $idNumber,
  659.            $options,
  660.            $this->renderHiddenCountyFlag()
  661.         );
  662.     }
  663.     private function getMunicipalityOptions()
  664.     {
  665.         if (is_null($this->municipalityOptions)) {
  666.             $this->municipalityOptions '<option value="all">' .
  667.                 $this->trans->get('text_label_page-list-partials_all-municipalities') . '</option>';
  668.             $requestSetMunicipality $this->getRequestSetMunicipality();
  669.             $requestSetCountyFlag $this->getRequestSetCountyFlag();
  670.             if ($requestSetCountyFlag && !in_array('all'$requestSetCountyFlag)) {
  671.                 $selected null;
  672.                 if ($requestSetMunicipality && in_array('countyclose'$requestSetMunicipality)) {
  673.                     $selected ' selected="selected"';
  674.                 }
  675.                 $this->municipalityOptions .= sprintf(
  676.                     '<option value="countyclose"%s>%s</option>',
  677.                     $selected,
  678.                     $this->trans->get('text_label_page-list-partials_close-counties')
  679.                 );
  680.             }
  681.             // If the user somehow have selected more than one county combined with more than one municipality, then reset municipalities.
  682.             if (
  683.                 $requestSetCountyFlag && count($requestSetCountyFlag) > &&
  684.                 $requestSetMunicipality && count($requestSetMunicipality) > 1
  685.             ) {
  686.                 $requestSetMunicipality null;
  687.             }
  688.             foreach ($this->activeMunicipalities as $locationId => $location) {
  689.                 $selected null;
  690.                 if ($requestSetMunicipality && in_array($locationId$requestSetMunicipality)) {
  691.                     $selected ' selected="selected"';
  692.                 }
  693.                 $this->municipalityOptions .= sprintf(
  694.                     '<option value="%s"%s>%s</option>',
  695.                     $locationId,
  696.                     $selected,
  697.                     StringFormatter::mb_ucfirst($location['name'])
  698.                 );
  699.             }
  700.         }
  701.         return $this->municipalityOptions;
  702.     }
  703.     public function renderPaging()
  704.     {
  705.         $options $this->getPagingOptions();
  706.         $lastPage $this->getPages();
  707.         if ($lastPage <= 1) {
  708.             return '';
  709.         }
  710.         $hiddenSetCountyFlag null;
  711.         $requestSetCountyFlag $this->getRequestSetCountyFlag();
  712.         if ($requestSetCountyFlag) {
  713.             foreach ($requestSetCountyFlag as $countyFlagItem) {
  714.                 $hiddenSetCountyFlag .= sprintf(
  715.                     '<input type="hidden" name="setcountyflag[]" value="%s">'$countyFlagItem
  716.                 );
  717.             }
  718.         }
  719.         $hiddenSetMunicipalityFlag null;
  720.         $requestSetMunicipality $this->getRequestSetMunicipality();
  721.         if ($requestSetMunicipality) {
  722.             foreach ($requestSetMunicipality as $municipalityItem) {
  723.                 $hiddenSetMunicipalityFlag .= sprintf(
  724.                     '<input type="hidden" name="setmunicipality[]" value="%s">'$municipalityItem
  725.                 );
  726.             }
  727.         }
  728.         $hiddenSearchTextFlag null;
  729.         if (isset($_REQUEST['searchtext'])) {
  730.             $hiddenSearchTextFlag sprintf(
  731.                 '<input type="hidden" name="searchtext" value="%s">'$_REQUEST['searchtext']
  732.             );
  733.         }
  734.         return sprintf('
  735.             <ul class="paginator">
  736.             %s
  737.             </ul>
  738.             <form class="pagination__search" method="get">
  739.                 <label for="pagination-input" class="pagination__label">%s: </label>
  740.                 <input id="pagination-input" name="curpage" data-maxValue="%d" min="1" class="pagination__input" type="number" maxlength="3" />
  741.                 <button class="pagination__submit" type="submit" disabled="disabled">
  742.                 </button>
  743.                 <span class="pagination__message"></span>
  744.                 %s %s %s %s
  745.             </form>
  746.         ',
  747.             $options,
  748.             $this->trans->get('text_label_page-list-partials_go-to-page'),
  749.             $lastPage,
  750.             $hiddenSetCountyFlag,
  751.             $hiddenSetMunicipalityFlag,
  752.             $hiddenSearchTextFlag,
  753.             $this->renderHiddenReservePriceFilter()
  754.         );
  755.     }
  756.     private function getPagingOptions()
  757.     {
  758.         if (is_null($this->pagingOptions)) {
  759.             $pagespan 2;
  760.             $firstLast 1;
  761.             $urlQuery = array(
  762.                 'curpage' => 1,
  763.             );
  764.             if ($this->getSearchText() !== '') {
  765.                 $urlQuery['searchtext'] = $this->getSearchText();
  766.             }
  767.             $requestSetCountyFlag $this->getRequestSetCountyFlag();
  768.             $requestSetMunicipality $this->getRequestSetMunicipality();
  769.             $requestReservePriceFilter $this->getReservePriceStatus();
  770.             if ($requestSetCountyFlag && !in_array('all'$requestSetCountyFlag)) {
  771.                 $urlQuery['setcountyflag'] = $requestSetCountyFlag;
  772.             }
  773.             if ($requestSetMunicipality && !in_array('all'$requestSetMunicipality)) {
  774.                 $urlQuery['setmunicipality'] = $requestSetMunicipality;
  775.             }
  776.             if ($requestReservePriceFilter) {
  777.                 $urlQuery['reserve'] = strtolower($requestReservePriceFilter->value);
  778.             }
  779.             $formUrl $this->getFormUrl();
  780.             $addLength 0;
  781.             if (($this->page $pagespan) < 0) {
  782.                 $addLength = ($pagespan $this->page);
  783.             }
  784.             $this->pagingOptions '';
  785.             if ($this->page 1) {
  786.                 $urlQuery['curpage'] = $this->page 1;
  787.                 $this->pagingOptions .= sprintf('<li><a class="pagination-arrow-left" href="%s?%s">&lt;</a></li>',
  788.                                 $formUrl,
  789.                                 http_build_query($urlQuery)
  790.                 );
  791.             }
  792.             $pagingItems = array();
  793.             $numberOfEllipses 0;
  794.             for ($i 1$i <= $this->pages$i++) {
  795.                 if (
  796.                     $i <= $firstLast ||
  797.                     ($i > ($this->page $pagespan) && $i < ($this->page $pagespan $addLength)) ||
  798.                     $i > ($this->pages $firstLast)
  799.                 ) {
  800.                     $pagingItems[] = array(
  801.                         'data' => $i,
  802.                         'ellipse' => false
  803.                     );
  804.                     if (
  805.                         ($i === $firstLast && $this->page > ($pagespan -$firstLast)) ||
  806.                         ($i === ($this->page $pagespan $addLength -1) && $this->page < ($this->pages $firstLast) && (int)$this->pages 4)
  807.                     ) {
  808.                         $pagingItems[] = array(
  809.                             'data' => null,
  810.                             'ellipse' => true
  811.                         );
  812.                         $numberOfEllipses++;
  813.                     }
  814.                 }
  815.             }
  816.             $ellipseQuantity 0;
  817.             foreach ($pagingItems as $index => $pagingItem) {
  818.                 $urlQuery['curpage'] = $pagingItem['data'];
  819.                 $activeClass '';
  820.                 if ($pagingItem['data'] === (int)$this->page) {
  821.                     $activeClass 'selected';
  822.                 } elseif (
  823.                     $numberOfEllipses &&
  824.                     !in_array($pagingItem['data'], array(1$this->page$this->pages)) &&
  825.                     (
  826.                         (isset($pagingItems[$index 1]) && $pagingItems[$index 1]['ellipse']) ||
  827.                         (isset($pagingItems[$index 1]) && $pagingItems[$index 1]['ellipse'])
  828.                     )
  829.                 ) {
  830.                     $activeClass 'mobile-hide';
  831.                 }
  832.                 $html sprintf('<li><a class="%s" href="%s?%s">%d</a></li>',
  833.                     $activeClass,
  834.                     $formUrl,
  835.                     http_build_query($urlQuery),
  836.                     $pagingItem['data']
  837.                 );
  838.                 $ellipseClass = array('paginator__ellipsis');
  839.                 if ($pagingItem['ellipse']) {
  840.                     $ellipseQuantity++;
  841.                     // The ellipse is visible on desktop when page 3 or second last page is active, this is wrong on
  842.                     // desktop and should only be shown on mobile.
  843.                     if (
  844.                         ($ellipseQuantity === && (((int)$this->page 3) === 0)) ||
  845.                         ($ellipseQuantity === && (((int)$this->pages - (int)$this->page) === 2))
  846.                     ) {
  847.                         $ellipseClass[] = 'desktop-hide';
  848.                     }
  849.                     $html sprintf('<li class="%s">...</li>'implode(' '$ellipseClass));
  850.                 }
  851.                 $this->pagingOptions .= $html;
  852.             }
  853.             if ($this->page $this->pages) {
  854.                 $urlQuery['curpage'] = $this->page 1;
  855.                 $this->pagingOptions .= sprintf('<li><a class="pagination-arrow-right" href="%s?%s">&gt;</a></li>',
  856.                                 $formUrl,
  857.                                 http_build_query($urlQuery)
  858.                 );
  859.             }
  860.         }
  861.         return $this->pagingOptions;
  862.     }
  863.     /**
  864.      * Render breadcrumb links
  865.      *
  866.      * @param int $categoryId
  867.      */
  868.     public function breadcrumbs($categoryId)
  869.     {
  870.         $breadcrumbs $this->breadcrumb->activeAuctionBreadcrumbs($categoryId);
  871.         $routeName 'app.legacy.auction.listing';
  872.         $routeNameCategory 'app.legacy.auction.listing.category';
  873.         if ($this->isShowClosed()) {
  874.             $breadcrumbs $this->breadcrumb->closedAuctionBreadcrumbs($categoryId);
  875.             $routeName 'app.legacy.auction.listing.closed';
  876.             $routeNameCategory 'app.legacy.auction.listing.closed.category';
  877.         }
  878.         $urlParams = [];
  879.         if (!empty($_REQUEST['searchtext'])) {
  880.             $urlParams['searchtext'] = $_REQUEST['searchtext'];
  881.             $urlParams['dosearch'] = '';
  882.             $breadcrumbs $this->breadcrumb->getBreadcrumbs($categoryId, array(
  883.                 array(
  884.                     'url' => '',
  885.                     'name' => $this->trans->get('text_label_page-list-partials_all-search-results'),
  886.                 ),
  887.             ));
  888.         }
  889.         $this->geoLocationUrlParams($urlParams);
  890.         $this->filterUrlParams($urlParams);
  891.         foreach($breadcrumbs as $index => $breadcrumbArray) {
  892.             if ($index === count($breadcrumbs)-1) {
  893.                 echo '<span>'.$breadcrumbArray['name'].'</span>';
  894.                 continue;
  895.             }
  896.             if ('' === $breadcrumbArray['url']) {
  897.                 $url $this->urlGenerator->generate($routeName$urlParams);
  898.             } else {
  899.                 $categoryUrlParams $urlParams;
  900.                 $categoryUrlParams['caturlname'] = $breadcrumbArray['url'];
  901.                 $url $this->urlGenerator->generate($routeNameCategory$categoryUrlParams);
  902.             }
  903.             echo '<a href="' $url '">'.$breadcrumbArray['name'].'</a>';
  904.         }
  905.     }
  906.     /**
  907.      * @param int $categoryId
  908.      *
  909.      * @throws CategoryCacheException
  910.      */
  911.     public function categoryButtons($categoryId)
  912.     {
  913.         if (is_null($this->categoryCache)) {
  914.             return;
  915.         }
  916.         $urlParams = [];
  917.         if (!empty($_REQUEST['searchtext'])) {
  918.             $searchCollection = new SearchCategoryCache($this->categoryCache->cachedCategories());
  919.             $categoriesCollection $searchCollection->buildFromProductObjects($this->objects);
  920.             $urlParams['searchtext'] = $_REQUEST['searchtext'];
  921.             $urlParams['dosearch'] = '';
  922.         } else {
  923.             $categoriesCollection $this->categoryCache->cachedCategories();
  924.         }
  925.         $this->geoLocationUrlParams($urlParams);
  926.         $this->filterUrlParams($urlParams);
  927.         $categoryButtons $categoriesCollection->getTopLevel();
  928.         try {
  929.             if ($categoryId) {
  930.                 $categoryButtons $categoriesCollection
  931.                     ->findById($categoryId)
  932.                     ->getChildren()
  933.                     ->showOnlyInParent(false)
  934.                     ->sortByOrder();
  935.                 if ($this->isShowClosed()) {
  936.                     $categoryButtons $categoryButtons->hasProductCount();
  937.                 }
  938.                 $categoryParent $categoriesCollection->findById($categoryId)->getParent();
  939.                 if ($categoryParent && !$categoryButtons->count()) {
  940.                     $categoryButtons $categoryParent
  941.                         ->getChildren()
  942.                         ->showOnlyInParent(false)
  943.                         ->sortByOrder();
  944.                     if ($this->isShowClosed()) {
  945.                         $categoryButtons $categoryButtons->hasProductCount();
  946.                     }
  947.                 }
  948.             }
  949.         } catch (CategoryCacheException $e) {
  950.             PageListLogger::critical('Missing category and has not rendered category buttons above the list', array($e->__toString()));
  951.         }
  952.         /** @var CacheCategory $category */
  953.         foreach($categoryButtons as $category) {
  954.             $numberOfProducts $category->getNumberOfProducts();
  955.             if ($category->getId() === $categoryId) {
  956.                 echo '<button class="button--category-tag button--category-tag--filled">' $category->getName() . '<span> (' $numberOfProducts ')</span></button>';
  957.                 continue;
  958.             }
  959.             $urlParams['caturlname'] = $category->getUrl();
  960.             $routeName $this->isShowClosed() ? 'app.legacy.auction.listing.closed.category' 'app.legacy.auction.listing.category';
  961.             echo '<a href="' $this->urlGenerator->generate($routeName$urlParams) . '" class="button--category-tag">' $category->getName() . '<span> (' $numberOfProducts ')</span></a>';
  962.         }
  963.     }
  964.     /**
  965.      * @param array $urlParams
  966.      *
  967.      * @return void
  968.      *
  969.      */
  970.     public function geoLocationUrlParams(&$urlParams)
  971.     {
  972.         $requestSetMunicipality $this->getRequestSetMunicipality();
  973.         $requestSetCountyFlag $this->getRequestSetCountyFlag();
  974.         if ($requestSetMunicipality) {
  975.             $urlParams['setmunicipality'] = $requestSetMunicipality;
  976.         }
  977.         if ($requestSetCountyFlag) {
  978.             $urlParams['setcountyflag'] = $requestSetCountyFlag;
  979.         }
  980.     }
  981.     /**
  982.      * @param $urlParams
  983.      * @return void
  984.      */
  985.     public function filterUrlParams(&$urlParams)
  986.     {
  987.         $reserve $this->getReservePriceStatus();
  988.         if ($reserve) {
  989.             $urlParams['reserve'] = strtolower($reserve->value);
  990.         }
  991.     }
  992.     /**
  993.      * @param null|int $selectedCategoryId
  994.      *
  995.      * @return string
  996.      * @throws CategoryCacheException
  997.      */
  998.     public function totalNumberOfProducts($selectedCategoryId null)
  999.     {
  1000.         if (is_null($this->categoryCache)) {
  1001.             return '';
  1002.         }
  1003.         $categoriesCollection $this->categoryCache->cachedCategories();
  1004.         if (!empty($_REQUEST['searchtext'])) {
  1005.             $searchCollection = new SearchCategoryCache($this->categoryCache->cachedCategories());
  1006.             $categoriesCollection $searchCollection->buildFromProductObjects($this->objects);
  1007.         }
  1008.         return number_format($categoriesCollection->totalNumberOfProducts($selectedCategoryId), 0','' ');
  1009.     }
  1010. }