Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как сделать вывод статистики общего количества пользователей по каждому значению доп. поля?

Как сделать вывод статистики общего количества пользователей по каждому значению доп. поля?


     15.11.2023    Статистика пользователей, Вывод статистики по доп. полям    Общие вопросы по PHP, Хаки, MySQL    909

вопрос
Сделал доп. поля пользователей, в которые пользователь может вносить значения из списка предложенных вариантов, либо не выбирать ничего - при регистрации или потом у себя в профиле. Для простоты опишу задачу для одного доп. поля, остальные сделаю аналогично. Допустим, создал доп. поле "Пол пользователя": 'user_gender', где можно выбрать 2 значения, которые сохраняются юзером в инпутах как 'gender_male' и 'gender_female' (он видит выбор полов на обычном языке). Хочу сделать в разделе статистики сайта (stats.tpl) дополнительно к стандартной статистике вывод количества пользователей мужского и женского пола. Ну дополнительно будет ещё количество тех, кто не указал пол. В PHP и SQL почти ничего не умею. Поэтому прошу знатоков написать код, как выводить из базы DLE в переменные, а лучше в новые теги типа {user_gender_male} и {user_gender_female}, эти динамически растущие (с увеличением кол-ва юзеров) значения для отображения в разделе статистики. Тех, которые пока ещё не выбрали пол, допустим, смогу получить вычитанием 2 полов из общего кол-ва юзеров {user_num}, хотя лучше брать из базы кол-во юзеров с пустым доп. полем 'user_gender'. Если кто-нибудь поможет с php-кодом для этой задачи, то для остальных доп. полей я и остальные DLE-сайтостроители смогут сделать аналогично. Благодарю за помощь.

Ответа пока нет


38 комментариев

rewenas
Юзер

rewenas - 16 ноября 2023 02:21 -

В engine/modules/stats.php после:
 $mysql_size = formatsize( $mysql_size ); 

Вставь:
 $result = $db->query("SELECT 
    COUNT(*) AS total_count,
    SUM(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, 'user_gender|', -1), '|', 1) = 'Мужчина' THEN 1 ELSE 0 END) AS male_count,
    SUM(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, 'user_gender|', -1), '|', 1) = 'Женщина' THEN 1 ELSE 0 END) AS female_count
    FROM " . USERPREFIX . "_users");

    $row = $result->fetch_assoc();  
        $total_count = $row['total_count'];
        $male_count = $row['male_count'];
        $female_count = $row['female_count'];
        $unknown = $total_count - ($male_count + $female_count);
  
    $tpl->set('{user_gender_male}', $male_count);
    $tpl->set('{user_gender_female}', $female_count);
    $tpl->set('{user_gender_unknown}', $unknown);
 

Сразу говорю я хз что там получается по нагрузке и за правильность написания всего этого. Возможно это можно кешировать как то или обыграть совершенно иначе. Но работать должно.

Sinoid
Юзер

Sinoid - 16 ноября 2023 17:21 -

Работает. Только вместо 'Мужчина' и 'Женщина' я поставил свои значения, как у меня скрипт вносит в скрытые инпуты выбор пользователя: 'gender_male' и 'gender_female'. Спасибо за помощь!
2). Но ещё, кто глубже понимает, скажите пжл, как эти запросы к БД оптимизировать / кэшировать, чтобы снизить нагрузку на сервер.
3). Дополнительная задача. Ещё сделал выбор страны проживания, который заносится скриптом в стандартный DLE-тег {land} в виде кода 249 стран списка ISO 3166-1 alpha-2. Чтобы вручную не вводить в подобный код PHP подсчёт кол-ва пользователей по каждой переменной страны типа 'land_AD_count', 'land_AE_count' и т.д. и не прописывать им теги для вывода {land_AD}, {land_AE} и т.д. - наверное лучше создать в PHP массив этих кодов 249 стран, а затем прописать цикл, в котором будут создаваться все 249 переменных 'land_zz_count' и тегов для вывода {land_zz}, где zz пробегает все 249 значений массива кодов ISO. Как это сделать?

rewenas
Юзер

