Vai al contenuto

Statistiche download files

Featured Replies

Inviato

Buongiorno a tutti, 

utilizzo ip.downloads versione 4.1 e sto cercando di capire se ci sono delle statistiche dettagliate sull'attività degli utenti registrati, mi basterebbe avere l'elenco dei files scaricati per ogni utente.

Per ora sono riuscito a vedere solo quanti file sono stati scaricati, ma non quali.

Esiste una soluzione?

 

Grazie

Inviato

basta creare una pagina php poi tocca modificare le righe con un template a parte... vedi logRows

<?php

require_once './init.php';

\IPS\Dispatcher\External::i();
$baseUrl = \IPS\Http\Url::external( \IPS\Http\Url::baseUrl().ltrim($_SERVER['PHP_SELF'],'/') );

$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl );
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin'), 'table' );
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin' ), 'rows' );
$table->sortBy = $table->sortBy ?: 'dtime';
$table->sortDirection = $table->sortDirection ?: 'asc';

\IPS\Output::i()->output .= (string) $table;
\IPS\Output::i()->title = 'DOWNLOADS';
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->globalTemplate( \IPS\Output::i()->title, \IPS\Output::i()->output) );

per l'utente collegato dovresti cambiare

$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl );

in

$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl, array( 'dmid=?', \IPS\Member::i()->loggedIn()->member_id ) );

però per questioni di sicurezza aggiungi prima di $baseUrl:

if( ! \IPS\Member::i()->loggedIn()->member_id )
{
	exit;
}

in questo modo i visitatori non potranno visualizzare i downloads di altri visitatori.

Inviato
  • Autore

Ti ringrazio per la risposta BomAle, purtroppo non sono molto pratico di modifiche su IPB quindi ti chiedo ancora qualche suggerimento.

Ho creato una nuova pagina chiamandola statistiche.php inserendo il codice che mi hai postato tu, richiamando questa pagina ora vedo un bel po di dati interessanti e altri meno.

Vedo l'id dell'utente e l'id del file scaricato che ora dovrei trasformare in nome utente nome file scaricato, in più dovrei eliminare alcune informazioni superflue.

Mi pare di capire che ora dovrei creare un template a parte che poi posso modificare a mio piacimento, mi potresti indicare gentilmente come dovrei procedere? Mi basterebbe capire come poter associare il nuovo template al file appena creato in modo che richiamandolo mi carichi il template da me creato.

Spero in tue istruzioni

Saluti

 

Modificato da silver

Inviato

DEMO:https://invisionita.com/downloads.php

Per semplificare il lavoro ho preferito avere tutto nello stesso file php.

<?php

require_once './init.php';

\IPS\Dispatcher\External::i();
$baseUrl = \IPS\Http\Url::external( \IPS\Http\Url::baseUrl().ltrim($_SERVER['PHP_SELF'],'/') );
$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl, \IPS\Member::loggedIn()->isAdmin() ? NULL : array('dmid=?',\IPS\Member::loggedIn()->member_id) );
if(\IPS\Member::loggedIn()->isAdmin())
{
	\IPS\Member::loggedIn()->language()->words['mine'] = "Miei";
	\IPS\Member::loggedIn()->language()->words['not_mine'] = "NON Miei";
	$table->filters = array(
		'mine' => array('dmid=?',\IPS\Member::loggedIn()->member_id),
		'not_mine' => array('dmid!=?',\IPS\Member::loggedIn()->member_id),
	);
}

$functionNamerows = 'ba_rows'. uniqid();
//@arguments $table, $headers, $rows
$templaterow = <<<HTML
{{foreach \$rows as \$row}}
	<li class='ipsGrid_span6 ipsPhotoPanel ipsPhotoPanel_mini ipsClearfix ipsPad_half'>
		{template="userPhoto" app="core" group="global" params="\IPS\Member::load( \$row['dmid'] ), 'mini'"}
		<div>
			<h3 class='ipsType_normal ipsType_reset ipsTruncate ipsTruncate_line'>{member="name" id="\$row['dmid']"}</h3>
			<span class='ipsType_light'>{datetime="\$row['dtime']" norelative="true"}</span><br />
			<span class='ipsType_light'>{\$row['dfid']|raw}</span>
		</div>
	</li>
{{endforeach}}
HTML;
\IPS\Theme::makeProcessFunction( $templaterow, $functionNamerows, '$table, $headers, $rows' );
$table->rowsTemplate =  'IPS\\Theme\\'.$functionNamerows;

