diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/AbstractBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/AbstractBrick.php index 03561dec5..8c1bfdd7d 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/AbstractBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/AbstractBrick.php @@ -65,6 +65,10 @@ abstract class AbstractBrick const DEFAULT_ALLOWED_PROFILES_OQL = ''; /** @var string DEFAULT_DENIED_PROFILES_OQL */ const DEFAULT_DENIED_PROFILES_OQL = ''; + /** @var array $DEFAULT_TEMPLATES_PATH */ + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + ]; /** @var string $sId */ protected $sId; @@ -112,7 +116,7 @@ abstract class AbstractBrick $this->bActive = static::DEFAULT_ACTIVE; $this->bVisible = static::DEFAULT_VISIBLE; $this->fRank = static::DEFAULT_RANK; - $this->sPageTemplatePath = static::DEFAULT_PAGE_TEMPLATE_PATH; + $this->sPageTemplatePath = static::$DEFAULT_TEMPLATES_PATH['page']; $this->sTitle = static::DEFAULT_TITLE; $this->sDescription = static::DEFAULT_DESCRIPTION; $this->sDataLoading = static::DEFAULT_DATA_LOADING; @@ -572,6 +576,20 @@ abstract class AbstractBrick return ($this->sDescription !== null && $this->sDescription !== ''); } + /** + * @param $sTemplateId + * @param $sTemplatePath + * + * @return void + * @since 3.2.1 + */ + public static function SetDefaultTemplatePath($sTemplateId, $sTemplatePath) + { + if(array_key_exists($sTemplateId, static::$DEFAULT_TEMPLATES_PATH)) { + static::$DEFAULT_TEMPLATES_PATH[$sTemplateId] = $sTemplatePath; + } + } + /** * Load the brick's data from the xml passed as a ModuleDesignElement. * This is used to set all the brick attributes at once. @@ -665,14 +683,13 @@ abstract class AbstractBrick * @param $aPortalProperties * * @return void - * @throws \DOMFormatException * @since 3.2.1 */ - public function LoadFromPortalProperties($aPortalProperties) + public static function LoadClassDefinitionFromPortalProperties($aPortalProperties) { // Get the bricks templates $aBricksTemplates = $aPortalProperties['templates']['bricks']; - $sClassFQCN = get_class($this); + $sClassFQCN = static::class; // Get the current brick templates $aCurrentBricksTemplates = array_key_exists($sClassFQCN, $aBricksTemplates) ? $aBricksTemplates[$sClassFQCN] : []; @@ -681,16 +698,7 @@ abstract class AbstractBrick $sTemplateId = str_ireplace($sClassFQCN.':', '', $sTemplateKey); // Call the set method for the template - $sSetTemplateMethodName = 'Set'.$sTemplateId.'TemplatePath'; - - if(method_exists($this, $sSetTemplateMethodName)) { - $this->{$sSetTemplateMethodName}($sTemplate); - } - else { - throw new DOMFormatException( - 'Template "'.$sTemplateId.'" is not a valid template for brick ' . $sClassFQCN, - null, null); - } + static::SetDefaultTemplatePath($sTemplateId, $sTemplate); } } } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/AggregatePageBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/AggregatePageBrick.php index 76b2bfd4a..4a0d09215 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/AggregatePageBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/AggregatePageBrick.php @@ -39,7 +39,10 @@ class AggregatePageBrick extends PortalBrick const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-tachometer-alt'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-tachometer-alt fa-2x'; const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/aggregate-page/layout.html.twig'; - + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + ]; // Overloaded variables public static $sRouteName = 'p_aggregatepage_brick'; diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/BrickCollection.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/BrickCollection.php index 5552fdeb4..571325a16 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/BrickCollection.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/BrickCollection.php @@ -62,7 +62,7 @@ class BrickCollection * @throws \Exception * @since 3.2.1 Added $aCombodoPortalInstanceConf parameter */ - public function __construct(ModuleDesign $oModuleDesign, $aCombodoPortalInstanceConf) + public function __construct(ModuleDesign $oModuleDesign, array $aCombodoPortalInstanceConf) { $this->oModuleDesign = $oModuleDesign; $this->aAllowedBricks = null; @@ -202,11 +202,12 @@ class BrickCollection { if (class_exists($sBrickClass)) { - /** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */ - $oBrick = new $sBrickClass(); // Load the portal properties that are common to all bricks of this type - $oBrick->LoadFromPortalProperties($this->aCombodoPortalInstanceConf['properties']); + $sBrickClass::LoadClassDefinitionFromPortalProperties($this->aCombodoPortalInstanceConf['properties']); + + /** @var \Combodo\iTop\Portal\Brick\PortalBrick $oBrick */ + $oBrick = new $sBrickClass(); // Load the brick specific properties from its XML definition $oBrick->LoadFromXml($oBrickNode); diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/BrowseBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/BrowseBrick.php index edf6ea0ac..138ffa015 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/BrowseBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/BrowseBrick.php @@ -32,6 +32,13 @@ use Combodo\iTop\DesignElement; */ class BrowseBrick extends PortalBrick { + /** @var string DEFAULT_PAGE_TEMPLATE_PATH */ + const DEFAULT_MODE_LIST_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_list.html.twig'; + /** @var string DEFAULT_MODE_MOSAIC_TEMPLATE_PATH */ + const DEFAULT_MODE_MOSAIC_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_mosaic.html.twig'; + /** @var string DEFAULT_MODE_TREE_TEMPLATE_PATH */ + const DEFAULT_MODE_TREE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/browse/mode_tree.html.twig'; + /** @var string ENUM_BROWSE_MODE_LIST */ const ENUM_BROWSE_MODE_LIST = 'list'; /** @var string ENUM_BROWSE_MODE_TREE */ @@ -77,6 +84,13 @@ class BrowseBrick extends PortalBrick const DEFAULT_ACTION_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL; /** @var int DEFAULT_LIST_LENGTH */ const DEFAULT_LIST_LENGTH = 20; + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + 'mode-list'=> self::DEFAULT_MODE_LIST_TEMPLATE_PATH, + 'mode-mosaic'=> self::DEFAULT_MODE_MOSAIC_TEMPLATE_PATH, + 'mode-tree'=> self::DEFAULT_MODE_TREE_TEMPLATE_PATH, + ]; // Overloaded variables public static $sRouteName = 'p_browse_brick'; @@ -359,7 +373,7 @@ class BrowseBrick extends PortalBrick } else { - $sTemplatePath = 'itop-portal-base/portal/templates/bricks/browse/mode_'.$sModeId.'.html.twig'; + $sTemplatePath = static::$DEFAULT_TEMPLATES_PATH['mode-'.$sModeId]; } $aModeData['template'] = $sTemplatePath; diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/CreateBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/CreateBrick.php index 83f351d2f..edbf8baf7 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/CreateBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/CreateBrick.php @@ -36,7 +36,10 @@ class CreateBrick extends PortalBrick const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-plus'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-plus fa-2x'; const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/create/modal.html.twig'; - + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + ]; /** @var string DEFAULT_CLASS */ const DEFAULT_CLASS = ''; diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/FilterBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/FilterBrick.php index 6f44922c8..6ce86067c 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/FilterBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/FilterBrick.php @@ -37,7 +37,10 @@ class FilterBrick extends PortalBrick const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/filter/tile.html.twig'; const DEFAULT_DECORATION_CLASS_HOME = 'fas fa-search'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'fas fa-search fa-2x'; - + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + ]; /** @var string DEFAULT_TARGET_BRICK_CLASS */ const DEFAULT_TARGET_BRICK_CLASS = 'Combodo\\iTop\\Portal\\Brick\\BrowseBrick'; /** @var string DEFAULT_SEARCH_PLACEHOLDER_VALUE */ diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/ManageBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/ManageBrick.php index dd59eba85..4026cf5a9 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/ManageBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/ManageBrick.php @@ -63,6 +63,14 @@ class ManageBrick extends PortalBrick const DEFAULT_DATA_LOADING = self::ENUM_DATA_LOADING_LAZY; const DEFAULT_TILE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig'; const DEFAULT_TILE_CONTROLLER_ACTION = 'Combodo\\iTop\\Portal\\Controller\\ManageBrickController::TileAction'; + const DEFAULT_LAYOUT_CHART_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_CHART; + const DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE; + const DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH = self::ENUM_PAGE_TEMPLATE_PATH_TABLE; + const DEFAULT_TILE_CHART_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig'; + const DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig'; + const DEFAULT_TILE_BADGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig'; + const DEFAULT_TILE_DEFAULT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/tile-default.html.twig'; + const DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig'; /** @var string DEFAULT_OQL */ const DEFAULT_OQL = ''; @@ -83,6 +91,19 @@ class ManageBrick extends PortalBrick /** @var bool DEFAULT_GROUP_SHOW_OTHERS */ const DEFAULT_GROUP_SHOW_OTHERS = true; + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + 'layout-chart' => self::DEFAULT_LAYOUT_CHART_TEMPLATE_PATH, + 'layout-table' => self::DEFAULT_LAYOUT_TABLE_TEMPLATE_PATH, + 'layout-badge' => self::DEFAULT_LAYOUT_BADGE_TEMPLATE_PATH, + 'tile-chart' => self::DEFAULT_TILE_CHART_TEMPLATE_PATH, + 'tile-top-list' => self::DEFAULT_TILE_TOP_LIST_TEMPLATE_PATH, + 'tile-badge' => self::DEFAULT_TILE_BADGE_TEMPLATE_PATH, + 'tile-default' => self::DEFAULT_TILE_DEFAULT_TEMPLATE_PATH, + 'popup-export-excel' => self::DEFAULT_POPUP_EXPORT_EXCEL_TEMPLATE_PATH, + ]; + /** @var array $aDisplayModes */ static $aDisplayModes = array( self::ENUM_DISPLAY_MODE_LIST, @@ -97,44 +118,13 @@ class ManageBrick extends PortalBrick self::ENUM_TILE_MODE_BAR, self::ENUM_TILE_MODE_TOP, ); + /** Initialized in its getter as we need DEFAULT_TEMPLATE static values to be accessible */ + /** @var array $aDefaultPresentationData */ + private static $aDefaultPresentationData = []; + + /** Specific data for the current brick, including brick definition overloads */ /** @var array $aPresentationData */ - public static $aPresentationData = array( - self::ENUM_TILE_MODE_BADGE => array( - 'decorationCssClass' => 'fas fa-id-card fa-2x', - 'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-badge.html.twig', - 'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE, - 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, - 'need_details' => true, - ), - self::ENUM_TILE_MODE_TOP => array( - 'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x', - 'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-top-list.html.twig', - 'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE, - 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, - 'need_details' => true, - ), - self::ENUM_TILE_MODE_PIE => array( - 'decorationCssClass' => 'fas fa-chart-pie fa-2x', - 'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig', - 'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART, - 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE, - 'need_details' => false, - ), - self::ENUM_TILE_MODE_BAR => array( - 'decorationCssClass' => 'fas fa-chart-bar fa-2x', - 'tileTemplate' => 'itop-portal-base/portal/templates/bricks/manage/tile-chart.html.twig', - 'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_CHART, - 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR, - 'need_details' => false, - ), - self::ENUM_TILE_MODE_TEXT => array( - 'decorationCssClass' => 'fas fa-pen-square fa-2x', - 'tileTemplate' => self::DEFAULT_TILE_TEMPLATE_PATH, - 'layoutTemplate' => self::ENUM_PAGE_TEMPLATE_PATH_TABLE, - 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, - 'need_details' => true, - ), - ); + public $aPresentationData = []; // Overloaded variables public static $sRouteName = 'p_manage_brick'; @@ -163,6 +153,8 @@ class ManageBrick extends PortalBrick protected $bGroupShowOthers; /** @var int $iDefaultListLength */ protected $iDefaultListLength; + /** @var string $sPopupExportExcelTemplatePath */ + protected $sPopupExportExcelTemplatePath; /** * Returns true if the $sDisplayMode need objects details for rendering. @@ -174,7 +166,7 @@ class ManageBrick extends PortalBrick static public function AreDetailsNeededForDisplayMode($sDisplayMode) { $bNeedDetails = false; - foreach (static::$aPresentationData as $aData) + foreach (static::GetDefaultPresentationData() as $aData) { if ($aData['layoutDisplayMode'] === $sDisplayMode) { @@ -195,8 +187,8 @@ class ManageBrick extends PortalBrick */ static public function GetPageTemplateFromDisplayMode($sDisplayMode) { - $sTemplate = static::DEFAULT_PAGE_TEMPLATE_PATH; - foreach (static::$aPresentationData as $aData) + $sTemplate = static::$DEFAULT_TEMPLATES_PATH['page']; + foreach (static::GetDefaultPresentationData() as $aData) { if ($aData['layoutDisplayMode'] === $sDisplayMode) { @@ -227,6 +219,7 @@ class ManageBrick extends PortalBrick $this->iGroupLimit = static::DEFAULT_GROUP_LIMIT; $this->bGroupShowOthers = static::DEFAULT_GROUP_SHOW_OTHERS; $this->iDefaultListLength = static::DEFAULT_LIST_LENGTH; + $this->sPopupExportExcelTemplatePath = static::$DEFAULT_TEMPLATES_PATH['popup-export-excel']; // This is hardcoded for now, we might allow area grouping on another attribute in the future $this->AddGrouping('areas', array('attribute' => 'finalclass')); @@ -328,7 +321,7 @@ class ManageBrick extends PortalBrick public function GetDecorationCssClass() { - return static::$aPresentationData[$this->sTileMode]['decorationCssClass']; + return static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass']; } /** * Sets the tile mode (display) @@ -344,6 +337,52 @@ class ManageBrick extends PortalBrick return $this; } + public static function GetDefaultPresentationData() + { + /** If the table isn't initialized yet, do it now */ + if (count(static::$aDefaultPresentationData) === 0) { + static::$aDefaultPresentationData = array( + self::ENUM_TILE_MODE_BADGE => array( + 'decorationCssClass' => 'fas fa-id-card fa-2x', + 'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-badge'], + 'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'], + 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, + 'need_details' => true, + ), + self::ENUM_TILE_MODE_TOP => array( + 'decorationCssClass' => 'fas fa-signal fa-rotate-270 fa-2x', + 'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-top-list'], + 'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'], + 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, + 'need_details' => true, + ), + self::ENUM_TILE_MODE_PIE => array( + 'decorationCssClass' => 'fas fa-chart-pie fa-2x', + 'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'], + 'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'], + 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_PIE, + 'need_details' => false, + ), + self::ENUM_TILE_MODE_BAR => array( + 'decorationCssClass' => 'fas fa-chart-bar fa-2x', + 'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-chart'], + 'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-chart'], + 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_BAR, + 'need_details' => false, + ), + self::ENUM_TILE_MODE_TEXT => array( + 'decorationCssClass' => 'fas fa-pen-square fa-2x', + 'tileTemplate' => static::$DEFAULT_TEMPLATES_PATH['tile-default'], + 'layoutTemplate' => static::$DEFAULT_TEMPLATES_PATH['layout-table'], + 'layoutDisplayMode' => self::ENUM_DISPLAY_MODE_LIST, + 'need_details' => true, + ), + ); + } + + return static::$aDefaultPresentationData; + } + /** * @param string $sTileMode * @@ -351,12 +390,12 @@ class ManageBrick extends PortalBrick */ public function GetPresentationDataForTileMode($sTileMode) { - if (isset(static::$aPresentationData[$sTileMode])) + if (isset(static::GetDefaultPresentationData()[$sTileMode])) { - return static::$aPresentationData[$sTileMode]; + return static::GetDefaultPresentationData()[$sTileMode]; } - return static::$aPresentationData[static::DEFAULT_TILE_MODE]; + return static::GetDefaultPresentationData()[static::DEFAULT_TILE_MODE]; } /** @@ -467,6 +506,15 @@ class ManageBrick extends PortalBrick return $this; } + public function GetPopupExportExcelTemplatePath() { + return $this->sPopupExportExcelTemplatePath; + } + + public function SetPopupExportExcelTemplatePath($sPopupExportExcelTemplatePath) { + $this->sPopupExportExcelTemplatePath = $sPopupExportExcelTemplatePath; + return $this; + } + /** * Adds a grouping. * @@ -965,10 +1013,10 @@ class ManageBrick extends PortalBrick // Checking the navigation icon $sDecorationClassNavigationMenu = $this->GetDecorationClassNavigationMenu(); - if (empty($sDecorationClassNavigationMenu) && isset(static::$aPresentationData[$this->sTileMode])) + if (empty($sDecorationClassNavigationMenu) && isset(static::GetDefaultPresentationData()[$this->sTileMode])) { /** @var string $sDecorationClassNavigationMenu */ - $sDecorationClassNavigationMenu = static::$aPresentationData[$this->sTileMode]['decorationCssClass']; + $sDecorationClassNavigationMenu = static::GetDefaultPresentationData()[$this->sTileMode]['decorationCssClass']; if (!empty($sDecorationClassNavigationMenu)) { $this->SetDecorationClassNavigationMenu($sDecorationClassNavigationMenu); diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/ObjectBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/ObjectBrick.php new file mode 100644 index 000000000..0ae08055d --- /dev/null +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/ObjectBrick.php @@ -0,0 +1,59 @@ + + */ +abstract class ObjectBrick extends AbstractBrick +{ + /** @var string DEFAULT_PAGE_TEMPLATE_PATH */ + const DEFAULT_PAGE_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/object/layout.html.twig'; + /** @var string DEFAULT_MODAL_TEMPLATE_PATH */ + const DEFAULT_MODAL_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/object/modal.html.twig'; + /** @var string DEFAULT_MODE_LOADER_TEMPLATE_PATH */ + const DEFAULT_MODE_LOADER_TEMPLATE_PATH = 'itop-portal-base/portal/templates/modal/mode_loader.html.twig'; + + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'modal' => self::DEFAULT_MODAL_TEMPLATE_PATH, + 'mode_loader' => self::DEFAULT_MODE_LOADER_TEMPLATE_PATH, + ]; + + /** + * @param $aCombodoPortalInstanceConf + * + * @return void + */ + public static function InitializeSelf($aCombodoPortalInstanceConf): void + { + static::LoadClassDefinitionFromPortalProperties($aCombodoPortalInstanceConf['properties']); + } + + /** + * @return string + */ + public static function GetPageDefaultTemplatePath(): string + { + return static::$DEFAULT_TEMPLATES_PATH['page']; + } + + /** + * @return string + */ + public static function GetModalDefaultTemplatePath(): string + { + return static::$DEFAULT_TEMPLATES_PATH['modal']; + } + + /** + * @return string + */ + public static function GetModeLoaderDefaultTemplatePath(): string + { + return static::$DEFAULT_TEMPLATES_PATH['mode_loader']; + } +} \ No newline at end of file diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/PortalBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/PortalBrick.php index e4f8b5f90..2630b8bef 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/PortalBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/PortalBrick.php @@ -63,6 +63,11 @@ abstract class PortalBrick extends AbstractBrick /** @var string DEFAULT_OPENING_TARGET */ const DEFAULT_OPENING_TARGET = self::ENUM_OPENING_TARGET_MODAL; + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + ]; + /** @var string|null $sRouteName */ static $sRouteName = null; /** @var array $aOpeningTargets */ @@ -121,7 +126,7 @@ abstract class PortalBrick extends AbstractBrick $this->bVisibleNavigationMenu = static::DEFAULT_VISIBLE_NAVIGATION_MENU; $this->sDecorationClassHome = static::DEFAULT_DECORATION_CLASS_HOME; $this->sDecorationClassNavigationMenu = static::DEFAULT_DECORATION_CLASS_NAVIGATION_MENU; - $this->sTileTemplatePath = static::DEFAULT_TILE_TEMPLATE_PATH; + $this->sTileTemplatePath = static::$DEFAULT_TEMPLATES_PATH['tile']; $this->sTileControllerAction = static::DEFAULT_TILE_CONTROLLER_ACTION; $this->sOpeningTarget = static::DEFAULT_OPENING_TARGET; } diff --git a/datamodels/2.x/itop-portal-base/portal/src/Brick/UserProfileBrick.php b/datamodels/2.x/itop-portal-base/portal/src/Brick/UserProfileBrick.php index 6b4fdb691..351f779f0 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Brick/UserProfileBrick.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Brick/UserProfileBrick.php @@ -39,7 +39,10 @@ class UserProfileBrick extends PortalBrick const DEFAUT_TITLE = 'Brick:Portal:UserProfile:Title'; const DEFAULT_DECORATION_CLASS_HOME = 'glyphicon glyphicon-user'; const DEFAULT_DECORATION_CLASS_NAVIGATION_MENU = 'glyphicon glyphicon-user'; - + protected static $DEFAULT_TEMPLATES_PATH = [ + 'page' => self::DEFAULT_PAGE_TEMPLATE_PATH, + 'tile' => self::DEFAULT_TILE_TEMPLATE_PATH, + ]; /** @var bool DEFAULT_SHOW_PICTURE_FORM */ const DEFAULT_SHOW_PICTURE_FORM = true; /** @var bool DEFAULT_SHOW_PREFERENCES_FORM */ diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php index c5f8e8157..fef217c6b 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/ManageBrickController.php @@ -70,7 +70,9 @@ use utils; */ class ManageBrickController extends BrickController { - /** @var string EXCEL_EXPORT_TEMPLATE_PATH */ + /** @var string EXCEL_EXPORT_TEMPLATE_PATH + * @deprecated since 3.2.1 + */ const EXCEL_EXPORT_TEMPLATE_PATH = 'itop-portal-base/portal/templates/bricks/manage/popup-export-excel.html.twig'; /** @@ -281,7 +283,7 @@ class ManageBrickController extends BrickController 'sWikiUrl' => 'https://www.itophub.io/wiki/page?id='.utils::GetItopVersionWikiSyntax().'%3Auser%3Alists#excel_export', ); - return $this->render(static::EXCEL_EXPORT_TEMPLATE_PATH, $aData); + return $this->render($oBrick->GetPopupExportExcelTemplatePath(), $aData); } /** diff --git a/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php b/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php index 84c300cd9..e430e62ae 100644 --- a/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php +++ b/datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php @@ -29,6 +29,7 @@ use BinaryExpression; use Combodo\iTop\Form\Field\DateTimeField; use Combodo\iTop\Portal\Brick\BrickCollection; use Combodo\iTop\Portal\Brick\CreateBrick; +use Combodo\iTop\Portal\Brick\ObjectBrick; use Combodo\iTop\Portal\Helper\ApplicationHelper; use Combodo\iTop\Portal\Helper\ContextManipulatorHelper; use Combodo\iTop\Portal\Helper\NavigationRuleHelper; @@ -82,8 +83,11 @@ class ObjectController extends BrickController * @param \Combodo\iTop\Portal\Brick\BrickCollection $oBrickCollection * @param \Combodo\iTop\Portal\Helper\ObjectFormHandlerHelper $oObjectFormHandlerHelper * @param \Combodo\iTop\Portal\Helper\NavigationRuleHelper $oNavigationRuleHelper + * @param \Combodo\iTop\Portal\Helper\ContextManipulatorHelper $oContextManipulatorHelper + * @param array $aCombodoPortalInstanceConf * * @since 3.2.0 N°6933 + * @since 3.2.1 Added $aCombodoPortalInstanceConf parameter */ public function __construct( protected SecurityHelper $oSecurityHelper, @@ -93,10 +97,11 @@ class ObjectController extends BrickController protected BrickCollection $oBrickCollection, protected ObjectFormHandlerHelper $oObjectFormHandlerHelper, protected NavigationRuleHelper $oNavigationRuleHelper, - protected ContextManipulatorHelper $oContextManipulatorHelper - + protected ContextManipulatorHelper $oContextManipulatorHelper, + protected array $aCombodoPortalInstanceConf ) { + ObjectBrick::InitializeSelf($this->aCombodoPortalInstanceConf); } /** @@ -232,7 +237,7 @@ class ObjectController extends BrickController if ($oRequest->isXmlHttpRequest()) { // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. if (empty($sOperation)) { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData); } else { $oResponse = new JsonResponse($aData); } @@ -246,7 +251,7 @@ class ObjectController extends BrickController } } $aData['sPageTitle'] = $aData['form']['title']; - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData); } return $oResponse; @@ -307,7 +312,7 @@ class ObjectController extends BrickController // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. if (empty($sOperation)) { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData); } else { @@ -327,7 +332,7 @@ class ObjectController extends BrickController } } $aData['sPageTitle'] = $aData['form']['title']; - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData); } return $oResponse; @@ -534,11 +539,11 @@ class ObjectController extends BrickController // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. if (empty($sOperation)) { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData); } elseif ($sOperation === 'redirect') { - $oResponse = $this->render('itop-portal-base/portal/templates/modal/mode_loader.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModeLoaderDefaultTemplatePath(), $aData); } else { @@ -547,7 +552,7 @@ class ObjectController extends BrickController } else { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData); } return $oResponse; @@ -1011,12 +1016,12 @@ class ObjectController extends BrickController if ($oRequest->isXmlHttpRequest()) { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData); } else { //throw new HttpException(Response::HTTP_NOT_FOUND, Dict::S('UI:ObjectDoesNotExist')); - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData); } } else @@ -1597,7 +1602,7 @@ class ObjectController extends BrickController // We have to check whether the 'operation' parameter is defined or not in order to know if the form is required via ajax (to be displayed as a modal dialog) or if it's a lifecycle call from a existing form. if (empty($sOperation)) { - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/modal.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetModalDefaultTemplatePath(), $aData); } else { @@ -1617,7 +1622,7 @@ class ObjectController extends BrickController } } $aData['sPageTitle'] = $aData['form']['title']; - $oResponse = $this->render('itop-portal-base/portal/templates/bricks/object/layout.html.twig', $aData); + $oResponse = $this->render(ObjectBrick::GetPageDefaultTemplatePath(), $aData); } return $oResponse; diff --git a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php index 127eefa4a..cb0f48185 100644 --- a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php +++ b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_classmap.php @@ -14,6 +14,7 @@ return array( 'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => $baseDir . '/src/Brick/CreateBrick.php', 'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => $baseDir . '/src/Brick/FilterBrick.php', 'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => $baseDir . '/src/Brick/ManageBrick.php', + 'Combodo\\iTop\\Portal\\Brick\\ObjectBrick' => $baseDir . '/src/Brick/ObjectBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => $baseDir . '/src/Brick/PortalBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => $baseDir . '/src/Brick/PropertyNotFoundException.php', 'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => $baseDir . '/src/Brick/UserProfileBrick.php', diff --git a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php index b9c0d723d..400b5cc84 100644 --- a/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php +++ b/datamodels/2.x/itop-portal-base/portal/vendor/composer/autoload_static.php @@ -34,6 +34,7 @@ class ComposerStaticInitdf408f3f8ea034d298269cdf7647358b 'Combodo\\iTop\\Portal\\Brick\\CreateBrick' => __DIR__ . '/../..' . '/src/Brick/CreateBrick.php', 'Combodo\\iTop\\Portal\\Brick\\FilterBrick' => __DIR__ . '/../..' . '/src/Brick/FilterBrick.php', 'Combodo\\iTop\\Portal\\Brick\\ManageBrick' => __DIR__ . '/../..' . '/src/Brick/ManageBrick.php', + 'Combodo\\iTop\\Portal\\Brick\\ObjectBrick' => __DIR__ . '/../..' . '/src/Brick/ObjectBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PortalBrick' => __DIR__ . '/../..' . '/src/Brick/PortalBrick.php', 'Combodo\\iTop\\Portal\\Brick\\PropertyNotFoundException' => __DIR__ . '/../..' . '/src/Brick/PropertyNotFoundException.php', 'Combodo\\iTop\\Portal\\Brick\\UserProfileBrick' => __DIR__ . '/../..' . '/src/Brick/UserProfileBrick.php',