rewenas - 16 ноября 2023 23:54 -

 $user_gender = dle_cache('user_gender_count');
if (!$user_gender) {
    $result = $db->query("SELECT 
        COUNT(*) AS total_count,
        SUM(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, 'user_gender|', -1), '|', 1) = 'Мужчина' THEN 1 ELSE 0 END) AS male_count,
        SUM(CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(xfields, 'user_gender|', -1), '|', 1) = 'Женщина' THEN 1 ELSE 0 END) AS female_count
        FROM " . USERPREFIX . "_users");

    $row = $result->fetch_assoc();

    $total_count = $row['total_count'];
    $male_count = $row['male_count'];
    $female_count = $row['female_count'];
    $unknown = $total_count - ($male_count + $female_count);

    $user_gender = array(
        'total_count' => $total_count,
        'male_count' => $male_count,
        'female_count' => $female_count,
        'unknown' => $unknown
    );

    create_cache('user_gender_count', $user_gender);
} else {
    $total_count = $user_gender['total_count'];
    $male_count = $user_gender['male_count'];
    $female_count = $user_gender['female_count'];
    $unknown = $user_gender['unknown'];
}

$tpl->set('{user_gender_male}', $male_count);
$tpl->set('{user_gender_female}', $female_count);
$tpl->set('{user_gender_unknown}', $unknown);
 

Наверное так, но это не точно...

rewenas
Юзер

rewenas - 16 ноября 2023 23:55 -

По 3 пункту не совсем понятно, вы хотите посчитать сколько у вас пользователей из какой типо страны?

Sinoid
Юзер

Sinoid - 17 ноября 2023 00:23 -

rewenas, Да, будет диаграмма с сортировкой по кол-ву юзеров из каждой страны. Типа так:
Китай: 340
США: 323
Индия: 278
Россия: 169
...
Монако: 3
Для этого считаем всех пользователей, указавших страну Китай: у них личный параметр {land} = 'CN', тогда всего таких юзеров из Китая будет {land_CN} = '340'. Далее, из США: {land_US} = '323'. И т.д.
Напомню, тег {land} в DLE не выводится в stats.tpl, т.к. он личный для каждого юзера и может показываться в разделах профиля пользователя.

rewenas
Юзер

rewenas - 17 ноября 2023 01:04 -

Нужно наверное выполнить запрос c оператором SQL GROUP BY и тем самым сгруппировать по результатам выборки запроса столбца. То что тега {land} нет в stats.tpl вообще не проблема. Самое главное он есть в базе данных в таблице dle_users а вывести нужные результаты по нему можно в любом шаблоне.

Sinoid
Юзер

Sinoid - 17 ноября 2023 01:56 -

rewenas, Спасибо за советы, но мне всё это не понятно. А времени на изучение PHP+SQL у меня нет. Если бы ещё немного мне тут помогли, то в PHP я бы больше не лез. В целом, думаю, уже смогу сделать рабочий вариант, только хотел уменьшить объём кода. Уточняю задачу.
Создам в PHP массив кодов стран, типа:

$iso_countries = array(
"AD",
"AE",
"AF",
.......
"ZW",
);
Затем нужно как-то циклом создать переменные для всех кодов:
foreach ($iso_countries as $zz){
// создаём массив переменных land_zz_count:
'land_' . $zz . '_count'
// в каждую из них вносим количество юзеров с данным кодом страны
// и создаём тег для вывода этого количества:
{land_zz}
}

Ещё вот нашёл полезный API для всех этих манипуляций с БД DLE. Из документации DLE (Навигация: Разработчикам >
API для разработки модулей):

Для использования API в своем модуле вы должны его подключить строчкой:
include ('engine/api/api.class.php');
*
$dle_api->load_table ( string $table [, string $fields [, string $where [, bool $multirow [, int $start [, int $limit [, string $sort [, string $sort_order]]]]]]]);

Получение информации из таблицы БД.
$table - название таблицы
$fields - необходимые поля через запятую или * для всех
$where - условие выборки
$multirow - забирать ли один ряд или несколько
$start - начальное значение выборки
$limit - количество записей для выборки, 0 - выбрать все
$sort - поле, по которому осуществляется сортировка
$sort_order - направление сортировки

