diff --git a/application/applicationextension.inc.php b/application/applicationextension.inc.php index 68da0a5d0..0579a6bd0 100644 --- a/application/applicationextension.inc.php +++ b/application/applicationextension.inc.php @@ -1101,7 +1101,9 @@ class JSButtonItem extends JSPopupMenuItem * @api * @package Extensibility * @since 2.0 - * @deprecated since 3.0.0 use iPageUIBlockExtension instead + * @deprecated 3.0.0 If you need to include: + * * JS/CSS files/snippets, use {@see \iBackofficeLinkedScriptsExtension}, {@see \iBackofficeLinkedStylesheetsExtension}, etc instead + * * HTML (and optionally JS/CSS), use {@see \iPageUIBlockExtension} to manipulate {@see \Combodo\iTop\Application\UI\Base\UIBlock} instead */ interface iPageUIExtension { @@ -1252,6 +1254,119 @@ abstract class AbstractPageUIBlockExtension implements iPageUIBlockExtension } } +/** + * Implement this interface to add script (JS) files to the backoffice pages + * + * @see \iTopWebPage::$a_linked_scripts + * @api + * @since 3.0.0 + */ +interface iBackofficeLinkedScriptsExtension +{ + /** + * @see \iTopWebPage::$a_linked_scripts Each script will be included using this property + * @return array An array of absolute URLs to the files to include + */ + public function GetLinkedScriptsAbsUrls(): array; +} + +/** + * Implement this interface to add inline script (JS) to the backoffice pages' head. + * Will be executed first, BEFORE the DOM interpretation. + * + * @see \iTopWebPage::$a_early_scripts + * @api + * @since 3.0.0 + */ +interface iBackofficeEarlyScriptExtension +{ + /** + * @see \iTopWebPage::$a_early_scripts + * @return string + */ + public function GetEarlyScript(): string; +} + +/** + * Implement this interface to add inline script (JS) to the backoffice pages that will be executed immediately, without waiting for the DOM to be ready. + * + * @see \iTopWebPage::$a_scripts + * @api + * @since 3.0.0 + */ +interface iBackofficeScriptExtension +{ + /** + * @see \iTopWebPage::$a_scripts + * @return string + */ + public function GetScript(): string; +} + +/** + * Implement this interface to add inline script (JS) to the backoffice pages that will be executed right when the DOM is ready. + * + * @see \iTopWebPage::$a_init_scripts + * @api + * @since 3.0.0 + */ +interface iBackofficeInitScriptExtension +{ + /** + * @see \iTopWebPage::$a_init_scripts + * @return string + */ + public function GetInitScript(): string; +} + +/** + * Implement this interface to add inline script (JS) to the backoffice pages that will be executed slightly AFTER the DOM is ready (just after the init. scripts). + * + * @see \iTopWebPage::$a_ready_scripts + * @api + * @since 3.0.0 + */ +interface iBackofficeReadyScriptExtension +{ + /** + * @see \iTopWebPage::$a_ready_scripts + * @return string + */ + public function GetReadyScript(): string; +} + +/** + * Implement this interface to add stylesheets (CSS) to the backoffice pages + * + * @see \iTopWebPage::$a_linked_stylesheets + * @api + * @since 3.0.0 + */ +interface iBackofficeLinkedStylesheetsExtension +{ + /** + * @see \iTopWebPage::$a_linked_stylesheets + * @return array An array of absolute URLs to the files to include + */ + public function GetLinkedStylesheetsAbsUrls(): array; +} + +/** + * Implement this interface to add inline style (CSS) to the backoffice pages' head. + * + * @see \iTopWebPage::$a_styles + * @api + * @since 3.0.0 + */ +interface iBackofficeStyleExtension +{ + /** + * @see \iTopWebPage::$a_styles + * @return string + */ + public function GetStyle(): string; +} + /** * Implement this interface to add content to any enhanced portal page * diff --git a/sources/application/WebPage/iTopWebPage.php b/sources/application/WebPage/iTopWebPage.php index 318af9c42..1430101ce 100644 --- a/sources/application/WebPage/iTopWebPage.php +++ b/sources/application/WebPage/iTopWebPage.php @@ -802,6 +802,45 @@ HTML; $oPrintHeader = null; // Prepare internal parts (js files, css files, js snippets, css snippets, ...) + // - API: External script files + /** @var \iBackofficeLinkedScriptsExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeLinkedScriptsExtension') as $oExtensionInstance) { + foreach ($oExtensionInstance->GetLinkedScriptsAbsUrls() as $sScriptUrl) { + $this->add_linked_script($sScriptUrl); + } + } + // - API: Early inline scripts + /** @var \iBackofficeEarlyScriptExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeEarlyScriptExtension') as $oExtensionInstance) { + $this->add_early_script($oExtensionInstance->GetEarlyScript()); + } + // - API: Inline scripts + /** @var \iBackofficeScriptExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeScriptExtension') as $oExtensionInstance) { + $this->add_early_script($oExtensionInstance->GetScript()); + } + // - API: Init. scripts + /** @var \iBackofficeInitScriptExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeInitScriptExtension') as $oExtensionInstance) { + $this->add_init_script($oExtensionInstance->GetInitScript()); + } + // - API: Ready scripts + /** @var \iBackofficeReadyScriptExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeReadyScriptExtension') as $oExtensionInstance) { + $this->add_ready_script($oExtensionInstance->GetReadyScript()); + } + // - API: External stylesheet files + /** @var \iBackofficeLinkedStylesheetsExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeLinkedStylesheetsExtension') as $oExtensionInstance) { + foreach ($oExtensionInstance->GetLinkedStylesheetsAbsUrls() as $sStylesheetUrl) { + $this->add_linked_stylesheet($sStylesheetUrl); + } + } + // - API: Inline style + /** @var \iBackofficeStyleExtension $oExtensionInstance */ + foreach (MetaModel::EnumPlugins('iBackofficeStyleExtension') as $oExtensionInstance) { + $this->add_style($oExtensionInstance->GetStyle()); + } // - Generate necessary dict. files if ($this->bAddJSDict) { $this->output_dict_entries();