Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 2418921

Browse files
committedDec 17, 2024··
N°8031 - Make all portal bricks use custom templates for all templates
1 parent afd96a0 commit 2418921

14 files changed

+228
-85
lines changed
 

‎datamodels/2.x/itop-portal-base/portal/src/Brick/AbstractBrick.php

+22-14
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ abstract class AbstractBrick
6565
const DEFAULT_ALLOWED_PROFILES_OQL = '';
6666
/** @var string DEFAULT_DENIED_PROFILES_OQL */
6767
const DEFAULT_DENIED_PROFILES_OQL = '';
68+
/** @var array $DEFAULT_TEMPLATES_PATH */
69+
protected static $DEFAULT_TEMPLATES_PATH = [
70+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
71+
];
6872

6973
/** @var string $sId */
7074
protected $sId;
@@ -112,7 +116,7 @@ public function __construct()
112116
$this->bActive = static::DEFAULT_ACTIVE;
113117
$this->bVisible = static::DEFAULT_VISIBLE;
114118
$this->fRank = static::DEFAULT_RANK;
115-
$this->sPageTemplatePath = static::DEFAULT_PAGE_TEMPLATE_PATH;
119+
$this->sPageTemplatePath = static::$DEFAULT_TEMPLATES_PATH['page'];
116120
$this->sTitle = static::DEFAULT_TITLE;
117121
$this->sDescription = static::DEFAULT_DESCRIPTION;
118122
$this->sDataLoading = static::DEFAULT_DATA_LOADING;
@@ -572,6 +576,20 @@ public function HasDescription()
572576
return ($this->sDescription !== null && $this->sDescription !== '');
573577
}
574578

579+
/**
580+
* @param $sTemplateName
581+
* @param $sTemplatePath
582+
*
583+
* @return void
584+
* @since 3.2.1
585+
*/
586+
public static function SetDefaultTemplatePath($sTemplateName, $sTemplatePath)
587+
{
588+
if(array_key_exists($sTemplateName, static::$DEFAULT_TEMPLATES_PATH)) {
589+
static::$DEFAULT_TEMPLATES_PATH[$sTemplateName] = $sTemplatePath;
590+
}
591+
}
592+
575593
/**
576594
* Load the brick's data from the xml passed as a ModuleDesignElement.
577595
* This is used to set all the brick attributes at once.
@@ -665,14 +683,13 @@ public function LoadFromXml(DesignElement $oMDElement)
665683
* @param $aPortalProperties
666684
*
667685
* @return void
668-
* @throws \DOMFormatException
669686
* @since 3.2.1
670687
*/
671-
public function LoadFromPortalProperties($aPortalProperties)
688+
public static function LoadFromPortalProperties($aPortalProperties)
672689
{
673690
// Get the bricks templates
674691
$aBricksTemplates = $aPortalProperties['templates']['bricks'];
675-
$sClassFQCN = get_class($this);
692+
$sClassFQCN = static::class;
676693

677694
// Get the current brick templates
678695
$aCurrentBricksTemplates = array_key_exists($sClassFQCN, $aBricksTemplates) ? $aBricksTemplates[$sClassFQCN] : [];
@@ -681,16 +698,7 @@ public function LoadFromPortalProperties($aPortalProperties)
681698
$sTemplateId = str_ireplace($sClassFQCN.':', '', $sTemplateKey);
682699

683700
// Call the set method for the template
684-
$sSetTemplateMethodName = 'Set'.$sTemplateId.'TemplatePath';
685-
686-
if(method_exists($this, $sSetTemplateMethodName)) {
687-
$this->{$sSetTemplateMethodName}($sTemplate);
688-
}
689-
else {
690-
throw new DOMFormatException(
691-
'Template "'.$sTemplateId.'" is not a valid template for brick ' . $sClassFQCN,
692-
null, null);
693-
}
701+
static::SetDefaultTemplatePath($sTemplateId, $sTemplate);
694702
}
695703
}
696704
}

‎datamodels/2.x/itop-portal-base/portal/src/Brick/AggregatePageBrick.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ class AggregatePageBrick extends PortalBrick
3939
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-tachometer-alt';
4040
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-tachometer-alt fa-2x';
4141
const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/aggregate-page/layout.html.twig';
42-
42+
protected static $DEFAULT_TEMPLATES_PATH = [
43+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
44+
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
45+
];
4346
// Overloaded variables
4447
public static $sRouteName = 'p_aggregatepage_brick';
4548

