Heimdall/app/Search.php

144 lines
4.3 KiB
PHP
Raw Normal View History

<?php
namespace App;
2019-01-16 14:47:32 +00:00
2019-01-18 15:21:50 +00:00
use Cache;
use Form;
use Illuminate\Support\Collection;
use Yaml;
2019-01-16 14:47:32 +00:00
abstract class Search
{
2019-01-18 18:21:44 +00:00
/**
* List of all search providers
*
* @return Collection
2019-01-18 18:21:44 +00:00
*/
2022-11-29 22:13:24 +00:00
public static function providers(): Collection
2019-01-16 14:47:32 +00:00
{
$providers = self::standardProviders();
2019-01-18 15:21:50 +00:00
$providers = $providers + self::appProviders();
return collect($providers);
2019-01-16 14:47:32 +00:00
}
2019-01-18 18:21:44 +00:00
/**
* Gets details for a single provider
*
2022-11-14 12:21:47 +00:00
* @return false|object
2019-01-18 18:21:44 +00:00
*/
2019-01-16 14:47:32 +00:00
public static function providerDetails($provider)
{
$providers = self::providers();
if (! isset($providers[$provider])) {
return false;
}
return (object) $providers[$provider] ?? false;
2019-01-16 14:47:32 +00:00
}
2019-01-18 18:21:44 +00:00
/**
* Array of the standard providers
*
* @return array
2019-01-18 18:21:44 +00:00
*/
2022-11-14 12:21:47 +00:00
public static function standardProviders(): array
2019-01-16 14:47:32 +00:00
{
// $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json')));
// print_r($providers);
$providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
$all = [];
foreach ($providers as $key => $provider) {
$all[$key] = $provider;
$all[$key]['type'] = 'standard';
}
return $all;
2019-01-16 14:47:32 +00:00
}
2019-01-18 18:21:44 +00:00
/**
* Loops through users apps to see if app is a search provider, might be worth
* looking into caching this at some point
*
* @return array
2019-01-18 18:21:44 +00:00
*/
2022-11-29 22:13:24 +00:00
public static function appProviders(): array
2019-01-18 15:21:50 +00:00
{
$providers = [];
$userapps = Item::all();
foreach ($userapps as $app) {
if (empty($app->class)) {
continue;
}
if (($provider = Item::isSearchProvider($app->class)) !== false) {
2019-01-18 15:21:50 +00:00
$name = Item::nameFromClass($app->class);
2019-09-11 17:42:33 +00:00
$providers[$app->id] = [
'id' => $app->id,
2019-01-18 15:21:50 +00:00
'type' => $provider->type,
2019-01-18 18:21:44 +00:00
'class' => $app->class,
'url' => $app->url,
'name' => $app->title,
2019-09-11 17:42:33 +00:00
'colour' => $app->colour,
'icon' => $app->icon,
'description' => $app->description,
2019-01-18 15:21:50 +00:00
];
}
}
2019-01-18 15:21:50 +00:00
return $providers;
}
2019-01-18 18:21:44 +00:00
/**
* Outputs the search form
*
2022-11-14 12:21:47 +00:00
* @return string
2019-01-18 15:21:50 +00:00
*/
2022-11-14 12:21:47 +00:00
public static function form(): string
2019-01-18 15:21:50 +00:00
{
$output = '';
$homepage_search = Setting::fetch('homepage_search');
$search_provider = Setting::where('key', '=', 'search_provider')->first();
$user_search_provider = Setting::fetch('search_provider');
//die(print_r($search_provider));
2019-01-18 15:21:50 +00:00
//die(var_dump($user_search_provider));
// return early if search isn't applicable
if ((bool) $homepage_search !== true) {
return $output;
}
2019-01-18 18:21:44 +00:00
$user_search_provider = $user_search_provider ?? 'none';
2019-01-18 15:21:50 +00:00
2022-11-14 12:21:47 +00:00
if ((bool) $search_provider) {
if ((bool) $user_search_provider) {
2019-01-18 15:21:50 +00:00
$name = 'app.options.'.$user_search_provider;
$provider = self::providerDetails($user_search_provider);
$output .= '<div class="searchform">';
$output .= '<form action="'.url('search').'"'.getLinkTargetAttribute().' method="get">';
2019-01-18 15:21:50 +00:00
$output .= '<div id="search-container" class="input-container">';
$output .= '<select name="provider">';
foreach (self::providers() as $key => $searchprovider) {
$selected = ((string) $key === (string) $user_search_provider) ? ' selected="selected"' : '';
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
2019-01-18 15:21:50 +00:00
}
$output .= '</select>';
$output .= Form::text(
'q',
null,
[
'class' => 'homesearch',
'autofocus' => 'autofocus',
'placeholder' => __('app.settings.search').'...'
]
);
2019-01-18 15:21:50 +00:00
$output .= '<button type="submit">'.ucwords(__('app.settings.search')).'</button>';
$output .= '</div>';
$output .= '</form>';
2019-01-18 15:21:50 +00:00
$output .= '</div>';
}
}
2019-01-18 15:21:50 +00:00
return $output;
}
2019-09-11 17:42:33 +00:00
}