$functionNametable = 'ba_table'.uniqid();
$templatetable = <<<HTML
<div data-baseurl='{\$table->baseUrl}' data-resort='{\$table->resortKey}' data-controller='core.global.core.table' {{if \$table->getPaginationKey() != 'page'}}data-pageParam='{\$table->getPaginationKey()}'{{endif}}>

	{{if \$table->pages > 1}}
		<div class="ipsButtonBar ipsPad_half ipsClearfix ipsClear">
			{{if !empty( \$table->filters )}}
			<ul class="ipsButtonRow ipsPos_right ipsClearfix">
				<li>
					<a href="#elFilterByMenu_menu" data-role="tableFilterMenu" id="elFilterByMenu_{\$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsButtonRow_active" data-ipsMenu-selectable="radio">{lang="filter_by"} <i class="fa fa-caret-down"></i></a>
					<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' id='elFilterByMenu_{\$table->uniqueId}_menu'>
						<li data-action="tableFilter" data-ipsMenuValue='' class='ipsMenu_item {{if !\$table->filter}}ipsMenu_itemChecked{{endif}}'>
							<a href='{\$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => \$table->sortBy, 'sortdirection' => \$table->sortDirection, 'page' => '1' ) )}'>{lang="{\$table->langPrefix}all"}</a>
						</li>
						{{foreach \$table->filters as \$k => \$q}}
						<li data-action="tableFilter" data-ipsMenuValue='{\$k}' class='ipsMenu_item {{if \$k === \$table->filter}}ipsMenu_itemChecked{{endif}}'>
							<a href='{\$table->baseUrl->setQueryString( array( 'filter' => \$k, 'sortby' => \$table->sortBy, 'sortdirection' => \$table->sortDirection, 'page' => '1' ) )}'>{lang="{\$table->langPrefix}{\$k}"}</a>
						</li>
						{{endforeach}}
					</ul>
				</li>
			</ul>
			{{endif}}
			<div data-role="tablePagination">
				{template="pagination" group="global" app="core" location="global" params="\$table->baseUrl, \$table->pages, \$table->page, \$table->limit, TRUE, \$table->getPaginationKey()"}
			</div>
		</div>
	{{endif}}


	{{if count( \$rows )}}
		<ol class='ipsGrid ipsGrid_collapsePhone ipsPad ipsClear {{foreach \$table->classes as \$class}}{\$class} {{endforeach}}' id='elTable_{\$table->uniqueId}' data-role="tableRows" itemscope itemtype="http://schema.org/ItemList">
			{{\$rhtml = call_user_func(\$table->rowsTemplate, \$table, \$headers, \$rows );}}{\$rhtml|raw}
		</ol>
	{{else}}
		<div class='ipsType_center ipsPad'>
			<p class='ipsType_large ipsType_light'>{lang="no_rows_in_table"}</p>
			{{if method_exists( \$table, 'container' ) AND \$table->container() !== NULL}}
				{{if \$table->container()->can('add')}}
					<a href='{\$table->container()->url()->setQueryString( 'do', 'add' )}' class='ipsButton ipsButton_primary ipsButton_medium'>
						{lang="submit_first_row"}
					</a>
				{{endif}}
			{{endif}}
		</div>
	{{endif}}
				
	{{if \$table->pages > 1}}
		<div class="ipsButtonBar ipsPad_half ipsClearfix ipsClear">
			<div data-role="tablePagination">
				{template="pagination" group="global" app="core" location="global" params="\$table->baseUrl, \$table->pages, \$table->page, \$table->limit, TRUE, \$table->getPaginationKey()"}
			</div>
		</div>
	{{endif}}
</div>
HTML;
\IPS\Theme::makeProcessFunction( $templatetable, $functionNametable, '$table, $headers, $rows, $quickSearch' );
$table->tableTemplate =  'IPS\\Theme\\'.$functionNametable;

$table->sortBy = $table->sortBy ?: 'dtime';

