sforkowany z mirror/friendica
				
			Move mod/mod/msearch & mod/match to src/Module
							rodzic
							
								
									3f6ec3dd31
								
							
						
					
					
						commit
						75360f3b8c
					
				
							
								
								
									
										132
									
								
								mod/match.php
								
								
								
								
							
							
						
						
									
										132
									
								
								mod/match.php
								
								
								
								
							|  | @ -1,132 +0,0 @@ | ||||||
| <?php |  | ||||||
| /** |  | ||||||
|  * @copyright Copyright (C) 2010-2022, the Friendica project |  | ||||||
|  * |  | ||||||
|  * @license GNU AGPL version 3 or any later version |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU Affero General Public License as |  | ||||||
|  * published by the Free Software Foundation, either version 3 of the |  | ||||||
|  * License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU Affero General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Affero General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| use Friendica\App; |  | ||||||
| use Friendica\Content\Widget; |  | ||||||
| use Friendica\Core\Renderer; |  | ||||||
| use Friendica\Core\Search; |  | ||||||
| use Friendica\Database\DBA; |  | ||||||
| use Friendica\DI; |  | ||||||
| use Friendica\Model\Contact; |  | ||||||
| use Friendica\Model\Profile; |  | ||||||
| use Friendica\Module\Contact as ModuleContact; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Controller for /match. |  | ||||||
|  * |  | ||||||
|  * It takes keywords from your profile and queries the directory server for |  | ||||||
|  * matching keywords from other profiles. |  | ||||||
|  * |  | ||||||
|  * @param App $a App |  | ||||||
|  * |  | ||||||
|  * @return string |  | ||||||
|  * @throws ImagickException |  | ||||||
|  * @throws \Friendica\Network\HTTPException\InternalServerErrorException |  | ||||||
|  * @throws Exception |  | ||||||
|  */ |  | ||||||
| function match_content(App $a) |  | ||||||
| { |  | ||||||
| 	if (!DI::userSession()->getLocalUserId()) { |  | ||||||
| 		return ''; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	DI::page()['aside'] .= Widget::findPeople(); |  | ||||||
| 	DI::page()['aside'] .= Widget::follow(); |  | ||||||
| 
 |  | ||||||
| 	$_SESSION['return_path'] = DI::args()->getCommand(); |  | ||||||
| 
 |  | ||||||
| 	$profile = Profile::getByUID(DI::userSession()->getLocalUserId()); |  | ||||||
| 
 |  | ||||||
| 	if (!DBA::isResult($profile)) { |  | ||||||
| 		return ''; |  | ||||||
| 	} |  | ||||||
| 	if (!$profile['pub_keywords'] && (!$profile['prv_keywords'])) { |  | ||||||
| 		DI::sysmsg()->addNotice(DI::l10n()->t('No keywords to match. Please add keywords to your profile.')); |  | ||||||
| 		return ''; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	$params = []; |  | ||||||
| 	$tags = trim($profile['pub_keywords'] . ' ' . $profile['prv_keywords']); |  | ||||||
| 
 |  | ||||||
| 	if (DI::mode()->isMobile()) { |  | ||||||
| 		$limit = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'itemspage_mobile_network', |  | ||||||
| 			DI::config()->get('system', 'itemspage_network_mobile')); |  | ||||||
| 	} else { |  | ||||||
| 		$limit = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'system', 'itemspage_network', |  | ||||||
| 			DI::config()->get('system', 'itemspage_network')); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	$params['s'] = $tags; |  | ||||||
| 	$params['n'] = 100; |  | ||||||
| 
 |  | ||||||
| 	$entries = []; |  | ||||||
| 	foreach ([Search::getGlobalDirectory(), DI::baseUrl()] as $server) { |  | ||||||
| 		if (empty($server)) { |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		$msearch = json_decode(DI::httpClient()->post($server . '/msearch', $params)->getBody()); |  | ||||||
| 		if (!empty($msearch)) { |  | ||||||
| 			$entries = match_get_contacts($msearch, $entries, $limit); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (empty($entries)) { |  | ||||||
| 		DI::sysmsg()->addInfo(DI::l10n()->t('No matches')); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	$tpl = Renderer::getMarkupTemplate('contact/list.tpl'); |  | ||||||
| 	$o = Renderer::replaceMacros($tpl, [ |  | ||||||
| 		'$title'    => DI::l10n()->t('Profile Match'), |  | ||||||
| 		'$contacts' => array_slice($entries, 0, $limit), |  | ||||||
| 	]); |  | ||||||
| 
 |  | ||||||
| 	return $o; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function match_get_contacts($msearch, $entries, $limit) |  | ||||||
| { |  | ||||||
| 	if (empty($msearch->results)) { |  | ||||||
| 		return $entries; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	foreach ($msearch->results as $profile) { |  | ||||||
| 		if (!$profile) { |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		// Already known contact
 |  | ||||||
| 		$contact = Contact::getByURL($profile->url, null, ['rel'], DI::userSession()->getLocalUserId()); |  | ||||||
| 		if (!empty($contact) && in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { |  | ||||||
| 			continue; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		$contact = Contact::getByURLForUser($profile->url, DI::userSession()->getLocalUserId()); |  | ||||||
| 		if (!empty($contact)) { |  | ||||||
| 			$entries[$contact['id']] = ModuleContact::getContactTemplateVars($contact); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		if (count($entries) == $limit) { |  | ||||||
| 			break; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return $entries; |  | ||||||
| } |  | ||||||
|  | @ -1,64 +0,0 @@ | ||||||
| <?php |  | ||||||
| /** |  | ||||||
|  * @copyright Copyright (C) 2010-2022, the Friendica project |  | ||||||
|  * |  | ||||||
|  * @license GNU AGPL version 3 or any later version |  | ||||||
|  * |  | ||||||
|  * This program is free software: you can redistribute it and/or modify |  | ||||||
|  * it under the terms of the GNU Affero General Public License as |  | ||||||
|  * published by the Free Software Foundation, either version 3 of the |  | ||||||
|  * License, or (at your option) any later version. |  | ||||||
|  * |  | ||||||
|  * This program is distributed in the hope that it will be useful, |  | ||||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  * GNU Affero General Public License for more details. |  | ||||||
|  * |  | ||||||
|  * You should have received a copy of the GNU Affero General Public License |  | ||||||
|  * along with this program.  If not, see <https://www.gnu.org/licenses/>. |  | ||||||
|  * |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| use Friendica\App; |  | ||||||
| use Friendica\Core\System; |  | ||||||
| use Friendica\Database\DBA; |  | ||||||
| use Friendica\DI; |  | ||||||
| use Friendica\Model\User; |  | ||||||
| use Friendica\Util\Proxy; |  | ||||||
| 
 |  | ||||||
| function msearch_post(App $a) |  | ||||||
| { |  | ||||||
| 	$search = $_POST['s'] ?? ''; |  | ||||||
| 	$perpage  = intval(($_POST['n'] ?? 0) ?: 80); |  | ||||||
| 	$page     = intval(($_POST['p'] ?? 0) ?: 1); |  | ||||||
| 	$startrec = ($page - 1) * $perpage; |  | ||||||
| 
 |  | ||||||
| 	$total = 0; |  | ||||||
| 	$results = []; |  | ||||||
| 
 |  | ||||||
| 	if (!strlen($search)) { |  | ||||||
| 		$output = ['total' => 0, 'items_page' => $perpage, 'page' => $page, 'results' => $results]; |  | ||||||
| 		System::jsonExit($output); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	$total = 0; |  | ||||||
| 
 |  | ||||||
| 	$condition = ["`net-publish` AND MATCH(`pub_keywords`) AGAINST (?)", $search]; |  | ||||||
| 	$total = DBA::count('owner-view', $condition); |  | ||||||
| 
 |  | ||||||
| 	$search_stmt = DBA::select('owner-view', ['pub_keywords', 'name', 'nickname', 'uid'], $condition, ['limit' => [$startrec, $perpage]]); |  | ||||||
| 	while ($search_result = DBA::fetch($search_stmt)) { |  | ||||||
| 		$results[] = [ |  | ||||||
| 			'name'  => $search_result['name'], |  | ||||||
| 			'url'   => DI::baseUrl() . '/profile/' . $search_result['nickname'], |  | ||||||
| 			'photo' => User::getAvatarUrl($search_result, Proxy::SIZE_THUMB), |  | ||||||
| 			'tags'  => str_replace([',', '  '], [' ', ' '], $search_result['pub_keywords']) |  | ||||||
| 		]; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	DBA::close($search_stmt); |  | ||||||
| 
 |  | ||||||
| 	$output = ['total' => $total, 'items_page' => $perpage, 'page' => $page, 'results' => $results]; |  | ||||||
| 
 |  | ||||||
| 	System::jsonExit($output); |  | ||||||
| } |  | ||||||
|  | @ -0,0 +1,169 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Friendica\Module\Contact; | ||||||
|  | 
 | ||||||
|  | use Friendica\App; | ||||||
|  | use Friendica\BaseModule; | ||||||
|  | use Friendica\Content\Widget; | ||||||
|  | use Friendica\Core\Config\Capability\IManageConfigValues; | ||||||
|  | use Friendica\Core\L10n; | ||||||
|  | use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; | ||||||
|  | use Friendica\Core\Renderer; | ||||||
|  | use Friendica\Core\Search; | ||||||
|  | use Friendica\Core\Session\Capability\IHandleUserSessions; | ||||||
|  | use Friendica\Database\Database; | ||||||
|  | use Friendica\Model\Contact; | ||||||
|  | use Friendica\Model\Profile; | ||||||
|  | use Friendica\Module\Contact as ModuleContact; | ||||||
|  | use Friendica\Module\Response; | ||||||
|  | use Friendica\Navigation\SystemMessages; | ||||||
|  | use Friendica\Network\HTTPClient\Capability\ICanSendHttpRequests; | ||||||
|  | use Friendica\Network\HTTPException\InternalServerErrorException; | ||||||
|  | use Friendica\Util\Profiler; | ||||||
|  | use Psr\Log\LoggerInterface; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Controller for /match. | ||||||
|  |  * | ||||||
|  |  * It takes keywords from your profile and queries the directory server for | ||||||
|  |  * matching keywords from other profiles. | ||||||
|  |  */ | ||||||
|  | class Match extends BaseModule | ||||||
|  | { | ||||||
|  | 	const FETCH_PER_PAGE = 100; | ||||||
|  | 
 | ||||||
|  | 	/** @var IHandleUserSessions */ | ||||||
|  | 	protected $session; | ||||||
|  | 	/** @var Database */ | ||||||
|  | 	protected $database; | ||||||
|  | 	/** @var SystemMessages */ | ||||||
|  | 	protected $systemMessages; | ||||||
|  | 	/** @var App\Page */ | ||||||
|  | 	protected $page; | ||||||
|  | 	/** @var App\Mode */ | ||||||
|  | 	protected $mode; | ||||||
|  | 	/** @var IManageConfigValues */ | ||||||
|  | 	protected $config; | ||||||
|  | 	/** @var IManagePersonalConfigValues */ | ||||||
|  | 	protected $pConfig; | ||||||
|  | 	/** @var ICanSendHttpRequests */ | ||||||
|  | 	protected $httpClient; | ||||||
|  | 
 | ||||||
|  | 	public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, IHandleUserSessions $session, Database $database, SystemMessages $systemMessages, App\Page $page, App\Mode $mode, IManageConfigValues $config, IManagePersonalConfigValues $pConfig, ICanSendHttpRequests $httpClient, array $server, array $parameters = []) | ||||||
|  | 	{ | ||||||
|  | 		parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); | ||||||
|  | 
 | ||||||
|  | 		$this->session        = $session; | ||||||
|  | 		$this->database       = $database; | ||||||
|  | 		$this->systemMessages = $systemMessages; | ||||||
|  | 		$this->page           = $page; | ||||||
|  | 		$this->mode           = $mode; | ||||||
|  | 		$this->config         = $config; | ||||||
|  | 		$this->pConfig        = $pConfig; | ||||||
|  | 		$this->httpClient     = $httpClient; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	protected function content(array $request = []): string | ||||||
|  | 	{ | ||||||
|  | 		if (!$this->session->getLocalUserId()) { | ||||||
|  | 			$this->systemMessages->addNotice($this->t('Permission denied.')); | ||||||
|  | 			$this->baseUrl->redirect('login&return_path=match'); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$profile = Profile::getByUID($this->session->getLocalUserId()); | ||||||
|  | 
 | ||||||
|  | 		if (empty($profile)) { | ||||||
|  | 			$this->logger->warning('Couldn\'t find Profile for user id in session.', ['uid' => $this->session->getLocalUserId()]); | ||||||
|  | 			throw new InternalServerErrorException($this->t('Invalid request.')); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$this->page['aside'] .= Widget::findPeople(); | ||||||
|  | 		$this->page['aside'] .= Widget::follow(); | ||||||
|  | 
 | ||||||
|  | 		if (empty($profile['pub_keywords']) && empty($profile['prv_keywords'])) { | ||||||
|  | 			$this->systemMessages->addNotice($this->t('No keywords to match. Please add keywords to your profile.')); | ||||||
|  | 			return ''; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if ($this->mode->isMobile()) { | ||||||
|  | 			$limit = $this->pConfig->get($this->session->getLocalUserId(), 'system', 'itemspage_mobile_network') | ||||||
|  | 					 ?? $this->config->get('system', 'itemspage_network_mobile'); | ||||||
|  | 		} else { | ||||||
|  | 			$limit = $this->pConfig->get($this->session->getLocalUserId(), 'system', 'itemspage_network') | ||||||
|  | 					 ?? $this->config->get('system', 'itemspage_network'); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$searchParameters = [ | ||||||
|  | 			's' => trim($profile['pub_keywords'] . ' ' . $profile['prv_keywords']), | ||||||
|  | 			'n' => self::FETCH_PER_PAGE, | ||||||
|  | 		]; | ||||||
|  | 
 | ||||||
|  | 		$entries = []; | ||||||
|  | 
 | ||||||
|  | 		foreach ([Search::getGlobalDirectory(), $this->baseUrl] as $server) { | ||||||
|  | 			if (empty($server)) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			$result = $this->httpClient->post($server . '/search/user/tags', $searchParameters); | ||||||
|  | 			if (!$result->isSuccess()) { | ||||||
|  | 				// try legacy endpoint
 | ||||||
|  | 				$result = $this->httpClient->post($server . '/contact/search/tags', $searchParameters); | ||||||
|  | 				if (!$result->isSuccess()) { | ||||||
|  | 					$this->logger->notice('Search-Endpoint not available for server.', ['server' => $server]); | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			$entries = $this->parseContacts(json_decode($result->getBody()), $entries, $limit); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (empty($entries)) { | ||||||
|  | 			$this->systemMessages->addNotice($this->t('No matches')); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$tpl = Renderer::getMarkupTemplate('contact/list.tpl'); | ||||||
|  | 		return Renderer::replaceMacros($tpl, [ | ||||||
|  | 			'$title'    => $this->t('Profile Match'), | ||||||
|  | 			'$contacts' => array_slice($entries, 0, $limit), | ||||||
|  | 		]); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * parses the JSON result and adds the new entries until the limit is reached | ||||||
|  | 	 * | ||||||
|  | 	 * @param       $jsonResult | ||||||
|  | 	 * @param array $entries | ||||||
|  | 	 * @param int   $limit | ||||||
|  | 	 * | ||||||
|  | 	 * @return array the new entries array | ||||||
|  | 	 */ | ||||||
|  | 	protected function parseContacts($jsonResult, array $entries, int $limit): array | ||||||
|  | 	{ | ||||||
|  | 		if (empty($jsonResult->results)) { | ||||||
|  | 			return $entries; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		foreach ($jsonResult->results as $profile) { | ||||||
|  | 			if (!$profile) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			// Already known contact
 | ||||||
|  | 			$contact = Contact::getByURL($profile->url, null, ['rel'], $this->session->getLocalUserId()); | ||||||
|  | 			if (!empty($contact) && in_array($contact['rel'], [Contact::FRIEND, Contact::SHARING])) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			$contact = Contact::getByURLForUser($profile->url, $this->session->getLocalUserId()); | ||||||
|  | 			if (!empty($contact)) { | ||||||
|  | 				$entries[$contact['id']] = ModuleContact::getContactTemplateVars($contact); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (count($entries) == $limit) { | ||||||
|  | 				break; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return $entries; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,88 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Friendica\Module\Search; | ||||||
|  | 
 | ||||||
|  | use Friendica\App; | ||||||
|  | use Friendica\BaseModule; | ||||||
|  | use Friendica\Core\L10n; | ||||||
|  | use Friendica\Core\System; | ||||||
|  | use Friendica\Database\Database; | ||||||
|  | use Friendica\Model\User; | ||||||
|  | use Friendica\Module\Response; | ||||||
|  | use Friendica\Util\Profiler; | ||||||
|  | use Friendica\Util\Proxy; | ||||||
|  | use Psr\Log\LoggerInterface; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Search users because of their public/private tags | ||||||
|  |  */ | ||||||
|  | class Tags extends BaseModule | ||||||
|  | { | ||||||
|  | 	const DEFAULT_ITEMS_PER_PAGE = 80; | ||||||
|  | 
 | ||||||
|  | 	/** @var Database */ | ||||||
|  | 	protected $database; | ||||||
|  | 
 | ||||||
|  | 	public function __construct(L10n $l10n, App\BaseURL $baseUrl, App\Arguments $args, LoggerInterface $logger, Profiler $profiler, Response $response, Database $database, array $server, array $parameters = []) | ||||||
|  | 	{ | ||||||
|  | 		parent::__construct($l10n, $baseUrl, $args, $logger, $profiler, $response, $server, $parameters); | ||||||
|  | 
 | ||||||
|  | 		$this->database = $database; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	protected function rawContent(array $request = []) | ||||||
|  | 	{ | ||||||
|  | 		$tags     = $request['s'] ?? ''; | ||||||
|  | 		$perPage  = intval($request['n'] ?? self::DEFAULT_ITEMS_PER_PAGE); | ||||||
|  | 		$page     = intval($request['p'] ?? 1); | ||||||
|  | 		$startRec = ($page - 1) * $perPage; | ||||||
|  | 
 | ||||||
|  | 		$results = []; | ||||||
|  | 
 | ||||||
|  | 		if (empty($tags)) { | ||||||
|  | 			System::jsonExit([ | ||||||
|  | 				'total'      => 0, | ||||||
|  | 				'items_page' => $perPage, | ||||||
|  | 				'page'       => $page, | ||||||
|  | 				'results'    => $results, | ||||||
|  | 			]); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$condition = [ | ||||||
|  | 			"`net-publish` AND MATCH(`pub_keywords`) AGAINST (?)", | ||||||
|  | 			$tags | ||||||
|  | 		]; | ||||||
|  | 
 | ||||||
|  | 		$totalCount = $this->database->count('owner-view', $condition); | ||||||
|  | 		if ($totalCount === 0) { | ||||||
|  | 			System::jsonExit([ | ||||||
|  | 				'total'      => 0, | ||||||
|  | 				'items_page' => $perPage, | ||||||
|  | 				'page'       => $page, | ||||||
|  | 				'results'    => $results, | ||||||
|  | 			]); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$searchStmt = $this->database->select('owner-view', | ||||||
|  | 			['pub_keywords', 'name', 'nickname', 'uid'], | ||||||
|  | 			$condition, | ||||||
|  | 			['limit' => [$startRec, $perPage]]); | ||||||
|  | 
 | ||||||
|  | 		while ($searchResult = $this->database->fetch($searchStmt)) { | ||||||
|  | 			$results[] = [ | ||||||
|  | 				'name'  => $searchResult['name'], | ||||||
|  | 				'url'   => $this->baseUrl . '/profile/' . $searchResult['nickname'], | ||||||
|  | 				'photo' => User::getAvatarUrl($searchResult, Proxy::SIZE_THUMB), | ||||||
|  | 			]; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		$this->database->close($searchStmt); | ||||||
|  | 
 | ||||||
|  | 		System::jsonExit([ | ||||||
|  | 			'total'      => $totalCount, | ||||||
|  | 			'items_page' => $perPage, | ||||||
|  | 			'page'       => $page, | ||||||
|  | 			'results'    => $results, | ||||||
|  | 		]); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -384,6 +384,7 @@ return [ | ||||||
| 		'/hidden'                     => [Module\Contact::class,               [R::GET]], | 		'/hidden'                     => [Module\Contact::class,               [R::GET]], | ||||||
| 		'/hovercard'                  => [Module\Contact\Hovercard::class,     [R::GET]], | 		'/hovercard'                  => [Module\Contact\Hovercard::class,     [R::GET]], | ||||||
| 		'/ignored'                    => [Module\Contact::class,               [R::GET]], | 		'/ignored'                    => [Module\Contact::class,               [R::GET]], | ||||||
|  | 		'/match'                      => [Module\Contact\Match::class,         [R::GET]], | ||||||
| 		'/pending'                    => [Module\Contact::class,               [R::GET]], | 		'/pending'                    => [Module\Contact::class,               [R::GET]], | ||||||
| 		'/redir/{id:\d+}'             => [Module\Contact\Redir::class,         [R::GET]], | 		'/redir/{id:\d+}'             => [Module\Contact\Redir::class,         [R::GET]], | ||||||
| 		'/suggestions'                => [Module\Contact\Suggestions::class,   [R::GET]], | 		'/suggestions'                => [Module\Contact\Suggestions::class,   [R::GET]], | ||||||
|  | @ -575,6 +576,7 @@ return [ | ||||||
| 		'/acl'                 => [Module\Search\Acl::class,   [R::GET, R::POST]], | 		'/acl'                 => [Module\Search\Acl::class,   [R::GET, R::POST]], | ||||||
| 		'/saved/add'           => [Module\Search\Saved::class, [R::GET         ]], | 		'/saved/add'           => [Module\Search\Saved::class, [R::GET         ]], | ||||||
| 		'/saved/remove'        => [Module\Search\Saved::class, [R::GET         ]], | 		'/saved/remove'        => [Module\Search\Saved::class, [R::GET         ]], | ||||||
|  | 		'/user/tags'           => [Module\Search\Tags::class,  [        R::POST]], | ||||||
| 	], | 	], | ||||||
| 
 | 
 | ||||||
| 	'/receive' => [ | 	'/receive' => [ | ||||||
|  |  | ||||||
|  | @ -5,8 +5,8 @@ | ||||||
| 	<form action="dirfind" method="get" /> | 	<form action="dirfind" method="get" /> | ||||||
| 		<input id="side-peoplefind-url" type="text" name="search" size="24" title="{{$nv.hint}}" /><input id="side-peoplefind-submit" type="submit" name="submit" value="{{$nv.findthem}}" /> | 		<input id="side-peoplefind-url" type="text" name="search" size="24" title="{{$nv.hint}}" /><input id="side-peoplefind-submit" type="submit" name="submit" value="{{$nv.findthem}}" /> | ||||||
| 	</form> | 	</form> | ||||||
| 	<div class="side-link" id="side-match-link"><a href="match">{{$nv.similar}}</a></div> | 	<div class="side-link" id="side-match-link"><a href="contact/match">{{$nv.similar}}</a></div> | ||||||
| 	<div class="side-link" id="side-suggest-link"><a href="suggest">{{$nv.suggest}}</a></div> | 	<div class="side-link" id="side-suggest-link"><a href="contact/suggest">{{$nv.suggest}}</a></div> | ||||||
| 	<div class="side-link" id="side-directory-link"><a href="directory">{{$nv.local_directory}}</a></div> | 	<div class="side-link" id="side-directory-link"><a href="directory">{{$nv.local_directory}}</a></div> | ||||||
| 	<div class="side-link" id="side-directory-link"><a href="{{$nv.global_dir}}" target="extlink">{{$nv.directory}}</a></div> | 	<div class="side-link" id="side-directory-link"><a href="{{$nv.global_dir}}" target="extlink">{{$nv.directory}}</a></div> | ||||||
| 	<div class="side-link" id="side-random-profile-link"><a href="randprof" target="extlink">{{$nv.random}}</a></div> | 	<div class="side-link" id="side-random-profile-link"><a href="randprof" target="extlink">{{$nv.random}}</a></div> | ||||||
|  |  | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| 	<div class="side-link" id="side-directory-link"><a href="directory">{{$nv.local_directory}}</a></div> | 	<div class="side-link" id="side-directory-link"><a href="directory">{{$nv.local_directory}}</a></div> | ||||||
| 	<div class="side-link" id="side-directory-link"><a href="{{$nv.global_dir}}" target="extlink">{{$nv.directory}}</a></div> | 	<div class="side-link" id="side-directory-link"><a href="{{$nv.global_dir}}" target="extlink">{{$nv.directory}}</a></div> | ||||||
| 	{{* Additional links *}} | 	{{* Additional links *}} | ||||||
| 	<div class="side-link" id="side-match-link"><a href="match">{{$nv.similar}}</a></div> | 	<div class="side-link" id="side-match-link"><a href="contact/match">{{$nv.similar}}</a></div> | ||||||
| 	<div class="side-link" id="side-suggest-link"><a href="contact/suggestions">{{$nv.suggest}}</a></div> | 	<div class="side-link" id="side-suggest-link"><a href="contact/suggestions">{{$nv.suggest}}</a></div> | ||||||
| 	<div class="side-link" id="side-random-profile-link"><a href="randprof" target="extlink">{{$nv.random}}</a></div> | 	<div class="side-link" id="side-random-profile-link"><a href="randprof" target="extlink">{{$nv.random}}</a></div> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Ładowanie…
	
		Reference in New Issue
	
	 Philipp
						Philipp