Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.03.2015, 09:23
Аватар для Georka
Аспирант
Отправить личное сообщение для Georka Посмотреть профиль Найти все сообщения от Georka
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 01.03.2015, 14:20
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

$_GET['count'] = intval($_GET['count']);
....
$searchcount = intval($_GET['count']);

То есть типа контрольного выстрела в голову? )
Ответить с цитированием
  #3 (permalink)  
Старый 01.03.2015, 21:45
Аватар для Georka
Аспирант
Отправить личное сообщение для Georka Посмотреть профиль Найти все сообщения от Georka
 
Регистрация: 05.09.2013
Сообщений: 95

Прочитай описание.. я расписал то что нужно,.. если ты знаком с DLE то поймешь. Готов заплатить 2000 рублей.
Ответить с цитированием
  #4 (permalink)  
Старый 02.03.2015, 02:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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, и прочих, а не то чтобы вновь заниматься ими. У них есть форумы своих фанатов, вот там с готовностью ваш заказ примут.
Ответить с цитированием
  #5 (permalink)  
Старый 02.03.2015, 11:42
Аватар для Georka
Аспирант
Отправить личное сообщение для Georka Посмотреть профиль Найти все сообщения от Georka
 
Регистрация: 05.09.2013
Сообщений: 95

Скажи пожалуйста ты сможешь сделать то что мне нужно? я заплачу 2000 руб.
Ответить с цитированием
  #6 (permalink)  
Старый 02.03.2015, 13:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00