Estendere plugin di terze parti in WinterCMS

Luca Benati

Estendiamo un plugin esterno al nostro in modo semplice e veloce


Pubblicato da Luca Benati il 07 giugno 2022

A volte capita che ci servirebbe personalizzare un model o un controller di un plugin esterno al nostro magari per estenderlo con funzionalità aggiuntive oppure per aggiungergli una chiave esterna per relazionarlo ad un model di un nostro plugin, in questo articolo vediamo come è possibile aggiungere un campo alla tabella di un plugin di terze parti e aggiungerlo alla form del model.

In questo esempio andreamo ad estendere un ipotetico plugin che definisce una tabella denominata cars dove vengono registrate delle autovetture ma rimane un riferimento valido per qualsiasi altro plugin che vorremmo estendere.

La prima cosa da fare è aggiungere il campo che ci serve nella tabella degli utenti cars, nel nostro caso vogliamo aggiungere un campo per definire il tipo di alimentazione de veicolo, quindi andiamo a creare una migration nella cartella updates del nostro plugin che chiameremo extend_cars_table.php dove tramite la facade Schema recuperiamo un'istanza della tabella dei veicoli e la andiamo ad alterare inserendo un nuovo campo di tipo varchar senza dimenticare di aggiungere anche il metodo per rimuovere il campo nel caso venga effettuato un rollback o una disinstallazione del nostro plugin


namespace Mio\Plugin\Updates;

use Winter\Storm\Database\Updates\Migration;
use Schema;

class ExtendsCarsTable extends Migration
{
    public function up()
    {
        Schema::table('cars', function ($table) {
            $table->string('alimentazione');
        });
    }

    public function down()
    {
        Schema::table('cars', function ($table) {
            $table->dropColumn('alimentazione');

        });
    }
}

ed aggiungiamo la nuova voce di versione nel file version.yaml incrementando la versione un commento che ci ricorda cosa fa quella migration e il nome del file che la contiene come ad esempio:



1.0.11:
    - 'Estende la tabella veicoli cars'
    - extend_cars_table.php

ora non ci resta che lanciare il comando


php artisan winter:up

per fare eseguire la migration e ci ritroveremo il nostro nuovo campo nella tabella degli autoveicol del pluign.

Naturalmente questo può essere fatto anche tramite il plugin builder per quanto riguarda la creazione della migration ed uscendo e rientrando in backend per eseguirla.

Ora che il campo è presente sul db dobbiamo renderelo disponibile nel form della vista di modifica di backend per poter inserire un valore nel campo appena creato.

Per estendere i campi di un controller esterno in WinterCMS è possibil usare il metodo statico extendFormFields, questo metodo prende tre argomenti; $form che rappresenta l'oggetto widget del Form, $model che rappresenta il model utilizzato dal form e $context è una stringa che contiene il contesto del form.

Detto questo, supponendo che il controller dei veicoli si chiami Cars, basterà aggiungere questo codice nel file principale del nostro plugin, normalmente all'interno del metodo di boot


Cars::extendFormFields(function($form, $model, $context)
{

    $form->addFields([
        'alimentazione' => [
            'label'   => 'Alimentazione',
            'comment' => 'Questo è il campo alimentazione che ho aggiunto.',
        ],
    ]);

});

Come abbiamo visto è veramente molto semplice estendere altri plugin in WinterCMS, così potremo personalizzarli senza perdere le noste modifiche nel caso li andassimo ad aggiornare, inoltre è possible estenderli in modo molto spinto aggiungendovi anche scope, metodi dinamici, eventi ecc sempre senza toccare i plugin originali ma questo lo vedremo nei prossimi articoli.

Happy coding!


Lunga vita e prosperità

Ti interessa un argomento non trattato?