introduce search, limit, offset and orderby possibilities for (almost) all API listing() functions; added listingCount() function in preparation to replace the old UI\Paging class later on
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
This commit is contained in:
@@ -232,6 +232,151 @@ abstract class ApiCommand extends ApiParameter
|
||||
return $this->user_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* return SQL when parameter $sql_search is given via API
|
||||
*
|
||||
* @param array $sql_search
|
||||
* optional array with index = fieldname, and value = array with 'op' => operator (one of <, > or =), LIKE is used if left empty and 'value' => searchvalue
|
||||
* @param array $query_fields
|
||||
* optional array of placeholders mapped to the actual value which is used in the API commands when executing the statement [internal]
|
||||
* @param boolean $append
|
||||
* optional append to WHERE clause rather then create new one, default false [internal]
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getSearchWhere(&$query_fields = array(), $append = false)
|
||||
{
|
||||
$search = $this->getParam('sql_search', true, array());
|
||||
$condition = '';
|
||||
if (! empty($search)) {
|
||||
if ($append == true) {
|
||||
$condition = ' AND ';
|
||||
} else {
|
||||
$condition = ' WHERE ';
|
||||
}
|
||||
$ops = array(
|
||||
'<',
|
||||
'>',
|
||||
'='
|
||||
);
|
||||
$first = true;
|
||||
foreach ($search as $field => $valoper) {
|
||||
$cleanfield = str_replace(".", "", $field);
|
||||
$sortfield = explode('.', $field);
|
||||
foreach ($sortfield as $id => $sfield) {
|
||||
if (substr($sfield, - 1, 1) != '`') {
|
||||
$sfield .= '`';
|
||||
}
|
||||
if ($sfield[0] != '`') {
|
||||
$sfield = '`' . $sfield;
|
||||
}
|
||||
$sortfield[$id] = $sfield;
|
||||
}
|
||||
$field = implode('.', $sortfield);
|
||||
if (! $first) {
|
||||
$condition .= ' AND ';
|
||||
}
|
||||
if (! is_array($valoper) || ! isset($valoper['op']) || empty($valoper['op'])) {
|
||||
$condition .= $field . ' LIKE :' . $cleanfield;
|
||||
if (! is_array($valoper)) {
|
||||
$query_fields[':' . $cleanfield] = '%' . $valoper . '%';
|
||||
} else {
|
||||
$query_fields[':' . $cleanfield] = '%' . $valoper['value'] . '%';
|
||||
}
|
||||
} elseif (in_array($valoper['op'], $ops)) {
|
||||
$condition .= $field . ' ' . $valoper['op'] . ':' . $cleanfield;
|
||||
$query_fields[':' . $cleanfield] = $valoper['value'] ?? '';
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
if ($first) {
|
||||
$first = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $condition;
|
||||
}
|
||||
|
||||
/**
|
||||
* return LIMIT clause when at least $sql_limit parameter is given via API
|
||||
*
|
||||
* @param int $sql_limit
|
||||
* optional, limit resultset, default 0
|
||||
* @param int $sql_offset
|
||||
* optional, offset for limitation, default 0
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getLimit()
|
||||
{
|
||||
$limit = $this->getParam('sql_limit', true, 0);
|
||||
$offset = $this->getParam('sql_offset', true, 0);
|
||||
|
||||
if (! is_numeric($limit)) {
|
||||
$limit = 0;
|
||||
}
|
||||
if (! is_numeric($offset)) {
|
||||
$offset = 0;
|
||||
}
|
||||
|
||||
if ($limit > 0) {
|
||||
return ' LIMIT ' . $offset . ',' . $limit;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* return ORDER BY clause if parameter $sql_orderby parameter is given via API
|
||||
*
|
||||
* @param array $sql_orderby
|
||||
* optional array with index = fieldname and value = ASC|DESC
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getOrderBy()
|
||||
{
|
||||
$orderby = $this->getParam('sql_orderby', true, array());
|
||||
$order = "";
|
||||
if (! empty($orderby)) {
|
||||
$order .= " ORDER BY ";
|
||||
foreach ($orderby as $field => $by) {
|
||||
$sortfield = explode('.', $field);
|
||||
foreach ($sortfield as $id => $sfield) {
|
||||
if (substr($sfield, - 1, 1) != '`') {
|
||||
$sfield .= '`';
|
||||
}
|
||||
if ($sfield[0] != '`') {
|
||||
$sfield = '`' . $sfield;
|
||||
}
|
||||
$sortfield[$id] = $sfield;
|
||||
}
|
||||
$field = implode('.', $sortfield);
|
||||
$by = strtoupper($by);
|
||||
if (! in_array($by, [
|
||||
'ASC',
|
||||
'DESC'
|
||||
])) {
|
||||
$by = 'ASC';
|
||||
}
|
||||
if (\Froxlor\Settings::Get('panel.natsorting') == 1) {
|
||||
// Acts similar to php's natsort(), found in one comment at http://my.opera.com/cpr/blog/show.dml/160556
|
||||
$order .= "CONCAT( IF( ASCII( LEFT( " . $field . ", 5 ) ) > 57,
|
||||
LEFT( " . $field . ", 1 ), 0 ),
|
||||
IF( ASCII( RIGHT( " . $field . ", 1 ) ) > 57,
|
||||
LPAD( " . $field . ", 255, '0' ),
|
||||
LPAD( CONCAT( " . $field . ", '-' ), 255, '0' )
|
||||
)) " . $by . ", ";
|
||||
} else {
|
||||
$order .= $field . " " . $by . ", ";
|
||||
}
|
||||
}
|
||||
$order = substr($order, 0, - 2);
|
||||
}
|
||||
|
||||
return $order;
|
||||
}
|
||||
|
||||
/**
|
||||
* return logger instance
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user