Merge branch 'support/3.2' into develop

This commit is contained in:
odain
2025-11-07 20:33:14 +01:00
1837 changed files with 33034 additions and 34549 deletions

View File

@@ -1,4 +1,5 @@
<?php
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -25,7 +26,7 @@ class AjaxPage extends WebPage implements iTabbedPage
*/
protected $m_oTabs;
const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/ajaxpage/layout';
public const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/ajaxpage/layout';
/** @var string */
private $sPromiseId;
@@ -41,7 +42,7 @@ class AjaxPage extends WebPage implements iTabbedPage
* @param string $s_title Not used
* @param bool $bOutputExtraResources if true will output also JS & CSS resources
*/
function __construct($s_title)
public function __construct($s_title)
{
$oKpi = new ExecutionKPI();
$sPrintable = utils::ReadParam('printable', '0');
@@ -288,7 +289,7 @@ class AjaxPage extends WebPage implements iTabbedPage
if (!empty($sCurrentTabContainer) && !empty($sCurrentTab)) {
$iOffset = $this->m_oTabs->GetCurrentTabLength();
return array('tc' => $sCurrentTabContainer, 'tab' => $sCurrentTab, 'offset' => $iOffset);
return ['tc' => $sCurrentTabContainer, 'tab' => $sCurrentTab, 'offset' => $iOffset];
} else {
return parent::start_capture();
}
@@ -335,6 +336,6 @@ class AjaxPage extends WebPage implements iTabbedPage
*/
public static function FilterXSS($sHTML)
{
return str_ireplace(array('<script', '</script>'), array('<!-- <removed-script', '</removed-script> -->'), $sHTML);
return str_ireplace(['<script', '</script>'], ['<!-- <removed-script', '</removed-script> -->'], $sHTML);
}
}

View File