// $table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin'), 'table' );
// $table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin' ), 'rows' );
// $table->include = array( 'dfid', 'dtime', 'dsize', 'dua', 'dmid', 'dip' );

/* Parsers */
$table->parsers = array(
	'dfid'	=> function( $val )
	{
		try
		{
			$file = \IPS\downloads\File::load( $val );
			return "<a href='" . $file->url() . "' target='_blank'>" . htmlspecialchars( $file->name, \IPS\HTMLENTITIES, 'UTF-8', FALSE ) . '</a>';
		}
		catch ( \OutOfRangeException $e )
		{
			return \IPS\Member::loggedIn()->language()->addToStack('content_deleted');
		}
	},
	// 'dtime'	=> function( $val )
	// {
		// return (string) \IPS\DateTime::ts( $val );
	// },
	// 'dsize'	=> function( $val )
	// {
		// return \IPS\Output\Plugin\Filesize::humanReadableFilesize( $val );
	// },
	// 'dua'	=> function( $val )
	// {
		// return (string) \IPS\Http\Useragent::parse( $val );
	// },
	// 'dmid'	=> function( $val )
	// {
		// try
		// {
			// $member = \IPS\Member::load( $val );
			// return \IPS\Theme::i()->getTemplate( 'global', 'core' )->userPhoto( $member, 'tiny' ) . ' ' . $member->link();
		// }
		// catch ( \OutOfRangeException $e )
		// {
			// return \IPS\Member::loggedIn()->language()->addToStack('deleted_member');
		// }
	// },
);

\IPS\Output::i()->output .= \IPS\Member::loggedIn()->member_id ? (string) $table : "Registrati per accedere a quest'area";
\IPS\Output::i()->title = 'DOWNLOADS';
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->globalTemplate( \IPS\Output::i()->title, \IPS\Output::i()->output) );

È molto intuitivo, se non è chiaro ti spiego passo passo...

si potrebbe aggiungere

  • una barra di ricerca per filtrare i downloads per titolo/file
  • ordinare i risultati
  • ricerche avanzate

il problema è che occorre tempo per implementare ogni cosa nel file php.

Inviato
  • Autore
Il 24/4/2017 at 20:57, BomAle ha scritto:

basta creare una pagina php poi tocca modificare le righe con un template a parte... vedi logRows


<?php

require_once './init.php';

\IPS\Dispatcher\External::i();
$baseUrl = \IPS\Http\Url::external( \IPS\Http\Url::baseUrl().ltrim($_SERVER['PHP_SELF'],'/') );

$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl );
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin'), 'table' );
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'tables', 'core', 'admin' ), 'rows' );
$table->sortBy = $table->sortBy ?: 'dtime';
$table->sortDirection = $table->sortDirection ?: 'asc';

\IPS\Output::i()->output .= (string) $table;
\IPS\Output::i()->title = 'DOWNLOADS';
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->globalTemplate( \IPS\Output::i()->title, \IPS\Output::i()->output) );

per l'utente collegato dovresti cambiare


$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl );

in


$table = new \IPS\Helpers\Table\Db( 'downloads_downloads', $baseUrl, array( 'dmid=?', \IPS\Member::i()->loggedIn()->member_id ) );

però per questioni di sicurezza aggiungi prima di $baseUrl:


if( ! \IPS\Member::i()->loggedIn()->member_id )
{
	exit;
}

in questo modo i visitatori non potranno visualizzare i downloads di altri visitatori.

Sei stato gentile e disponibile oltremodo, ti ringrazio davvero tanto per l'aiuto che mi hai dato, con qualche piccola modica al codice che mi hai gentilmente fornito sono riuscito ad ottenere esattamente quello che volevo.

Grazie di tutto.

Per favore accedi per lasciare un commento

Potrai lasciare un commento dopo aver effettuato l'accesso

Accedi Ora

Chi sta navigando 0

  • Nessun utente registrato visualizza questa pagina.

Informazioni importanti

Abbiamo inserito dei cookies nel tuo dispositivo per aiutarti a migliorare la tua esperienza su questo sito. Puoi modificare le impostazioni dei cookie, altrimenti puoi accettarli cliccando su continua. to insert a cookie message.

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.