Passa al contenuto principale

Estendere le Estensioni

Le estensioni di Flarum non prevedono solo l'aggiunta di funzionalità al core: le estensioni possono estendere anche altre estensioni!

tip

Per imparare a rendere estensibile la tua estensione, consulta la documentazione pertinente

Dipendenze

Se la tua estensione si basa su un'altra estensione, ti assicurerai che:

  • L'altra estensione è installata e abilitata prima della tua attuale estensione.
  • L'altra estensione non può essere disabilitata mentre la tua è abilitata.
  • L'altra estensione viene avviata prima della tua estensione.

Flarum rende tutto ciò molto facile: basta aggiungere l'altra estensione al file composer.jsondella tua estensione o nella sezione require.

Ad esempio, se stai sviluppando un nuovo tema per l'estensione Tag Flarum, il tuo composer.json dovrebbe essere simile a questo:

{
// ...
"require": {
"flarum/core": "^1.0.0", // Perchè tutte le estensioni necessitano del Core di Flarum.
"flarum/tags": "^1.1.0" // Questo dice a Flarum di trattare i tag come dipendenza della tua estensione.
},
// ...
}

Dipendenze opzionali

A volte, l'estensione A potrebbe voler estendere l'estensione B solo se l'estensione B è abilitata. In questo caso, chiamiamo B una "Dipendenza opzionale" di A. Per esempio, l'estensione "Drafts" potrebbe voler aggiungere il supporto per salvare bozze di discussione private, ma solo se l'estensione di discussione privata è abilitata.

Il primo passo quindi è quello di rilevare se l'estensione B è abilitata. Nel frontend, è facile: se l'estensione B fa qualcosa nel frontend, il suo ID di estensione apparirà come chiave nell'oggetto globale flarum.extensions . Per esempio:

if ('some-extension-id' in flarum.extensions) {
// fai qualcosa
}

Nel backend, dovrai iniettare un'istanza di Flarum\Extension\ExtensionManagere usare il metodo isEnabled(). Per esempio:

<?php

use Flarum\Extension\ExtensionManager;

class SomeClass {
public function __construct(ExtensionManager $extensions)
{
$this->extensions = $extensions;
}

public function someMethod()
{
if ($this->extensions->isEnabled('some-extension-id')) {
// fai qualcosa.
}
}
}

Generalmente, se la tua estensione ha dipendenze opzionali, vorrai che venga avviata dopo queste dipendenze opzionali. Tutto ciò è possibile farlo anche specificando i nomi dei pacchetti composer (NON ID dell' estensione flarum) in un array extra.flarum-extension.optional-dependencies del tuo file composer.json.

Per esempio:

{
// ...
"extra": {
"flarum-extension": {
"optional-dependencies": [
"flarum/tags"
]
}
},
// ...
}

Importazione da estensioni

Nel backend, puoi importare le classi di cui hai bisogno tramite la dichiarazione PHP use:

<?php

use Flarum\Tags\Tag;

class SomeClass
{
public function someMethod()
{
return new Tag(); // Questa non è la maniera corretta di istanziare modelli, E' solo un esempio.
}
}

Nota che se stai importando da una dipendenza opzionale che potrebbe non essere installata, dovrai controllare che la classe in questione esista tramite la funzione class_exists.

Nel frontend, è possibile importare solo cose che sono state esplicitamente esportate. Tuttavia, per prima cosa dovrai configurare il webpack della tua estensione per consentire queste importazioni:

webpack.config.js

module.exports = require('flarum-webpack-config')({
// Fornire gli ID di estensione di tutte le estensioni da cui la tua estensione verrà importata.
// Fai questo sia per le dipendenze complete che opzionali.
useExtensions: ['flarum-tags']
});

Una volta fatto questo, è possibile importare con:

const tutteLeCoseEsportateDaQualcheEstensione = require('@flarum-tags');