Enhance Service locator

This commit is contained in:
Eric Espie
2026-01-27 11:54:05 +01:00
parent 390b5c0bc3
commit bfa7a209d6
43 changed files with 338 additions and 210 deletions

View File

@@ -20,13 +20,14 @@ use Combodo\iTop\Application\WebPage\DownloadPage;
use Combodo\iTop\Application\WebPage\JsonPage;
use Combodo\iTop\Forms\Block\FormBlockService;
use Combodo\iTop\PropertyType\Serializer\XMLSerializer;
use Combodo\iTop\Service\DependencyInjection\ServiceLocator;
use Combodo\iTop\Service\ServiceLocator\ServiceLocator;
use DBObjectSearch;
use DBObjectSet;
use Dict;
use DOMException;
use Exception;
use IssueLog;
use MetaModel;
use ModelReflectionRuntime;
use RuntimeDashboard;
use SecurityException;
@@ -37,6 +38,14 @@ class DashboardController extends Controller
{
public const ROUTE_NAMESPACE = 'dashboard';
private FormBlockService $oFormBlockService;
public function __construct($sViewPath = '', $sModuleName = 'core', $aAdditionalPaths = [], array $aThemes = ['application/forms/itop_console_layout.html.twig', 'application/forms/wip_form_demonstrator.html.twig'])
{
parent::__construct($sViewPath, $sModuleName, $aAdditionalPaths, $aThemes);
$this->oFormBlockService = MetaModel::GetService('FormBlockService');
}
public function OperationGetDashlet()
{
// TODO 3.3 Do we want to use a readparam here or SF internal mechanism ?
@@ -54,8 +63,6 @@ class DashboardController extends Controller
$oDashlet = DashletFactory::GetInstance()->CreateDashlet($sDashletClass, $sDashletId);
// TODO 3.3 This is not the place to register this service, do better please
ServiceLocator::GetInstance()->RegisterService('ModelReflection', new ModelReflectionRuntime());
if (!empty($aValues)) {
$oDashlet->FromModelData($aValues);
} else {
@@ -103,7 +110,7 @@ class DashboardController extends Controller
try {
// Get the form block from the service (and the compiler)
$oRequest = $this->getRequest();
$oFormBlock = FormBlockService::GetInstance()->GetFormBlockById('DashboardGrid', 'Dashboard');
$oFormBlock = $this->oFormBlockService->GetFormBlockById('DashboardGrid', 'Dashboard');
$oBuilder = $this->GetFormBuilder($oFormBlock, $aViewData);
$oForm = $oBuilder->getForm();
$oForm->handleRequest($oRequest);
@@ -127,8 +134,7 @@ class DashboardController extends Controller
$aFormErrors = $oForm->getErrors(true, true);
$sMessage = $aFormErrors->__toString();
}
}
catch (Exception $e) {
} catch (Exception $e) {
IssueLog::Exception($e->getMessage(), $e);
$sStatus = 'error';
$sMessage = $e->getMessage();
@@ -205,11 +211,9 @@ class DashboardController extends Controller
$oDoc = utils::ReadPostedDocument('dashboard_upload_file');
$oDashboard->FromXml($oDoc->GetData());
$oDashboard->PersistDashboard($oDoc->GetData());
}
catch (DOMException $e) {
} catch (DOMException $e) {
$aResult = ['error' => Dict::S('UI:Error:InvalidDashboardFile')];
}
catch (Exception $e) {
} catch (Exception $e) {
$aResult = ['error' => $e->getMessage()];
}
} else {

View File

@@ -664,7 +664,9 @@ JS
*/
protected function GetAvailableDashlets(): array
{
return DashletService::GetInstance()->GetAvailableDashlets();
/** @var DashletService $oDashletService */
$oDashletService = MetaModel::GetService('DashletService');
return $oDashletService->GetAvailableDashlets();
}
/**

View File

@@ -6,13 +6,22 @@ use Combodo\iTop\Forms\Block\Base\ChoiceFormBlock;
use Combodo\iTop\Forms\Block\Base\FormBlock;
use Combodo\iTop\Forms\Block\Base\IntegerFormBlock;
use Combodo\iTop\PropertyType\PropertyTypeService;
use MetaModel;
class DashletFormBlock extends FormBlock
{
private PropertyTypeService $oPropertyTypeService;
public function __construct(string $sName, array $aOptions = [])
{
parent::__construct($sName, $aOptions);
$this->oPropertyTypeService = MetaModel::GetService('PropertyTypeService');
}
protected function BuildForm(): void
{
// type
$aPropertyTypes = PropertyTypeService::GetInstance()->ListPropertyTypesByType('Dashlet');
$aPropertyTypes = $this->oPropertyTypeService->ListPropertyTypesByType('Dashlet');
$this->Add('class', ChoiceFormBlock::class, [
'label' => 'Class',
'choices' => array_combine($aPropertyTypes, $aPropertyTypes),

View File

@@ -6,11 +6,19 @@ use Combodo\iTop\Forms\Block\Base\FormBlock;
use Combodo\iTop\Forms\IO\Format\StringIOFormat;
use Combodo\iTop\Forms\Register\IORegister;
use Combodo\iTop\PropertyType\PropertyTypeService;
use MetaModel;
class DashletPropertiesFormBlock extends FormBlock
{
// inputs
public const INPUT_DASHLET_TYPE = 'dashlet_type';
private PropertyTypeService $oPropertyTypeService;
public function __construct(string $sName, array $aOptions = [])
{
parent::__construct($sName, $aOptions);
$this->oPropertyTypeService = MetaModel::GetService('PropertyTypeService');
}
protected function RegisterIO(IORegister $oIORegister): void
{
@@ -21,7 +29,7 @@ class DashletPropertiesFormBlock extends FormBlock
public function GetFormType(): string
{
$sDashletType = strval($this->GetInputValue(self::INPUT_DASHLET_TYPE));
$oDashlet = PropertyTypeService::GetInstance()->GetFormBlockById($sDashletType, 'Dashlet');
$oDashlet = $this->oPropertyTypeService->GetFormBlockById($sDashletType, 'Dashlet');
return $oDashlet->GetFormType();
}
@@ -29,7 +37,7 @@ class DashletPropertiesFormBlock extends FormBlock
public function GetOptions(): array
{
$sDashletType = strval($this->GetInputValue(self::INPUT_DASHLET_TYPE));
$oDashlet = PropertyTypeService::GetInstance()->GetFormBlockById($sDashletType, 'Dashlet');
$oDashlet = $this->oPropertyTypeService->GetFormBlockById($sDashletType, 'Dashlet');
return $oDashlet->GetOptions();
}

View File

@@ -10,11 +10,14 @@ namespace Combodo\iTop\Application\Dashboard\Layout;
use Combodo\iTop\Application\Dashlet\Service\DashletService;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardGrid;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use MetaModel;
class DashboardLayoutGrid extends \DashboardLayout
{
public function Render($oPage, $aDashlets, $bEditMode = false, array $aExtraParams = [])
{
/** @var DashletService $oDashletService */
$oDashletService = MetaModel::GetService('DashletService');
$oDashboardLayout = new DashboardLayoutUIBlock($aExtraParams['dashboard_div_id']);
$oDashboardGrid = new DashboardGrid();
@@ -29,7 +32,7 @@ class DashboardLayoutGrid extends \DashboardLayout
$sDashletId = $oDashlet->GetID();
$sDashletClass = $oDashlet->GetDashletType();
$aDashletDenormalizedProperties = $oDashlet->GetModelData();
$aDashletsInfo = DashletService::GetInstance()->GetDashletDefinition($sDashletClass);
$aDashletsInfo = $oDashletService->GetDashletDefinition($sDashletClass);
// Also set minimal height/width
$iPositionX = $aPosDashlet['position_x'] ?? 0;

View File

@@ -13,7 +13,7 @@ use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\DependencyInjection\ServiceLocator;
use Combodo\iTop\Service\ServiceLocator\ServiceLocator;
/**
* Class RuntimeDashboard
@@ -35,7 +35,6 @@ class RuntimeDashboard extends Dashboard
parent::__construct($sId);
$this->oMetaModel = new ModelReflectionRuntime();
$this->oDashletFactory->SetModelReflectionRuntime($this->oMetaModel);
ServiceLocator::GetInstance()->RegisterService('ModelReflection', $this->oMetaModel);
$this->bCustomized = false;
}
@@ -686,6 +685,8 @@ JS
*/
public static function GetDashletCreationForm($sOQL = null)
{
/** @var DashletService $oDashletService */
$oDashletService = MetaModel::GetService('DashletService');
$oAppContext = new ApplicationContext();
$sContextMenuId = $oAppContext->GetCurrentValue('menu', null);
@@ -743,7 +744,7 @@ JS
// Get the list of possible dashlets that support a creation from
// an OQL
$aDashlets = DashletService::GetInstance()->GetAvailableDashlets('can_create_by_oql');
$aDashlets = $oDashletService->GetAvailableDashlets('can_create_by_oql');
$oSelectorField = new DesignerFormSelectorField('dashlet_class', Dict::S('UI:DashletCreation:DashletType'), '');
$oForm->AddField($oSelectorField);