Extending Modules¶
It may become necessary to extend the functionality of a module which is installed as a standalone package. To achieve this, you can hook into to the events emitted and add the desired functionality.
You can add these event listeners directly in your app/AppCms.php
or extract them into their
own classes if applicable.
Adding form fields¶
Here is an example of adding an additional colour field to the products module from the shop package.
<?php declare(strict_types = 1);
namespace App;
use Dms\Common\Structure\Field;
use Dms\Core\Cms;
use Dms\Core\CmsDefinition;
use Dms\Core\Common\Crud\Definition\Form\CrudFormDefinition;
use Dms\Package\Analytics\AnalyticsPackage;
use Dms\Package\Shop\Cms\ShopPackage;
use Dms\Package\Shop\Domain\Entities\Product\Product;
use Dms\Web\Laravel\Auth\AdminPackage;
use Dms\Web\Laravel\Document\PublicFilePackage;
/**
* The application's cms.
*
* @author Elliot Levin <elliotlevin@hotmail.com>
*/
class AppCms extends Cms
{
/**
* Defines the structure and installed packages of the cms.
*
* @param CmsDefinition $cms
*
* @return void
*/
protected function define(CmsDefinition $cms)
{
$cms->packages([
'admin' => AdminPackage::class,
'documents' => PublicFilePackage::class,
'analytics' => AnalyticsPackage::class,
'shop' => ShopPackage::class,
]);
\Event::listen('dms::shop.products.defined-form', function (CrudFormDefinition $form) {
// Add your form fields here
$form->continueSection([
$form->field(
Field::create('colour', 'Colour')->string()->required()
)->bindToCallbacks(
function (Product $product) {
return $product->metadata['colour'] ?? null;
},
function (Product $product, string $value) {
$product->metadata['colour'] = $value;
}
),
]);
});
}
}
Adding actions¶
Here is an example of adding a custom action to the product module.
<?php declare(strict_types = 1);
namespace App;
use Dms\Common\Structure\Field;
use Dms\Core\Cms;
use Dms\Core\CmsDefinition;
use Dms\Core\Common\Crud\Definition\CrudModuleDefinition;
use Dms\Package\Analytics\AnalyticsPackage;
use Dms\Package\Shop\Cms\ShopPackage;
use Dms\Web\Laravel\Auth\AdminPackage;
use Dms\Web\Laravel\Document\PublicFilePackage;
/**
* The application's cms.
*
* @author Elliot Levin <elliotlevin@hotmail.com>
*/
class AppCms extends Cms
{
/**
* Defines the structure and installed packages of the cms.
*
* @param CmsDefinition $cms
*
* @return void
*/
protected function define(CmsDefinition $cms)
{
$cms->packages([
'admin' => AdminPackage::class,
'documents' => PublicFilePackage::class,
'analytics' => AnalyticsPackage::class,
'shop' => ShopPackage::class,
]);
\Event::listen('dms::shop.products.define', function (CrudModuleDefinition $module) {
// Add your custom action here
$module->action('custom-action')
->handler(function (array $input) {
// ...
});
});
}
}