Custom Fields¶
If you need a field in your backend that is not provided out of the box you can implement a custom field renderer in your app which will override how a field is displayed.
app/Cms/Modules/YourModule.php¶
<?php declare(strict_types = 1);
namespace App\Cms\Modules;
use Dms\Core\Auth\IAuthSystem;
use Dms\Core\Common\Crud\CrudModule;
use Dms\Core\Common\Crud\Definition\CrudModuleDefinition;
use Dms\Core\Common\Crud\Definition\Form\CrudFormDefinition;
use Dms\Core\Common\Crud\Definition\Table\SummaryTableDefinition;
use App\Domain\Entities\Entity;
use Dms\Common\Structure\Field;
/**
* The photograph module.
*/
class YourModule extends CrudModule
{
/**
* Defines the structure of this module.
*
* @param CrudModuleDefinition $module
*/
protected function defineCrudModule(CrudModuleDefinition $module)
{
$module->name('your-module');
$module->crudForm(function (CrudFormDefinition $form) {
$form->section('Details', [
$form->field(
Field::create('custom_field', 'Custom Field')->string()->required()
)->bindToProperty(Entity::PROPERTY),
//
]);
});
}
}
app/Cms/Custom/CustomFieldRenderer.php¶
<?php declare(strict_types=1);
namespace App\Cms\Custom;
use Dms\Core\Form\Field\Type\ArrayOfType;
use Dms\Core\Form\Field\Type\StringType;
use Dms\Core\Form\IField;
use Dms\Core\Form\IFieldType;
use Dms\Web\Laravel\Renderer\Form\Field\BladeFieldRenderer;
use Dms\Web\Laravel\Renderer\Form\FormRenderingContext;
/**
* @author Elliot Levin <elliotlevin@hotmail.com>
*/
class CustomFieldRenderer extends BladeFieldRenderer
{
/**
* Gets the expected class of the field type for the field.
*
* @return array
*/
public function getFieldTypeClasses(): array
{
return [StringType::class];
}
/**
* @param FormRenderingContext $renderingContext
* @param IField $field
* @param IFieldType $fieldType
*
* @return bool
*/
protected function canRender(FormRenderingContext $renderingContext, IField $field, IFieldType $fieldType): bool
{
return $renderingContext->getAction()->getPackageName() === 'your-package'
&& $renderingContext->getAction()->getModuleName() === 'your-module'
&& $field->getName() === 'custom_field';
}
/**
* @param FormRenderingContext $renderingContext
* @param IField $field
* @param IFieldType $fieldType
*
* @return string
*/
protected function renderField(FormRenderingContext $renderingContext, IField $field, IFieldType $fieldType): string
{
return view('dms.custom-fields.text', [
'field' => $field,
])->render();
}
/**
* @param FormRenderingContext $renderingContext
* @param IField $field
* @param mixed $value
* @param IFieldType $fieldType
*
* @return string
*/
protected function renderFieldValue(FormRenderingContext $renderingContext, IField $field, $value, IFieldType $fieldType): string
{
return view('dms.custom-fields.readonly-text', [
'field' => $field,
'value' => $value,
])->render();
}
}
config/dms.php¶
Register your custom form field renderer in config/dms.php
<?php
[
// ...
'services' => [
// ...
'renderers' => [
// ...
'form-fields' => [
// Add your class here
App\Cms\Custom\CustomFieldRenderer::class,
// ...
],
// ...
],
],
]
resources/views/dms/custom-fields/text.blade.php¶
Your custom field:
<input type="text" name="{{ $field->getName() }}" value="{{ $field->getInitialValue() }}" />
resources/views/dms/custom-fields/readonly-text.blade.php¶
Your custom value: {{ $value }}