‎datamodels/2.x/itop-portal-base/portal/src/Brick/BrickCollection.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class BrickCollection
6262
* @throws \Exception
6363
* @since 3.2.1 Added $aCombodoPortalInstanceConf parameter
6464
*/
65-
public function __construct(ModuleDesign $oModuleDesign, $aCombodoPortalInstanceConf)
65+
public function __construct(ModuleDesign $oModuleDesign, array $aCombodoPortalInstanceConf)
6666
{
6767
$this->oModuleDesign = $oModuleDesign;
6868
$this->aAllowedBricks = null;
@@ -202,11 +202,12 @@ private function GetRawBrickList()
202202
{
203203
if (class_exists($sBrickClass))
204204
{
205-
/** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */
206-
$oBrick = new $sBrickClass();
207205

208206
// Load the portal properties that are common to all bricks of this type
209-
$oBrick->LoadFromPortalProperties($this->aCombodoPortalInstanceConf['properties']);
207+
$sBrickClass::LoadFromPortalProperties($this->aCombodoPortalInstanceConf['properties']);
208+
209+
/** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */
210+
$oBrick = new $sBrickClass();
210211

211212
// Load the brick specific properties from its XML definition
212213
$oBrick->LoadFromXml($oBrickNode);

‎datamodels/2.x/itop-portal-base/portal/src/Brick/BrowseBrick.php

+8-1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,13 @@ class BrowseBrick extends PortalBrick
7777
const DEFAULT_ACTION_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL;
7878
/** @var int DEFAULT_LIST_LENGTH */
7979
const DEFAULT_LIST_LENGTH = 20;
80+
protected static $DEFAULT_TEMPLATES_PATH = [
81+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
82+
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
83+
'mode-list'=> 'itop-portal-base/portal/templates/bricks/browse/mode_list.html.twig',
84+
'mode-mosaic'=> 'itop-portal-base/portal/templates/bricks/browse/mode_mosaic.html.twig',
85+
'mode-tree'=> 'itop-portal-base/portal/templates/bricks/browse/mode_tree.html.twig',
86+
];
8087

8188
// Overloaded variables
8289
public static $sRouteName = 'p_browse_brick';
@@ -359,7 +366,7 @@ public function LoadFromXml(DesignElement $oMDElement)
359366
}
360367
else
361368
{
362-
$sTemplatePath = 'itop-portal-base/portal/templates/bricks/browse/mode_'.$sModeId.'.html.twig';
369+
$sTemplatePath = static::$DEFAULT_TEMPLATES_PATH['mode-'.$sModeId];
363370
}
364371
$aModeData['template'] = $sTemplatePath;
365372

‎datamodels/2.x/itop-portal-base/portal/src/Brick/CreateBrick.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ class CreateBrick extends PortalBrick
3636
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-plus';
3737
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-plus fa-2x';
3838
const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/create/modal.html.twig';
39-
39+
protected static $DEFAULT_TEMPLATES_PATH = [
40+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
41+
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
42+
];
4043
/** @var string DEFAULT_CLASS */
4144
const DEFAULT_CLASS = '';
4245

‎datamodels/2.x/itop-portal-base/portal/src/Brick/FilterBrick.php

+4-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ class FilterBrick extends PortalBrick
3737
const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/filter/tile.html.twig';
3838
const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-search';
3939
const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-search fa-2x';
40-
40+
protected static $DEFAULT_TEMPLATES_PATH = [
41+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
42+
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
43+
];
4144
/** @var string DEFAULT_TARGET_BRICK_CLASS */
4245
const DEFAULT_TARGET_BRICK_CLASS = 'Combodo\\iTop\\Portal\\Brick\\BrowseBrick';
4346
/** @var string DEFAULT_SEARCH_PLACEHOLDER_VALUE */

‎datamodels/2.x/itop-portal-base/portal/src/Brick/ManageBrick.php

+94-46
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ class ManageBrick extends PortalBrick
6363
const DEFAULT_DATA_LOADING = self::ENUM_DATA_LOADING_LAZY;
6464
const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig';
6565
const DEFAULT_TILE_CONTROLLER_ACTION = 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController::TileAction';
66+
const DEFAULT_LAYOUT_CHART_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_CHART;
67+
const DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE;
68+
const DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE;
69+
const DEFAULT_TILE_CHART_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig';
70+
const DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig';
71+
const DEFAULT_TILE_BADGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig';
72+
const DEFAULT_TILE_DEFAULT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig';
73+
const DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig';
6674

6775
/** @var string DEFAULT_OQL */
6876
const DEFAULT_OQL = '';
@@ -83,6 +91,19 @@ class ManageBrick extends PortalBrick
8391
/** @var bool DEFAULT_GROUP_SHOW_OTHERS */
8492
const DEFAULT_GROUP_SHOW_OTHERS = true;
8593

94+
protected static $DEFAULT_TEMPLATES_PATH = [
95+
'page' => self::DEFAULT_PAGE_TEMPLATE_PATH,
96+
'tile' => self::DEFAULT_TILE_TEMPLATE_PATH,
97+
'layout-chart' => self::DEFAULT_LAYOUT_CHART_TEMPLATE_PATH,
98+
'layout-table' => self::DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH,
99+
'layout-badge' => self::DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH,
100+
'tile-chart' => self::DEFAULT_TILE_CHART_TEMPLATE_PATH,
101+
'tile-top-list' => self::DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH,
102+
'tile-badge' => self::DEFAULT_TILE_BADGE_TEMPLATE_PATH,
103+
'tile-default' => self::DEFAULT_TILE_DEFAULT_TEMPLATE_PATH,
104+
'popup-export-excel' => self::DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH,
105+
];
106+
86107
/** @var array $aDisplayModes */
87108
static $aDisplayModes = array(
88109
self::ENUM_DISPLAY_MODE_LIST,
@@ -97,44 +118,13 @@ class ManageBrick extends PortalBrick
97118
self::ENUM_TILE_MODE_BAR,
98119
self::ENUM_TILE_MODE_TOP,
99120
);
121+
/** Initialized in its getter as we need DEFAULT_TEMPLATE static values to be accessible */
122+
/** @var array $aDefaultPresentationData */
123+
private static $aDefaultPresentationData = [];
124+
125+
/** Specific data for the current brick, including brick definition overloads */
100126
/** @var array $aPresentationData */
101-
public static $aPresentationData = array(
102-
self::ENUM_TILE_MODE_BADGE => array(
103-
'decorationCssClass' => 'fas fa-id-card fa-2x',
104-
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig',
105-
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
106-
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
107-
'need_details' => true,
108-
),
109-
self::ENUM_TILE_MODE_TOP => array(
110-
'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x',
111-
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig',
112-
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
113-
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
114-
'need_details' => true,
115-
),
116-
self::ENUM_TILE_MODE_PIE => array(
117-
'decorationCssClass' => 'fas fa-chart-pie fa-2x',
118-
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig',
119-
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART,
120-
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE,
121-
'need_details' => false,
122-
),
123-
self::ENUM_TILE_MODE_BAR => array(
124-
'decorationCssClass' => 'fas fa-chart-bar fa-2x',
125-
'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig',
126-
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART,
127-
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR,
128-
'need_details' => false,
129-
),
130-
self::ENUM_TILE_MODE_TEXT => array(
131-
'decorationCssClass' => 'fas fa-pen-square fa-2x',
132-
'tileTemplate' => self::DEFAULT_TILE_TEMPLATE_PATH,
133-
'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE,
134-
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
135-
'need_details' => true,
136-
),
137-
);
127+
public $aPresentationData = [];
138128

139129
// Overloaded variables
140130
public static $sRouteName = 'p_manage_brick';
@@ -163,6 +153,8 @@ class ManageBrick extends PortalBrick
163153
protected $bGroupShowOthers;
164154
/** @var int $iDefaultListLength */
165155
protected $iDefaultListLength;
156+
/** @var string $sPopupExportExcelTemplatePath */
157+
protected $sPopupExportExcelTemplatePath;
166158

167159
/**
168160
* Returns true if the $sDisplayMode need objects details for rendering.
@@ -174,7 +166,7 @@ class ManageBrick extends PortalBrick
174166
static public function AreDetailsNeededForDisplayMode($sDisplayMode)
175167
{
176168
$bNeedDetails = false;
177-
foreach (static::$aPresentationData as $aData)
169+
foreach (static::GetDefaultPresentationData() as $aData)
178170
{
179171
if ($aData['layoutDisplayMode'] === $sDisplayMode)
180172
{
@@ -195,8 +187,8 @@ static public function AreDetailsNeededForDisplayMode($sDisplayMode)
195187
*/
196188
static public function GetPageTemplateFromDisplayMode($sDisplayMode)
197189
{
198-
$sTemplate = static::DEFAULT_PAGE_TEMPLATE_PATH;
199-
foreach (static::$aPresentationData as $aData)
190+
$sTemplate = static::$DEFAULT_TEMPLATES_PATH['page'];
191+
foreach (static::GetDefaultPresentationData() as $aData)
200192
{
201193
if ($aData['layoutDisplayMode'] === $sDisplayMode)
202194
{
@@ -227,6 +219,7 @@ public function __construct()
227219
$this->iGroupLimit = static::DEFAULT_GROUP_LIMIT;
228220
$this->bGroupShowOthers = static::DEFAULT_GROUP_SHOW_OTHERS;
229221
$this->iDefaultListLength = static::DEFAULT_LIST_LENGTH;
222+
$this->sPopupExportExcelTemplatePath = static::$DEFAULT_TEMPLATES_PATH['popup-export-excel'];
230223

231224
// This is hardcoded for now, we might allow area grouping on another attribute in the future
232225
$this->AddGrouping('areas', array('attribute' => 'finalclass'));
@@ -328,7 +321,7 @@ public function GetTileMode()
328321

329322
public function GetDecorationCssClass()
330323
{
331-
return static::$aPresentationData[$this->sTileMode]['decorationCssClass'];
324+
return static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass'];
332325
}
333326
/**
334327
* Sets the tile mode (display)
@@ -344,19 +337,65 @@ public function SetTileMode($sTileMode)
344337
return $this;
345338
}
346339

340+
public static function GetDefaultPresentationData()
341+
{
342+
/** If the table isn't initialized yet, do it now */
343+
if (count(static::$aDefaultPresentationData) === 0) {
344+
static::$aDefaultPresentationData = array(
345+
self::ENUM_TILE_MODE_BADGE => array(
346+
'decorationCssClass' => 'fas fa-id-card fa-2x',
347+
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-badge'],
348+
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
349+
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
350+
'need_details' => true,
351+
),
352+
self::ENUM_TILE_MODE_TOP => array(
353+
'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x',
354+
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-top-list'],
355+
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
356+
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
357+
'need_details' => true,
358+
),
359+
self::ENUM_TILE_MODE_PIE => array(
360+
'decorationCssClass' => 'fas fa-chart-pie fa-2x',
361+
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'],
362+
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'],
363+
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE,
364+
'need_details' => false,
365+
),
366+
self::ENUM_TILE_MODE_BAR => array(
367+
'decorationCssClass' => 'fas fa-chart-bar fa-2x',
368+
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'],
369+
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'],
370+
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR,
371+
'need_details' => false,
372+
),
373+
self::ENUM_TILE_MODE_TEXT => array(
374+
'decorationCssClass' => 'fas fa-pen-square fa-2x',
375+
'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-default'],
376+
'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'],
377+
'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST,
378+
'need_details' => true,
379+
),
380+
);
381+
}
382+
383+
return static::$aDefaultPresentationData;
384+
}
385+
347386
/**
348387
* @param string $sTileMode
349388
*
350389
* @return string[] parameters for specified type, default parameters if type is invalid
351390
*/
352391
public function GetPresentationDataForTileMode($sTileMode)
353392
{
354-
if (isset(static::$aPresentationData[$sTileMode]))
393+
if (isset(static::GetDefaultPresentationData()[$sTileMode]))
355394
{
356-
return static::$aPresentationData[$sTileMode];
395+
return static::GetDefaultPresentationData()[$sTileMode];
357396
}
358397

359-
return static::$aPresentationData[static::DEFAULT_TILE_MODE];
398+
return static::GetDefaultPresentationData()[static::DEFAULT_TILE_MODE];
360399
}
361400

362401
/**
@@ -467,6 +506,15 @@ public function SetDefaultListLength($iDefaultListLength) {
467506
return $this;
468507
}
469508

509+
public function GetPopupExportExcelTemplatePath() {
510+
return $this->sPopupExportExcelTemplatePath;
511+
}
512+
513+
public function SetPopupExportExcelTemplatePath($sPopupExportExcelTemplatePath) {
514+
$this->sPopupExportExcelTemplatePath = $sPopupExportExcelTemplatePath;
515+
return $this;
516+
}
517+
470518
/**
471519
* Adds a grouping.
472520
*
@@ -965,10 +1013,10 @@ public function LoadFromXml(DesignElement $oMDElement)
9651013

9661014
// Checking the navigation icon
9671015
$sDecorationClassNavigationMenu = $this->GetDecorationClassNavigationMenu();
968-
if (empty($sDecorationClassNavigationMenu) && isset(static::$aPresentationData[$this->sTileMode]))
1016+
if (empty($sDecorationClassNavigationMenu) && isset(static::GetDefaultPresentationData()[$this->sTileMode]))
9691017
{
9701018
/** @var string $sDecorationClassNavigationMenu */
971-
$sDecorationClassNavigationMenu = static::$aPresentationData[$this->sTileMode]['decorationCssClass'];
1019+
$sDecorationClassNavigationMenu = static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass'];
9721020
if (!empty($sDecorationClassNavigationMenu))
9731021
{
9741022
$this->SetDecorationClassNavigationMenu($sDecorationClassNavigationMenu);

0 commit comments

Comments
 (0)
Please sign in to comment.