Возвращается массив с данными, либо false если в БД по указанным параметрам ничего не найдено.
*
$dle_api->save_to_cache ( string $fname, mixed $vars);

Запись данных в файл кеша. Параметр $fname указывает имя файла кеша без указания его расширения. $vars - данные для записи в кеш.
*
$dle_api->load_from_cache ( string $fname, [, int $timeout [, string $type]]);
Чтение данных из файла кеша. Параметр $fname указывает имя файла кеша без указания его расширения. Необязательный параметр $timeout указывает количество секунд, в течении которых информацию из кеша считать актуальной. Если файл кеша будет устаревшим, то функция возвращает false. Необязательный параметр $type указывает на тип данных который хранится в кеше, если не 'text' - считаем, что хранился массив и возвращается массив данных.


Вот здесь есть и запись в кэш с его временем. Этим API наверное удобнее всего делать запросы и кэш.

[У меня тут в комменте почему-то перестали работать опции вставки ссылки и цитаты. Нажимаю на кнопки, а ничего не происходит. В начальном моём вопросе я смог сделать ссылку на сайт, а тут нет.]
[Upd. После публикации коммента при его правке стали работать кнопки ссылки и цитаты]

rewenas
Юзер

rewenas - 18 ноября 2023 20:14 -

// в каждую из них вносим количество юзеров с данным кодом страны
// и создаём тег для вывода этого количества:
{land_zz}

У тебя же будет 249 тегов. Не многовато ли ? Причем большинство тегов так и будет постоянно с 0 так как навряд ли кто то будет из стран 3 сотни

Sinoid
Юзер

Sinoid - 18 ноября 2023 21:30 -

rewenas, А что делать? Есть какое-то другое решение?!! Ну и что, это лишь временные переменные в виде тегов.

rewenas
Юзер

rewenas - 19 ноября 2023 00:32 -

Можно например вывести только те страны что пользователи отметили у себя и посчитать в них суммарное количество пользователей. Причем сделать это отдельно подключаемым шаблоном, который отдельной строкой можно подключить в шаблоне статистики.

rewenas
Юзер

rewenas - 19 ноября 2023 00:30 -

Delete

Sinoid
Юзер

Sinoid - 19 ноября 2023 01:11 -

rewenas, Понятно, что в статистику нет смысла выводить страны, которые никто не выбрал. Но ожидаю, что за несколько месяцев работы моего глобального научного сайта наберутся юзеры из около 60-80 стран. Всё равно много переменных выводить нужно. Допустим, внутри PHP считаем и формируем теги {land_zz} только тех стран zz, где {land_zz} > 0, заносим их в массив, сортируем по убыванию, а на страницу статистики выдаём список рейтинга из пар zz: {land_zz}. Как это всё реализовать в PHP?

rewenas
Юзер

rewenas - 19 ноября 2023 01:51 -

Не знаю насколько конечно это правильно, но я вижу это в голове у себе немного по другому. Завтра постараюсь реализовать

rewenas
Юзер

rewenas - 19 ноября 2023 16:21 -

1 Создать в engine/data/ конфигурационный файл country-configuration.php с массивом ключей, представляющими коды стран и их значения.


<?PHP 

$iso_countries = array (

'AD' => "Андорра",
'AE' => "Объединенные Арабские Эмираты",
'AF' => "Афганистан",

// Здесь надо добавить все оставшиеся 245 стран из нужных 249. Их очень много и добавлять очень долго, я не стал

'ZW' => "Зимбабве",
);

?> 


2 Создать через систему плагинов или просто так в engine/modules/ файл с названием country.php


