N°6041 - Introduce new \iFieldRendererMapping interface to register mapping between Field / FormRenderer (console, bootstrap, ...) / FieldRenderer

This commit is contained in:
Molkobain
2023-03-09 10:30:17 +01:00
parent 59586ad001
commit 7d01030d7c
2 changed files with 41 additions and 0 deletions

View File

@@ -1643,6 +1643,32 @@ abstract class AbstractPortalUIExtension implements iPortalUIExtension
}
}
/**
* Implement this interface to register a new field renderer mapping to either:
* - Add the rendering of a new attribute type
* - Overload the default rendering of an attribute type
*
* @since 3.1.0 N°6041
*/
interface iFieldRendererMappingsExtension
{
/**
* @return array {string, string, string} List of field renderer mapping: FQCN field class, FQCN Form Renderer class, FQCN Field Renderer class
*
* Example:
*
* ```php
* [
* ['FQCN\FieldA', 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'FQCN\FieldRendererA'],
* ['FQCN\FieldB', 'Combodo\iTop\Renderer\Console\ConsoleFormRenderer', 'FQCN\FieldRendererB'],
* ['FQCN\FieldA', 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'FQCN\FieldRendererA'],
* ['FQCN\FieldB', 'Combodo\iTop\Renderer\Bootstrap\BsFormRenderer', 'FQCN\FieldRendererB'],
* ]
* ```
*/
public static function RegisterSupportedFields(): array;
}
/**
* Implement this interface to add new operations to the REST/JSON web service
*

View File

@@ -23,6 +23,8 @@ namespace Combodo\iTop\Renderer;
use Exception;
use Combodo\iTop\Form\Form;
use Combodo\iTop\Form\Field\Field;
use iFieldRendererMappingsExtension;
use utils;
/**
* Description of FormRenderer
@@ -52,8 +54,21 @@ abstract class FormRenderer
{
$this->oForm = $oForm;
}
$this->aSupportedFields = [];
$this->sBaseLayout = '';
$this->InitOutputs();
/** @var \iFieldRendererMappingsExtension $sImplementingClass */
foreach (utils::GetClassesForInterface(iFieldRendererMappingsExtension::class, '', ['[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]']) as $sImplementingClass) {
$aFieldRendererMappings = $sImplementingClass::RegisterSupportedFields();
foreach ($aFieldRendererMappings as list($sFieldClass, $sFormRendererClass, $sFieldRendererClass)) {
if ($sFormRendererClass !== static::class) {
continue;
}
$this->AddSupportedField($sFieldClass, $sFieldRendererClass);
}
}
}
/**