silver

4.x
Statistiche download files

5 risposte in questa discussione

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

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

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.

Piace a silver

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Inviato (modificato)

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

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

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.

Piace a silver e Terrry

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti
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.

Piace a BomAle

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Crea un account o accedi per lasciare un commento

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

Crea un account

Iscriviti per un nuovo account nella nostra comunità. È facile!


Registra un nuovo account

Accedi

Sei già registrato? Accedi qui.


Accedi Ora