<?php
if( ! defined( 'DATALIFEENGINE' ) ) {
	die( "Hacking attempt!" );
}

    include_once ENGINE_DIR . "/data/country-configuration.php";

	$tpl->load_template('users-country.tpl');	
	$tpl->result['users-country'] = dle_cache( "users-country_", $tpl->result['users-country'], true);
	
	if (!$tpl->result['users-country']) {
        $result = $db->query("SELECT land, COUNT(*) AS user_count FROM " . USERPREFIX . "_users WHERE land != '' GROUP BY land");
        $country_counts = array();      
            while( $row = $db->get_row($result) ) { 
                $country = $row['land']; 
                $user_count = $row['user_count']; 

                if (isset($iso_countries[$country])) {
                    $country_name = $iso_countries[$country];
                    $tpl->set('{land}', $country_name);
                } else {
                    $tpl->set('{land}', 'Код страны не найден');
                }                 
                $tpl->set('{user-count}', $user_count);
          
	        $tpl->compile('users-country');
	    }      
		$tpl->clear();
		create_cache( "users-country_", $tpl->result['users-country'], true );
	}
	echo $tpl->result['users-country'];
?>


3 В папке вашего шаблона создать новый users-country.tpl файл. ( Стили в нем написаны просто для примера, их необходимо перенести в свой CSS файл вашего шаблона. Можно их изменять или добавлять новые, делая оформление на ваш вкус и цвет.)


<style>
.country {
   border: 1px solid  #cecfcf;
   border-radius: 5px; 
   text-align: left;
   padding: 5px 25px;
   margin-bottom: 10px;
}

.user-count {
   float: right;
}
</style>

<div class="col-xs-12 col-sm-3">
      <div class="country"> {land} <span class="user-count">{user-count}</span> </div>
</div>


4 В шаблоне stats.tpl вставить строку подключения {include file="/engine/modules/country.php"}

Sinoid
Юзер

Sinoid - 19 ноября 2023 16:53 -

rewenas, Спасибо. Но:
1. $iso_countries будет содержать только коды. Названия стран потом будет выводить скрипт.
2. {land} нельзя переопределять. Он мне нужен сам по себе как доп. поле каждого юзера. Туда заносится выбор страны юзером и оттуда отображается страна и флаг рядом с аватаром юзера в его комментах и в профиле.
3. На выходе из PHP мне нужен только сортированный (или нет) массив ненулевых количеств юзеров по каждой стране. Далее этот массив будет обрабатываться скриптом через библиотеку Chart.js, чтобы выводить диаграмму по всем странам. Bootstrap не использую. Про графическое представление списка на странице статов можешь не думать. Лучше сделай комментарии в коде PHP или здесь, что там происходит хотя бы в основной логике алгоритма.

rewenas
Юзер

rewenas - 19 ноября 2023 17:59 -

1 Если тебе нужно вывести из $iso_countries массива только ключи то:
 $keys = array_keys($iso_countries); 

2 В смысле переопределять? Его никто даже не трогал. Или я тебя просто не понимаю. Я всего лишь думал что инпутом у тебя пользователи выбирают страну :в следствие чего у тебя в столбец land таблицы dle_users заноситься двухбуквенный код стран.
Ещё сделал выбор страны проживания, который заносится скриптом в стандартный DLE-тег {land} в виде кода 249 стран списка ISO 3166-1 alpha-2
Поэтому этим кодом:

                if (isset($iso_countries[$country])) {
                    $country_name = $iso_countries[$country];
                    $tpl->set('{land}', $country_name);
                } else {
                    $tpl->set('{land}', 'Код страны не найден');
                } 
Заменил этот двухбуквенный код на название страны
3 Тогда тебе нужно:
 
$result = $db->query("SELECT land, COUNT(*) AS user_count FROM " . USERPREFIX . "_users WHERE land != '' GROUP BY land");
$resultArray = array(); 
while ($row = $result->fetch_assoc()) { 
   $country = $row['land']; 
   $user_count = $row['user_count']; 
   $country_counts[$country] = $user_count; 
}

foreach ($country_counts as $country => $user_count) {
    $resultArray[] = array(
        'Страна' => $country,
        'Количество пользователей' => $user_count
    );
}

Результат запроса сохраняется в переменной $result. Далее создается пустой массив для хранения данных $resultArray = array(); И далее внутри цикла foreach в этот массив записывается каждый элемент массива $country_counts в виде массива с ключами страна и количество пользователей. Наверное это то что тебе как раз надо

