01.03.2015, 09:23
|
|
Аспирант
|
|
Регистрация: 05.09.2013
Сообщений: 95
|
|
Сортировщик пользователей для DLE 10.3 + по дополнительным полям
Всем привет ) Ребят помогите пожалуйста в написании кода сортировки пользователей для DLE 10.3.
Сейчас код выполняет сортировку по:
{count} - Выбор количества отображаемых пользователей
{order} - 2 select не совсем понимаю, но там: Логин, Группа, Регистрация, Вход, Новостей, Комментариев.
{sort} - 3 select : по Возрастанию и по Убыванию
{usergroups}- 4 select : по Группам
Демо: ТУТ
Нужна сортировка по:
- Выбор количества отображаемых пользователей на текущей странице (уже есть),
- Дополнительному полю профиля пользователя "spec",
- Городу пользователя,
- Дополнительному полю профиля пользователя "price",
- Выбору 2 групп: С ID 3 Журналисты или ID 4 Посетители.
Вот исполняемый PHP код:
<?php
if( ! defined( 'DATALIFEENGINE' ) ) {
die( "Hacking attempt!" );
}
include_once ENGINE_DIR . '/classes/parse.class.php';
$parse = new ParseFilter( );
$parse->safe_mode = true;
$tpl->load_template( 'users_search.tpl' );
$g = 0;
$_GET['count'] = intval($_GET['count']);
$_GET['order'] = addslashes($_GET['order']);
$_GET['sort'] = addslashes($_GET['sort']);
$_GET['usergroups'] = intval($_GET['usergroups']);
$_GET['login'] = addslashes($_GET['login']);
while ( $g++ <= 4 ){
$u = $g * 20;
if($_GET['count'] != $u)
$sel_num .= '<option value="'.$u.'">'.$u.'</option>';
else
$sel_num .= '<option value="'.$u.'" selected>'.$u.'</option>';
}
$tpl->set('{count}', $sel_num);
$orders = array('name' => 'Логин', 'user_group' => 'Группа', 'reg_date' => 'Регистрация', 'lastdate' => 'Вход', 'news_num' => 'Новостей', 'comm_num' => 'Комментариев');
foreach ( $orders as $key => $value){
if($_GET['order'] == $key)
$order .= '<option value="'.$key.'" selected>'.$value.'</option>';
else
$order .= '<option value="'.$key.'">'.$value.'</option>';
}
$tpl->set('{order}', $order);
$sorts = array('ASC' => 'По возрастанию', 'DESC' => 'По убыванию');
foreach ( $sorts as $key => $value){
if($_GET['sort'] == $key)
$sort .= '<option value="'.$key.'" selected>'.$value.'</option>';
else
$sort .= '<option value="'.$key.'">'.$value.'</option>';
}
$tpl->set('{sort}', $sort);
$usergroups = $db->query( "SELECT * FROM " . USERPREFIX . "_usergroups");
while ( $row = $db->get_row( $usergroups ) ) {
if($_GET['usergroups'] == $row['id'])
$group_s .= '<option value="'.$row['id'].'" selected>'.$row['group_name'].'</option>';
else
$group_s .= '<option value="'.$row['id'].'">'.$row['group_name'].'</option>';
}
$tpl->set('{usergroups}', $group_s);
if ($_GET['count'] != ""){
$searchcount = intval($_GET['count']);
$postfix .= "&count=$searchcount";
}else {
$searchcount = 10;
}
if($_GET['order'] != ""){
$order_by = $_GET['order'];
$postfix .= "&order=".$_GET['order'];
}else
$order_by = "user_group";
if ($_GET['sort'] != ""){
$sort_by = $_GET['sort'];
$postfix .= "&sort=".$_GET['sort'];
}else {
$sort_by = "ASC";
}
if ($_GET['usergroups'] != "" or $_GET['login'] != "") $where_w = "WHERE ";
if ($_GET['usergroups'] != ""){
$where_w .= "user_group=".$_GET['usergroups'];
$postfix .= "&usergroups=".$_GET['usergroups'];
}
if ($_GET['login'] != ""){
if ($_GET['usergroups'] != "") $where_w .= " AND ";
$where_w .= "name like '%".$_GET['login']."%'";
$postfix .= "&login=".$_GET['login'];
$login_val = $_GET['login'];
}
$tpl->set('{login}', $login_val);
$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_users $where_w";
$row = $db->super_query($sql_count);
$count_all = $row['count'];
function pluralForm($count_all, $numb1, $numb2, $numb3)
{
$count_all = abs($count_all) % 100;
$n1 = $count_all % 10;
if ($count_all > 10 && $count_all < 20) return $numb3;
if ($n1 > 1 && $n1 < 5) return $numb2;
if ($n1 == 1) return $numb1;
return $numb3;
}
$tpl->set('{numbers}', pluralForm($count_all, 'Найден', 'Найдено', 'Найдено').' '.$count_all.' '.pluralForm($count_all, 'пользователь', 'пользвателя', 'пользователей'));
$tpl->compile('content');
?>
Последний раз редактировалось Georka, 01.03.2015 в 09:28.
|
|
01.03.2015, 14:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
$_GET['count'] = intval($_GET['count']);
....
$searchcount = intval($_GET['count']);
То есть типа контрольного выстрела в голову? )
|
|
01.03.2015, 21:45
|
|
Аспирант
|
|
Регистрация: 05.09.2013
Сообщений: 95
|
|
Прочитай описание.. я расписал то что нужно,.. если ты знаком с DLE то поймешь. Готов заплатить 2000 рублей.
|
|
02.03.2015, 02:54
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Прочитал конечно, а поэтому и не понятно, зачем к приведенному к integer значению массива применять эту операцию еще раз.
С чем я знаком, а с чем нет, это не имеет значения, принципы сортировки не зависят от CMS.
{count} - Выбор количества отображаемых пользователей //это не сортировка это LIMIT
{order} - 2 select не совсем понимаю, но там: Логин, Группа, Регистрация, Вход, Новостей, Комментариев. //а вот это сортировка
{sort} - 3 select : по Возрастанию и по Убыванию //это порядок сортировки
{usergroups}- 4 select : по Группам //это может быть и группировкой в запросе
Если к примеру, имеется таблица, щелчок по заголовкам которой означает сортировку по выбранной таким образом колонке, то достаточно передать серверу индекс этой колонки, который определит поле sql-таблицы для ORDER BY выбранное по этому индексу в массиве типа $orders, но с иной структурой. Направление сортировки можно и не передавать, если сервер будет хранить текущее имя поля сортировки и ее порядок, то легко определить первый ли это запрос сортировки по запрашиваемому полю, или же второй и надо просто изменить порядок ASC/DESC.
Если же сортировка, это сортировка по нескольким полям, то поступать можно точно также, с разницей лишь в том, что из массива $orders посредством array_intersect_key($orders, $in) получаем все поля участвующие в сортировке. У вас же сплошные условия.
Если бы было предложено и на порядок выше, я бы не согласился. Уже более 5 лет я даже слышать не хочу о джумлах, dle, и прочих, а не то чтобы вновь заниматься ими. У них есть форумы своих фанатов, вот там с готовностью ваш заказ примут.
|
|
02.03.2015, 11:42
|
|
Аспирант
|
|
Регистрация: 05.09.2013
Сообщений: 95
|
|
Скажи пожалуйста ты сможешь сделать то что мне нужно? я заплачу 2000 руб.
|
|
02.03.2015, 13:15
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,990
|
|
Как бы это деликатно пояснить, чтобы не было лишних вопросов.
Я могу описать сортировку, параметры ее определяемые клиентом и выходные параметры от них зависящие, естественно в рамках поставленной задачи - от интерфейса клиента до параметров запроса.
Чего я больше и никогда делать не буду, и о чем говорил, так это думать в рамках чей-то CMS, просто для меня это, как работать из под палки. Вы ездили на своем автомобиле в черта города и вне ее, разницу чувствовали? Я больше не хочу ездить по чужим правилам, останавливаться на светофорах не мной расставленных, и которые в моем понимании лишние, решать проблемы пробок не от меня зависящих. Я хочу свободы в движении.
Давно существует булева алгебра и логические устройства ее использующие, например дешифратор. Он ведь работает не по условиям, а как простейший цифровой автомат выполняющий логические операции - выходные шины его будут иметь состояния зависящие от состояния на входных шинах.
В рамках РНР роль такого дешифратора можно возложить на массив - ключи, это входные шины, а значения ключей выходные. Такому "аналогу дешифратора" сигналы на входных шинах:
$_GET['count'] = intval($_GET['count']);
$_GET['order'] = addslashes($_GET['order']);
$_GET['sort'] = addslashes($_GET['sort']);
$_GET['usergroups'] = intval($_GET['usergroups']);
$_GET['login'] = addslashes($_GET['login']);
совсем не нужны, да и вредно вываливать клиенту структуру таблиц. Поступая таким образом, это усложнять себе же задачу, потому как в данном случае достаточно чисел, что удобнее и безопаснее, а следовательно сигналы на входе автомата, это:
$_GET = array_map('intval', $_GET)
Входные параметры равные нулю после этой операции будут считаться параметрами по умолчанию. Каждый из этих параметров и будет определять ключ массива, который описывает набор правил (параметров sql-запроса) выбранных пользователем. Например, если сортировать по дате, то параметр $_GET['sort'] это ключ хранящий поле таблицы, а $_GET['order'] направление сортировки (хотя это можно и не передавать). Но если запрашивать сортировку по числу записей и это число указывается пользователем, то ключ хранящий поле таблицы должен учитывать и значение выбранное пользователем, потому как в этом случае значением для ORDER BY будет уже выражение.
Результат выборки по параметрам выданный этим автоматом будет и отсортирован, и иметь только запрошенное.
Не думаю, что это так сложно сделать.
Последний раз редактировалось laimas, 02.03.2015 в 13:47.
|
|
|
|