implement [ApiModule].listing() in frontend-module as sorting/limiting/searching is now possible via API call (partly untested)
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
This commit is contained in:
@@ -4,6 +4,36 @@ namespace Froxlor;
|
||||
class PhpHelper
|
||||
{
|
||||
|
||||
private static $sort_key = 'id';
|
||||
|
||||
private static $sort_type = SORT_STRING;
|
||||
|
||||
/**
|
||||
* sort an array by either natural or string sort and a given index where the value for comparison is found
|
||||
*
|
||||
* @param array $list
|
||||
* @param string $key
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function sortListBy(&$list, $key = 'id')
|
||||
{
|
||||
self::$sort_type = Settings::Get('panel.natsorting') == 1 ? SORT_NATURAL : SORT_STRING;
|
||||
self::$sort_key = $key;
|
||||
return usort($list, array(
|
||||
'self',
|
||||
'sortListByGivenKey'
|
||||
));
|
||||
}
|
||||
|
||||
private static function sortListByGivenKey($a, $b)
|
||||
{
|
||||
if (self::$sort_type == SORT_NATURAL) {
|
||||
return strnatcasecmp($a[self::$sort_key], $b[self::$sort_key]);
|
||||
}
|
||||
return strcasecmp($a[self::$sort_key], $b[self::$sort_key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper around htmlentities to handle arrays, with the advantage that you
|
||||
* can select which fields should be handled by htmlentities
|
||||
|
||||
313
lib/Froxlor/UI/Pagination.php
Normal file
313
lib/Froxlor/UI/Pagination.php
Normal file
@@ -0,0 +1,313 @@
|
||||
<?php
|
||||
namespace Froxlor\UI;
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
*
|
||||
* For the full copyright and license information, please view the COPYING
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package API
|
||||
* @since 0.10.0
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class to manage pagination, limiting and ordering
|
||||
*/
|
||||
class Pagination
|
||||
{
|
||||
|
||||
private $data = array();
|
||||
|
||||
private $fields = null;
|
||||
|
||||
public $sortorder = 'ASC';
|
||||
|
||||
public $sortfield = null;
|
||||
|
||||
private $searchtext = null;
|
||||
|
||||
private $searchfield = null;
|
||||
|
||||
private $is_search = false;
|
||||
|
||||
private $pageno = 0;
|
||||
|
||||
private $entries = 0;
|
||||
|
||||
/**
|
||||
* Create new pagination object to search/filter, limit and sort Api-listing() calls
|
||||
*
|
||||
* @param array $userinfo
|
||||
* @param array $fields
|
||||
* @param number $total_entries
|
||||
*/
|
||||
public function __construct($userinfo, $fields = array(), $total_entries = 0)
|
||||
{
|
||||
$this->fields = $fields;
|
||||
$this->entries = $total_entries;
|
||||
$this->pageno = 1;
|
||||
// add default limitation by settings
|
||||
$this->addLimit(\Froxlor\Settings::Get('panel.paging'));
|
||||
// check search request
|
||||
$this->searchtext = '';
|
||||
if (count($fields) > 0) {
|
||||
$orderfields = array_keys($fields);
|
||||
$this->searchfield = $orderfields[0];
|
||||
}
|
||||
if (isset($_REQUEST['searchtext']) && (preg_match('/[-_@\p{L}\p{N}*.]+$/u', $_REQUEST['searchtext']) || $_REQUEST['searchtext'] === '')) {
|
||||
$this->searchtext = trim($_REQUEST['searchtext']);
|
||||
}
|
||||
if (isset($_REQUEST['searchfield']) && isset($fields[$_REQUEST['searchfield']])) {
|
||||
$this->searchfield = $_REQUEST['searchfield'];
|
||||
}
|
||||
if (! empty($this->searchtext) && ! empty($this->searchfield)) {
|
||||
$this->addSearch($this->searchtext, $this->searchfield);
|
||||
}
|
||||
|
||||
// check other ordering requests
|
||||
if (isset($_REQUEST['sortorder']) && (strtolower($_REQUEST['sortorder']) == 'desc' || strtolower($_REQUEST['sortorder']) == 'asc')) {
|
||||
$this->sortorder = strtoupper($_REQUEST['sortorder']);
|
||||
}
|
||||
if (isset($_REQUEST['sortfield']) && isset($fields[$_REQUEST['sortfield']])) {
|
||||
$this->sortfield = $_REQUEST['sortfield'];
|
||||
$this->addOrderBy($this->sortfield, $this->sortorder);
|
||||
} else {
|
||||
// add default ordering by given fields
|
||||
if (count($fields) > 0) {
|
||||
$orderfields = array_keys($fields);
|
||||
$this->addOrderBy($orderfields[0]);
|
||||
}
|
||||
}
|
||||
|
||||
// check current page / pages
|
||||
if (isset($_REQUEST['pageno']) && intval($_REQUEST['pageno']) != 0) {
|
||||
$this->pageno = intval($_REQUEST['pageno']);
|
||||
}
|
||||
if (($this->pageno - 1) * \Froxlor\Settings::Get('panel.paging') > $this->entries) {
|
||||
$this->pageno = 1;
|
||||
}
|
||||
$this->addOffset(($this->pageno - 1) * \Froxlor\Settings::Get('panel.paging'));
|
||||
}
|
||||
|
||||
/**
|
||||
* add a field for ordering
|
||||
*
|
||||
* @param string $field
|
||||
* @param string $order
|
||||
* optional, default 'ASC'
|
||||
*
|
||||
* @return \Froxlor\UI\Pagination
|
||||
*/
|
||||
public function addOrderBy($field = null, $order = 'ASC')
|
||||
{
|
||||
if (! isset($this->data['sql_orderby'])) {
|
||||
$this->data['sql_orderby'] = array();
|
||||
}
|
||||
$this->data['sql_orderby'][$field] = $order;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a limit
|
||||
*
|
||||
* @param number $limit
|
||||
* optional, default 0
|
||||
*
|
||||
* @return \Froxlor\UI\Pagination
|
||||
*/
|
||||
public function addLimit($limit = 0)
|
||||
{
|
||||
$this->data['sql_limit'] = (int) $limit;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* add an offset
|
||||
*
|
||||
* @param number $offset
|
||||
* optional, default 0
|
||||
*
|
||||
* @return \Froxlor\UI\Pagination
|
||||
*/
|
||||
public function addOffset($offset = 0)
|
||||
{
|
||||
$this->data['sql_offset'] = (int) $offset;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* add a search operation
|
||||
*
|
||||
* @param string $searchtext
|
||||
* @param string $field
|
||||
* @param string $operator
|
||||
*
|
||||
* @return \Froxlor\UI\Pagination
|
||||
*/
|
||||
public function addSearch($searchtext = null, $field = null, $operator = null)
|
||||
{
|
||||
if (! isset($this->data['sql_search'])) {
|
||||
$this->data['sql_search'] = array();
|
||||
}
|
||||
$this->data['sql_search'][$field] = [
|
||||
'value' => $searchtext,
|
||||
'op' => $operator
|
||||
];
|
||||
// if a search is performed, the result-entries-count is irrelevant
|
||||
// we do not want pagination
|
||||
$this->is_search = true;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* return number of total entries the user can access from the current resource
|
||||
*
|
||||
* @return number
|
||||
*/
|
||||
public function getEntries()
|
||||
{
|
||||
return $this->entries;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for sorting field
|
||||
*
|
||||
* @param array $lng
|
||||
* Language array
|
||||
* @return string the html sortcode
|
||||
*/
|
||||
public function getHtmlSortCode($lng, $break = false)
|
||||
{
|
||||
$sortcode = '';
|
||||
$fieldoptions = '';
|
||||
$orderoptions = '';
|
||||
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldoptions .= HTML::makeoption($fieldcaption, $fieldname, $this->sortfield, true, true);
|
||||
}
|
||||
|
||||
$breakorws = ($break ? '<br />' : ' ');
|
||||
foreach (array(
|
||||
'asc' => $lng['panel']['ascending'],
|
||||
'desc' => $lng['panel']['descending']
|
||||
) as $sortordertype => $sortorderdescription) {
|
||||
$orderoptions .= HTML::makeoption($sortorderdescription, $sortordertype, $this->sortorder, true, true);
|
||||
}
|
||||
|
||||
eval("\$sortcode =\"" . Template::getTemplate("misc/htmlsortcode", '1') . "\";");
|
||||
return $sortcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for sorting arrows
|
||||
*
|
||||
* @param string $baseurl
|
||||
* URL to use as base for links
|
||||
* @param string $field
|
||||
* If set, only this field will be returned
|
||||
*
|
||||
* @return mixed An array or a string (if field is set) of html code of arrows
|
||||
*/
|
||||
public function getHtmlArrowCode($baseurl, $field = '')
|
||||
{
|
||||
global $theme;
|
||||
if ($field != '' && isset($this->fields[$field])) {
|
||||
$baseurl = htmlspecialchars($baseurl);
|
||||
$fieldname = htmlspecialchars($field);
|
||||
eval("\$arrowcode =\"" . Template::getTemplate("misc/htmlarrowcode", '1') . "\";");
|
||||
} else {
|
||||
$baseurl = htmlspecialchars($baseurl);
|
||||
$arrowcode = array();
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldname = htmlspecialchars($fieldname);
|
||||
eval("\$arrowcode[\$fieldname] =\"" . Template::getTemplate("misc/htmlarrowcode", '1') . "\";");
|
||||
}
|
||||
}
|
||||
return $arrowcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for searching field
|
||||
*
|
||||
* @param array $lng
|
||||
* Language array
|
||||
*
|
||||
* @return string the html searchcode
|
||||
*/
|
||||
public function getHtmlSearchCode($lng)
|
||||
{
|
||||
$searchcode = '';
|
||||
$fieldoptions = '';
|
||||
$searchtext = htmlspecialchars($this->searchtext);
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldoptions .= HTML::makeoption($fieldcaption, $fieldname, $this->searchfield, true, true);
|
||||
}
|
||||
eval("\$searchcode =\"" . Template::getTemplate("misc/htmlsearchcode", '1') . "\";");
|
||||
return $searchcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for paging
|
||||
*
|
||||
* @param string $baseurl
|
||||
* URL to use as base for links
|
||||
*
|
||||
* @return string the html pagingcode
|
||||
*/
|
||||
public function getHtmlPagingCode($baseurl)
|
||||
{
|
||||
if (\Froxlor\Settings::Get('panel.paging') == 0 || $this->is_search) {
|
||||
return '';
|
||||
} else {
|
||||
$pages = intval($this->getEntries() / \Froxlor\Settings::Get('panel.paging'));
|
||||
}
|
||||
|
||||
if ($this->getEntries() % \Froxlor\Settings::Get('panel.paging') != 0) {
|
||||
$pages ++;
|
||||
}
|
||||
|
||||
if ($pages > 1) {
|
||||
|
||||
$start = $this->pageno - 4;
|
||||
if ($start < 1) {
|
||||
$start = 1;
|
||||
}
|
||||
|
||||
$stop = $this->pageno + 4;
|
||||
if ($stop > $pages) {
|
||||
$stop = $pages;
|
||||
}
|
||||
|
||||
$pagingcode = '<a href="' . htmlspecialchars($baseurl) . '&pageno=1">«</a> <a href="' . htmlspecialchars($baseurl) . '&pageno=' . ((intval($this->pageno) - 1) == 0 ? '1' : intval($this->pageno) - 1) . '"><</a> ';
|
||||
for ($i = $start; $i <= $stop; $i ++) {
|
||||
if ($i != $this->pageno) {
|
||||
$pagingcode .= ' <a href="' . htmlspecialchars($baseurl) . '&pageno=' . $i . '">' . $i . '</a> ';
|
||||
} else {
|
||||
$pagingcode .= ' <strong>' . $i . '</strong> ';
|
||||
}
|
||||
}
|
||||
$pagingcode .= ' <a href="' . htmlspecialchars($baseurl) . '&pageno=' . ((intval($this->pageno) + 1) > $pages ? $pages : intval($this->pageno) + 1) . '">></a> <a href="' . $baseurl . '&pageno=' . $pages . '">»</a>';
|
||||
} else {
|
||||
$pagingcode = '';
|
||||
}
|
||||
|
||||
return $pagingcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* return parameter array for API command parameters $sql_search, $sql_limit, $sql_offset and $sql_orderby
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getApiCommandParams()
|
||||
{
|
||||
return $this->data;
|
||||
}
|
||||
}
|
||||
@@ -1,520 +0,0 @@
|
||||
<?php
|
||||
namespace Froxlor\UI;
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2003-2009 the SysCP Team (see authors).
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
*
|
||||
* For the full copyright and license information, please view the COPYING
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Florian Lippert <flo@syscp.org> (2003-2009)
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Class to manage paging system
|
||||
*
|
||||
* @package Functions
|
||||
*/
|
||||
class Paging
|
||||
{
|
||||
|
||||
/**
|
||||
* Userinfo
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $userinfo = array();
|
||||
|
||||
/**
|
||||
* MySQL-Table
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $table = '';
|
||||
|
||||
/**
|
||||
* Fields with description which should be selectable
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $fields = array();
|
||||
|
||||
/**
|
||||
* Entries per page
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $entriesperpage = 0;
|
||||
|
||||
/**
|
||||
* Number of entries of table
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $entries = 0;
|
||||
|
||||
/**
|
||||
* Sortorder, asc or desc
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $sortorder = 'asc';
|
||||
|
||||
/**
|
||||
* Sortfield
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $sortfield = '';
|
||||
|
||||
/**
|
||||
* Searchfield
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $searchfield = '';
|
||||
|
||||
/**
|
||||
* Searchtext
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $searchtext = '';
|
||||
|
||||
/**
|
||||
* Pagenumber
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $pageno = 0;
|
||||
|
||||
/**
|
||||
* Switch natsorting on/off
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $natSorting = false;
|
||||
|
||||
private $limit = 0;
|
||||
|
||||
/**
|
||||
* Class constructor.
|
||||
* Loads settings from request or from userdata and saves them to session.
|
||||
*
|
||||
* @param
|
||||
* array userinfo
|
||||
* @param
|
||||
* string Name of Table
|
||||
* @param
|
||||
* array Fields, in format array( 'fieldname_in_mysql' => 'field_caption' )
|
||||
* @param
|
||||
* int *deprecated* entries per page
|
||||
* @param
|
||||
* bool *deprecated* Switch natsorting on/off (global, affects all calls of sort)
|
||||
* @param int $default_field
|
||||
* default sorting-field-index
|
||||
* @param string $default_order
|
||||
* default sorting order 'asc' or 'desc'
|
||||
*
|
||||
*/
|
||||
public function __construct($userinfo, $table, $fields, $entriesperpage = 0, $natSorting = false, $default_field = 0, $default_order = 'asc', $limit = 0)
|
||||
{
|
||||
|
||||
// entries per page and natsorting-flag are not
|
||||
// passed as parameter anymore, because these are
|
||||
// from the settings anyway
|
||||
$entriesperpage = \Froxlor\Settings::Get('panel.paging');
|
||||
$natSorting = \Froxlor\Settings::Get('panel.natsorting');
|
||||
|
||||
$this->userinfo = $userinfo;
|
||||
|
||||
if (! is_array($this->userinfo['lastpaging'])) {
|
||||
$this->userinfo['lastpaging'] = json_decode($this->userinfo['lastpaging'], true);
|
||||
}
|
||||
|
||||
$this->table = $table;
|
||||
$this->fields = $fields;
|
||||
$this->entriesperpage = $entriesperpage;
|
||||
$this->natSorting = $natSorting;
|
||||
$checklastpaging = (isset($this->userinfo['lastpaging']['table']) && $this->userinfo['lastpaging']['table'] == $this->table);
|
||||
$this->userinfo['lastpaging']['table'] = $this->table;
|
||||
|
||||
if (isset($_REQUEST['sortorder']) && (strtolower($_REQUEST['sortorder']) == 'desc' || strtolower($_REQUEST['sortorder']) == 'asc')) {
|
||||
$this->sortorder = strtolower($_REQUEST['sortorder']);
|
||||
} else {
|
||||
|
||||
if ($checklastpaging && isset($this->userinfo['lastpaging']['sortorder']) && (strtolower($this->userinfo['lastpaging']['sortorder']) == 'desc' || strtolower($this->userinfo['lastpaging']['sortorder']) == 'asc')) {
|
||||
$this->sortorder = strtolower($this->userinfo['lastpaging']['sortorder']);
|
||||
} else {
|
||||
$this->sortorder = $default_order;
|
||||
}
|
||||
}
|
||||
|
||||
$this->userinfo['lastpaging']['sortorder'] = $this->sortorder;
|
||||
|
||||
if (isset($_REQUEST['sortfield']) && isset($fields[$_REQUEST['sortfield']])) {
|
||||
$this->sortfield = $_REQUEST['sortfield'];
|
||||
} else {
|
||||
if ($checklastpaging && isset($this->userinfo['lastpaging']['sortfield']) && isset($fields[$this->userinfo['lastpaging']['sortfield']])) {
|
||||
$this->sortfield = $this->userinfo['lastpaging']['sortfield'];
|
||||
} else {
|
||||
$fieldnames = array_keys($fields);
|
||||
$this->sortfield = $fieldnames[$default_field];
|
||||
}
|
||||
}
|
||||
|
||||
$this->userinfo['lastpaging']['sortfield'] = $this->sortfield;
|
||||
|
||||
if (isset($_REQUEST['searchfield']) && isset($fields[$_REQUEST['searchfield']])) {
|
||||
$this->searchfield = $_REQUEST['searchfield'];
|
||||
} else {
|
||||
if ($checklastpaging && isset($this->userinfo['lastpaging']['searchfield']) && isset($fields[$this->userinfo['lastpaging']['searchfield']])) {
|
||||
$this->searchfield = $this->userinfo['lastpaging']['searchfield'];
|
||||
} else {
|
||||
$fieldnames = array_keys($fields);
|
||||
$this->searchfield = $fieldnames[0];
|
||||
}
|
||||
}
|
||||
|
||||
$this->userinfo['lastpaging']['searchfield'] = $this->searchfield;
|
||||
|
||||
if (isset($_REQUEST['searchtext']) && (preg_match('/[-_@\p{L}\p{N}*.]+$/u', $_REQUEST['searchtext']) || $_REQUEST['searchtext'] === '')) {
|
||||
$this->searchtext = trim($_REQUEST['searchtext']);
|
||||
} else {
|
||||
if ($checklastpaging && isset($this->userinfo['lastpaging']['searchtext']) && preg_match('/[-_@\p{L}\p{N}*.]+$/u', $this->userinfo['lastpaging']['searchtext'])) {
|
||||
$this->searchtext = $this->userinfo['lastpaging']['searchtext'];
|
||||
} else {
|
||||
$this->searchtext = '';
|
||||
}
|
||||
}
|
||||
|
||||
$this->userinfo['lastpaging']['searchtext'] = $this->searchtext;
|
||||
|
||||
if (isset($_REQUEST['pageno']) && intval($_REQUEST['pageno']) != 0) {
|
||||
$this->pageno = intval($_REQUEST['pageno']);
|
||||
} else {
|
||||
if ($checklastpaging && isset($this->userinfo['lastpaging']['pageno']) && intval($this->userinfo['lastpaging']['pageno']) != 0) {
|
||||
$this->pageno = intval($this->userinfo['lastpaging']['pageno']);
|
||||
} else {
|
||||
$this->pageno = 1;
|
||||
}
|
||||
}
|
||||
|
||||
$this->userinfo['lastpaging']['pageno'] = $this->pageno;
|
||||
$upd_stmt = \Froxlor\Database\Database::prepare("
|
||||
UPDATE `" . TABLE_PANEL_SESSIONS . "` SET
|
||||
`lastpaging` = :lastpaging
|
||||
WHERE `hash` = :hash AND `userid` = :userid
|
||||
AND `ipaddress` = :ipaddr AND `useragent` = :ua
|
||||
AND `adminsession` = :adminsession
|
||||
");
|
||||
$upd_data = array(
|
||||
'lastpaging' => json_encode($this->userinfo['lastpaging']),
|
||||
'hash' => $userinfo['hash'],
|
||||
'userid' => $userinfo['userid'],
|
||||
'ipaddr' => $userinfo['ipaddress'],
|
||||
'ua' => $userinfo['useragent'],
|
||||
'adminsession' => $userinfo['adminsession']
|
||||
);
|
||||
\Froxlor\Database\Database::pexecute($upd_stmt, $upd_data);
|
||||
|
||||
$this->limit = $limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets number of entries and adjusts pageno if the number of entries doesn't correspond to the pageno.
|
||||
*
|
||||
* @param
|
||||
* int entries
|
||||
*/
|
||||
public function setEntries($entries)
|
||||
{
|
||||
$this->entries = $entries;
|
||||
|
||||
if (($this->pageno - 1) * $this->entriesperpage > $this->entries) {
|
||||
$this->pageno = 1;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a row should be displayed or not, used in loops
|
||||
*
|
||||
* @param
|
||||
* int number of row
|
||||
* @return bool to display or not to display, that's the question
|
||||
*/
|
||||
public function checkDisplay($count)
|
||||
{
|
||||
$begin = (intval($this->pageno) - 1) * intval($this->entriesperpage);
|
||||
$end = (intval($this->pageno) * intval($this->entriesperpage));
|
||||
return (($count >= $begin && $count < $end) || $this->entriesperpage == 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns condition code for sql query
|
||||
*
|
||||
* @param
|
||||
* bool should returned condition code start with WHERE (false) or AND (true)?
|
||||
* @return string the condition code
|
||||
*/
|
||||
public function getSqlWhere($append = false)
|
||||
{
|
||||
if ($this->searchtext != '') {
|
||||
if ($append == true) {
|
||||
$condition = ' AND ';
|
||||
} else {
|
||||
$condition = ' WHERE ';
|
||||
}
|
||||
|
||||
$searchfield = explode('.', $this->searchfield);
|
||||
foreach ($searchfield as $id => $field) {
|
||||
if (substr($field, - 1, 1) != '`') {
|
||||
$field .= '`';
|
||||
}
|
||||
|
||||
if ($field[0] != '`') {
|
||||
$field = '`' . $field;
|
||||
}
|
||||
|
||||
$searchfield[$id] = $field;
|
||||
}
|
||||
|
||||
$searchfield = implode('.', $searchfield);
|
||||
|
||||
$ops = array(
|
||||
'<',
|
||||
'>',
|
||||
'='
|
||||
);
|
||||
|
||||
// check if we use an operator or not
|
||||
$useOper = 0;
|
||||
$oper = "=";
|
||||
if (in_array(substr($this->searchtext, 0, 1), $ops)) {
|
||||
$useOper = 1;
|
||||
$oper = substr($this->searchtext, 0, 1);
|
||||
}
|
||||
|
||||
// check for diskspace and whether searchtext is a number
|
||||
// in any other case the logical-operators would make no sense
|
||||
if (strpos($searchfield, 'diskspace') > 0 && is_numeric(substr($this->searchtext, $useOper))) {
|
||||
// anything with diskspace is *1024
|
||||
$searchtext = ((int) substr($this->searchtext, $useOper)) * 1024;
|
||||
$useOper = 1;
|
||||
} elseif (strpos($searchfield, 'traffic') > 0 && is_numeric(substr($this->searchtext, $useOper))) {
|
||||
// anything with traffic is *1024*1024
|
||||
$searchtext = ((int) substr($this->searchtext, $useOper)) * 1024 * 1024;
|
||||
$useOper = 1;
|
||||
} else {
|
||||
// any other field
|
||||
$searchtext = substr($this->searchtext, $useOper);
|
||||
}
|
||||
|
||||
if ($useOper == 1 && is_numeric(substr($this->searchtext, $useOper))) {
|
||||
// now as we use >, < or = we use the given operator and not LIKE
|
||||
$condition .= $searchfield . " " . $oper . " " . \Froxlor\Database\Database::quote($searchtext);
|
||||
} else {
|
||||
$searchtext = str_replace('*', '%', $this->searchtext);
|
||||
// append wildcards if user did not enter any
|
||||
if (strpos($searchtext, '%') === false)
|
||||
$searchtext = '%' . $searchtext . '%';
|
||||
$condition .= $searchfield . " LIKE " . \Froxlor\Database\Database::quote($searchtext);
|
||||
}
|
||||
} else {
|
||||
$condition = '';
|
||||
}
|
||||
|
||||
return $condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns "order by"-code for sql query
|
||||
*
|
||||
* @param
|
||||
* bool Switch natsorting on/off (local, affects just this call)
|
||||
* @return string the "order by"-code
|
||||
*/
|
||||
public function getSqlOrderBy($natSorting = null)
|
||||
{
|
||||
$sortfield = explode('.', $this->sortfield);
|
||||
foreach ($sortfield as $id => $field) {
|
||||
if (substr($field, - 1, 1) != '`') {
|
||||
$field .= '`';
|
||||
}
|
||||
|
||||
if ($field[0] != '`') {
|
||||
$field = '`' . $field;
|
||||
}
|
||||
|
||||
$sortfield[$id] = $field;
|
||||
}
|
||||
|
||||
$sortfield = implode('.', $sortfield);
|
||||
$sortorder = strtoupper($this->sortorder);
|
||||
|
||||
if ($natSorting == true || ($natSorting === null && $this->natSorting == true)) {
|
||||
// Acts similar to php's natsort(), found in one comment at http://my.opera.com/cpr/blog/show.dml/160556
|
||||
$sortcode = "ORDER BY CONCAT( IF( ASCII( LEFT( " . $sortfield . ", 5 ) ) > 57,
|
||||
LEFT( " . $sortfield . ", 1 ), 0 ),
|
||||
IF( ASCII( RIGHT( " . $sortfield . ", 1 ) ) > 57,
|
||||
LPAD( " . $sortfield . ", 255, '0' ),
|
||||
LPAD( CONCAT( " . $sortfield . ", '-' ), 255, '0' )
|
||||
)) " . $sortorder;
|
||||
} else {
|
||||
$sortcode = 'ORDER BY ' . $sortfield . ' ' . $sortorder;
|
||||
}
|
||||
|
||||
return $sortcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Currently not used
|
||||
*
|
||||
* @return string always empty
|
||||
*/
|
||||
public function getSqlLimit()
|
||||
{
|
||||
if ($this->limit > 0) {
|
||||
$_offset = ($this->pageno - 1) * $this->limit;
|
||||
return ' LIMIT ' . $_offset . ',' . $this->limit;
|
||||
}
|
||||
/**
|
||||
* currently not in use
|
||||
*/
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for sorting field
|
||||
*
|
||||
* @param
|
||||
* array Language array
|
||||
* @return string the html sortcode
|
||||
*/
|
||||
public function getHtmlSortCode($lng, $break = false)
|
||||
{
|
||||
$sortcode = '';
|
||||
$fieldoptions = '';
|
||||
$orderoptions = '';
|
||||
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldoptions .= HTML::makeoption($fieldcaption, $fieldname, $this->sortfield, true, true);
|
||||
}
|
||||
|
||||
$breakorws = ($break ? '<br />' : ' ');
|
||||
foreach (array(
|
||||
'asc' => $lng['panel']['ascending'],
|
||||
'desc' => $lng['panel']['descending']
|
||||
) as $sortordertype => $sortorderdescription) {
|
||||
$orderoptions .= HTML::makeoption($sortorderdescription, $sortordertype, $this->sortorder, true, true);
|
||||
}
|
||||
|
||||
eval("\$sortcode =\"" . Template::getTemplate("misc/htmlsortcode", '1') . "\";");
|
||||
return $sortcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for sorting arrows
|
||||
*
|
||||
* @param
|
||||
* string URL to use as base for links
|
||||
* @param
|
||||
* string If set, only this field will be returned
|
||||
* @return mixed An array or a string (if field is set) of html code of arrows
|
||||
*/
|
||||
public function getHtmlArrowCode($baseurl, $field = '')
|
||||
{
|
||||
global $theme;
|
||||
|
||||
if ($field != '' && isset($this->fields[$field])) {
|
||||
$baseurl = htmlspecialchars($baseurl);
|
||||
$fieldname = htmlspecialchars($field);
|
||||
eval("\$arrowcode =\"" . Template::getTemplate("misc/htmlarrowcode", '1') . "\";");
|
||||
} else {
|
||||
$baseurl = htmlspecialchars($baseurl);
|
||||
$arrowcode = array();
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldname = htmlspecialchars($fieldname);
|
||||
eval("\$arrowcode[\$fieldname] =\"" . Template::getTemplate("misc/htmlarrowcode", '1') . "\";");
|
||||
}
|
||||
}
|
||||
|
||||
return $arrowcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for searching field
|
||||
*
|
||||
* @param
|
||||
* array Language array
|
||||
* @return string the html searchcode
|
||||
*/
|
||||
public function getHtmlSearchCode($lng)
|
||||
{
|
||||
$searchcode = '';
|
||||
$fieldoptions = '';
|
||||
$searchtext = htmlspecialchars($this->searchtext);
|
||||
foreach ($this->fields as $fieldname => $fieldcaption) {
|
||||
$fieldoptions .= HTML::makeoption($fieldcaption, $fieldname, $this->searchfield, true, true);
|
||||
}
|
||||
eval("\$searchcode =\"" . Template::getTemplate("misc/htmlsearchcode", '1') . "\";");
|
||||
return $searchcode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns html code for paging
|
||||
*
|
||||
* @param
|
||||
* string URL to use as base for links
|
||||
* @return string the html pagingcode
|
||||
*/
|
||||
public function getHtmlPagingCode($baseurl)
|
||||
{
|
||||
if ($this->entriesperpage == 0) {
|
||||
return '';
|
||||
} else {
|
||||
$pages = intval($this->entries / $this->entriesperpage);
|
||||
}
|
||||
|
||||
if ($this->entries % $this->entriesperpage != 0) {
|
||||
$pages ++;
|
||||
}
|
||||
|
||||
if ($pages > 1) {
|
||||
|
||||
$start = $this->pageno - 4;
|
||||
if ($start < 1) {
|
||||
$start = 1;
|
||||
}
|
||||
|
||||
$stop = $this->pageno + 4;
|
||||
if ($stop > $pages) {
|
||||
$stop = $pages;
|
||||
}
|
||||
|
||||
$pagingcode = '<a href="' . htmlspecialchars($baseurl) . '&pageno=1">«</a> <a href="' . htmlspecialchars($baseurl) . '&pageno=' . ((intval($this->pageno) - 1) == 0 ? '1' : intval($this->pageno) - 1) . '"><</a> ';
|
||||
for ($i = $start; $i <= $stop; $i ++) {
|
||||
if ($i != $this->pageno) {
|
||||
$pagingcode .= ' <a href="' . htmlspecialchars($baseurl) . '&pageno=' . $i . '">' . $i . '</a> ';
|
||||
} else {
|
||||
$pagingcode .= ' <strong>' . $i . '</strong> ';
|
||||
}
|
||||
}
|
||||
$pagingcode .= ' <a href="' . htmlspecialchars($baseurl) . '&pageno=' . ((intval($this->pageno) + 1) > $pages ? $pages : intval($this->pageno) + 1) . '">></a> <a href="' . $baseurl . '&pageno=' . $pages . '">»</a>';
|
||||
} else {
|
||||
$pagingcode = '';
|
||||
}
|
||||
|
||||
return $pagingcode;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user