Skriv ett eget plugin

Mozquizto innehåller ett stort antal filter och funktioner som är användbara när man konstruerar nya frågor, men ibland är de inbyggda funktionerna inte tillräckliga.

Låt oss säga att vi vill skapa ett antal frågor om grundämnen. Då vore det praktiskt att få tillgång till en databas med information. Med lite googling kan man till exempel hitta följande lilla öppen källkod-projekt som innehåller alla data man kan tänka sig om våra grundämnen: https://github.com/andrejewski/periodic-table

Hur gör vi dessa tillgängliga i Mozquizto? Det bästa sättet är att skriva en modul (plugin) till systemet. Mozquizto levereras tillsammans med några färdiga moduler: en som innehåller ett antal vanliga statistiska fördelningar och några som ger stöd för att anropa externa program (pari, Maxima), men det går också bra att skapa nya moduler

Skapa en ny modul

  • Öppna ett terminalfönster på servern där (helst en lokal utvecklingsversion av) Mozquizto är installerad.
  • Navigera till roten av installationen (t.ex. /var/www/mozquizto) och kör kommandot php artisan module:make Elements Detta skapar en ny mapp Modules/Elements med ett stort antal filer:
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/module.json
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Routes/web.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Routes/api.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Resources/views/index.blade.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Resources/views/layouts/master.blade.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Config/config.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/composer.json
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Resources/assets/js/app.js
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Resources/assets/sass/app.scss
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/webpack.mix.js
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/package.json
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Database/Seeders/ElementsDatabaseSeeder.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Providers/ElementsServiceProvider.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Providers/RouteServiceProvider.php
Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Http/Controllers/ElementsController.php

Skapa en ny tabell i databasen

Det effektivaste sättet att lagra grundämnesinformationen är via en tabell i systemets databas. Konventionen är att databastabller som skapas av nya moduler ska heta module_ + modulens namn. I vårt fall vill vi alltså skapa en ny tabell module_elements. Moduler som behöver skapa flera databastabeller kan göra det. Namnge i så fall dessa tabeller t.ex. module_elements_physical_data och liknande. För detta exempel räcker det med en ny tabell.

Det enklaste sättet att skapa en så kallad databas-migration är att köra kommandot php artisan module:make-migration create_module_elements_table Elements. Detta skapar en ny fil,

Created : /Users/frankw/Sites/mozquizto/Modules/Elements/Database/Migrations/2018_11_15_000501_create_module_elements_table.php

Det exakta filnamnet beror på när kommandot körs. Denna fil ser ut så här:

increments('id');

            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('module_elements');
    }
}

I funktionen up() behöver vi definiera vilka kolumner som ska finnas i den nya databastabellen. Github-paketet ovan innehåller massor av information om varje grundämne. För enkelhets skull, låt oss välja ut några av de viktigaste, men modifiera gärna detta om du har andra behov! Redigera migrations-filen så att den innehåller något i stil med:

public function up()
{
    Schema::create('module_elements', function (Blueprint $table) {
        $table->increments('id');

        $table->integer('atomic_number')->unsigned();
        $table->string('symbol');
        $table->string('name');
        $table->float('atomic_mass');
        $table->float('melting_point');
        $table->float('boiling_point');
        $table->float('density');
        $table->integer('year_discovered')->unsigned();

        $table->timestamps();
    });
}

Kör därefter kommandot php artisan module:migrate Elements för att skapa den nya tabellen i databasen.