rewenas
Юзер

rewenas - 19 ноября 2023 18:01 -

Сразу хочу сказать я в этом деле самоучка. Так что могу что то не так понимать и реализовывать

Sinoid
Юзер

Sinoid - 19 ноября 2023 20:33 -

1. Да, не нужно заменять ISO-код в поле {land} на название страны:
$tpl->set('{land}', $country_name);
2. Хорошо, получили массив $resultArray[] с элементами типа:
(RU, 127), (СN, 69), (US, 215), ...
Как мне их выводить в HTML-код страницы stats.tpl ? Всё равно делать массив каких-то тегов? Или как можно без тегов вставить в список <ul> в каждый <li> пару ключ+значение массива $resultArray[] ? Если примерно как ниже, то не знаю, будут ли такие пары без ошибок влезать в html:
<ul>
<?php foreach ($resultArray as $zz) {
<li>
<?php echo $zz ?> + <?php echo $resultArray[$zz] ?>
<li/>
}
?>
<ul/>
А если через массив тегов [ {land_zz} = $resultArray[zz] ], то вроде бы проще, но как в html перебирать весь массив тегов, если из html нет доступа к размеру такого массива (который меняется динамически), а в js-скрипте DLE-теги не работают?
3. Напиши пжл весь country.php ещё раз со всеми изменениями и с кэшированием.

rewenas
Юзер

rewenas - 20 ноября 2023 14:20 -


Хорошо, получили массив $resultArray[] с элементами типа:
(RU, 127), (СN, 69), (US, 215), ...
Как мне их выводить в HTML-код страницы stats.tpl

Как их выводить в stats.tpl я тебе написал выше. Но тебе это не подходит. Или я не пойму, тебе на каждую страну нужен отдельный тег? Я так понял ты хочешь потом с помощью скрипта сделать диаграмму. Но насколько я знаю в скрипт ты не сможешь вставить эти теги, там нужны как раз переменные. К сожалению в js я пока не силен

Bootstrap не использую.

Это ваше право. Я просто написал это для примера, мне так проще, так как я его использую. Удобная штука.

rewenas
Юзер

rewenas - 20 ноября 2023 15:51 -


$user_tags = dle_cache('user_tags_count');
if (!$user_tags) {
    $result = $db->query("SELECT land, COUNT(*) AS user_count FROM " . USERPREFIX . "_users WHERE land != '' GROUP BY land");
    $resultArray = array();

    while ($row = $result->fetch_assoc()) { 
        $country = $row['land']; 
        $user_count = $row['user_count']; 
        $country_counts[$country] = $user_count; 
  
        $resultArray[] = array(
            'land' => $country,
            'count_users' => $user_count
        );
    }
    create_cache('user_tags_count', $resultArray); 
} else { 
    $resultArray = $user_tags; 
}

foreach ($resultArray as $item) {                  
    $tpl->set('{' . $item['land'] . '}', $item['land']);
    $tpl->set('{' . $item['land'] . '_count}', $item['count_users']);
  
    echo $tpl->result['stats'];
}


В шаблоне stats.tpl , будут теги:

Страна: {US}, Количество пользователей: {US_count}
Страна: {RU}, Количество пользователей: {RU_count}
Страна: {CN}, Количество пользователей: {CN_count}

И так далее сколько нужно вам раз. Хоть все 249.

Sinoid
Юзер

Sinoid - 20 ноября 2023 19:22 -

rewenas, Ну в итоге вернулись мы к тому, что нужно создавать все 249 тегов, а затем скриптом показывать только ненулевые количества? Если по нагрузке на сервер это не сильно отличается от динамического создания 60-80 тегов, то мне годится. Задача была в том, чтобы в PHP выводить массив только стран с ненулевым количеством юзеров. А даже если такой массив создаётся, например, из 50 тегов, то в HTML я же не знаю, какие там 50 тегов {ZZ} получилось ненулевыми по значению {ZZ_count}. То есть какие конкретно 50 стран прописывать в вёрстку или в скрипт? А через 10 минут может быть уже 51 тег. Вот в чём проблема.
Вот этот цикл
foreach ($resultArray as $item)
- если он выводит только страны с ненулевым количеством юзеров, то снова ключевой вопрос: как мне в stats.tpl прописать в нужное место, чтобы туда выводился этот список, допустим, в данный момент актуальных 50 стран? Я же не знаю, какие там сейчас страны ненулевые.

