mirror of https://github.com/YOURLS/YOURLS
281 lines
8.7 KiB
PHP
281 lines
8.7 KiB
PHP
<?php
|
|
/**
|
|
* Parameters used to display links the admin view (eg admin/index.php)
|
|
*
|
|
* @since 1.8.2
|
|
*/
|
|
|
|
namespace YOURLS\Views;
|
|
|
|
/**
|
|
* Class AdminParams to get admin view parameters (number of links to display, search, ...)
|
|
*
|
|
* @since 1.8.2
|
|
* @package YOURLS\Views
|
|
*/
|
|
class AdminParams
|
|
{
|
|
|
|
/**
|
|
* All possible search parameters. Populated in the constructor.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $possible_search_params;
|
|
|
|
/**
|
|
* All possible sort parameters. Populated in the constructor.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $possible_sort_params;
|
|
|
|
/**
|
|
* All possible date sorting parameters. Populated in the constructor.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $possible_date_sorting;
|
|
|
|
/**
|
|
* Parameter translations. Populated in the constructor.
|
|
*
|
|
* @var array
|
|
*/
|
|
private $params_translations;
|
|
|
|
|
|
/**
|
|
* Admin constructor : populate all default parameters
|
|
*
|
|
*/
|
|
public function __construct()
|
|
{
|
|
// Cast return values of yourls_apply_filter() to array in case a hook would incorrectly return something else
|
|
$this->possible_search_params = (array)yourls_apply_filter('admin_params_possible_search',
|
|
['all', 'keyword', 'url', 'title', 'ip']);
|
|
$this->possible_sort_params = (array)yourls_apply_filter('admin_params_possible_sort',
|
|
['keyword', 'url', 'title', 'ip', 'timestamp', 'clicks']);
|
|
$this->params_translations = (array)yourls_apply_filter('admin_params_possible_translations',[
|
|
'all' => yourls__('All fields'),
|
|
'keyword' => yourls__('Short URL'),
|
|
'url' => yourls__('URL'),
|
|
'title' => yourls__('Title'),
|
|
'ip' => yourls__('IP Address'),
|
|
'timestamp' => yourls__('Date'),
|
|
'clicks' => yourls__('Clicks'),
|
|
]);
|
|
$this->possible_date_sorting = (array)yourls_apply_filter('admin_params_possible_date_sort',
|
|
['before', 'after', 'between']);
|
|
}
|
|
|
|
/**
|
|
* Get the number of links to display per page
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @param int $default default number of links to display
|
|
* @return int
|
|
*/
|
|
public function get_per_page(int $default): int
|
|
{
|
|
// return if we have a value and it's not 0
|
|
if (isset($_GET['perpage']) && intval($_GET['perpage'])) {
|
|
$per_page = intval($_GET['perpage']);
|
|
// otherwise return filtered default value
|
|
} else {
|
|
// @hook Default number of links to display (value provided by caller eg /admin/index.php)
|
|
$per_page = yourls_apply_filter('admin_view_per_page', $default);
|
|
}
|
|
|
|
return $per_page;
|
|
}
|
|
|
|
/**
|
|
* Get the current page number to be displayed
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return int
|
|
*/
|
|
public function get_page(): int
|
|
{
|
|
return isset($_GET['page']) ? intval($_GET['page']) : 1;
|
|
}
|
|
|
|
/**
|
|
* Get search text (the 'Search for') from query string variables search_protocol, search_slashes and search
|
|
*
|
|
* Some servers don't like query strings containing "(ht|f)tp(s)://". A javascript bit
|
|
* explodes the search text into protocol, slashes and the rest (see JS function
|
|
* split_search_text_before_search()) and this function glues pieces back together
|
|
* See issue https://github.com/YOURLS/YOURLS/issues/1576
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_search(): string
|
|
{
|
|
$search = '';
|
|
if (isset($_GET['search_protocol'])) {
|
|
$search .= $_GET['search_protocol'];
|
|
}
|
|
if (isset($_GET['search_slashes'])) {
|
|
$search .= $_GET['search_slashes'];
|
|
}
|
|
if (isset($_GET['search'])) {
|
|
$search .= $_GET['search'];
|
|
}
|
|
|
|
// @hook Default search text in links displayed
|
|
return yourls_apply_filter('admin_view_get_search_text', htmlspecialchars(trim($search)));
|
|
}
|
|
|
|
/**
|
|
* Get the 'Search In' parameter (one of 'all', 'keyword', 'url', 'title', 'ip')
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_search_in(): string
|
|
{
|
|
if (isset($_GET['search_in']) && in_array($_GET['search_in'], $this->possible_search_params)) {
|
|
$search_in = $_GET['search_in'];
|
|
} else {
|
|
// @hook Default searching in the admin view (in all fields)
|
|
$search_in = yourls_apply_filter('admin_view_search_in', 'all');
|
|
}
|
|
|
|
return $search_in;
|
|
}
|
|
|
|
/**
|
|
* Get the 'Sort by' parameter
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return string
|
|
*/
|
|
public function get_sort_by(): string
|
|
{
|
|
if (isset($_GET['sort_by']) && in_array($_GET['sort_by'], $this->possible_sort_params)) {
|
|
$sort_by = $_GET['sort_by'];
|
|
} else {
|
|
// @hook Default sorting in the admin view (by Timestamp)
|
|
$sort_by = yourls_apply_filter('admin_view_sort_by', 'timestamp');
|
|
}
|
|
|
|
return $sort_by;
|
|
}
|
|
|
|
/**
|
|
* Get the correct phrasing associated to a search or sort parameter (ie 'all' -> 'All fields' for instance)
|
|
*
|
|
* No checks : you need to supply an existing parameter, see $params_translations
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @param string $param
|
|
* @return string
|
|
*/
|
|
public function get_param_long_name(string $param): string
|
|
{
|
|
return $this->params_translations[$param];
|
|
}
|
|
|
|
/**
|
|
* Get the sort order (asc or desc)
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function get_sort_order()
|
|
{
|
|
// @hook Default sorting order in the admin view (descending)
|
|
return isset($_GET['sort_order']) && $_GET['sort_order'] == 'asc' ? 'asc' : yourls_apply_filter('admin_view_sort_order', 'desc');
|
|
|
|
}
|
|
|
|
/**
|
|
* Get the click "more or less than"
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return mixed
|
|
*/
|
|
public function get_click_filter()
|
|
{
|
|
// @hook Default 'Show links with more/less than' ('more')
|
|
return isset($_GET['click_filter']) && $_GET['click_filter'] == 'less' ? 'less' : yourls_apply_filter('admin_view_click_filter', 'more');
|
|
}
|
|
|
|
/**
|
|
* Get the click threshold
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return int|string
|
|
*/
|
|
public function get_click_limit()
|
|
{
|
|
// @hook Default link click threshold (unset)
|
|
return (!empty($_GET['click_limit']) && intval($_GET['click_limit']) >= 0) ?
|
|
intval($_GET['click_limit']) : yourls_apply_filter('admin_view_click_limit', '');
|
|
}
|
|
|
|
|
|
/**
|
|
* Get the date parameters : the date "filter" and the two dates
|
|
*
|
|
* @since 1.8.2
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_date_params(): array
|
|
{
|
|
if (isset($_GET['date_filter']) && in_array($_GET['date_filter'], $this->possible_date_sorting)) {
|
|
$date_filter = $_GET['date_filter'];
|
|
} else {
|
|
// @hook Default date filtering (unset)
|
|
$date_filter = yourls_apply_filter('admin_view_date_filter', '');
|
|
}
|
|
|
|
switch ($date_filter) {
|
|
case 'after':
|
|
case 'before':
|
|
if (isset($_GET['date_first']) && yourls_sanitize_date($_GET['date_first'])) {
|
|
$date_first = yourls_sanitize_date($_GET['date_first']);
|
|
} else {
|
|
// @hook Default date when date filter is either 'after' or 'before' (unset)
|
|
// In such case, the filter is either 'admin_view_date_first_after' or 'admin_view_date_first_before'
|
|
$date_first = yourls_apply_filter('admin_view_date_first_' . $date_filter, '');
|
|
}
|
|
$date_second = '';
|
|
break;
|
|
|
|
case 'between':
|
|
if (isset($_GET['date_first']) && isset($_GET['date_second']) && yourls_sanitize_date($_GET['date_first']) && yourls_sanitize_date($_GET['date_second'])) {
|
|
$date_first = yourls_sanitize_date($_GET['date_first']);
|
|
$date_second = yourls_sanitize_date($_GET['date_second']);
|
|
} else {
|
|
// @hook Default dates when date filter is 'between' (unset)
|
|
$date_first = yourls_apply_filter('admin_view_date_first_between', '');
|
|
$date_second = yourls_apply_filter('admin_view_date_second_between', '');
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// @hook Default date when date filter is unset (unset)
|
|
$date_first = yourls_apply_filter('admin_view_date_first_unset', '');
|
|
$date_second = yourls_apply_filter('admin_view_date_second_unset', '');
|
|
|
|
}
|
|
|
|
return ['date_filter' => $date_filter, 'date_first' => $date_first, 'date_second' => $date_second];
|
|
}
|
|
|
|
}
|