mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-24 02:58:43 +02:00
Merge remote-tracking branch 'origin/support/3.0' into develop
This commit is contained in:
@@ -21,6 +21,19 @@ use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactor
|
|||||||
*/
|
*/
|
||||||
class PDFBulkExport extends HTMLBulkExport
|
class PDFBulkExport extends HTMLBulkExport
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var string For sample purposes
|
||||||
|
* @internal
|
||||||
|
* @since 2.7.8
|
||||||
|
*/
|
||||||
|
const ENUM_OUTPUT_TYPE_SAMPLE = 'sample';
|
||||||
|
/**
|
||||||
|
* @var string For the real export
|
||||||
|
* @internal
|
||||||
|
* @since 2.7.8
|
||||||
|
*/
|
||||||
|
const ENUM_OUTPUT_TYPE_REAL = 'real';
|
||||||
|
|
||||||
public function DisplayUsage(Page $oP)
|
public function DisplayUsage(Page $oP)
|
||||||
{
|
{
|
||||||
$oP->p(" * pdf format options:");
|
$oP->p(" * pdf format options:");
|
||||||
@@ -197,6 +210,25 @@ EOF
|
|||||||
return $sPDF;
|
return $sPDF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritDoc
|
||||||
|
* @since 2.7.8
|
||||||
|
*/
|
||||||
|
protected function GetSampleData($oObj, $sAttCode)
|
||||||
|
{
|
||||||
|
if ($sAttCode !== 'id')
|
||||||
|
{
|
||||||
|
$oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode);
|
||||||
|
|
||||||
|
// As sample data will be displayed in the web browser, AttributeImage needs to be rendered with a regular HTML format, meaning its "src" looking like "data:image/png;base64,iVBORw0KGgoAAAANSUh..."
|
||||||
|
// Whereas for the PDF generation it needs to be rendered with a TCPPDF-compatible format, meaning its "src" looking like "@iVBORw0KGgoAAAANSUh..."
|
||||||
|
if ($oAttDef instanceof AttributeImage) {
|
||||||
|
return $this->GetAttributeImageValue($oAttDef, $oObj->Get($sAttCode), static::ENUM_OUTPUT_TYPE_SAMPLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parent::GetSampleData($oObj, $sAttCode);
|
||||||
|
}
|
||||||
|
|
||||||
protected function GetValue($oObj, $sAttCode)
|
protected function GetValue($oObj, $sAttCode)
|
||||||
{
|
{
|
||||||
switch($sAttCode)
|
switch($sAttCode)
|
||||||
@@ -212,31 +244,7 @@ EOF
|
|||||||
$oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode);
|
$oAttDef = MetaModel::GetAttributeDef(get_class($oObj), $sAttCode);
|
||||||
if ($oAttDef instanceof AttributeImage)
|
if ($oAttDef instanceof AttributeImage)
|
||||||
{
|
{
|
||||||
// To limit the image size in the PDF output, we have to enforce the size as height/width because max-width/max-height have no effect
|
$sRet = $this->GetAttributeImageValue($oAttDef, $value, static::ENUM_OUTPUT_TYPE_REAL);
|
||||||
//
|
|
||||||
$iDefaultMaxWidthPx = 48;
|
|
||||||
$iDefaultMaxHeightPx = 48;
|
|
||||||
if ($value->IsEmpty())
|
|
||||||
{
|
|
||||||
$iNewWidth = $iDefaultMaxWidthPx;
|
|
||||||
$iNewHeight = $iDefaultMaxHeightPx;
|
|
||||||
|
|
||||||
$sUrl = $oAttDef->Get('default_image');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
list($iWidth, $iHeight) = utils::GetImageSize($value->GetData());
|
|
||||||
$iMaxWidthPx = min($iDefaultMaxWidthPx, $oAttDef->Get('display_max_width'));
|
|
||||||
$iMaxHeightPx = min($iDefaultMaxHeightPx, $oAttDef->Get('display_max_height'));
|
|
||||||
|
|
||||||
$fScale = min($iMaxWidthPx / $iWidth, $iMaxHeightPx / $iHeight);
|
|
||||||
$iNewWidth = $iWidth * $fScale;
|
|
||||||
$iNewHeight = $iHeight * $fScale;
|
|
||||||
|
|
||||||
$sUrl = 'data:'.$value->GetMimeType().';base64,'.base64_encode($value->GetData());
|
|
||||||
}
|
|
||||||
$sRet = ($sUrl !== null) ? '<img src="'.$sUrl.'" style="width: '.$iNewWidth.'px; height: '.$iNewHeight.'px">' : '';
|
|
||||||
$sRet = '<div class="ibo-input-image--image-view">'.$sRet.'</div>';
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -251,6 +259,55 @@ EOF
|
|||||||
return $sRet;
|
return $sRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \AttributeImage $oAttDef Instance of image attribute
|
||||||
|
* @param \ormDocument $oValue Value of image attribute
|
||||||
|
* @param string $sOutputType {@see \PDFBulkExport::ENUM_OUTPUT_TYPE_SAMPLE}, {@see \PDFBulkExport::ENUM_OUTPUT_TYPE_REAL}
|
||||||
|
*
|
||||||
|
* @return string Rendered value of $oAttDef / $oValue according to the desired $sOutputType
|
||||||
|
* @since 2.7.8
|
||||||
|
*/
|
||||||
|
protected function GetAttributeImageValue(AttributeImage $oAttDef, ormDocument $oValue, string $sOutputType)
|
||||||
|
{
|
||||||
|
// To limit the image size in the PDF output, we have to enforce the size as height/width because max-width/max-height have no effect
|
||||||
|
//
|
||||||
|
$iDefaultMaxWidthPx = 48;
|
||||||
|
$iDefaultMaxHeightPx = 48;
|
||||||
|
if ($oValue->IsEmpty()) {
|
||||||
|
$iNewWidth = $iDefaultMaxWidthPx;
|
||||||
|
$iNewHeight = $iDefaultMaxHeightPx;
|
||||||
|
|
||||||
|
$sUrl = $oAttDef->Get('default_image');
|
||||||
|
} else {
|
||||||
|
list($iWidth, $iHeight) = utils::GetImageSize($oValue->GetData());
|
||||||
|
$iMaxWidthPx = min($iDefaultMaxWidthPx, $oAttDef->Get('display_max_width'));
|
||||||
|
$iMaxHeightPx = min($iDefaultMaxHeightPx, $oAttDef->Get('display_max_height'));
|
||||||
|
|
||||||
|
$fScale = min($iMaxWidthPx / $iWidth, $iMaxHeightPx / $iHeight);
|
||||||
|
$iNewWidth = $iWidth * $fScale;
|
||||||
|
$iNewHeight = $iHeight * $fScale;
|
||||||
|
|
||||||
|
$sValueAsBase64 = base64_encode($oValue->GetData());
|
||||||
|
switch ($sOutputType) {
|
||||||
|
case static::ENUM_OUTPUT_TYPE_SAMPLE:
|
||||||
|
$sUrl = 'data:'.$oValue->GetMimeType().';base64,'.$sValueAsBase64;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case static::ENUM_OUTPUT_TYPE_REAL:
|
||||||
|
default:
|
||||||
|
// TCPDF requires base64-encoded images to be rendered without the usual "data:<MIMETYPE>;base64" header but with an "@"
|
||||||
|
// @link https://tcpdf.org/examples/example_009/
|
||||||
|
$sUrl = '@'.$sValueAsBase64;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sRet = ($sUrl !== null) ? '<img src="'.$sUrl.'" style="width: '.$iNewWidth.'px; height: '.$iNewHeight.'px;">' : '';
|
||||||
|
$sRet = '<div class="ibo-input-image--image-view">'.$sRet.'</div>';
|
||||||
|
|
||||||
|
return $sRet;
|
||||||
|
}
|
||||||
|
|
||||||
public function GetSupportedFormats()
|
public function GetSupportedFormats()
|
||||||
{
|
{
|
||||||
return array('pdf' => Dict::S('Core:BulkExport:PDFFormat'));
|
return array('pdf' => Dict::S('Core:BulkExport:PDFFormat'));
|
||||||
|
|||||||
27
test/application/TestAutoload.php
Normal file
27
test/application/TestAutoload.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @copyright Copyright (C) 2010-2022 Combodo SARL
|
||||||
|
* @license http://opensource.org/licenses/AGPL-3.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @runTestsInSeparateProcesses
|
||||||
|
* @preserveGlobalState disabled
|
||||||
|
* @backupGlobals disabled
|
||||||
|
*/
|
||||||
|
class TestAutoload extends ItopDataTestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
*/
|
||||||
|
public function testAutoloader()
|
||||||
|
{
|
||||||
|
if (class_exists('Composer\InstalledVersions')) {
|
||||||
|
$this->assertTrue(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->assertTrue(false, 'You should run composer install on the faulty module');
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user