Plugins
A Plugin (typically a laravel package) is a feature that can be active/inactive, and can be installed via composer. Plugins can have its own settings, a description, and will be displayed on the plugins page.
Important notes
Laravelpackage.com provides good documentation for the development of a Laravel package.
Composer package
You should make your plugin be installable via composer. You can achieve this by adding a gitlab-ci.yaml to your
module.
Gitlab will automatically register your package whenever you push a tag. For example:
stages:
- deploy
variables:
TAG: '0.0.1'
deploy:
stage: deploy
only:
- tags
script:
- 'apt-get update; apt-get -y install curl'
- 'curl --header "Job-Token: $CI_JOB_TOKEN" --data tag=$TAG "${CI_API_V4_URL}/projects/$CI_PROJECT_ID/packages/composer"'
You can find more information here: Installing Modules & Plugins.
Now when you push your changes, Gitlab will register your plugin as a composer package. For example: https://gitlab.qlic.nl/qore/plugins/postcode/-/packages
There is an existing dev plugin which can be used as an example: https://gitlab.qlic.nl/qore/plugins/postcode.
There is also an example module which registers Vue templates: https://gitlab.qlic.nl/qore/modules/qore-issue-tracker.
Updating documentation and release notes
After you have created a plugin, please take some time to add a page to https://qore.qlic.nl. You can do this by updating this project: https://gitlab.qlic.nl/qore/docs:
- Update the
config/extensions.php - Add a note to
resources/views/notes/plugins/<your-plugin.md>//: # (context-remember)
Getting started
Registering your plugin
You can register your own plugin in your service provider:
class NewPluginServiceProvider extends ServiceProvider
{
public function boot()
{
app(Plugins::class)->register(new NewPlugin);
}
}
Your plugin should extend QorePlugin. Here is an example:
use Qore\System\Contracts\Resource\Resources;
use Qore\System\Plugin\QorePlugin;
class TestPlugin extends QorePlugin
{
public function boot()
{
app(Resources::class)->register(new testResource);
}
public function composerName(): string
{
return 'qore/test';
}
public function title(): string
{
return 'Test';
}
public function description(): string
{
return 'Dit is een test plugin.';
}
}
Each plugin that is registered, will be booted in the Skeletons' PluginServiceProvider.
Settings in plugins
Commonly, you will need the user to configure some settings in order to use your plugin.
You can achieve this by adding 3 methods:
public function settingsUrl(): ?string
{
return 'test-plugin';
}
public function settingFields(): ?FieldCollection
{
return new FieldCollection(
Text::make(__('Test'), 'test')
->setMaxWidth('md')
->rules('required', 'min:3', 'max:60')
->hint('hier kun je een api key mee geven')
);
}
public function settingFieldsLayout(): ?FieldLayout
{
return (new FieldLayout())
->column('test')
}
public function storeSettings(array $data)
{
auth()->user()->tenant->setSetting($this->composerName(), 'test', $data['test']);
}
Prevent disabling
You can prevent users from deactivating your plugin by adding the following method:
/**
* This Plugin can not be deactivated by the user
*
* @return bool
*/
public function canBeDisabled(): bool
{
return false;
}
Hiding from index
You can hide your plugin from the index page by adding the following method:
public function isVisibleForUser(): bool
{
return false;
}
Plugin hooks
Every Qore extension (plugin/module) will have the following hooks that you can override:
/**
* Boot is called on every request (while this extension is enabled)
* You might want to register resources here for example
*/
public function boot()
{
}
/**
* Optional: if this extension gets enabled
* For example, you might run a permission seeder here
*/
public function onEnable(): void
{
}
/**
* Optional: if this extension gets disabled
* For example, you might remove permissions here
*/
public function onDisable(): void
{
}
Helper methods
Back-end
You can get all plugins:
plugins()
You may retrieve a specific plugin:
plugin('qore/test')
Check if a plugin is active:
plugin_is_active('qore/test')
Front-end
You can retrieve all plugins in Vue templates
this.$plugins
You may retrieve a specific plugin:
this.$plugin('qore/test')
Check if a plugin is active:
this.$isPluginActive('qore/test')
For example:
<IssueTracker v-if="$isPluginActive('qore/test')"/>