J3.x

Make your own Action Log Plugin/it: Difference between revisions

From Joomla! Documentation

Ino (talk | contribs)
Created page with "J3.x:Crea il tuo plugin per il log delle azioni"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(21 intermediate revisions by one other user not shown)
Line 1: Line 1:
<noinclude><languages /></noinclude>
<noinclude><languages /></noinclude>
Joomla! 3.9 and later allows extensions to log their actions in the User Action Log. This is done by creating a plugin in the actionlog folder.
Joomla! 3.9 e successive consente alle estensioni di registrare le loro azioni nel registro azioni dell'utente. Questo viene fatto creando un plug-in nella cartella del log delle azioni.


Please note that if your plugin is not in the actionlog folder you will get untranslated strings in the User Action Log component and / or module when actions of your extension are being displayed.  
Si noti che se il proprio plug-in non si trova nella cartella del registro azioni, verranno visualizzate stringhe non tradotte nel componente e/o modulo del registro azioni utente quando vengono visualizzate le azioni dell'estensione.  


As a developer, you should be aware that all published actionlog plugins are loaded by Joomla's Action Log system plugin on every page load. The implication to that is that the constructor of your actionlog plugin should be kept to a bare minimum and not do any initialization which could have a performance impact. If you need to perform any kind of heavy initialization try to defer it for the last possibly moment, i.e. when you are about to log an action.
Come sviluppatore, dovresti sapere che tutti i plug-in del actionlog pubblicati vengono caricati dal plugin del sistema Action Log di Joomla su ogni caricamento della pagina. L'implicazione a questo è che il costruttore del tuo plugin actionlog dovrebbe essere ridotto al minimo e non eseguire alcuna inizializzazione che potrebbe avere un impatto sulle prestazioni. Se è necessario eseguire qualsiasi tipo di inizializzazione pesante, provare a differirlo per l'ultimo, ad esempio quando si sta per registrare un'azione.


The actionlog plugin is meant to "catch" your extension's actions and log them. The "catching" part depends entirely on your extension. The concept is that each interesting action that needs to be logged must trigger a plugin event which is handled by your actionlog plugin and has the effect of logging said action to the database.
Il plugin actionlog serve a "catturare" le azioni della tua estensione e registrarle. La parte "catching" dipende interamente dalla tua estensione. Il concetto è che ogni azione interessante che deve essere registrata deve attivare un evento plugin che viene gestito dal plug-in actionlog e ha l'effetto di registrare la suddetta azione nel database.


Joomla's MVC only triggers events on content preparation. If you want to see how you can handle those events for your component check the Joomla plugin in the actionlog folder.
Joomla MVC attiva solo eventi sulla preparazione del contenuto. Se vuoi vedere come puoi gestire quegli eventi per il tuo componente controlla il plugin Joomla nella cartella del registro azioni.


For everything else it's advisable to use your own, custom plugin event names. Take extra care to not cause any naming conflicts. For example, a plugin event called <tt>onAfterInitialize</tt> is '''BAD''' because it clashes with Joomla's built-in event by the same name. '''DO NOT''' use generic plugin names such as <tt>onAfterSave</tt> because you are guaranteed to cause a conflict with another extension or Joomla itself. Remember that plugin event names are shared across all plugins in all plugin folders!  
Per tutto il resto è consigliabile utilizzare i propri nomi di eventi plug-in personalizzati. Prestare particolare attenzione a non causare conflitti di denominazione. Ad esempio, un evento plugin chiamato <tt> onAfterInitialize </ tt> è '' 'BAD' '' perché si scontra con l'evento integrato di Joomla con lo stesso nome. '' 'NON' '' utilizzare nomi di plugin generici come <tt> onAfterSave </ tt> perché si è certi che causi un conflitto con un'altra estensione o con Joomla stesso. Ricorda che i nomi degli eventi dei plug-in sono condivisi tra tutti i plug-in in tutte le cartelle di plug-in!  


The best way to prevent naming clashes is using naming conventions like the following:
Il modo migliore per evitare conflitti di naming è utilizzare le convenzioni di naming come la seguente:


* For components, <tt>onComComponentControllerViewnameAfterorbeforeTask</tt> e.g. <tt>onComExampleControllerItemsAfterBrowse</tt> for <tt>option=com_example&view=items&task=browse</tt>
* Per componenti, <tt>onComComponentControllerViewnameAfterorbeforeTask</tt> e.g. <tt>onComExampleControllerItemsAfterBrowse</tt> for <tt>option=com_example&view=items&task=browse</tt>
* For plugins, <tt>onPlgFolderPluginnameAction</tt> e.g. <tt>onPlgSystemFoobarBaz</tt> to log the "baz" action taken by a plugin named <tt>foobar</tt> in the system folder.
* Per plugins, <tt>onPlgFolderPluginnameAction</tt> e.g. <tt>onPlgSystemFoobarBaz</tt> per registrare l'azione "baz" eseguita da un plugin chiamato <tt>foobar</tt> nella cartella di sistema.


Modules, templates, and libraries are unlikely candidates for actions you might want to log but you can use a similar naming convention:
Moduli, modelli e librerie sono candidati improbabili per le azioni che potresti voler registrare ma puoi usare una convenzione di denominazione simile:


* For modules, <tt>onModSiteoradminModulenameAction</tt> e.g. <tt>onModSiteExampleFoo</tt> for a frontend (site) module <tt>mod_example</tt> taking action foo
* Per i moduli, <tt>onModSiteoradminModulenameAction</tt> ad es. <tt>onModSiteExampleFoo</tt> per un modulo (sito) di frontend <tt>mod_example</tt> che prende l'azione per
* For libraries, <tt>onLibLibrarynameAction</tt> e.g. <tt>onLibExampleFoo</tt> for the <tt>lib_example</tt> library taking action foo
* Per le librerie, <tt>onLibLibrarynameAction</tt> ad es. <tt>onLibExampleFoo</tt> per la <tt>lib_example</tt> che accetta l'azione foo
* For templates, <tt>onTplSiteoradminTemplatenameAction</tt> e.g. on <tt>TplSiteExampleFoo</tt> for a frontend template named example taking action foo
* For templates, <tt>onTplSiteoradminTemplatenameAction</tt> ad es. su <tt>TplSiteExampleFoo</tt> per un modello di frontend chiamato example prendendo l'azione foo


If you have a Model used in many of your component's controllers and you would rather log an action taken there you can use the naming convention <tt>onComComponentModelModelnameAfterorbeforeMethodname</tt> e.g. <tt>onComExampleModelItemsBeforeSave</tt> to log something that happens after calling the <tt>ExampleModelItems::save()</tt> method. Again, this convention is arbitrary and the only reason we recommend it is that you can have a reasonable expectation that it won't cause naming clashes. The more specific the event name is the less likely it is to have a conflict with core or third party code.
Se si dispone di un modello utilizzato in molti dei controller del proprio componente e si preferisce eseguire il log delle azioni eseguite, è possibile utilizzare la convenzione naming <tt>onComComponentModelModelnameAfterorbeforeMethodname</tt> ad es. <tt>onComExampleModelItemsBeforeSave</tt> per registrare qualcosa che accade dopo aver chiamato il metodo <tt>ExampleModelItems::save()</tt> Ancora una volta, questa convenzione è arbitraria e l'unica ragione per cui lo consigliamo è che puoi avere una ragionevole aspettativa che non causerà conflitti di denominazione. Più specifico è il nome dell'evento è meno probabile che sia in conflitto con il codice principale o di terze parti.


Logging the actions requires going through a bit of code to perform sanity checks (e.g. correct Joomla version) and do the actual logging. Here is a prototype function you can use in your plugin:
La registrazione delle azioni richiede il passaggio di un po 'di codice per eseguire controlli di integrità (ad esempio, la versione corretta di Joomla) e eseguire la registrazione effettiva. Ecco una funzione di prototipo che puoi utilizzare nel tuo plugin:


<source lang="php">
<source lang="php">
Line 72: Line 72:
</source>
</source>


Here is an example plugin method performing user action logging:
Ecco un esempio di metodo plug-in che esegue la registrazione delle azioni dell'utente:


<source lang="php">
<source lang="php">
Line 96: Line 96:
</source>
</source>


Note that the log title (the second argument to the method) is a translation key. It is defined similar to that:
Si noti che il titolo del registro (il secondo argomento del metodo) è una chiave di traduzione. È definito simile a quello:


<tt>COM_AKEEBA_LOGS_PROFILE_ADD="User <a href=\"{accountlink}\">{username}</a> created the backup profile {title}"</tt>
<tt>COM_AKEEBA_LOGS_PROFILE_ADD="User <a href=\"{accountlink}\">{username}</a> ha creato il profilo di backup {title}"</tt>


The <tt>{title}</tt> variable is the <tt>$title</tt> parameter in our method. The other two variables are defined and processed by the User Action Logs module and component when rendering the user actions log.
The <tt>{title}</tt> variable is the <tt>$title</tt> nel nostro metodo. Le altre due variabili vengono definite ed elaborate dal modulo e dal componente Registri azioni utente durante il rendering del registro delle azioni dell'utente.


''Caveat'': Since Joomla 4 has not yet integrated the Action Logs component and plugins the code above will not work on Joomla! 4. If / when Action Logs are ported to Joomla 4 we'll have to revisit this documentation page since neither <tt>JModelLegacy</tt> is available, nor will the Model name be <tt>ActionlogsModelActionlog</tt>.
''Caveat'': Dal momento che Joomla 4 non ha ancora integrato il componente Registri di azione e plugin il codice sopra non funzionerà su Joomla! 4. If / quando i log delle azioni sono portati su Joomla 4, dovremo rivisitare questa pagina di documentazione poiché né <tt>JModelLegacy</tt> è disponibile, né il nome del modello sarà <tt>ActionlogsModelActionlog</tt>.


<noinclude>
<noinclude>
[[Category:Components]]
[[Category:Components{{#translation:}}]]
[[Category:Joomla! 3.9]]
[[Category:Joomla! 3.9{{#translation:}}]]
[[Category:Plugins]]
[[Category:Plugins{{#translation:}}]]
[[Category:Modules]]
[[Category:Modules{{#translation:}}]]
[[Category:User Action Logs]]
[[Category:User Action Logs{{#translation:}}]]
</noinclude>
</noinclude>

Latest revision as of 13:26, 12 February 2021

Joomla! 3.9 e successive consente alle estensioni di registrare le loro azioni nel registro azioni dell'utente. Questo viene fatto creando un plug-in nella cartella del log delle azioni.

Si noti che se il proprio plug-in non si trova nella cartella del registro azioni, verranno visualizzate stringhe non tradotte nel componente e/o modulo del registro azioni utente quando vengono visualizzate le azioni dell'estensione.

Come sviluppatore, dovresti sapere che tutti i plug-in del actionlog pubblicati vengono caricati dal plugin del sistema Action Log di Joomla su ogni caricamento della pagina. L'implicazione a questo è che il costruttore del tuo plugin actionlog dovrebbe essere ridotto al minimo e non eseguire alcuna inizializzazione che potrebbe avere un impatto sulle prestazioni. Se è necessario eseguire qualsiasi tipo di inizializzazione pesante, provare a differirlo per l'ultimo, ad esempio quando si sta per registrare un'azione.

Il plugin actionlog serve a "catturare" le azioni della tua estensione e registrarle. La parte "catching" dipende interamente dalla tua estensione. Il concetto è che ogni azione interessante che deve essere registrata deve attivare un evento plugin che viene gestito dal plug-in actionlog e ha l'effetto di registrare la suddetta azione nel database.

Joomla MVC attiva solo eventi sulla preparazione del contenuto. Se vuoi vedere come puoi gestire quegli eventi per il tuo componente controlla il plugin Joomla nella cartella del registro azioni.

Per tutto il resto è consigliabile utilizzare i propri nomi di eventi plug-in personalizzati. Prestare particolare attenzione a non causare conflitti di denominazione. Ad esempio, un evento plugin chiamato onAfterInitialize </ tt> è 'BAD' perché si scontra con l'evento integrato di Joomla con lo stesso nome. 'NON' utilizzare nomi di plugin generici come onAfterSave </ tt> perché si è certi che causi un conflitto con un'altra estensione o con Joomla stesso. Ricorda che i nomi degli eventi dei plug-in sono condivisi tra tutti i plug-in in tutte le cartelle di plug-in!

Il modo migliore per evitare conflitti di naming è utilizzare le convenzioni di naming come la seguente:

  • Per componenti, onComComponentControllerViewnameAfterorbeforeTask e.g. onComExampleControllerItemsAfterBrowse for option=com_example&view=items&task=browse
  • Per plugins, onPlgFolderPluginnameAction e.g. onPlgSystemFoobarBaz per registrare l'azione "baz" eseguita da un plugin chiamato foobar nella cartella di sistema.

Moduli, modelli e librerie sono candidati improbabili per le azioni che potresti voler registrare ma puoi usare una convenzione di denominazione simile:

  • Per i moduli, onModSiteoradminModulenameAction ad es. onModSiteExampleFoo per un modulo (sito) di frontend mod_example che prende l'azione per
  • Per le librerie, onLibLibrarynameAction ad es. onLibExampleFoo per la lib_example che accetta l'azione foo
  • For templates, onTplSiteoradminTemplatenameAction ad es. su TplSiteExampleFoo per un modello di frontend chiamato example prendendo l'azione foo

Se si dispone di un modello utilizzato in molti dei controller del proprio componente e si preferisce eseguire il log delle azioni eseguite, è possibile utilizzare la convenzione naming onComComponentModelModelnameAfterorbeforeMethodname ad es. onComExampleModelItemsBeforeSave per registrare qualcosa che accade dopo aver chiamato il metodo ExampleModelItems::save() Ancora una volta, questa convenzione è arbitraria e l'unica ragione per cui lo consigliamo è che puoi avere una ragionevole aspettativa che non causerà conflitti di denominazione. Più specifico è il nome dell'evento è meno probabile che sia in conflitto con il codice principale o di terze parti.

La registrazione delle azioni richiede il passaggio di un po 'di codice per eseguire controlli di integrità (ad esempio, la versione corretta di Joomla) e eseguire la registrazione effettiva. Ecco una funzione di prototipo che puoi utilizzare nel tuo plugin:

	public function logUserAction($title, $logText, $extension)
	{
		static $joomlaModelAdded = false;

		// User Actions Log is available only under Joomla 3.9+
		if (version_compare(JVERSION, '3.9', 'lt'))
		{
			return;
		}

		// Include required Joomla Model
		if (!$joomlaModelAdded)
		{
			\JModelLegacy::addIncludePath(JPATH_ROOT . '/administrator/components/com_actionlogs/models', 'ActionlogsModel');
			$joomlaModelAdded = true;
		}

		$user = $this->getUser();

		// No log for guest users
		if ($user->guest)
		{
			return;
		}

		$message = array(
			'title'    	  => $title,
			'username' 	  => $user->username,
			'accountlink'     => 'index.php?option=com_users&task=user.edit&id=' . $user->id
		);

		/** @var \ActionlogsModelActionlog $model **/
		try
		{
			$model = \JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
			$model->addLog(array($message), $logText, $extension, $user->id);
		}
		catch (\Exception $e)
		{
			// Ignore any error
		}
	}

Ecco un esempio di metodo plug-in che esegue la registrazione delle azioni dell'utente:

/**
	 * Logs the creation of a new backup profile
	 *
	 * @param \Akeeba\Backup\Admin\Controller\Profiles	$controller
	 * @param array										$data
	 * @param int										$id
	 */
	public function onComAkeebaControllerProfilesAfterApplySave($controller, $data, $id)
	{
		// If I have an ID in the request and it's the same of the model, I'm just editing a record
		if (isset($data['id']) && $data['id'] == $id)
		{
			return;
		}

		$profile_title = $data['description'];

		$this->logUserAction($profile_title, 'COM_AKEEBA_LOGS_PROFILE_ADD', 'com_akeeba');
	}

Si noti che il titolo del registro (il secondo argomento del metodo) è una chiave di traduzione. È definito simile a quello:

COM_AKEEBA_LOGS_PROFILE_ADD="User <a href=\"{accountlink}\">{username}</a> ha creato il profilo di backup {title}"

The {title} variable is the $title nel nostro metodo. Le altre due variabili vengono definite ed elaborate dal modulo e dal componente Registri azioni utente durante il rendering del registro delle azioni dell'utente.

Caveat: Dal momento che Joomla 4 non ha ancora integrato il componente Registri di azione e plugin il codice sopra non funzionerà su Joomla! 4. If / quando i log delle azioni sono portati su Joomla 4, dovremo rivisitare questa pagina di documentazione poiché né JModelLegacy è disponibile, né il nome del modello sarà ActionlogsModelActionlog.