-
Notifications
You must be signed in to change notification settings - Fork 29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add docs on extending configuration #96
Draft
dennisameling
wants to merge
3
commits into
main
Choose a base branch
from
extending-configuration
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,177 @@ | ||
Configuration | ||
############# | ||
|
||
For basic information about configuring your Plugin, see :ref:`Config file`. This document goes into more detail by explaining how to add User-configurable options to Mautic. | ||
|
||
Configuration parameters | ||
************************ | ||
************************ | ||
|
||
You can find Mautic's configuration in ``app/config/local.php``. Plugins can leverage custom config parameters to use within its code. | ||
|
||
You can define every configuration option you need. Make sure it has a default set in the :ref:`Plugin's config file<Config file>`. | ||
This prevents Symfony from throwing errors if the parameter gets used during cache compilation or if accessed directly from the container without checking if it exists first. | ||
Defining the parameters in the Plugin's config file ensures that it always exists. | ||
|
||
To add config options to the Configuration section, you need to add an :ref:`Event Listener<Event listeners>`, a config :ref:`form type<Forms>`, and a specific view (TODO). | ||
|
||
.. note:: To translate the Plugin's tab in the configuration Form, be sure to include ``mautic.config.tab.helloworld_config`` in the Plugin's messages.ini file. Replace helloworld_config with whatever you use as the ``formAlias`` when registering the Form in the event subscriber. You can find more on this below. | ||
|
||
.. vale off | ||
|
||
Config Event Subscriber | ||
======================= | ||
|
||
.. vale on | ||
|
||
The event subscriber should listen to the ``ConfigEvents::CONFIG_ON_GENERATE`` and ``ConfigEvents::CONFIG_PRE_SAVE`` events. | ||
|
||
The ``ConfigEvents::CONFIG_ON_GENERATE`` is dispatched when the configuration form is built giving the plugin an opportunity to inject it's own tab and config options. | ||
|
||
To do this, the Plugin must register it's configuration details through the method assigned to the ``ConfigEvents::CONFIG_ON_GENERATE`` event. | ||
The ``\Mautic\ConfigBundle\Event\ConfigBuilderEvent`` object gets passed into the method and expects the method to call ``addForm()``. ``addForm()`` expects an array with the following elements: | ||
|
||
.. list-table:: | ||
:header-rows: 1 | ||
|
||
* - Key | ||
- Description | ||
* - ``formAlias`` | ||
- Alias of the Form type class that sets the expected Form elements | ||
* - ``formTheme`` | ||
- View to format the configuration Form elements, i.e, ``HelloWorldBundle:FormTheme\Config`` | ||
* - ``parameters`` | ||
- Array of custom config elements. ``$event->getParametersFromConfig('HelloWorldBundle')))`` can be used to glean them from the plugin's config file. | ||
|
||
|
||
The ``ConfigEvents::CONFIG_PRE_SAVE`` is called before the values from the form are rendered and saved to the ``local.php`` file. | ||
This gives the Plugin an opportunity to clean up or manipulate the data before it's written. | ||
|
||
Remember that you must register the subscriber through the Plugin's config in the ``services[events]`` :ref:`section<Service config items>`. | ||
|
||
.. code-block:: php | ||
|
||
<?php | ||
// plugins/HelloWorldBundle/EventListener/ConfigSubscriber.php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MauticPlugin\HelloWorldBundle\EventListener; | ||
|
||
use Mautic\ConfigBundle\Event\ConfigEvent; | ||
use Mautic\ConfigBundle\ConfigEvents; | ||
use Mautic\ConfigBundle\Event\ConfigBuilderEvent; | ||
use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||
|
||
class ConfigSubscriber implements EventSubscriberInterface | ||
{ | ||
static public function getSubscribedEvents() | ||
{ | ||
return [ | ||
ConfigEvents::CONFIG_ON_GENERATE => ['onConfigGenerate', 0], | ||
ConfigEvents::CONFIG_PRE_SAVE => ['onConfigSave', 0] | ||
]; | ||
} | ||
|
||
public function onConfigGenerate(ConfigBuilderEvent $event) | ||
{ | ||
$event->addForm( | ||
[ | ||
'formAlias' => 'helloworld_config', | ||
'formTheme' => 'HelloWorldBundle:FormTheme\Config', | ||
'parameters' => $event->getParametersFromConfig('HelloWorldBundle') | ||
] | ||
); | ||
} | ||
|
||
public function onConfigSave(ConfigEvent $event) | ||
{ | ||
$values = $event->getConfig(); | ||
|
||
// Manipulate the values | ||
if (!empty($values['helloworld_config']['custom_config_option'])) { | ||
$values['helloworld_config']['custom_config_option'] = htmlspecialchars($values['helloworld_config']['custom_config_option']); | ||
} | ||
|
||
// Set updated values | ||
$event->setConfig($values); | ||
} | ||
} | ||
|
||
.. vale off | ||
|
||
Config Form | ||
=========== | ||
|
||
.. vale on | ||
|
||
.. code-block:: php | ||
|
||
<?php | ||
// plugins/HelloWorldBundle/Form/Type/ConfigType.php | ||
|
||
declare(strict_types=1); | ||
|
||
namespace MauticPlugin\HelloWorldBundle\Form\Type; | ||
|
||
use Symfony\Component\Form\AbstractType; | ||
use Symfony\Component\Form\FormBuilderInterface; | ||
|
||
class ConfigType extends AbstractType | ||
{ | ||
public function buildForm(FormBuilderInterface $builder, array $options) | ||
{ | ||
$builder->add( | ||
'custom_config_option', | ||
'text', | ||
[ | ||
'label' => 'plugin.helloworld.config.custom_config_option', | ||
'data' => $options['data']['custom_config_option'], | ||
'attr' => [ | ||
'tooltip' => 'plugin.helloworld.config.custom_config_option_tooltip' | ||
] | ||
] | ||
); | ||
} | ||
|
||
public function getName() | ||
{ | ||
return 'helloworld_config'; | ||
} | ||
} | ||
|
||
The Form type gets used to generate the Form Fields in the main configuration Form. Refer to :ref:`Forms` for more information on using Form types. | ||
|
||
Remember that you must register the Form type through the Plugin's config in the ``services[forms]`` :ref:`section<Service config items>`. | ||
|
||
.. vale off | ||
|
||
Config Template | ||
=============== | ||
|
||
.. vale on | ||
|
||
.. code-block:: php | ||
|
||
<?php | ||
// plugins/HelloWorldBundle/Views/FormTheme/Config/_config_helloworld_config_widget.html.php | ||
?> | ||
|
||
<div class="panel panel-primary"> | ||
<div class="panel-heading"> | ||
<h3 class="panel-title"><?php echo $view['translator']->trans('mautic.config.tab.helloworld_config'); ?></h3> | ||
</div> | ||
<div class="panel-body"> | ||
<?php foreach ($form->children as $f): ?> | ||
<div class="row"> | ||
<div class="col-md-6"> | ||
<?php echo $view['form']->row($f); ?> | ||
</div> | ||
</div> | ||
<?php endforeach; ?> | ||
</div> | ||
</div> | ||
|
||
Registering a ``formTheme`` as ``HelloWorldBundle:FormTheme\Config`` in the event listener told the ConfigBundle to look in the HelloWorldBundle's Views/FormTheme/Config folder for templates. | ||
Specifically, it will look for a template named ``_config_{formAlias}_widget.html.php`` where ``{formAlias}`` is the same as ``formAlias`` set in the plugin's ``ConfigEvents::CONFIG_ON_GENERATE`` event listener. | ||
|
||
The template should be in a panel format to match the rest of the config UI. |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like we don't have the docs on MVC in the new docs yet: https://developer.mautic.org/#mvc
Have just created a separate issue for that: #99
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK great - so we are just pending the MVC section for now with this part.