rewenas
Юзер

rewenas - 20 ноября 2023 21:16 -

Кажется мы с вами ходим по кругу. Если тебе надо вывести в шаблон stats.tpl список всех стран которые пользователи отметили у себя в профиле и посчитать в них количество пользователей, тогда у меня есть подозрение что вы мой код который я вам писал и который подключается в шаблоне одной строкой вы даже не пробовали. Так как он как раз и выводит и считает только актуальные страны. В отличии от того кода который делает все 249 тегов, потому что действительно вы не можете знать актуальны ли они. Так как в любое время новый пользователь может добавить у себя в профиле новую страну. .
Что касается скрипта который должен строить у вас круговую диаграмму то туда скорее всего идут переменные из массива. Теги ты не сможешь внести в скрипт, они нужны лишь для вывода полученной информации в шаблонах. Но с этим скриптом уже вопрос не ко мне, я пока JS только пытаюсь изучить.Д
Напишите точнее что вы хотите в итоге получить? И если можно напишите каким скриптом вы даёте пользователям заносить в поле импут ( или скорее всего селект) коды стран

Sinoid
Юзер

Sinoid - 20 ноября 2023 22:46 -

rewenas, Я эти коды не пробовал, потому что не знаю как эти PHP-алгоритмы вызывать в шаблоне. С гендерами я понял, потому что там вставляю обычные DLE-теги. Напиши мне пжл, что конкретно нужно добавить в stats.tpl. Этого я не могу понять.
Диаграмма по странам не получится круговой, там же будет плохо видно узкие секторы. Будет типа линейная шкала для каждой страны на 30% ширины страницы (точнее, контейнера для всей диаграммы), если из этой страны 30% юзеров.
Для выбора всех этих доп. полей я создал мега-меню в модальном окне. При выборе страны в стандартный инпут для доп. полей вносится код страны. Только этот инпут скрытый - не виден на странице профиля или валидации и не доступен для табуляции. Скрываем инпут, добавив класс, который выносит элемент за пределы страницы:
.skip {
position: absolute;
top: -100%;
pointer-events: none;
}
После выбора страны (гендера и других доп. полей) юзер видит свой выбор в изменившейся надписи на кнопке вызова модала (скрипт подставляет новый выбор). И как обычно, ему ещё нужно нажать кнопку "Сохранить" внизу формы изменения личной информации.
Ну и обычное дело прописать стилями размещение флага страны, значка гендера и прочих значков около аватарки в комментах юзера. При наведении на флажок всплывает подсказка с полным названием страны.
Вот флаги, если надо.
Это мой хак и у меня всё работает. Просто логическим продолжением будет ещё и на странице статистики показать, сколько народу из каждой страны. Всем же интересно не только, откуда юзер, оставивший коммент, но и вообще из каких стран юзеры читают сайт.

Sinoid
Юзер

Sinoid - 20 ноября 2023 22:55 -

Del

rewenas
Юзер

rewenas - 20 ноября 2023 23:00 -

но и вообще из каких стран юзеры читают сайт.

ссылка
Вот я тебе тут подробно все описал, как в шаблон stats.tpl вывести все страны с количеством пользователей которые пользователи отметили у себя. Даже разжевал подробно. Оформить это можешь как угодно. Тут все зависит от твоего CSS Изголяйся как хочешь. Бутстап можешь выкинуть если он тебе не нужен

rewenas
Юзер

rewenas - 20 ноября 2023 23:03 -

А вообще там пользователи могут же выбирать что угодно. Хоть с закрытыми глазами. Это скорее для успокоения, истины там может быть мало. Тут скорее по IP надо смотреть. И то с помощью прокси и ВПН можно сделать ложные следы

Sinoid
Юзер

