Перейти к содержимому
Открыть в приложении

Удобный способ просмотра. Узнать больше.

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

Полноэкранное приложение на главном экране с push-уведомлениями, медалями и многим другим.

Чтобы установить это приложение на iOS и iPadOS
  1. Нажмите иконку «Поделиться» в Safari
  2. Прокрутите меню и нажмите На экран «Домой».
  3. Нажмите Добавить в правом верхнем углу.
Чтобы установить это приложение на Android
  1. Нажмите меню из трёх точек (⋮) в правом верхнем углу браузера.
  2. Нажмите Добавить на главный экран или Установить приложение.
  3. Подтвердите, нажав Установить.
Русский язык для Invision Community 5

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

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

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

 

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

 

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

Аккаунт

Навигация

Поиск

Поиск

Настроить push-уведомления браузера

Chrome (Android)
  1. Нажмите на иконку замка рядом с адресной строкой.
  2. Нажмите Права доступа -> Уведомления.
  3. Измените свои настройки.
Chrome (компьютер)
  1. Нажмите на иконку замка в адресной строке.
  2. Выберите Настройки сайта.
  3. Найдите Уведомления и измените свои настройки.