Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

Помогите советом, необходимо в определенные места в шаблоне вывести некоторую информацию из статистики, а если быть точным, то: количество файлов из приложения 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, создать с помощью него блок и вставить данный код куда.

Опубликовано:
  • Автор

@Lesovsky спасибо!

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

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

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

Опубликовано:
1 час назад, DevilDriver сказал:

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

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

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

image.png

image.png

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

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

image.png

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

Опубликовано:
  • Автор

Ага, сейчас сам блок заработал, показывает информацию. Но в нужном мне месте снова показывает 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}

 

Опубликовано:
  • Автор

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

image.png.410c81c0d4b008177231bad3f8430f34.png

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

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

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

Опубликовано:
31 минуту назад, DevilDriver сказал:

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

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

  • 4 недели спустя...
Опубликовано:
  • Автор

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

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

'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

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.