mirror of
https://github.com/openvk/openvk
synced 2024-11-15 03:31:18 +03:00
130 lines
4.5 KiB
PHP
130 lines
4.5 KiB
PHP
<?php declare(strict_types=1);
|
||
namespace openvk\Web\Presenters;
|
||
use openvk\Web\Models\Entities\{User, Club};
|
||
use openvk\Web\Models\Repositories\{Users, Clubs, Posts, Videos, Applications, Audios};
|
||
use Chandler\Database\DatabaseConnection;
|
||
|
||
final class SearchPresenter extends OpenVKPresenter
|
||
{
|
||
private $users;
|
||
private $clubs;
|
||
private $posts;
|
||
private $videos;
|
||
private $apps;
|
||
private $audios;
|
||
|
||
function __construct()
|
||
{
|
||
$this->users = new Users;
|
||
$this->clubs = new Clubs;
|
||
$this->posts = new Posts;
|
||
$this->videos = new Videos;
|
||
$this->apps = new Applications;
|
||
$this->audios = new Audios;
|
||
|
||
parent::__construct();
|
||
}
|
||
|
||
function renderIndex(): void
|
||
{
|
||
$this->assertUserLoggedIn();
|
||
|
||
$query = $this->queryParam("q") ?? "";
|
||
$section = $this->queryParam("section") ?? "users";
|
||
$order = $this->queryParam("order") ?? "id";
|
||
$invert = (int) ($this->queryParam("invert") ?? 0) == 1;
|
||
$page = (int) ($this->queryParam("p") ?? 1);
|
||
|
||
# https://youtu.be/pSAWM5YuXx8
|
||
# https://youtu.be/FfNZRhIn2Vk
|
||
|
||
$repos = [
|
||
"groups" => "clubs",
|
||
"users" => "users",
|
||
"posts" => "posts",
|
||
"videos" => "videos",
|
||
"audios" => "audios",
|
||
"apps" => "apps",
|
||
"audios_playlists" => "audios"
|
||
];
|
||
$parameters = [
|
||
"ignore_private" => true,
|
||
];
|
||
|
||
foreach($_REQUEST as $param_name => $param_value) {
|
||
if(is_null($param_value)) continue;
|
||
|
||
switch($param_name) {
|
||
default:
|
||
$parameters[$param_name] = $param_value;
|
||
break;
|
||
case 'marital_status':
|
||
case 'polit_views':
|
||
if((int) $param_value == 0) continue;
|
||
$parameters[$param_name] = $param_value;
|
||
|
||
break;
|
||
case 'is_online':
|
||
if((int) $param_value == 1)
|
||
$parameters['is_online'] = 1;
|
||
|
||
break;
|
||
case 'only_performers':
|
||
if((int) $param_value == 1 || $param_value == 'on')
|
||
$parameters['only_performers'] = true;
|
||
|
||
break;
|
||
case 'with_lyrics':
|
||
if($param_value == 'on' || $param_value == '1')
|
||
$parameters['with_lyrics'] = true;
|
||
|
||
break;
|
||
# дай бог работал этот case
|
||
case 'from_me':
|
||
if((int) $param_value != 1) continue;
|
||
$parameters['from_me'] = $this->user->id;
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
$repo = $repos[$section] or $this->throwError(400, "Bad Request", "Invalid search entity $section.");
|
||
|
||
$results = NULL;
|
||
switch($section) {
|
||
default:
|
||
$results = $this->{$repo}->find($query, $parameters, ['type' => $order, 'invert' => $invert]);
|
||
break;
|
||
case 'audios_playlists':
|
||
$results = $this->{$repo}->findPlaylists($query, $parameters, ['type' => $order, 'invert' => $invert]);
|
||
break;
|
||
}
|
||
|
||
$iterator = $results->page($page, OPENVK_DEFAULT_PER_PAGE);
|
||
$count = $results->size();
|
||
|
||
$this->template->order = $order;
|
||
$this->template->invert = $invert;
|
||
$this->template->data = $this->template->iterator = iterator_to_array($iterator);
|
||
$this->template->count = $count;
|
||
$this->template->section = $section;
|
||
$this->template->page = $page;
|
||
$this->template->perPage = OPENVK_DEFAULT_PER_PAGE;
|
||
$this->template->query = $query;
|
||
$this->template->atSearch = true;
|
||
|
||
$this->template->paginatorConf = (object) [
|
||
"page" => $page,
|
||
"count" => $count,
|
||
"amount" => sizeof($this->template->data),
|
||
"perPage" => $this->template->perPage,
|
||
"atBottom" => false,
|
||
"tidy" => true,
|
||
"space" => 6,
|
||
'pageCount' => ceil($count / $this->template->perPage),
|
||
];
|
||
$this->template->extendedPaginatorConf = clone $this->template->paginatorConf;
|
||
$this->template->extendedPaginatorConf->space = 11;
|
||
$this->template->paginatorConf->atTop = true;
|
||
}
|
||
}
|