Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
DevilDriver

Вывод информации из статистики в любое место

Рекомендованные сообщения

Приветствую!

Помогите советом, необходимо в определенные места в шаблоне вывести некоторую информацию из статистики, а если быть точным, то: количество файлов из приложения downloads, общее количество скачиваний, количество просмотров.

В шаблонах находил код, который связан с отображением этой статистики в виджетах, но при попытке его использовать счетчик показывает 0.

Пример кода из шаблона downloadStats:

{number="$stats['totalFiles']"}
{number="$stats['totalComments']"}
{number="$stats['totalReviews']"}

 

Поделиться сообщением


Ссылка на сообщение

Добрый день!

К сожалению до сбоя на ipbskins была тема и даже плагин по расширению статистики форума с компонентами, и также не помню автора.

По вашему вопросу, чтобы присланный вами код из downloadStats  заработал в любом месте, нужно вставить в начало шаблона:

{{$stats = \IPS\Db::i()->select( 'COUNT(*) AS totalFiles, SUM(file_comments) AS totalComments, SUM(file_reviews) AS totalReviews', 'downloads_files', array( "file_open=?", 1 ) )->first();}}
{{$stats['totalAuthors'] = \IPS\Db::i()->select( 'COUNT(DISTINCT file_submitter)', 'downloads_files' )->first();}}

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

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

@Lesovsky спасибо!

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

И попробовал с помощью Pages через админку создать кастомный блок, добавил туда ваш код, после добавил этот блок на страницу с помощью Manage Blocks, и в шаблон страницы вставил код отображения статистики, очистил кеш. В этом случае счетчик снова показывает 0.

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

Поделиться сообщением


Ссылка на сообщение
1 час назад, DevilDriver сказал:

создать кастомный блок

Вот с такими параметрами должен быть блок:

Скрытый текст

image.png

image.png

Результат работы у нас (не форматированный цифры внизу, сейчас блок отключил):

Скрытый текст

image.png

Кеширование блоков включено, после очистки также работает.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение
08/08/23 18:14 (изменено)

Ага, сейчас сам блок заработал, показывает информацию. Но в нужном мне месте снова показывает 0.

Если кратко, какого результата я добиваюсь: мне нужно вывести общее количество файлов в название кнопки, которая ведет в категории файлового архива (/downloads/categories). 

P.S. Еще дополнительная статистика содержится на главной админки, там где виджет Downloads Overview: общее кол-во просмотров файлов и количество загрузок. Хотел там посмотреть реализацию, но вообще не нашел этих шаблонов в теме.

Скрытый текст

image.png.39c06ec796d7cea5fa11135c8b7d4df4.png

 

Изменено пользователем DevilDriver

Поделиться сообщением


Ссылка на сообщение
1 час назад, DevilDriver сказал:

P.S. Еще дополнительная статистика содержится на главной админки

Вот набор запросов оттуда, но хочу заметить, тут идут данные без учёта прав доступа:

Скрытый текст

 


		$oneMonthAgo = \IPS\DateTime::create()->sub( new \DateInterval( 'P1M' ) )->getTimestamp();
		
		/* Basic stats */
		$data = array(
			'total_disk_spaced'			=> (int) \IPS\Db::i()->select( 'SUM(record_size)', 'downloads_files_records' )->first(),
			'total_files'				=> (int) \IPS\Db::i()->select( 'COUNT(*)', 'downloads_files' )->first(),
			'total_views'				=> (int) \IPS\Db::i()->select( 'SUM(file_views)', 'downloads_files' )->first(),
			'total_downloads'			=> (int) \IPS\Db::i()->select( 'SUM(file_downloads)', 'downloads_files' )->first(),
			'total_bandwidth'			=> (int) \IPS\Db::i()->select( 'SUM(dsize)', 'downloads_downloads' )->first(),
			'current_month_bandwidth'	=> (int) \IPS\Db::i()->select( 'SUM(dsize)', 'downloads_downloads', array( 'dtime>?', $oneMonthAgo ) )->first(),
		);

 

 

 

Т.е., чтобы вывести как вы пишите тут:

1 час назад, DevilDriver сказал:

