setTitle(_t('@listings', 'Listings')); $this->setTemplate('profile.items.list', 'listings'); $this->setKey('profile.items.list'); } public function blocks() { $this->addListBlock(); } public function addListBlock($listView = ListFactory::LIST) { $this->addBlock('list', function () use ($listView) { return ListFactory::create($listView ?? $this->listView); }, function (ListListBlock $block) { $block->items = &$this->items; $block->setEmptyText($this->emptyText); $block->showBanners(false); }); } public function onSubmitAction() { $this->loadItems(); $this->respond('list', $this->getBlock('list')); $this->respond('pgn', $this->pages); return $this->getActionResponse(); } public function data() { $data = parent::data(); $this->loadItems(); # Categories select $data['cats'] = $this->categoriesSelectBasedOnFilter(); return $data; } public function categoriesSelectBasedOnFilter() { $options = [0 => ['id' => 0, 'title' => _t('listings', 'All Categories')]]; if ($this->total > 0) { if (! $this->skipFilter('categoryId')) { $options += Listings::model()->itemsListCategoriesMain($this->filter); } } return $options; } public function loadItems() { $this->fillFilter(); $filter = $this->prepareFilter(); if (empty($this->url)) { $this->url = $this->request->url(true, false); } $this->total = Listings::model()->itemsList($filter['filter'], true); if ($this->total > 0) { $pages = new Pagination($this->total, $this->pageSize, [ 'link' => $this->url, 'query' => ['page' => $this->page, 'c' => $this->categoryId], ]); $this->items = Listings::model()->itemsList($filter['filter'], false, [ 'orderBy' => $filter['orderBy'], 'limit' => $pages->getLimit(), 'offset' => $pages->getOffset(), ]); $this->page = $pages->getCurrentPage(); $this->pages = $pages->view(); } # Reinit list (using filter/settings view) if (! ($this->getBlock('list') instanceof $this->listViews[$this->listView]['view'])) { $this->addListBlock($this->listView); } } public function fillFilter() { $this->categoryId = $this->input->postget('c', TYPE_UINT); $this->query = $this->input->postget('q', TYPE_NOTAGS); $this->listView = $this->input->postget('lt', TYPE_NOTAGS); $this->page = $this->input->postget('page', TYPE_UINT); $this->listViews(); } public function skipFilter(string $filter, $skip = null) { if (! is_null($skip)) { $this->skipFilters[$filter] = $skip; } return $this->skipFilters[$filter] ?? false; } public function prepareFilter(): array { $filter = $this->filter; $orderBy = 'publicated_order DESC, id DESC'; # Category Id if ($this->categoryId > 0 && ! $this->skipFilter('categoryId')) { $filter[':cat-filter'] = $this->categoryId; } # Search query if ($this->query && ! $this->skipFilter('query')) { $this->query = $this->input->cleanSearchString($this->query); if (! empty($this->query)) { $filter[':query'] = $this->query; } } return [ 'filter' => $filter, 'orderBy' => $orderBy, ]; } /** * List views * @return array */ public function listViews() { if ($this->listViews) { return $this->listViews; } $views = ListFactory::views(); # Except map view unset($views[ListFactory::MAP]); # Default list view if (! $this->listView && $this->defaultListView) { $this->listView = $this->defaultListView; } # Correct current view if (! array_key_exists($this->listView, $views)) { reset($views); $this->listView = key($views); } # Mark active view foreach ($views as $key => $view) { $views[$key]['active'] = ($key === $this->listView); } return ($this->listViews = $views); } public function settingsForm($form) { $form ->number('pageSize', _t('@listings', 'Search Results'), 1, 100, 1, 10) ->label(_t('@', 'per page')) ->width(100); $form ->select('defaultListView', _t('@listings', 'Default list type'), ListFactory::LIST, function () { return $this->listViews(); }) ->width(200) ; } }