Jump to content
Дизайн и модификация Invision Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
DevilDriver

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

Recommended Posts

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

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

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

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

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

 

Share this post


Link to post

Добрый день!

К сожалению до сбоя на 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

Share this post


Link to post

@Lesovsky спасибо!

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

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

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

Share this post


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

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

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

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

image.png

image.png

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

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

image.png

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

  • Upvote 1

Share this post


Link to post

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

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

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

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

image.png.39c06ec796d7cea5fa11135c8b7d4df4.png

 

Edited by DevilDriver

Share this post


Link to post
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

Share this post


Link to post

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

image.png.410c81c0d4b008177231bad3f8430f34.png

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

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

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

Share this post


Link to post
31 минуту назад, DevilDriver сказал:

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

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

  • Upvote 1

Share this post


Link to post

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

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

'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(),

 

Share this post


Link to post

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

    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.

 

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

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...