Sinoid - 20 ноября 2023 23:10 -

"А вообще там пользователи могут же выбирать что угодно."
Ну так никто их не заставляет выбирать что угодно. Кто не хочет - не указывает. Это лишь вопрос культурности, а сайт для образованных людей, так что 99,9% укажут правду. Никто не собирается преследовать их в своих странах, если они будут читать мой сайт. Какой смысл им скрывать страну проживания? Если они хотят, чтобы их лучше понимали, учитывая культурный код их страны, или чтобы возможно они могли найти единомышленников в своей стране, они будут указывать свою страну без вранья.

rewenas
Юзер

rewenas - 20 ноября 2023 23:11 -

Посмотри в php my admin что у тебя заноситься в столбец land таблицы dle_usets название страны или их двухбуквенный код. Я исправлю тот код под тебя . Так как он изначально считает что туда заноситься двухбуквенный код

Sinoid
Юзер

Sinoid - 20 ноября 2023 23:20 -

rewenas, Я сразу написал, что мой скрипт вносит в инпут и затем сохраняет в поле для {land} стандартный 2-буквенный код. Не нужно в PHP расшифровывать название страны - это хорошо делает мой скрипт. Мне нужно, чтобы на страницу статистики (в то место, где я укажу) выводился список строк, в каждой из которых я смогу вставить код страны
{ZZ} и в этой же строке кол-во юзеров из этой страны - {ZZ_count}. А сейчас я не понимаю, что для твоего последнего PHP-сценария вписывать в stats.tpl. Если сценарий просто выдаёт поток значений (код страны - количество) в начало страницы, то как я смогу стилизовать его? Вот с тегами удобно. Вот например, как я пока без диаграммы вывел твой сценарий для гендеров в стандартный шаблон статистики DLE:
<ul>
<li>
Общее количество пользователей мужского пола:
<b class="">{user_gender_male}</b>
</li>
<li>
Общее количество пользователей женского пола:
<b class="">{user_gender_female}</b>
</li>
<li>
Общее количество пользователей с невыбранным полом:
<b class="">{user_gender_unknown}</b>
</li>
</ul>

Sinoid
Юзер

Sinoid - 20 ноября 2023 23:36 -

Если в PHP создать 249 тегов, то я могу просто выдать их в шаблон вёрстки таким образом:
<ul>
<li>
Общее количество пользователей из AD:
<b class="">{AD_count}</b>
</li>
<li>
Общее количество пользователей из AE:
<b class="">{AE_count}</b>
</li>
...
<li>
Общее количество пользователей из ZW:
<b class="">{ZW_count}</b>
</li>
</ul>
Затем скрипт сканирует эту выдачу и оставляет только ненулевые страны, переводит код в название страны (из массива-библиотеки) и выдаёт например, 50 строк в стиле:
<li>
Общее количество пользователей из России:
<b class="">{RU_count}</b>
</li>
где на странице вместо {RU_count} видно кол-во, например, 638.
Это я могу сделать. Но задача была в оптимизации, потому что ты сам указал, что 249 тегов - это много. Если для сервера особой разницы нет, высчитывать 249 тегов всегда или 50 тегов сегодня, а 60 тегов через месяц, то я уже могу сделать со всеми 249 тегами рабочий вариант.

rewenas
Юзер

rewenas - 21 ноября 2023 00:01 -

Словил тот же глюк с телефона , что и у тебя с невозможностью нажать на кнопку цитаты, поэтому отвечу так
" Мне нужно, чтобы на страницу статистики (в то место, где я укажу) выводился список строк, в каждой из которых я смогу вставить код страны"
Мой код который я вам писал выше как раз это делает.

"Затем скрипт сканирует эту выдачу и оставляет только ненулевые страны, переводит код в название страны (из массива-библиотеки) и выдаёт например, 50 строк"
Да не сможет ваш скрипт просканировать эти теги, он их просто не поймет Ему нужны переменные которые мы занесли в массив и которые содержат кючи

Sinoid
Юзер

Sinoid - 21 ноября 2023 00:25 -