@@ -1,4 +1,5 @@
<?php
/**
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -8,7 +9,7 @@ namespace Combodo\iTop\Application\WebPage;
class CLILikeWebPage extends WebPage
{
const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/clilikewebpage/layout';
public const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/clilikewebpage/layout';
public function add_comment($sText)
{
$this->add('#'.$sText."<br/>\n");

View File

@@ -1,9 +1,10 @@
<?php
// Copyright (C) 2010-2024 Combodo SAS
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
@@ -22,33 +23,32 @@ use DBSearch;
use ExecutionKPI;
/**
* CLI page
* CLI page
* The page adds the content-type text/XML and the encoding into the headers
*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CLIPage implements Page
{
/** @var string */
public $s_title;
function __construct($s_title)
{
$this->s_title = $s_title;
}
public function __construct($s_title)
{
$this->s_title = $s_title;
}
public function output()
{
if (class_exists('DBSearch')) {
DBSearch::RecordQueryTrace();
}
if (class_exists('ExecutionKPI')) {
ExecutionKPI::ReportStats();
}
}
public function output()
{
if (class_exists('DBSearch')) {
DBSearch::RecordQueryTrace();
}
if (class_exists('ExecutionKPI')) {
ExecutionKPI::ReportStats();
}
}
public function add($sText)
{
@@ -70,27 +70,21 @@ class CLIPage implements Page
echo "#".$sText."\n";
}
public function table($aConfig, $aData, $aParams = array())
public function table($aConfig, $aData, $aParams = [])
{
$aCells = array();
foreach($aConfig as $sName=>$aDef)
{
if (strlen($aDef['description']) > 0)
{
$aCells = [];
foreach ($aConfig as $sName => $aDef) {
if (strlen($aDef['description']) > 0) {
$aCells[] = $aDef['label'].' ('.$aDef['description'].')';
}
else
{
} else {
$aCells[] = $aDef['label'];
}
}
echo implode(';', $aCells)."\n";
foreach($aData as $aRow)
{
$aCells = array();
foreach($aConfig as $sName=>$aAttribs)
{
foreach ($aData as $aRow) {
$aCells = [];
foreach ($aConfig as $sName => $aAttribs) {
$sValue = $aRow["$sName"];
$aCells[] = $sValue;
}

View File

@@ -1,9 +1,10 @@
<?php
// Copyright (C) 2010-2024 Combodo SAS
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
@@ -29,40 +30,39 @@ use ExecutionKPI;
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CSVPage extends WebPage
{
function __construct($s_title)
{
$oKpi = new ExecutionKPI();
parent::__construct($s_title);
$this->add_header("Content-type: text/plain; charset=".self::PAGES_CHARSET);
$this->no_cache();
$this->add_http_headers();
//$this->add_header("Content-Transfer-Encoding: binary");
$oKpi->ComputeStats(get_class($this).' creation', 'CSVPage');
}
public function __construct($s_title)
{
$oKpi = new ExecutionKPI();
parent::__construct($s_title);
$this->add_header("Content-type: text/plain; charset=".self::PAGES_CHARSET);
$this->no_cache();
$this->add_http_headers();
//$this->add_header("Content-Transfer-Encoding: binary");
$oKpi->ComputeStats(get_class($this).' creation', 'CSVPage');
}
public function output()
{
$this->add_header("Content-Length: ".strlen(trim($this->s_content)));
public function output()
{
$this->add_header("Content-Length: ".strlen(trim($this->s_content)));
// Get the unexpected output but do nothing with it
$sTrash = $this->ob_get_clean_safe();
// Get the unexpected output but do nothing with it
$sTrash = $this->ob_get_clean_safe();
$oKpi = new ExecutionKPI();
foreach ($this->a_headers as $s_header) {
header($s_header);
}
echo trim($this->s_content);
echo "\n";
$oKpi->ComputeAndReport('Echoing ('.round(strlen($this->s_content) / 1024).' Kb)');
$oKpi = new ExecutionKPI();
foreach ($this->a_headers as $s_header) {
header($s_header);
}
echo trim($this->s_content);
echo "\n";
$oKpi->ComputeAndReport('Echoing ('.round(strlen($this->s_content) / 1024).' Kb)');
if (class_exists('DBSearch')) {
DBSearch::RecordQueryTrace();
}
ExecutionKPI::ReportStats();
}
if (class_exists('DBSearch')) {
DBSearch::RecordQueryTrace();
}
ExecutionKPI::ReportStats();
}
public function small_p($sText)
{
@@ -81,29 +81,23 @@ class CSVPage extends WebPage
public function add_comment($sText)
{
$this->s_content .= "#".$sText."\n";
}
}
public function table($aConfig, $aData, $aParams = array())
public function table($aConfig, $aData, $aParams = [])
{
$aCells = array();
foreach($aConfig as $sName=>$aDef)
{
if (strlen($aDef['description']) > 0)
{
$aCells = [];
foreach ($aConfig as $sName => $aDef) {
if (strlen($aDef['description']) > 0) {
$aCells[] = $aDef['label'].' ('.$aDef['description'].')';
}
else
{
} else {
$aCells[] = $aDef['label'];
}
}
$this->s_content .= implode(';', $aCells)."\n";
foreach($aData as $aRow)
{
$aCells = array();
foreach($aConfig as $sName=>$aAttribs)
{
foreach ($aData as $aRow) {
$aCells = [];
foreach ($aConfig as $sName => $aAttribs) {
$sValue = $aRow["$sName"];
$aCells[] = $sValue;
}
@@ -111,4 +105,3 @@ class CSVPage extends WebPage
}
}
}

View File

@@ -1,9 +1,10 @@
<?php
// Copyright (C) 2024 Combodo SAS
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
@@ -30,10 +31,9 @@ use ExecutionKPI;
* @license http://opensource.org/licenses/AGPL-3.0
*/
class CaptureWebPage extends WebPage
{
function __construct()
public function __construct()
{
$oKpi = new ExecutionKPI();
parent::__construct('capture web page');
@@ -51,8 +51,7 @@ class CaptureWebPage extends WebPage
public function GetJS()
{
$sRet = implode("\n", $this->a_scripts);
if (!empty($this->s_deferred_content))
{
if (!empty($this->s_deferred_content)) {
$sRet .= "\n\$('body').append('".addslashes(str_replace("\n", '', $this->s_deferred_content))."');";
}
@@ -93,4 +92,3 @@ class CaptureWebPage extends WebPage
throw new Exception(__method__.' should not be called');
}
}

View File

@@ -1,4 +1,5 @@
<?php
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0

View File

@@ -16,7 +16,6 @@ use utils;
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* @since 2.7.1 N°2641 class creation
*/
@@ -55,10 +54,9 @@ class ErrorPage extends NiceWebPage
public function error($sText)
{
$this->add("<div class=\"message message-error\">$sText</div>");
if(utils::IsEasterEggAllowed())
{
if (utils::IsEasterEggAllowed()) {
$this->add('<div class="message message-valid">'.Dict::S('UI:ErrorPage:UnstableVersion').'</div>');
$this->add('<img src="' . utils::GetAbsoluteUrlAppRoot() . 'images/alpha-fatal-error.gif">');
$this->add('<img src="'.utils::GetAbsoluteUrlAppRoot().'images/alpha-fatal-error.gif">');
$this->add('<div class="message message-valid">'.nl2br(Dict::S('UI:ErrorPage:KittyDisclaimer')).'</div>');
}
$this->log_error($sText);

View File

@@ -1,4 +1,5 @@
<?php
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -73,6 +74,6 @@ class JsonPPage extends JsonPage
{
$sContent = parent::ComputeContent();
return $this->sCallbackName . '(' . $sContent . ');';
return $this->sCallbackName.'('.$sContent.');';
}
}
}

View File

@@ -1,4 +1,5 @@
<?php
/*
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -89,7 +90,7 @@ class JsonPage extends WebPage
*/
protected function OutputHeaders(): void
{
$this->add_header('Content-type: ' . $this->sContentType);
$this->add_header('Content-type: '.$this->sContentType);
foreach ($this->a_headers as $s_header) {
header($s_header);
@@ -126,4 +127,4 @@ class JsonPage extends WebPage
$oKpi->ComputeAndReport('Echoing ('.round(strlen($sContent) / 1024).' Kb)');
ExecutionKPI::ReportStats();
}
}
}

View File

@@ -1,4 +1,5 @@
<?php
/**
* Copyright (C) 2013-2024 Combodo SAS
*
@@ -22,7 +23,6 @@ namespace Combodo\iTop\Application\WebPage;
use Combodo\iTop\Renderer\BlockRenderer;
use ExecutionKPI;
/**
* Special class of WebPage for printing into a PDF document
*/
@@ -35,7 +35,7 @@ class PDFPage extends WebPage
{
$oKpi = new ExecutionKPI();
parent::__construct($s_title);
if (!defined('K_PATH_FONTS')){
if (!defined('K_PATH_FONTS')) {
define('K_PATH_FONTS', APPROOT.'lib/combodo/tcpdf/fonts/');
}
$this->oPdf = new iTopPDF($sPageOrientation, 'mm', $sPageFormat, true, self::PAGES_CHARSET, false);
@@ -152,12 +152,10 @@ EOF
public function output()
{
$this->add_header('Content-type: application/x-pdf');
if (!empty($this->sContentDisposition))
{
if (!empty($this->sContentDisposition)) {
$this->add_header('Content-Disposition: '.$this->sContentDisposition.'; filename="'.$this->sContentFileName.'"');
}
foreach ($this->a_headers as $s_header)
{
foreach ($this->a_headers as $s_header) {
header($s_header);
}
$this->flush();

View File

@@ -1,4 +1,5 @@
<?php
/**
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -64,5 +65,5 @@ interface Page
*
* @return void
*/
public function table($aConfig, $aData, $aParams = array());
public function table($aConfig, $aData, $aParams = []);
}

View File

@@ -1,4 +1,5 @@
<?php
/**
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -12,16 +13,15 @@ use Combodo\iTop\Application\UI\Base\Layout\TabContainer\TabContainer;
use DeprecatedCallsLog;
use Dict;
/**
* Helper class to implement JQueryUI tabs inside a page
*/
class TabManager
{
const ENUM_TAB_TYPE_HTML = 'html';
const ENUM_TAB_TYPE_AJAX = 'ajax';
public const ENUM_TAB_TYPE_HTML = 'html';
public const ENUM_TAB_TYPE_AJAX = 'ajax';
const DEFAULT_TAB_TYPE = self::ENUM_TAB_TYPE_HTML;
public const DEFAULT_TAB_TYPE = self::ENUM_TAB_TYPE_HTML;
/**
* @var TabContainer[]

View File

@@ -1,4 +1,5 @@
<?php
/**
* Copyright (C) 2013-2024 Combodo SAS
*
@@ -37,7 +38,7 @@ use utils;
*/
class UnauthenticatedWebPage extends NiceWebPage
{
const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/unauthenticatedwebpage/layout';
public const DEFAULT_PAGE_TEMPLATE_REL_PATH = 'pages/backoffice/unauthenticatedwebpage/layout';
private $sContent;
private $sPanelTitle;
private $sPanelIcon;
@@ -77,17 +78,17 @@ class UnauthenticatedWebPage extends NiceWebPage
$this->SetContentType('text/html');
// - bootstrap
$this->LinkScriptFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL . 'lib/bootstrap/js/bootstrap.min.js');
$this->LinkScriptFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL.'lib/bootstrap/js/bootstrap.min.js');
// Note: Since 2.6.0 moment was moved from portal to iTop core
$this->LinkScriptFromAppRoot('node_modules/moment/min/moment-with-locales.min.js');
$this->LinkScriptFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL . 'lib/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js');
$this->LinkScriptFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL.'lib/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js');
// CSS files
$this->LinkStylesheetFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL . 'lib/bootstrap/css/bootstrap.min.css');
$this->add_saas(UAWP_PORTAL_PUBLIC_FOLDER_RELATIVE_PATH . 'css/bootstrap-theme-combodo.scss');
$this->LinkStylesheetFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL . 'lib/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css');
$this->LinkStylesheetFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL.'lib/bootstrap/css/bootstrap.min.css');
$this->add_saas(UAWP_PORTAL_PUBLIC_FOLDER_RELATIVE_PATH.'css/bootstrap-theme-combodo.scss');
$this->LinkStylesheetFromURI(UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL.'lib/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css');
// Default theme
$this->add_saas('css/unauthenticated.scss');
@@ -102,24 +103,22 @@ class UnauthenticatedWebPage extends NiceWebPage
*/
private function Init(): void
{
$this->sPortalBaseFolderRelPath = 'env-' . utils::GetCurrentEnvironment() . '/itop-portal-base/portal/';
$this->sPortalSourcesFolderRelPath = $this->sPortalBaseFolderRelPath . 'src/';
$this->sPortalPublicFolderRelPath = $this->sPortalBaseFolderRelPath . 'public/';
$this->sPortalBaseFolderRelPath = 'env-'.utils::GetCurrentEnvironment().'/itop-portal-base/portal/';
$this->sPortalSourcesFolderRelPath = $this->sPortalBaseFolderRelPath.'src/';
$this->sPortalPublicFolderRelPath = $this->sPortalBaseFolderRelPath.'public/';
$this->sPortalBaseFolderAbsPath = APPROOT . $this->sPortalBaseFolderRelPath;
$this->sPortalSourcesFolderAbsPath = APPROOT . $this->sPortalSourcesFolderRelPath;
$this->sPortalPublicFolderAbsPath = APPROOT . $this->sPortalPublicFolderRelPath;
$this->sPortalBaseFolderAbsPath = APPROOT.$this->sPortalBaseFolderRelPath;
$this->sPortalSourcesFolderAbsPath = APPROOT.$this->sPortalSourcesFolderRelPath;
$this->sPortalPublicFolderAbsPath = APPROOT.$this->sPortalPublicFolderRelPath;
/** @noinspection PhpUnhandledExceptionInspection */
$this->sPortalPublicFolderAbsUrl = utils::GetAbsoluteUrlModulesRoot().'/itop-portal-base/portal/public/';
// Constants to be used in the UnauthenticatedWebPage
if(!defined('UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL'))
{
if (!defined('UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL')) {
define('UAWP_PORTAL_PUBLIC_FOLDER_ABSOLUTE_URL', $this->sPortalPublicFolderAbsUrl);
}
if(!defined('UAWP_PORTAL_PUBLIC_FOLDER_RELATIVE_PATH'))
{
if (!defined('UAWP_PORTAL_PUBLIC_FOLDER_RELATIVE_PATH')) {
define('UAWP_PORTAL_PUBLIC_FOLDER_RELATIVE_PATH', $this->sPortalPublicFolderRelPath);
}
}
@@ -131,7 +130,7 @@ class UnauthenticatedWebPage extends NiceWebPage
{
$this->sContent .= $sHtml;
}
/**
* @inheritdoc
*/
@@ -179,7 +178,7 @@ class UnauthenticatedWebPage extends NiceWebPage
'sDeferredContent' => utils::FilterXSS($this->s_deferred_content),
'sContent' => $this->sContent,
'sPanelIcon' => $this->sPanelIcon,
'sPanelTitle' => $this->sPanelTitle
'sPanelTitle' => $this->sPanelTitle,
];
$aData['aBlockParams'] = $this->GetBlockParams();
@@ -196,7 +195,7 @@ class UnauthenticatedWebPage extends NiceWebPage
$aData['aPage']['sFaviconUrl'] = $this->GetFaviconAbsoluteUrl();
$oTwigEnv = TwigHelper::GetTwigEnvironment(BlockRenderer::TWIG_BASE_PATH, BlockRenderer::TWIG_ADDITIONAL_PATHS);
// Render final TWIG into global HTML
$sHtml = TwigHelper::RenderTemplate($oTwigEnv, $aData, $this->GetTemplateRelPath());
$oKpi->ComputeAndReport(get_class($this).' output');
@@ -204,7 +203,7 @@ class UnauthenticatedWebPage extends NiceWebPage
$oKpi->ComputeAndReport('Echoing ('.round(strlen($sHtml) / 1024).' Kb)');
ExecutionKPI::ReportStats();
}
/**
* Displays a success message.
*
@@ -271,7 +270,6 @@ class UnauthenticatedWebPage extends NiceWebPage
return $this;
}
/**
* @inheritDoc
* @throws \Exception
@@ -282,8 +280,7 @@ class UnauthenticatedWebPage extends NiceWebPage
// Default theme
$this->add_saas('css/unauthenticated.scss');
// Custom theme to allow admin to override the default one.
if(!empty($this->sCustomThemeUrl))
{
if (!empty($this->sCustomThemeUrl)) {
$this->LinkStylesheetFromURI($this->sCustomThemeUrl);
}
}
@@ -296,4 +293,4 @@ class UnauthenticatedWebPage extends NiceWebPage
{
return Branding::GetLoginFavIconAbsoluteUrl();
}
}
}

View File

@@ -1,9 +1,10 @@
<?php
// Copyright (C) 2010-2024 Combodo SAS
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
@@ -28,7 +29,6 @@ use ExecutionKPI;
* @license http://opensource.org/licenses/AGPL-3.0
*/
/**
* Simple web page with no includes or fancy formatting, useful to generateXML documents
* The page adds the content-type text/XML and the encoding into the headers
@@ -38,10 +38,10 @@ class XMLPage extends WebPage
/**
* For big XML files, it's better NOT to store everything in memory and output the XML piece by piece
*/
var $m_bPassThrough;
var $m_bHeaderSent;
function __construct($s_title, $bPassThrough = false)
public $m_bPassThrough;
public $m_bHeaderSent;
public function __construct($s_title, $bPassThrough = false)
{
$oKpi = new ExecutionKPI();
parent::__construct($s_title);
@@ -65,8 +65,7 @@ class XMLPage extends WebPage
}
public function output()
{
if (!$this->m_bPassThrough)
{
if (!$this->m_bPassThrough) {
$oKpi = new ExecutionKPI();
// Get the unexpected output but do nothing with it
@@ -75,8 +74,7 @@ class XMLPage extends WebPage
$sCharset = self::PAGES_CHARSET;
$this->s_content = "<?xml version=\"1.0\" encoding=\"$sCharset\"?".">\n".trim($this->s_content);
$this->add_header("Content-Length: ".strlen($this->s_content));
foreach($this->a_headers as $s_header)
{
foreach ($this->a_headers as $s_header) {
header($s_header);
}
$oKpi->ComputeAndReport(get_class($this).' output');
@@ -96,12 +94,9 @@ class XMLPage extends WebPage
} else {
if ($this->m_bHeaderSent) {
echo $sText;
}
else
{
} else {
$s_captured_output = $this->ob_get_clean_safe();
foreach($this->a_headers as $s_header)
{
foreach ($this->a_headers as $s_header) {
header($s_header);
}
$sCharset = self::PAGES_CHARSET;
@@ -118,7 +113,7 @@ class XMLPage extends WebPage
{
}
public function table($aConfig, $aData, $aParams = array())
public function table($aConfig, $aData, $aParams = [])
{
}
}

View File

@@ -1,4 +1,5 @@
<?php
/**
* @copyright Copyright (C) 2010-2024 Combodo SAS
* @license http://opensource.org/licenses/AGPL-3.0
@@ -12,7 +13,6 @@ use TCPDF;
use TCPDF_IMAGES;
use utils;
/**
* Custom class derived from TCPDF for providing custom headers and footers
*
@@ -65,11 +65,14 @@ class iTopPDF extends TCPDF
}*/
$imgtype = TCPDF_IMAGES::getImageFileType($sImagePath);
if (($imgtype == 'eps') or ($imgtype == 'ai')) {
$this->ImageEps($sImagePath, $x, $y, $w, $h);;
$this->ImageEps($sImagePath, $x, $y, $w, $h);
;
} elseif ($imgtype == 'svg') {
$this->ImageSVG($sImagePath, $x, $y, $w, $h);;
$this->ImageSVG($sImagePath, $x, $y, $w, $h);
;
} else {
$this->Image($sImagePath, $x, $y, $w, $h);;
$this->Image($sImagePath, $x, $y, $w, $h);
;
}
}
@@ -89,14 +92,44 @@ class iTopPDF extends TCPDF
// Display the title (centered)
$this->SetXY($aMargins['left'] + $iPageNumberWidth, 0);
$this->MultiCell($this->getPageWidth() - $aMargins['left'] - $aMargins['right'] - 2 * $iPageNumberWidth, 15, $this->sDocumentTitle,
0, 'C', false, 0 /* $ln */, '', '', true, 0, false, true, 15, 'M' /* $valign */);
$this->MultiCell(
$this->getPageWidth() - $aMargins['left'] - $aMargins['right'] - 2 * $iPageNumberWidth,
15,
$this->sDocumentTitle,
0,
'C',
false,
0 /* $ln */,
'',
'',
true,
0,
false,
true,
15,
'M' /* $valign */
);
$this->SetFontParams('', 10);
// Display the page number (right aligned)
// Warning: the 'R'ight alignment does not work when using placeholders like $this->getAliasNumPage() or $this->getAliasNbPages()
$this->MultiCell($iPageNumberWidth, 15, Dict::Format('Core:BulkExport:PDF:PageNumber', $this->page), 0, 'R', false, 0 /* $ln */, '',
'', true, 0, false, true, 15, 'M' /* $valign */);
$this->MultiCell(
$iPageNumberWidth,
15,
Dict::Format('Core:BulkExport:PDF:PageNumber', $this->page),
0,
'R',
false,
0 /* $ln */,
'',
'',
true,
0,
false,
true,
15,
'M' /* $valign */
);
// Branding logo
$sBrandingIcon = Branding::GetLogoRelativePath(Branding::ENUM_LOGO_TYPE_MAIN_LOGO_FULL);

View File

@@ -1,9 +1,10 @@
<?php
// Copyright (C) 2010-2024 Combodo SAS
//
// This file is part of iTop.
//
// iTop is free software; you can redistribute it and/or modify
// iTop is free software; you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
@@ -33,29 +34,28 @@ use utils;
*/
class iTopWizardWebPage extends iTopWebPage
{
var $m_iCurrentStep;
var $m_aSteps;
public function __construct($sTitle, $currentOrganization, $iCurrentStep, $aSteps)
{
$oKpi = new ExecutionKPI();
parent::__construct($sTitle." - step $iCurrentStep of ".count($aSteps)." - ".$aSteps[$iCurrentStep - 1], $currentOrganization);
public $m_iCurrentStep;
public $m_aSteps;
public function __construct($sTitle, $currentOrganization, $iCurrentStep, $aSteps)
{
$oKpi = new ExecutionKPI();
parent::__construct($sTitle." - step $iCurrentStep of ".count($aSteps)." - ".$aSteps[$iCurrentStep - 1], $currentOrganization);
$this->m_iCurrentStep = $iCurrentStep;
$this->m_aSteps = $aSteps;
$oKpi->ComputeStats(get_class($this).' creation', 'iTopWizardWebPage');
}
public function output()
{
$aSteps = array();
$iIndex = 0;
foreach($this->m_aSteps as $sStepTitle)
{
$iIndex++;
$sStyle = ($iIndex == $this->m_iCurrentStep) ? 'wizActiveStep' : 'wizStep';
$aSteps[] = "<div class=\"$sStyle\"><span>$sStepTitle</span></div>";
}
$sWizardHeader = "<div class=\"wizHeader\"><h1>".utils::EscapeHtml($this->s_title)."</h1>\n".implode("<div class=\"wizSeparator\"><img align=\"bottom\" src=\"" . utils::GetAbsoluteUrlAppRoot() . "images/wizArrow.gif\"></div>", $aSteps)."<br style=\"clear:both;\"/></div>\n";
$this->s_content = "$sWizardHeader<div class=\"wizContainer\">".$this->s_content."</div>";
parent::output();
$this->m_aSteps = $aSteps;
$oKpi->ComputeStats(get_class($this).' creation', 'iTopWizardWebPage');
}
public function output()
{
$aSteps = [];
$iIndex = 0;
foreach ($this->m_aSteps as $sStepTitle) {
$iIndex++;
$sStyle = ($iIndex == $this->m_iCurrentStep) ? 'wizActiveStep' : 'wizStep';
$aSteps[] = "<div class=\"$sStyle\"><span>$sStepTitle</span></div>";
}
$sWizardHeader = "<div class=\"wizHeader\"><h1>".utils::EscapeHtml($this->s_title)."</h1>\n".implode("<div class=\"wizSeparator\"><img align=\"bottom\" src=\"".utils::GetAbsoluteUrlAppRoot()."images/wizArrow.gif\"></div>", $aSteps)."<br style=\"clear:both;\"/></div>\n";
$this->s_content = "$sWizardHeader<div class=\"wizContainer\">".$this->s_content."</div>";
parent::output();
}
}