Если кратко, какого результата я добиваюсь: мне нужно вывести общее количество файлов в название кнопки, которая ведет в категории файлового архива (/downloads/categories). 

Можно конечно слегка доработать шаблон downloads > front > browse > categoriesSidebar сделать некоторую переменную и к ней прибавлять значения количества файлов, чтобы был с учётом прав доступа, но если нет необходимости (скрытые разделы отсутствуют) можно взять например запрос количества файлов и сделать так:

{{$total_files = (int) \IPS\Db::i()->select( 'COUNT(*)', 'downloads_files' )->first();}}

Всего файлов {$total_files}

 

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Спасибо большое, вот теперь отлично работает, то что нужно!

image.png.410c81c0d4b008177231bad3f8430f34.png

7 минут назад, Lesovsky сказал:

но хочу заметить, тут идут данные без учёта прав доступа

Извиняюсь за может быть глупый вопрос, получается если использовать вывод данных как сделано там, то это может повлиять на безопасность?

Поделиться сообщением


Ссылка на сообщение
31 минуту назад, DevilDriver сказал:

Извиняюсь за может быть глупый вопрос, получается если использовать вывод данных как сделано там, то это может повлиять на безопасность?

Нет, просто будут учитываться файлы из закрытых категорий если они есть.

  • Upvote 1

Поделиться сообщением


Ссылка на сообщение

Подниму тему, чтобы не создавать новую.

Подскажите, можно ли как-то сделать так, чтобы сохранять данные вот этих запросов статистики, которые указывали выше, например раз в день, заносить их в отдельный столбец БД, и потом уже обращаться к ним напрямую, чтобы не грузить базу запросами с вычислениями при каждом обновлении страницы?

'total_disk_spaced'			=> (int) \IPS\Db::i()->select( 'SUM(record_size)', 'downloads_files_records' )->first(),
'total_files'				=> (int) \IPS\Db::i()->select( 'COUNT(*)', 'downloads_files' )->first(),
'total_views'				=> (int) \IPS\Db::i()->select( 'SUM(file_views)', 'downloads_files' )->first(),
'total_downloads'			=> (int) \IPS\Db::i()->select( 'SUM(file_downloads)', 'downloads_files' )->first(),
'total_bandwidth'			=> (int) \IPS\Db::i()->select( 'SUM(dsize)', 'downloads_downloads' )->first(),

 

Поделиться сообщением


Ссылка на сообщение

Записывать в базу значения не самый оптимальный вариант, я думаю лучше использовать кеширование с истекающем сроком хранения:

    function getDownloadsStats(): array
    {

        try {
            return \IPS\Data\Cache::i()->getWithExpire('downloads_statschache', TRUE);
        } catch (\OutOfRangeException $e) {
        }

        $oneMonthAgo = \IPS\DateTime::create()->sub(new \DateInterval('P1M'))->getTimestamp();

        /* Basic stats */
        $data = array(
            'total_disk_spaced' => (int)\IPS\Db::i()->select('SUM(record_size)', 'downloads_files_records')->first(),
            'total_files' => (int)\IPS\Db::i()->select('COUNT(*)', 'downloads_files')->first(),
            'total_views' => (int)\IPS\Db::i()->select('SUM(file_views)', 'downloads_files')->first(),
            'total_downloads' => (int)\IPS\Db::i()->select('SUM(file_downloads)', 'downloads_files')->first(),
            'total_bandwidth' => (int)\IPS\Db::i()->select('SUM(dsize)', 'downloads_downloads')->first(),
            'current_month_bandwidth' => (int)\IPS\Db::i()->select('SUM(dsize)', 'downloads_downloads', array('dtime>?', $oneMonthAgo))->first(),
        );

        \IPS\Data\Cache::i()->storeWithExpire('downloads_statschache', $data, \IPS\DateTime::create()->add(new \DateInterval('P1D')), TRUE);

        return $data;
    }

, где P1D как раз временный интервал в один день.

Конечно эту функцию лучше засунуть в плагин и подключить к шаблону, или сделать некий виджет, но можно засунуть и в кастоный блок Pages.

 

Кстати, по такой же логике, можно сделать и в этой теме

 

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...