"Да не сможет ваш скрипт просканировать эти теги". Ну вот я сначала так и думал. Мне же не за что цепляться напрямую, чтобы вытащить эти данные в обработку для стилей и для диаграммы. Но теперь сообразил, что на самом деле, если в составе выдачи будут ключи кодов стран по признаку после особого символа, например, выдача будет такой строкой:
'@RU: 638# @CN: 1253# @US: 920#' то скрипт сможет вытаскивать код страны между @ и : А количество юзеров страны - между : и # Просто чуть больше писать JS-кода. Но в JS есть функции работы со строками, так что решаемо.
Тогда думаю, можно выводить такую выдачу в скрытое поле, чтобы оттуда обрабатывать скриптом для графической выдачи на страницу. Нужно прописать тогда новый PHP-сценарий и 1 тег в нём для выдачи такой строки. Оптимизация тогда будет в том, что сервер просчитывает только ненулевые страны и выдаёт всего 1 тег в кэш для выдачи ненулевых стран по алфавиту, а нагрузка по сортировке и графической выдаче будет на стороне пользователя. Можешь тогда такой PHP-сценарий оформить? Представим, что есть простой массив (без ключей) всех 249 кодов стран в PHP-файле:
$iso_codes = ["AD", "AE", "AF", ... , "ZW"];
Напомню, именно в таком виде коды содержатся в доп. поле {land} каждого юзера, кто выбрал страну.

rewenas
Юзер

rewenas - 21 ноября 2023 00:09 -

" то как я смогу стилизовать его?"очень легко, это всего лишь вопрос CSS

rewenas
Юзер

rewenas - 21 ноября 2023 00:18 -

"Если в PHP создать 249 тегов"
Не надо создавать 249 тегов. Код создаёт один так называемый динамический тег. В который в шаблоне вы подставляете двухбуквенный код нужной вам страны и он выводит необходимый результат. Но вы же не можете знать какие страны будут у вас добавлять пользователи. Ведь так же. Поэтому логичнее будет дать возможность коду самому циклом пройтись и выбрать только те страны что пользователи уже отметили и занести все в кеш. Который с некой переодичностью очищается, следовательно данные постоянно обновляются. Вопрос лишь в нагрузке, но тут я хз

Sinoid
Юзер

Sinoid - 21 ноября 2023 00:40 -

rewenas, По нагрузке будет понятно уже после запуска сайта. Так что надо пробовать. Если что, потом можно отключить такую статистику. Да и запрашивать её будут далеко не все пользователи. Сервер на DLE постоянно высчитывает, например, количество просмотров каждой новости и кол-во комментариев к новости, а это гораздо бОльшая нагрузка при сотнях новостей, чем считать страны юзеров.

Sinoid
Юзер

Sinoid - 21 ноября 2023 01:06 -

Про динамические теги я сначала не понял. Но теперь сообразил, как последним сценарием
foreach ($resultArray as $item) {
$tpl->set('{' . $item['land'] . '}', $item['land']);
$tpl->set('{' . $item['land'] . '_count}', $item['count_users']);

echo $tpl->result['stats'];
}
пользоваться. Мне было непонятно, как вызывать кол-во по каждой стране, тем более когда неизвестно, какие страны актуальны. Тут тогда создаваемые этим циклом теги {ZZ} не нужны. В скрипте пропишу сканирование по всем 249 тегам {ZZ_count}, которые будут выводиться в скрытый список по всем странам ZZ. Если PHP-сценарий не сформировал для страны тег {ZZ_count}, то HTML его не выводит - там вместо числа юзеров будет пусто. Затем скрипт сортирует полученные ненулевые (где вышло непустое значение) теги и распределяет по убыванию количества юзеров в таблицу линейной диаграммы.

rewenas
Юзер

rewenas - 21 ноября 2023 18:24 -


Все равно я тебя немного не понимаю, ну да ладно... дерзай
У меня получилось так:

Sinoid
Юзер

Sinoid - 21 ноября 2023 19:50 -

rewenas, Я ещё не начал делать. Но если как у тебя с сортировкой, то мне так и нужно. Покажи HTML-код в stats.tpl пжл.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх