@Night386

Как сделать сортировку?

Добрый день! имеется вот такой код

$limit = 'limit 0, 500';

				if (isset($_GET['ajax2'])) $limit = 'limit '.(int)$_GET['offset'].', 30';

				$rows = fs::getObjects($sql, "order by c_object.added desc ".$limit);
				$rowsCount = count(fs::getObjects($sql));

				if (isset($_GET['ajax2']) && !count($rows))
				{
					header("HTTP/1.0 404 Not Found");
					die;
				}


Подскажите как можно сделать так чтобы было два selecta(или может тумблер какой-нибудь) - один это который имеется по коду ( "order by c_object.added desc ) - это сортировка по добавленным, а второй меняется на ( "order by c_object.updated desc ) - сортировка по обновленным . имеется php файл и tpl файл
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Добавьте еще два параметра в ту часть запроса, которая отвечает за сортировку.
order_column - по какой колонке сортировать, order_direct - в каком направлении.
Пример с limit намекает, как это сделать.
$limit = 'limit 0, 500';
$order_column = 'added';
$order_direct = 'desc';
if(isset($_GET['order_col']))
{
  if($_GET['order_col'] == 'updated')
    $order_column = 'updated'; // не вздумайте подставлять из GET название колонки, будет sql-инъекция!
}
if(isset($_GET['order_dir']))
{
  if($_GET['order_dir'] == 'asc')
    $order_direct = 'asc'; // не вздумайте подставлять из GET название клаузы, будет sql-инъекция!  
}
        if (isset($_GET['ajax2'])) $limit = 'limit '.(int)$_GET['offset'].', 30'; // тут застраховано от инъекции при помощи преобразования в int!

        $rows = fs::getObjects($sql, "order by c_object.".$order_column." ".$order_direct." ".$limit);
        $rowsCount = count(fs::getObjects($sql));

        if (isset($_GET['ajax2']) && !count($rows))
        {
          header("HTTP/1.0 404 Not Found");
          die;
        }

ПС: Осталось вам дополнить вопрос, "а где мне найти шаблон формы с фильтром списка, чтобы прописать get-параметры order_col и order_dir".
Ответ написан
Комментировать
@runapa
function orderBy(array &$array, $sortOrder)
{
    usort($array, function ($a, $b) use ($sortOrder) {
        $result = '';

        $sortOrderArray = explode(',', $sortOrder);
        foreach ($sortOrderArray AS $item) {
            $itemArray = explode(' ', trim($item));
            $field = $itemArray[0];
            $sort = !empty($itemArray[1]) ? $itemArray[1] : '';

            $mix = [$a, $b];
            if (!isset($mix[0][$field]) || !isset($mix[1][$field])) {
                continue;
            }

            if (strtolower($sort) === 'desc') {
                $mix = array_reverse($mix);
            }

            if (is_numeric($mix[0][$field]) && is_numeric($mix[1][$field])) {
                $result .= ceil($mix[0][$field] - $mix[1][$field]);
            } else {
                $result .= strcasecmp($mix[0][$field], $mix[1][$field]);
            }
        }

        return $result;
    });

    return $array;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы