J3.x

J3.x:Crea il tuo plugin per il log delle azioni

From Joomla! Documentation

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This page is a translated version of the page J3.x:Make your own Action Log Plugin and the translation is 100% complete.
Other languages:
English • ‎français • ‎italiano • ‎中文(台灣)‎

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.