From 25bbbb99f632156aaf3af4bbdf9ea7cebf9d6a2b Mon Sep 17 00:00:00 2001 From: Damien <damien.burel@maarch.org> Date: Tue, 7 Aug 2018 17:15:16 +0200 Subject: [PATCH] FEAT #8137 Goodbye Thumbnail module + Improve thumbnail process --- .../Views/signature-book.component.html | 2 +- .../class/class_lists_Abstract.php | 2 +- apps/maarch_entreprise/css/styles.css | 22 + apps/maarch_entreprise/img/noThumbnail.png | Bin 0 -> 27851 bytes apps/maarch_entreprise/smartphone/details.php | 47 +- .../xml/IVS/requests_definitions.xml | 3 - apps/maarch_entreprise/xml/config.xml.default | 4 - core/class/LinkController.php | 14 +- install/class/Class_Install.php | 205 +----- modules/attachments/attachments_content.php | 64 -- modules/thumbnails/LICENSE.txt | 675 ------------------ modules/thumbnails/LoggerLog4php.php | 314 -------- modules/thumbnails/README.txt | 14 - modules/thumbnails/ajaxShowThumb.php | 61 -- modules/thumbnails/batch_tools.php | 155 ---- .../thumbnails/class/class_modules_tools.php | 250 ------- modules/thumbnails/create_tnl.php | 314 -------- modules/thumbnails/css/module.css | 66 -- modules/thumbnails/doc_thumb.php | 40 -- modules/thumbnails/doc_thumb_frame.php | 118 --- modules/thumbnails/js/functions.js | 32 - modules/thumbnails/lang/en.php | 3 - modules/thumbnails/lang/fr.php | 3 - modules/thumbnails/log/test.txt | 0 modules/thumbnails/no_thumb.png | Bin 13380 -> 0 bytes .../scripts/launch_batch_thumbnails.sh | 4 - modules/thumbnails/xml/IVS/data_types.xml | 3 - .../xml/IVS/requests_definitions.xml | 23 - .../thumbnails/xml/IVS/validation_rules.xml | 10 - modules/thumbnails/xml/config.xml | 8 - modules/thumbnails/xml/config.xml.default | 8 - .../xml/config_batch_attachments.xml.default | 23 - .../xml/config_batch_letterbox.xml.default | 23 - modules/thumbnails/xml/services.xml | 3 - sql/develop.sql | 1 + .../ConvertThumbnailController.php | 8 +- .../resource/controllers/ResController.php | 38 +- .../resource/controllers/StoreController.php | 2 +- .../controllers/SignatureBookController.php | 6 +- 39 files changed, 79 insertions(+), 2489 deletions(-) create mode 100644 apps/maarch_entreprise/img/noThumbnail.png delete mode 100755 modules/thumbnails/LICENSE.txt delete mode 100755 modules/thumbnails/LoggerLog4php.php delete mode 100755 modules/thumbnails/README.txt delete mode 100755 modules/thumbnails/ajaxShowThumb.php delete mode 100755 modules/thumbnails/batch_tools.php delete mode 100755 modules/thumbnails/class/class_modules_tools.php delete mode 100755 modules/thumbnails/create_tnl.php delete mode 100755 modules/thumbnails/css/module.css delete mode 100755 modules/thumbnails/doc_thumb.php delete mode 100755 modules/thumbnails/doc_thumb_frame.php delete mode 100755 modules/thumbnails/js/functions.js delete mode 100755 modules/thumbnails/lang/en.php delete mode 100755 modules/thumbnails/lang/fr.php delete mode 100755 modules/thumbnails/log/test.txt delete mode 100755 modules/thumbnails/no_thumb.png delete mode 100755 modules/thumbnails/scripts/launch_batch_thumbnails.sh delete mode 100755 modules/thumbnails/xml/IVS/data_types.xml delete mode 100755 modules/thumbnails/xml/IVS/requests_definitions.xml delete mode 100755 modules/thumbnails/xml/IVS/validation_rules.xml delete mode 100755 modules/thumbnails/xml/config.xml delete mode 100755 modules/thumbnails/xml/config.xml.default delete mode 100755 modules/thumbnails/xml/config_batch_attachments.xml.default delete mode 100755 modules/thumbnails/xml/config_batch_letterbox.xml.default delete mode 100755 modules/thumbnails/xml/services.xml diff --git a/apps/maarch_entreprise/Views/signature-book.component.html b/apps/maarch_entreprise/Views/signature-book.component.html index ac5dc94189e..50bf8dbd5bc 100755 --- a/apps/maarch_entreprise/Views/signature-book.component.html +++ b/apps/maarch_entreprise/Views/signature-book.component.html @@ -76,7 +76,7 @@ <div *ngIf="headerTab == 1" class="contentShow"> <div *ngIf="showTopLeftPanel" class="pjDoc"> <div style="height:100%;"> - <img title="{{document.title}}" id="thumnails_img" *ngFor="let document of signatureBook.documents; let i = index" (click)="changeLeftViewer(i)" [src]="document.thumbnailLink" + <img title="{{document.title}}" id="thumnails_img" *ngFor="let document of signatureBook.documents; let i = index" (click)="changeLeftViewer(i)" [src]="coreUrl + document.thumbnailLink" class="leftPanelThumbnails" [ngClass]="{'panelSelectedThumbnail': i == leftSelectedThumbnail}"/> </div> </div> diff --git a/apps/maarch_entreprise/class/class_lists_Abstract.php b/apps/maarch_entreprise/class/class_lists_Abstract.php index 7d5948d5c6d..88a31edf400 100755 --- a/apps/maarch_entreprise/class/class_lists_Abstract.php +++ b/apps/maarch_entreprise/class/class_lists_Abstract.php @@ -1190,7 +1190,7 @@ abstract class lists_Abstract extends Database } $href = $this->_buildMyLink($this->params['viewDocumentLink'], $resultTheLine, $listKey); - if ($core->is_module_loaded('thumbnails') === true && !$isAttachment) { + if (!$isAttachment) { $return .= '<div align="center" class="iconDoc" onmouseover="displayThumbnail(\''.$res_id.'\')"><a href="'.$href.'" target="_blank" title="' ._VIEW_DOC.'"><i class="tooltip fa fa-download fa-2x" title="'._VISUALIZE.'"></i><span id="thumb_'.$res_id.'" name="thumb_'.$res_id.'"></span></a></div>'; } else { diff --git a/apps/maarch_entreprise/css/styles.css b/apps/maarch_entreprise/css/styles.css index 87e093da58f..d482657ec57 100755 --- a/apps/maarch_entreprise/css/styles.css +++ b/apps/maarch_entreprise/css/styles.css @@ -3733,3 +3733,25 @@ width:auto; .typeahead__list { min-width: 150px !important; } +.iconDoc span { + display: none; +} +.iconDoc:hover span { + display: block; + position:fixed; + left:10px; + top:10px; + -moz-box-shadow: 0px 0px 5px 0px #656565; + -webkit-box-shadow: 0px 0px 5px 0px #656565; + -o-box-shadow: 0px 0px 5px 0px #656565; + box-shadow: 0px 0px 5px 0px #656565; + filter:progid:DXImageTransform.Microsoft.Shadow(color=#656565, Direction=NaN, Strength=5); + z-index:100; + height:auto; + width:auto; +} + +.iconDoc:hover span img { + height:auto; + width:auto; +} diff --git a/apps/maarch_entreprise/img/noThumbnail.png b/apps/maarch_entreprise/img/noThumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..2e865dcf63e0afb0acc95a766b08b88eb8e8f7f8 GIT binary patch literal 27851 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 literal 0 HcmV?d00001 diff --git a/apps/maarch_entreprise/smartphone/details.php b/apps/maarch_entreprise/smartphone/details.php index ad341f18ca8..1204347afed 100755 --- a/apps/maarch_entreprise/smartphone/details.php +++ b/apps/maarch_entreprise/smartphone/details.php @@ -146,44 +146,18 @@ foreach (array_keys($data) as $key) { } } -require_once 'modules'.DIRECTORY_SEPARATOR.'thumbnails'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR - .'class_modules_tools.php'; - $getAttach = ''; -$tnl = new thumbnails(); - $db = new Database(); -if (isset($_REQUEST['res_id_master'])) { - //$ac->getCorrespondingPdf($att_id); - require_once 'modules/attachments/class/attachments_controler.php'; - $ac = new attachments_controler(); - $infos_attach = $ac->getAttachmentInfos($att_id); - $pdf_id = $ac->getCorrespondingPdf($att_id); - //echo "pdf : ".$pdf_id; - - $path = $tnl->getPathTnl($s_id, $coll_id); - if (!is_file($path)) { - $path = $tnl->generateTnl($s_id, $coll_id); - } - - $path = $tnl->getPathTnl($pdf_id, $coll_id, 'res_attachments'); - $getAttach = '&res_id_attach='.$pdf_id; - - if (!is_file($path)) { - $path = $tnl->generateTnl($pdf_id, $coll_id, 'res_attachments'); - } -} else { - $path = $tnl->getPathTnl($s_id, $coll_id); - if (!is_file($path)) { - $path = $tnl->generateTnl($s_id, $coll_id); - } -} +$tnlAdr = \Resource\models\AdrModel::getTypedDocumentAdrByResId([ + 'select' => [1], + 'resId' => $s_id, + 'type' => 'TNL' +]); ?> <div id="details" title="Détails" class="panel"> <?php - if (!is_file($path)) { + if (empty($tnlAdr)) { echo 'pdf : '.$pdf_id; ?> <div align="center"> <input type="button" class="whiteButton" value="<?php @@ -193,11 +167,8 @@ if (isset($_REQUEST['res_id_master'])) { } else { ?> - <!--<img style="width:90%;" src="<?php echo $_SESSION['config']['businessappurl'].'index.php?page=doc_thumb&module=thumbnails&res_id='.$s_id.'&coll_id=letterbox_coll&display=true'; ?>" onclick="window.open(' - <?php echo $fileUrl; ?>', '_blank');"/>--> - <div id="frameThumb"> - <iframe id="ifrm" frameborder="0" scrolling="no" width="0" height="0" src="<?php echo $_SESSION['config']['businessappurl'].'index.php?page=doc_thumb_frame&body_loaded&module=thumbnails&res_id='.$s_id.'&coll_id=letterbox_coll'.$getAttach; ?>"></iframe> + <iframe id="ifrm" frameborder="0" scrolling="no" width="0" height="0" src="<?php echo '../../../rest/res/'.$s_id.'/thumbnail' ?>"></iframe> </div> <?php @@ -242,10 +213,6 @@ if (isset($_REQUEST['res_id_master'])) { <i class="fa fa-hand-point-up fa-2x mCdarkGrey" aria-hidden="true"></i> </span> </a> - - <span class="bubble" style="cursor: pointer;margin-right: 5px;" onclick="switchFrame('<?php functions::xecho($_SESSION['config']['businessappurl'].'index.php?page=doc_thumb_frame&body_loaded&module=thumbnails'); ?>',<?php functions::xecho($s_id); ?>,<?php functions::xecho($pdf_id); ?>);"> - <i class="fa fa-retweet fa-2x mCdarkGrey"></i> - </span> <input type="hidden" id="type_doc_show" value="attach" /> <?php diff --git a/apps/maarch_entreprise/xml/IVS/requests_definitions.xml b/apps/maarch_entreprise/xml/IVS/requests_definitions.xml index 4a168743a85..7bb867b8b38 100755 --- a/apps/maarch_entreprise/xml/IVS/requests_definitions.xml +++ b/apps/maarch_entreprise/xml/IVS/requests_definitions.xml @@ -591,7 +591,6 @@ <xi:include href="../../../../modules/sendmail/xml/IVS/requests_definitions.xml"/> <xi:include href="../../../../modules/tags/xml/IVS/requests_definitions.xml"/> <xi:include href="../../../../modules/templates/xml/IVS/requests_definitions.xml"/> - <xi:include href="../../../../modules/thumbnails/xml/IVS/requests_definitions.xml"/> <xi:include href="../../../../modules/visa/xml/IVS/requests_definitions.xml"/> <xi:include href="../../../../modules/avis/xml/IVS/requests_definitions.xml"/> <xi:include href="../../../../modules/thesaurus/xml/IVS/requests_definitions.xml"/> @@ -623,7 +622,6 @@ <xi:include href="../../../../modules/sendmail/xml/IVS/validation_rules.xml"/> <xi:include href="../../../../modules/tags/xml/IVS/validation_rules.xml"/> <xi:include href="../../../../modules/templates/xml/IVS/validation_rules.xml"/> - <xi:include href="../../../../modules/thumbnails/xml/IVS/validation_rules.xml"/> <xi:include href="../../../../modules/visa/xml/IVS/validation_rules.xml"/> <xi:include href="../../../../modules/avis/xml/IVS/validation_rules.xml"/> <xi:include href="../../../../modules/thesaurus/xml/IVS/validation_rules.xml"/> @@ -655,7 +653,6 @@ <xi:include href="../../../../modules/sendmail/xml/IVS/data_types.xml"/> <xi:include href="../../../../modules/tags/xml/IVS/data_types.xml"/> <xi:include href="../../../../modules/templates/xml/IVS/data_types.xml"/> - <xi:include href="../../../../modules/thumbnails/xml/IVS/data_types.xml"/> <xi:include href="../../../../modules/visa/xml/IVS/data_types.xml"/> <xi:include href="../../../../modules/avis/xml/IVS/data_types.xml"/> <xi:include href="../../../../modules/thesaurus/xml/IVS/data_types.xml"/> diff --git a/apps/maarch_entreprise/xml/config.xml.default b/apps/maarch_entreprise/xml/config.xml.default index cab1d4cb99a..821a48a829c 100755 --- a/apps/maarch_entreprise/xml/config.xml.default +++ b/apps/maarch_entreprise/xml/config.xml.default @@ -291,10 +291,6 @@ <MODULES> <moduleid>sendmail</moduleid> <comment>_SENDMAIL_COMMENT</comment> - </MODULES> - <MODULES> - <moduleid>thumbnails</moduleid> - <comment>_THUMBNAILS_COMMENT</comment> </MODULES> <MODULES> <moduleid>visa</moduleid> diff --git a/core/class/LinkController.php b/core/class/LinkController.php index b7295264fb2..828c85a8482 100755 --- a/core/class/LinkController.php +++ b/core/class/LinkController.php @@ -118,19 +118,7 @@ class LinkController $delChild = $key; } $return .= '<td align="right">'; - if ($core->is_module_loaded('thumbnails') === true) { - require_once 'modules'.DIRECTORY_SEPARATOR.'thumbnails'.DIRECTORY_SEPARATOR - .'class'.DIRECTORY_SEPARATOR - .'class_modules_tools.php'; - - $tnl = new thumbnails(); - $path = $tnl->getPathTnl($key, 'letterbox_coll'); - if (is_file($path)) { - $return .= '<div align="center" class="iconDoc"><a href="index.php?display=true&dir=indexing_searching&page=view_resource_controler&id='.$key.'" target="_blank" title="'._VIEW_DOC.'"><i class="fa fa-download fa-2x" title="'._VIEW_DOC.'"></i><span><img src="index.php?page=doc_thumb&module=thumbnails&res_id='.$key.'&coll_id=letterbox_coll&display=true"></span></a></div>'; - } else { - $return .= '<div align="center" class="iconDoc"><a href="index.php?display=true&dir=indexing_searching&page=view_resource_controler&id='.$key.'" target="_blank" title="'._VIEW_DOC.'"><i class="fa fa-download fa-2x" title="'._VIEW_DOC.'"></i><span id="no_doc"></span></a></div>'; - } - } + $return .= '<div align="center" class="iconDoc"><a href="index.php?display=true&dir=indexing_searching&page=view_resource_controler&id='.$key.'" target="_blank" title="'._VIEW_DOC.'"><i class="fa fa-download fa-2x" title="'._VIEW_DOC.'"></i><span><img src="../../rest/res/'.$key.'/thumbnail"></span></a></div>'; $return .= '</td>'; $return .= '<td align="right">'; $return .= '<span onclick="'; diff --git a/install/class/Class_Install.php b/install/class/Class_Install.php index aff28df4ac6..0575a35bc8e 100755 --- a/install/class/Class_Install.php +++ b/install/class/Class_Install.php @@ -125,9 +125,9 @@ class Install extends functions if (!$this->isPhpRequirements('gd')) { return false; } - /*if (!$this->isPhpRequirements('imagick')) { + if (!$this->isPhpRequirements('imagick')) { return false; - }*/ + } /*if (!$this->isPhpRequirements('ghostscript')) { return false; }*/ @@ -323,16 +323,6 @@ class Install extends functions $cheminCustomMaarchCourrierModules = realpath('.')."/custom/cs_$databasename/modules"; mkdir($cheminCustomMaarchCourrierModules, 0755); - /** Création répertoire thumbnails dans le custom **/ - $cheminCustomMaarchCourrierModulesThumbnails = realpath('.')."/custom/cs_$databasename/modules/thumbnails"; - mkdir($cheminCustomMaarchCourrierModulesThumbnails, 0755); - - $cheminCustomMaarchCourrierModulesThumbnailsXml = realpath('.')."/custom/cs_$databasename/modules/thumbnails/xml"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsXml, 0755); - - $cheminCustomMaarchCourrierModulesThumbnailsScripts = realpath('.')."/custom/cs_$databasename/modules/thumbnails/scripts"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsScripts, 0755); - /** Création répertoire notification dans le custom **/ $cheminCustomMaarchCourrierModulesNotifications = realpath('.')."/custom/cs_$databasename/modules/notifications"; mkdir($cheminCustomMaarchCourrierModulesNotifications, 0755); @@ -381,22 +371,8 @@ class Install extends functions } if (is_dir(realpath('.')."/custom/cs_$databasename/modules/")) { - /* Création répertoire thumbnails dans le custom **/ - - if (!is_dir(realpath('.')."/custom/cs_$databasename/modules/thumbnails/")) { - $cheminCustomMaarchCourrierModulesThumbnails = realpath('.')."/custom/cs_$databasename/modules/thumbnails"; - mkdir($cheminCustomMaarchCourrierModulesThumbnails, 0755); - } - if (!is_dir(realpath('.')."/custom/cs_$databasename/modules/thumbnails/xml/")) { - $cheminCustomMaarchCourrierModulesThumbnailsXml = realpath('.')."/custom/cs_$databasename/modules/thumbnails/xml"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsXml, 0755); - } - if (!is_dir(realpath('.')."/custom/cs_$databasename/modules/thumbnails/scripts/")) { - $cheminCustomMaarchCourrierModulesThumbnailsScripts = realpath('.')."/custom/cs_$databasename/modules/thumbnails/scripts"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsScripts, 0755); - } - /* Création répertoire thumbnails dans le custom **/ + /* Création répertoire notif dans le custom **/ if (!is_dir(realpath('.')."/custom/cs_$databasename/modules/notifications/")) { $cheminCustomMaarchCourrierModulesNotifications = realpath('.')."/custom/cs_$databasename/modules/notifications/"; mkdir($cheminCustomMaarchCourrierModulesNotifications, 0755); @@ -414,7 +390,7 @@ class Install extends functions mkdir($cheminCustomMaarchCourrierModulesNotificationsScripts, 0755); } - /* Création répertoire thumbnails dans le custom **/ + /* Création répertoire sendmail dans le custom **/ if (!is_dir(realpath('.')."/custom/cs_$databasename/modules/sendmail/")) { $cheminCustomMaarchCourrierModulesSendmail = realpath('.')."/custom/cs_$databasename/modules/sendmail"; mkdir($cheminCustomMaarchCourrierModulesSendmail, 0755); @@ -568,16 +544,6 @@ class Install extends functions $cheminCustomMaarchCourrierModules = realpath('.')."/custom/cs_$databasename/modules"; mkdir($cheminCustomMaarchCourrierModules, 0755); - /** Création répertoire thumbnails dans le custom **/ - $cheminCustomMaarchCourrierModulesThumbnails = realpath('.')."/custom/cs_$databasename/modules/thumbnails"; - mkdir($cheminCustomMaarchCourrierModulesThumbnails, 0755); - - $cheminCustomMaarchCourrierModulesThumbnailsXml = realpath('.')."/custom/cs_$databasename/modules/thumbnails/xml"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsXml, 0755); - - $cheminCustomMaarchCourrierModulesThumbnailsScripts = realpath('.')."/custom/cs_$databasename/modules/thumbnails/scripts"; - mkdir($cheminCustomMaarchCourrierModulesThumbnailsScripts, 0755); - /** Création répertoire notification dans le custom **/ $cheminCustomMaarchCourrierModulesNotifications = realpath('.')."/custom/cs_$databasename/modules/notifications"; mkdir($cheminCustomMaarchCourrierModulesNotifications, 0755); @@ -782,18 +748,6 @@ class Install extends functions $connect .= 'password='.$_SESSION['config']['databasepassword'].' '; $connect .= 'dbname=postgres'; - if (!$this->setConfigXmlThumbnails()) { - return false; - exit; - } - if (!$this->setConfig_batch_XmlThumbnails()) { - return false; - exit; - } - if (!$this->setConfigScriptLaunchThumbnails()) { - return false; - exit; - } if (!$this->setConfig_sendmail()) { return false; exit; @@ -911,18 +865,6 @@ class Install extends functions exit; } - if (!$this->setConfigXmlThumbnails()) { - return false; - exit; - } - if (!$this->setConfig_batch_XmlThumbnails()) { - return false; - exit; - } - if (!$this->setConfigScriptLaunchThumbnails()) { - return false; - exit; - } if (!$this->setConfig_sendmail()) { return false; exit; @@ -1033,10 +975,6 @@ class Install extends functions #################################################################################### -######################THUMBNAILS#################################################### -*/5 5-21 * * 1-5 '.realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/scripts/launch_batch_thumbnails.sh -15 12 * * 0 rm -Rf '.realpath('.').'/modules/thumbnails/log/*.log - ######################notification################################################# 15 10 * * * '.realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/notifications/batch/scripts/nct-ncc-and-anc.sh @@ -1148,95 +1086,6 @@ class Install extends functions // return true; // } - private function setConfigXmlThumbnails() - { - //var_dump("setConfigXmlThumbnails"); - $xmlconfig = simplexml_load_file('modules/thumbnails/xml/config.xml.default'); - //$xmlconfig = 'apps/maarch_entreprise/xml/config.xml.default'; - $CONFIG = $xmlconfig->CONFIG; - - $CONFIG->docserver_id = 'TNL'; - $chemin_no_file = realpath('.').'/modules/thumbnails/no_thumb.png'; - $CONFIG->no_file = $chemin_no_file; - $res = $xmlconfig->asXML(); - $fp = @fopen(realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/xml/config.xml', 'w+'); - if (!$fp) { - return false; - exit; - } - $write = fwrite($fp, $res); - if (!$write) { - return false; - exit; - } - - return true; - } - - private function setConfig_batch_XmlThumbnails() - { - $xmlconfig = simplexml_load_file('modules/thumbnails/xml/config_batch_letterbox.xml.default'); - - $CONFIG = $xmlconfig->CONFIG; - - $chemin_core = realpath('.').'/core/'; - - $CONFIG->MaarchDirectory = realpath('.').'/'; - - $CONFIG_BASE = $xmlconfig->CONFIG_BASE; - $CONFIG_BASE->databaseserver = $_SESSION['config']['databaseserver']; - $CONFIG_BASE->databaseserverport = $_SESSION['config']['databaseserverport']; - $CONFIG_BASE->databasename = $_SESSION['config']['databasename']; - $CONFIG_BASE->databaseuser = $_SESSION['config']['databaseuser']; - $CONFIG_BASE->databasepassword = $_SESSION['config']['databasepassword']; - - $LOG4PHP = $xmlconfig->LOG4PHP; - $LOG4PHP->Log4PhpConfigPath = realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/apps/maarch_entreprise/xml/log4php.xml'; - - $res = $xmlconfig->asXML(); - $fp = @fopen(realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/xml/config_batch_letterbox.xml', 'w+'); - if (!$fp) { - return false; - exit; - } - - $write = fwrite($fp, $res); - if (!$write) { - return false; - exit; - } - $xmlconfig = simplexml_load_file('modules/thumbnails/xml/config_batch_attachments.xml.default'); - - $CONFIG = $xmlconfig->CONFIG; - - $chemin_core = realpath('.').'/core/'; - - $CONFIG->MaarchDirectory = realpath('.').'/'; - - $CONFIG_BASE = $xmlconfig->CONFIG_BASE; - $CONFIG_BASE->databaseserver = $_SESSION['config']['databaseserver']; - $CONFIG_BASE->databaseserverport = $_SESSION['config']['databaseserverport']; - $CONFIG_BASE->databasename = $_SESSION['config']['databasename']; - $CONFIG_BASE->databaseuser = $_SESSION['config']['databaseuser']; - $CONFIG_BASE->databasepassword = $_SESSION['config']['databasepassword']; - - $LOG4PHP = $xmlconfig->LOG4PHP; - $LOG4PHP->Log4PhpConfigPath = realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/apps/maarch_entreprise/xml/log4php.xml'; - - $res = $xmlconfig->asXML(); - $fp = @fopen(realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/xml/config_batch_attachments.xml', 'w+'); - if (!$fp) { - return false; - exit; - } - $write = fwrite($fp, $res); - if (!$write) { - return false; - exit; - } - - return true; - } private function setConfig_batch_XmlNotifications() { @@ -1666,52 +1515,6 @@ class Install extends functions return true; } - private function setConfigScriptLaunchThumbnails() - { - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $res = 'cd '.realpath('.')."\modules\\thumbnails\\"; - $res .= "\n"; - $res .= '"'.realpath('.').'\..\..\php\php.exe" '.realpath('.').'\modules\\thumbnails\create_tnl.php '.realpath('.')."\custom\cs_".$_SESSION['config']['databasename'].'\modules\\thumbnails\xml\config_batch_letterbox.xml'; - $res .= "\n"; - $res .= '"'.realpath('.').'\..\..\php\php.exe" '.realpath('.').'\modules\\thumbnails\create_tnl.php '.realpath('.')."\custom\cs_".$_SESSION['config']['databasename'].'\modules\\thumbnails\xml\config_batch_attachments.xml'; - $res .= "\n"; - - $fp = @fopen(realpath('.')."\custom\cs_".$_SESSION['config']['databasename']."\modules\\thumbnails\scripts\launch_batch_thumbnails.bat", 'w+'); - if (!$fp) { - return false; - exit; - } - $write = fwrite($fp, $res); - if (!$write) { - return false; - exit; - } - - return true; - } elseif (strtoupper(substr(PHP_OS, 0, 3)) === 'LIN') { - $res = '#!/bin/bash'; - $res .= "\n\n"; - $res .= 'cd '.realpath('.').'/modules/thumbnails/'; - $res .= "\n\n"; - $res .= 'php '.realpath('.').'/modules/thumbnails/create_tnl.php '.realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/xml/config_batch_letterbox.xml'; - $res .= "\n\n"; - $res .= 'php '.realpath('.').'/modules/thumbnails/create_tnl.php '.realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/xml/config_batch_attachments.xml'; - - $fp = @fopen(realpath('.').'/custom/cs_'.$_SESSION['config']['databasename'].'/modules/thumbnails/scripts/launch_batch_thumbnails.sh', 'w+'); - if (!$fp) { - return false; - exit; - } - $write = fwrite($fp, $res); - if (!$write) { - return false; - exit; - } - - return true; - } - } - private function setScriptNotificationNctNccAndAncSh() { if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { diff --git a/modules/attachments/attachments_content.php b/modules/attachments/attachments_content.php index 060cc51c58d..3594038c90a 100755 --- a/modules/attachments/attachments_content.php +++ b/modules/attachments/attachments_content.php @@ -318,28 +318,6 @@ if (isset($_POST['add']) && $_POST['add']) { $_SESSION['data'], $_SESSION['config']['databasetype'] ); - if ($attachment_types == 'outgoing_mail') { - $extDocument = \Resource\models\ResModel::getExtById(['select' => ['category_id'], 'resId' => $_SESSION['doc_id']]); - - if ($extDocument['category_id'] == 'outgoing') { - $attachment = \Attachment\models\AttachmentModel::getOnView([ - 'select' => ['res_id'], - 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status not in (?)'], - 'data' => [$_SESSION['doc_id'], 'outgoing_mail', ['DEL', 'OBS']], - 'limit' => 1 - ]); - if (!empty($attachment[0]) && $attachment[0]['res_id'] == $id) { - \Resource\models\AdrModel::deleteDocumentAdr(['where' => ['res_id = ?', 'type = ?'], 'data' => [$_SESSION['doc_id'], 'TNL']]); - \Resource\controllers\ConvertThumbnailController::convert([ - 'collId' => 'letterbox_coll', - 'resId' => $_SESSION['doc_id'], - 'outgoingId' => $id, - 'isOutgoingVersion' => false - ]); - } - } - - } //copie de la version PDF de la pièce si mode de conversion sur le client if ($_SESSION['upfile'][$numAttach]['fileNamePdfOnTmp'] != '' && empty($templateOffice)) { @@ -814,27 +792,6 @@ if (isset($_POST['add']) && $_POST['add']) { } else { $stmt = $db->query("UPDATE res_version_attachments SET status = 'OBS' WHERE res_id = ?", array($previous_attachment->res_id_version)); } - if ($previous_attachment->attachment_type == 'outgoing_mail') { - $extDocument = \Resource\models\ResModel::getExtById(['select' => ['category_id'], 'resId' => $_SESSION['doc_id']]); - - if ($extDocument['category_id'] == 'outgoing') { - $attachment = \Attachment\models\AttachmentModel::getOnView([ - 'select' => ['res_id', 'res_id_version'], - 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status not in (?)'], - 'data' => [$_SESSION['doc_id'], 'outgoing_mail', ['DEL', 'OBS']], - 'limit' => 1 - ]); - if (!empty($attachment[0]) && ($attachment[0]['res_id'] == $previous_attachment->res_id || $attachment[0]['res_id_version'] == $previous_attachment->res_id_version)) { - \Resource\models\AdrModel::deleteDocumentAdr(['where' => ['res_id = ?', 'type = ?'], 'data' => [$_SESSION['doc_id'], 'TNL']]); - \Resource\controllers\ConvertThumbnailController::convert([ - 'collId' => 'letterbox_coll', - 'resId' => $_SESSION['doc_id'], - 'outgoingId' => $id, - 'isOutgoingVersion' => true - ]); - } - } - } } } else { $is_new_version = false; @@ -942,27 +899,6 @@ if (isset($_POST['add']) && $_POST['add']) { } else { $stmt = $db->query('UPDATE res_version_attachments SET '.$set_update.' WHERE res_id = :res_id', $arrayPDO); } - if ($_SESSION['upfile'][0]['upAttachment'] != false) { - $attachment = \Attachment\models\AttachmentModel::getOnView([ - 'select' => ['res_id', 'res_id_version', 'attachment_type'], - 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status not in (?)'], - 'data' => [$_SESSION['doc_id'], 'outgoing_mail', ['DEL', 'OBS']], - 'limit' => 1 - ]); - if (!empty($attachment[0]) && in_array($_REQUEST['res_id'], [$attachment[0]['res_id'], $attachment[0]['res_id_version']])) { - $extDocument = \Resource\models\ResModel::getExtById(['select' => ['category_id'], 'resId' => $_SESSION['doc_id']]); - - if ($extDocument['category_id'] == 'outgoing') { - \Resource\models\AdrModel::deleteDocumentAdr(['where' => ['res_id = ?', 'type = ?'], 'data' => [$_SESSION['doc_id'], 'TNL']]); - \Resource\controllers\ConvertThumbnailController::convert([ - 'collId' => 'letterbox_coll', - 'resId' => $_SESSION['doc_id'], - 'outgoingId' => $id, - 'isOutgoingVersion' => ($_REQUEST['relation'] != 1) - ]); - } - } - } } //copie de la version PDF de la pièce si mode de conversion sur le client if ($_SESSION['modules_loaded']['attachments']['convertPdf'] == true && $_SESSION['upfile'][0]['fileNamePdfOnTmp'] != '' && empty($error) && $_SESSION['upfile'][0]['upAttachment'] != false) { diff --git a/modules/thumbnails/LICENSE.txt b/modules/thumbnails/LICENSE.txt deleted file mode 100755 index 10926e87f11..00000000000 --- a/modules/thumbnails/LICENSE.txt +++ /dev/null @@ -1,675 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - <program> Copyright (C) <year> <name of author> - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -<http://www.gnu.org/licenses/>. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -<http://www.gnu.org/philosophy/why-not-lgpl.html>. - diff --git a/modules/thumbnails/LoggerLog4php.php b/modules/thumbnails/LoggerLog4php.php deleted file mode 100755 index 900b13489c9..00000000000 --- a/modules/thumbnails/LoggerLog4php.php +++ /dev/null @@ -1,314 +0,0 @@ -<?php - -/** Logger class - * - * @author Laurent Giovannoni <dev@maarch.org> - **/ - -class Logger4Php -{ - - /** - * Array of errors levels - * - * @protected - **/ - protected $error_levels = array('DEBUG' => 0, 'INFO' => 1, 'NOTICE' => 2, 'WARNING' => 3, 'ERROR' => 4); - - /** - * Maps each handler with its log threshold. - * - * @protected - **/ - protected $mapping; - - /** - * Minimum log level - * - * @protected - **/ - protected $threshold_level; - - /** - * Path to log4Php library - * - * @protected - **/ - protected $log4PhpLibrary; - - /** - * Name of the logger - * - * @protected - **/ - protected $log4PhpLogger; - - /** - * Name of the business code - * - * @protected - **/ - protected $log4PhpBusinessCode; - - /** - * Path of the param of log4php - * - * @protected - **/ - protected $log4PhpConfigPath; - - /** - * Name of the batch - * - * @protected - **/ - protected $log4PhpBatchName; - - /** Class constructor - * - * Inits the threshold level - * - * @param $threshold_level (string) Threshold level (set to 'INFO' by default) - **/ - function __construct($threshold_level = 'WARNING') - { - $this->threshold_level = $threshold_level; - $this->mapping = array_fill(0, count($this->error_levels), array()); - } - - /** Writes error message in current handlers - * - * writes only if the error level is greater or equal the threshold level - * - * @param $msg (string) Error message - * @param $error_level (string) Error level (set to 'INFO' by default) - * @param $error_code (integer) Error code (set to 0 by default) - **/ - public function write($msg, $error_level = 'INFO', $error_code = 0, $other_params = array()) - { - if (!array_key_exists($error_level, $this->error_levels)) { - $error_level = 'INFO'; - } - $foundLogger = false; - if ($this->error_levels[$error_level] >= $this->error_levels[$this->threshold_level]) { - for ($i=$this->error_levels[$error_level];$i>=0;$i--) { - foreach ($this->mapping[$i] as $handler) { - $handler->write($msg, $error_level, $error_code, $other_params); - if ( - get_class($handler) == 'FileHandler' - && (isset($this->log4PhpLibrary) - && !empty($this->log4PhpLibrary)) - ) { - if ($error_code == 0) { - $result = 'OK'; - } else { - $result = 'KO'; - $msg = '%error_code:' . $error_code . '% ' . $msg; - } - require_once($this->log4PhpLibrary); - $remote_ip = '127.0.0.1'; - Logger::configure($this->log4PhpConfigPath); - $logger = Logger::getLogger($this->log4PhpLogger); - $searchPatterns = array('%ACCESS_METHOD%', - '%RESULT%', - '%BUSINESS_CODE%', - '%HOW%', - '%WHAT%', - '%REMOTE_IP%', - '%BATCH_NAME%' - ); - $replacePatterns = array('Script', - $result, - $this->log4PhpBusinessCode, - 'UP', - $msg, - $remote_ip, - $this->log4PhpBatchName - ); - $logLine = str_replace($searchPatterns, - $replacePatterns, - '[%ACCESS_METHOD%][%RESULT%]' - . '[%BUSINESS_CODE%][%HOW%][%WHAT%][%BATCH_NAME%]' - ); - $this->writeLog4php($logger, $logLine, $error_level); - } - } - } - } - } - - /** - * - * write a log entry with a specific log level - * @param object $logger Log4php logger - * @param string $logLine Line we want to trace - * @param enum $level Log level - */ - function writeLog4php($logger, $logLine, $level) { - switch ($level) { - case 'DEBUG': - $logger->debug($logLine); - break; - case 'INFO': - $logger->info($logLine); - break; - case 'WARNING': - $logger->warn($logLine); - break; - case 'ERROR': - $logger->error($logLine); - break; - case 'FATAL': - $logger->fatal($logLine); - break; - } - } - - /** Adds a new handler in the current handlers array - * - * @param $handler (object) Handler object - **/ - public function add_handler(&$handler, $error_level = NULL) - { - if(!isset($handler)) - return false; - - if(!isset($error_level) || !array_key_exists($error_level, $this->error_levels)) - { - $error_level = $this->threshold_level; - } - - $this->mapping[$this->error_levels[$error_level]][] = $handler; - return true; - } - - /** Adds a new handler in the current handlers array - * - * @param $handler (object) Handler object - **/ - public function change_handler_log_level(&$handler, $log_level ) - { - if (!isset($handler) || !isset($log_level)) - return false; - - if (!array_key_exists($log_level, $this->error_levels)) { - return false; - } - - for ($i=0; $i<count($this->mapping);$i++) { - for($j=0;$j<count($this->mapping[$i]);$j++) { - if($handler == $this->mapping[$i][$j]) { - unset($this->mapping[$i][$j]); - } - } - } - $this->mapping = array_values($this->mapping); - $this->mapping[$this->error_levels[$log_level]][] = $handler; - return true; - } - - /** Sets treshold level - * - * @param $treshold (string) treshold level - **/ - public function set_threshold_level($treshold) - { - if (isset($treshold) && array_key_exists($treshold, $this->error_levels)) { - $this->threshold_level = $treshold; - return true; - } - $this->threshold_level = 'WARNING'; - return false; - } - - /** Sets log4Php library path - * - * @param $log4PhpLibrary (string) path - **/ - public function set_log4PhpLibrary($log4PhpLibrary) - { - if (isset($log4PhpLibrary) && !empty($log4PhpLibrary)) { - if (file_exists($log4PhpLibrary)) { - $this->log4PhpLibrary = $log4PhpLibrary; - return true; - } else { - return false; - } - } - return false; - } - - /** Sets log4php logger name - * - * @param $log4PhpLogger (string) logger name - **/ - public function set_log4PhpLogger($log4PhpLogger) - { - if (isset($log4PhpLogger) && !empty($log4PhpLogger)) { - $this->log4PhpLogger = $log4PhpLogger; - return true; - } - $this->log4PhpLogger = 'loggerTechnique'; - return false; - } - - /** Sets log4php path to log4php xml config - * - * @param $log4PhpPath (string) path to log4php xml config - **/ - public function set_log4PhpConfigPath($log4PhpConfigPath) - { - if (isset($log4PhpConfigPath) && !empty($log4PhpConfigPath)) { - if (file_exists($log4PhpConfigPath)) { - $this->log4PhpConfigPath = $log4PhpConfigPath; - return true; - } else { - return false; - } - } - return false; - } - - /** Sets log4php business code - * - * @param $log4PhpBusinessCode (string) business code - **/ - public function set_log4PhpBusinessCode($log4PhpBusinessCode) - { - if (isset($log4PhpBusinessCode) && !empty($log4PhpBusinessCode)) { - $this->log4PhpBusinessCode = $log4PhpBusinessCode; - return true; - } - $this->log4PhpBusinessCode = 'Maarch'; - return false; - } - - /** Sets log4php batch name - * - * @param $log4PhpBatchName (string) BatchName - **/ - public function set_log4PhpBatchName($log4PhpBatchName) - { - if (isset($log4PhpBatchName) && !empty($log4PhpBatchName)) { - $this->log4PhpBatchName = $log4PhpBatchName; - return true; - } - $this->log4PhpBatchName = 'MaarchBatch'; - return false; - } - - /** Class destructor - * - * Calls handlers destructors - **/ - function __destruct() - { - for($i=0; $i<count($this->mapping);$i++) - { - foreach($this->mapping[$i] as $handler) - { - unset($handler); - } - } - } -} diff --git a/modules/thumbnails/README.txt b/modules/thumbnails/README.txt deleted file mode 100755 index 98a7a24520b..00000000000 --- a/modules/thumbnails/README.txt +++ /dev/null @@ -1,14 +0,0 @@ -Pour Linux : -- Paramétrer un robot qui lance le script launch_batch_thumbnails.sh placé dans modules/thumbnails/scripts - -- Le fichier de paramètres est config_batch_letterbox.xml (dans le dossier xml) - -- Ce script lance le fichier php create_tnl qui permet de créer les miniatures des documents ayant les champs "tnl_path" et "tnl_filename" vides. Ces champs sont à rajouter dans la table res_letterbox (et autres tables liées comme les versions, documents liés, etc.. ?) - -- Les miniatures sont enregistrées dans un docserveur différent (l'id est à définir dans le fichier de paramètres) du docserveur principal - -- La commande de conversion est la suivante - -convert -thumbnail x300 -background white -alpha remove <path_input>[0] <path_output> - -imagemagick et ghostscript sont nécessaires \ No newline at end of file diff --git a/modules/thumbnails/ajaxShowThumb.php b/modules/thumbnails/ajaxShowThumb.php deleted file mode 100755 index 3e9761f1646..00000000000 --- a/modules/thumbnails/ajaxShowThumb.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php -/* -* Copyright 2014-2017 Maarch -* -* This file is part of Maarch Framework. -* -* Maarch Framework is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* Maarch Framework is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. -* -* @brief Displays thumbnails if exists -* -* @file -* @author <dev@maarch.org> -* @date $date$ -* @version $Revision$ -*/ - -require_once 'modules/thumbnails/class/class_modules_tools.php'; - -$error = false; - -if (isset($_REQUEST['resId'])) { - $resId = $_REQUEST['resId']; -} else { - $error = 'RES_ID' . _EMPTY; -} - -if (isset($_REQUEST['collId'])) { - $collId = $_REQUEST['collId']; -} else { - $error = 'COLL_ID' . _EMPTY; -} - -if (!$error) { - $tnl = new thumbnails(); - $path = $tnl->getPathTnl($resId, 'letterbox_coll'); - - if (is_file($path)) { - $return .= '<img src="index.php?page=doc_thumb&module=thumbnails&res_id=' . $resId . '&coll_id=letterbox_coll&display=true">'; - $status = 0; - } else { - $return .= '<span id="no_doc"><i class="fa fa-ban" style="font-size: 460px;color: grey;opacity: 0.2;margin-top: 30px;"></i></span>'; - $status = 1; - } -} else { - $return .= '<span id="no_doc"><i class="fa fa-ban" style="font-size: 460px;color: grey;opacity: 0.2;margin-top: 30px;"></i></span>'; - $status = 1; -} - -echo "{status : " . $status . ", toShow : '" . addslashes($return) . "'}"; -exit (); diff --git a/modules/thumbnails/batch_tools.php b/modules/thumbnails/batch_tools.php deleted file mode 100755 index b19885273e9..00000000000 --- a/modules/thumbnails/batch_tools.php +++ /dev/null @@ -1,155 +0,0 @@ -<?php - -/* - * Copyright 2008-2015 Maarch - * - * This file is part of Maarch Framework. - * - * Maarch Framework is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Maarch Framework is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Maarch Framework. If not, see <http://www.gnu.org/licenses/>. - */ - -/** - * @brief API to manage batchs - * - * @file - * @author Laurent Giovannoni - * @date $date$ - * @version $Revision$ - * @ingroup core - */ - -/** - * Execute a sql query - * - * @param object $dbConn connection object to the database - * @param string $queryTxt path of the file to include - * @param boolean $transaction for rollback if error - * @return true if ok, exit if ko and rollback if necessary - */ -function Bt_doQuery($dbConn, $queryTxt, $param=array(), $transaction=false) -{ - if (count($param) > 0) { - $stmt = $dbConn->query($queryTxt, $param); - } else { - $stmt = $dbConn->query($queryTxt); - } - - if (!$stmt) { - if ($transaction) { - $GLOBALS['logger']->write('ROLLBACK', 'INFO'); - $dbConn->query('ROLLBACK'); - } - Bt_exitBatch( - 104, 'SQL Query error:' . $queryTxt - ); - } - $GLOBALS['logger']->write('SQL query:' . $queryTxt, 'DEBUG'); - return $stmt; -} - -/** - * Exit the batch with a return code, message in the log and - * in the database if necessary - * - * @param int $returnCode code to exit (if > O error) - * @param string $message message to the log and the DB - * @return nothing exit the program - */ -function Bt_exitBatch($returnCode, $message='') -{ - if (file_exists($GLOBALS['lckFile'])) { - unlink($GLOBALS['lckFile']); - } - if ($returnCode > 0) { - $GLOBALS['totalProcessedResources']--; - if ($GLOBALS['totalProcessedResources'] == -1) { - $GLOBALS['totalProcessedResources'] = 0; - } - if($returnCode < 100) { - if (file_exists($GLOBALS['errorLckFile'])) { - unlink($GLOBALS['errorLckFile']); - } - $semaphore = fopen($GLOBALS['errorLckFile'], "a"); - fwrite($semaphore, '1'); - fclose($semaphore); - } - $GLOBALS['logger']->write($message, 'ERROR', $returnCode); - Bt_logInDataBase($GLOBALS['totalProcessedResources'], 1, $message.' (return code: '. $returnCode.')'); - } elseif ($message <> '') { - $GLOBALS['logger']->write($message, 'INFO', $returnCode); - Bt_logInDataBase($GLOBALS['totalProcessedResources'], 0, $message.' (return code: '. $returnCode.')'); - } - Bt_updateWorkBatch(); - exit($returnCode); -} - -/** -* Insert in the database the report of the batch -* @param long $totalProcessed total of resources processed in the batch -* @param long $totalErrors total of errors in the batch -* @param string $info message in db -*/ -function Bt_logInDataBase($totalProcessed=0, $totalErrors=0, $info='') -{ - $query = "INSERT INTO history_batch (module_name, batch_id, event_date, " - . "total_processed, total_errors, info) values(?, ?, CURRENT_TIMESTAMP, ?, ?, ?)"; - $arrayPDO = array($GLOBALS['batchName'], $GLOBALS['wb'], $totalProcessed, $totalErrors, substr(str_replace('\\', '\\\\', str_replace("'", "`", $info)), 0, 999)); - $GLOBALS['db']->query($query, $arrayPDO); -} - -/** - * Get the batch if of the batch - * - * @return nothing - */ -function Bt_getWorkBatch() -{ - $req = "SELECT param_value_int FROM parameters WHERE id = ? "; - $stmt = $GLOBALS['db']->query($req, array($GLOBALS['batchName']."_id")); - - while ($reqResult = $stmt->fetchObject()) { - $GLOBALS['wb'] = $reqResult->param_value_int + 1; - } - if ($GLOBALS['wb'] == '') { - $req = "INSERT INTO parameters(id, param_value_int) VALUES (?, 1)"; - $GLOBALS['db']->query($req, array($GLOBALS['batchName']."_id")); - $GLOBALS['wb'] = 1; - } -} - -/** - * Update the database with the new batch id of the batch - * - * @return nothing - */ -function Bt_updateWorkBatch() -{ - $req = "UPDATE parameters SET param_value_int = ? WHERE id = ?"; - $GLOBALS['db']->query($req, array($GLOBALS['wb'], $GLOBALS['batchName']."_id")); -} - -/** - * Include the file requested if exists - * - * @param string $file path of the file to include - * @return nothing - */ -function Bt_myInclude($file) -{ - if (file_exists($file)) { - include_once ($file); - } else { - throw new IncludeFileError($file); - } -} diff --git a/modules/thumbnails/class/class_modules_tools.php b/modules/thumbnails/class/class_modules_tools.php deleted file mode 100755 index 49a77110a7c..00000000000 --- a/modules/thumbnails/class/class_modules_tools.php +++ /dev/null @@ -1,250 +0,0 @@ -<?php - -class thumbnails -{ - /*function __construct() - { - parent::__construct(); - }*/ - - public function build_modules_tables() - { - if (file_exists( - $_SESSION['config']['corepath'] . 'custom' . DIRECTORY_SEPARATOR - . $_SESSION['custom_override_id'] . DIRECTORY_SEPARATOR . "modules" - . DIRECTORY_SEPARATOR . "thumbnails" . DIRECTORY_SEPARATOR . "xml" - . DIRECTORY_SEPARATOR . "config.xml" - ) - ) { - $configPath = $_SESSION['config']['corepath'] . 'custom' - . DIRECTORY_SEPARATOR . $_SESSION['custom_override_id'] - . DIRECTORY_SEPARATOR . "modules" . DIRECTORY_SEPARATOR - . "thumbnails" . DIRECTORY_SEPARATOR . "xml" - . DIRECTORY_SEPARATOR . "config.xml"; - } else { - $configPath = "modules" . DIRECTORY_SEPARATOR . "thumbnails" - . DIRECTORY_SEPARATOR . "xml" . DIRECTORY_SEPARATOR - . "config.xml"; - } - - $xmlconfig = simplexml_load_file($configPath); - $conf = $xmlconfig->CONFIG; - - } - - private function r_mkdir_tnl($path, $mode = 0777, $recursive = true) { - if(empty($path)) - return false; - - if($recursive) { - $toDo = substr($path, 0, strrpos($path, DIRECTORY_SEPARATOR)); - if($toDo !== '.' && $toDo !== '..') - $this->r_mkdir_tnl($toDo, $mode); - } - - if(!is_dir($path)) - mkdir($path, $mode); - - return true; -} - public function generateTnl($res_id, $coll_id, $table_name = false){ - $db = new Database(); - $query = "select docserver_id from docservers where is_readonly = 'N' and " - . " coll_id = ? and docserver_type_id = 'TNL'"; - $stmt1 = $db->query($query, array($coll_id)); - - if($res = $stmt1->fetchObject()){ - $docserverId = $res->docserver_id; - }else{ - $docserverId=''; - } - - $docServers = "select docserver_id, path_template, device_label from docservers"; - - $stmt1 = $db->query($docServers,array()); - while ($queryResult = $stmt1->fetchObject()) { - $pathToDocServer[$queryResult->docserver_id] = $queryResult->path_template; - } - $pathOutput = $pathToDocServer[(string)$docserverId]; - if (!$table_name) $table_name = 'res_letterbox'; - $queryMakeThumbnails = "select docserver_id, path, filename, format from ". $table_name . " where res_id = ? "; - $stmt1 = $db->query($queryMakeThumbnails, array($res_id)); - - while ($queryResult=$stmt1->fetchObject()) { - $fileFormat = $queryResult->format; - $path= $queryResult->path; - $filename= $queryResult->filename; - - $pathToFile = $pathToDocServer[$queryResult->docserver_id] - . str_replace("#", DIRECTORY_SEPARATOR, $path) - . $queryResult->filename; - $outputPathFile = $pathOutput . str_replace("#", DIRECTORY_SEPARATOR, $path) - . str_replace(pathinfo($pathToFile, PATHINFO_EXTENSION), "png",$filename); - } - - if ( - strtoupper($fileFormat) <> 'PDF' - && strtoupper($fileFormat) <> 'HTML' - && strtoupper($fileFormat) <> 'MAARCH' - ) { - $stmt2 = $db->query("UPDATE ".$table_name." SET tnl_path = 'ERR', tnl_filename = 'ERR' WHERE res_id = ?", array($res_id)); - - } else { - $racineOut = $pathOutput . str_replace("#", DIRECTORY_SEPARATOR, $path); - if (!is_dir($racineOut)){ - $this->r_mkdir_tnl($racineOut,0777); - } - - $command = ''; - - if (strtoupper($fileFormat) == 'PDF') { - $command = "convert -density 100x100 -quality 65 -alpha remove " . escapeshellarg($pathToFile) . " ". escapeshellarg($outputPathFile); - } else { - $posPoint = strpos($pathToFile, '.'); - $extension = substr($pathToFile, $posPoint); - $chemin = substr($pathToFile, 0, $posPoint); - if($extension == '.maarch'){ - if (!copy($pathToFile, $chemin.'.html')) { - echo "La copie $pathToFile du fichier a échoué...\n"; - }else{ - $cheminComplet = $chemin.".html"; - $command = "wkhtmltoimage --width 400 --height 600 --quality 100 --zoom 0.2 " . escapeshellarg($cheminComplet) . " " - . escapeshellarg($outputPathFile); - - } - }else{ - $command = "wkhtmltoimage --width 400 --height 600 --quality 100 --zoom 0.2 " . escapeshellarg($pathToFile) . " " - . escapeshellarg($outputPathFile); - } - } - echo $command; - exec($command.' 2>&1', $output, $result); - if($result > 0) - { - echo 'document not converted ! ('.$output[0].')'; - }else{ - if (is_file($outputPathFile)){ - $stmt2 = $db->query("UPDATE ".$table_name." SET tnl_path = ?, tnl_filename = ? WHERE res_id = ?", array($path, str_replace(pathinfo($pathToFile, PATHINFO_EXTENSION), "png",$filename), $res_id)); - } - else if (is_file(pathinfo($outputPathFile,PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . pathinfo($outputPathFile,PATHINFO_FILENAME).'-0.png')){ - $newFilename = pathinfo($outputPathFile,PATHINFO_FILENAME).'-0.png'; - $stmt2 = $db->query("UPDATE ".$table_name." SET tnl_path = ?, tnl_filename = ? WHERE res_id = ?", array($path, $newFilename, $res_id)); - } - return $this->getPathTnl($res_id, $coll_id, $table_name); - } - } - } - - public function getPathTnl($res_id, $coll_id, $table_name = false) - { - if (empty($res_id)) { - return ''; - } - - $tnlAdr = \Resource\models\AdrModel::getTypedDocumentAdrByResId([ - 'select' => ['docserver_id', 'path', 'filename'], - 'resId' => $res_id, - 'type' => 'TNL' - ]); - if (empty($tnlAdr)) { - return ''; - } - $docserver = \Docserver\models\DocserverModel::getByDocserverId([ - 'select' => ['path_template'], - 'docserverId' => $tnlAdr['docserver_id'] - ]); - $tnlPath = str_replace("#", DIRECTORY_SEPARATOR , $tnlAdr['path']); - $path = $docserver['path_template'] . DIRECTORY_SEPARATOR . $tnlPath . $tnlAdr['filename']; - $path = str_replace("//", "/", $path); - - return $path; - } - - public function testMultiPage($path_tnl){ - if (strpos(pathinfo($path_tnl,PATHINFO_FILENAME),"-0") === false){ - return array($path_tnl); - } - else{ - $rep = pathinfo($path_tnl,PATHINFO_DIRNAME); - $basefile = explode("-",pathinfo($path_tnl,PATHINFO_FILENAME)); - $basefile = $basefile[0]; - $directory = opendir($rep); - while (false !== ($filename = readdir($directory))) { - if (strpos($filename,$basefile) !== false) - $tmpfiles[] = $rep.DIRECTORY_SEPARATOR.$filename; - } - - $files = array(); - foreach($tmpfiles as $tmp){ - $tmp_basefile = explode("-",pathinfo($tmp,PATHINFO_FILENAME)); - $cpt = $tmp_basefile[1]; - $files[$cpt] = $tmp; - } - return $files; - } - } - - /** - * Retrieve the path of source file to process - * @param array $aArgs - * @return string - */ - public function getTnlPathWithColl(array $aArgs = []) { - if (empty($aArgs['resId'])) { - throw new \Exception('resId empty'); - } - if (empty($aArgs['collId'])) { - throw new \Exception('collId empty'); - } - - $resId = $aArgs['resId']; - $collId = $aArgs['collId']; - - for ($i=0;$i < count($_SESSION['collections']);$i++) { - if ($_SESSION['collections'][$i]['id'] == $collId) { - $resTable = $_SESSION['collections'][$i]['table']; - } - } - if (empty($resTable)) { - return false; - } - - $oRowSet = \SrcCore\models\DatabaseModel::select([ - 'select' => ['path_template'], - 'table' => ['docservers'], - 'where' => ['docserver_type_id = ?'], - 'data' => ['TNL'] - ]); - - if (empty($oRowSet[0]['path_template'])) { - throw new \Exception('TNL docserver path empty'); - } - - $docserverPath = $oRowSet[0]['path_template']; - - $oRowSet = \SrcCore\models\DatabaseModel::select([ - 'select' => ['tnl_path', 'tnl_filename'], - 'table' => [$resTable], - 'where' => ['res_id = ?'], - 'data' => [$resId] - ]); - - if (empty($oRowSet)) { - return false; - } - - $path = ''; - $filename = ''; - if (!empty($oRowSet[0]['tnl_path'])) { - $path = $oRowSet[0]['tnl_path']; - } - if (!empty($oRowSet[0]['tnl_filename'])) { - $filename = $oRowSet[0]['tnl_filename']; - } - $sourceFilePath = $docserverPath . $path . $filename; - $sourceFilePath = str_replace('#', DIRECTORY_SEPARATOR, $sourceFilePath); - - return $sourceFilePath; - } - -} diff --git a/modules/thumbnails/create_tnl.php b/modules/thumbnails/create_tnl.php deleted file mode 100755 index e6f3ab8cecf..00000000000 --- a/modules/thumbnails/create_tnl.php +++ /dev/null @@ -1,314 +0,0 @@ -<?php -/** -* Copyright Maarch since 2008 under licence GPLv3. -* See LICENCE.txt file at the root folder for more details. -* This file is part of Maarch software. - -* @brief create_tnl -* @author dev <dev@maarch.org> -* @ingroup thumbnails -*/ - -try { - include 'Maarch_CLITools/ArgsParser.php'; - include 'LoggerLog4php.php'; - include 'Maarch_CLITools/FileHandler.php'; - include 'Maarch_CLITools/ConsoleHandler.php'; -} catch (IncludeFileError $e) { - echo 'Maarch_CLITools required ! \n (pear.maarch.org)\n'; - exit(106); -} -// Load tools -require 'batch_tools.php'; - -$GLOBALS['batchName'] = 'thumbnails'; -$GLOBALS['wb'] = ''; -$GLOBALS['lckFile'] = ''; -$totalProcessedResources = 0; - -// Open Logger -$GLOBALS['logger'] = new Logger4Php(); -$GLOBALS['logger']->set_threshold_level('DEBUG'); - -$logFile = 'log/' . date('Y-m-d_H-i-s') . '.log'; - -$file = new FileHandler($logFile); -$GLOBALS['logger']->add_handler($file); - -//error mode and function -error_reporting(E_ERROR); -set_error_handler(errorHandler); -// global vars of the program -/** -* Name of the config (usefull for multi instance) -*/ -$GLOBALS['config_name'] = ""; -/** -* Path to the log file -*/ -$GLOBALS['log'] = ""; -/** -* User exit of the program, contains 1 if any problem appears -*/ -$GLOBALS['ErrorLevel'] = 0; -/** -* Connection object to database 1 -*/ -$GLOBALS['db'] = ""; - -// Class to manage files includes errors -class IncludeFileError extends Exception -{ - public function __construct($file) - { - $this->file = $file; - parent::__construct("Include File \"$file\" is missing!", 1); - } -} - -function MyInclude($file) -{ - if (file_exists($file)) { - include_once $file; - } else { - throw new IncludeFileError($file); - } -} - -function r_mkdir($path, $mode = 0777, $recursive = true) -{ - if(empty($path)) - return false; - - if ($recursive) { - $toDo = substr($path, 0, strrpos($path, DIRECTORY_SEPARATOR)); - if($toDo !== '.' && $toDo !== '..') - r_mkdir($toDo, $mode); - } - - if(!is_dir($path)) - mkdir($path, $mode); - - return true; -} - -/** -* Managing of errors -* @param $errno integer number of the error -* @param $errstr string text of the error -* @param $errfile string file concerned with the error -* @param $errline integer line of the error -* @param $errcontext string context of the error -*/ -function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) -{ - $GLOBALS['logger']->write('from line ' . $errline . ' : ' . $errstr, 'WARNING', 1); - $GLOBALS['errorLevel'] = 1; -} - -// Begin -date_default_timezone_set('Europe/Paris'); -if ($argc != 2) { - echo "You must specify the configuration file." . $argc; - exit; -} -$conf = $argv[1]; -; -if (!file_exists($conf)) { - $GLOBALS['logger']->write("Can't load xml config file ! (".$conf.")", "ERROR"); - exit(); -} else { - $xmlconfig = simplexml_load_file($conf); -} -foreach ($xmlconfig->CONFIG as $CONFIG) { - $GLOBALS['config_name'] = $CONFIG->CONFIG_NAME; - - $GLOBALS['tablename'] = $CONFIG->TABLE_NAME; - $GLOBALS['collection'] = $CONFIG->COLLECTION; - - $GLOBALS['max_batch_size'] = $CONFIG->MAX_BATCH_SIZE; - $maarchDirectory = (string) $CONFIG->MaarchDirectory; - $GLOBALS['core_path'] = $maarchDirectory . 'core' . DIRECTORY_SEPARATOR; -} -$GLOBALS['databasetype'] = $xmlconfig->CONFIG_BASE->databasetype; - -$log4phpParams = $xmlconfig->LOG4PHP; -if ((string) $log4phpParams->enabled == 'true') { - $GLOBALS['logger']->set_log4PhpLibrary( - $maarchDirectory . 'apps/maarch_entreprise/tools/log4php/Logger.php' - ); - $GLOBALS['logger']->set_log4PhpLogger((string) $log4phpParams->Log4PhpLogger); - $GLOBALS['logger']->set_log4PhpBusinessCode((string) $log4phpParams->Log4PhpBusinessCode); - $GLOBALS['logger']->set_log4PhpConfigPath((string) $log4phpParams->Log4PhpConfigPath); - $GLOBALS['logger']->set_log4PhpBatchName('thumbnails'); -} - -$GLOBALS['logger']->write("Launch of process of thumbnails conversion"); -$GLOBALS['logger']->write("Loading the xml config file"); -$GLOBALS['logger']->write("Config name : " . $GLOBALS['config_name']); -$GLOBALS['logger']->write("Conversion launched for table : " . $GLOBALS['tablename']); - -require $GLOBALS['core_path']."class/class_functions.php"; -require $GLOBALS['core_path']."class/class_db_pdo.php"; - -$GLOBALS['db'] = new Database($conf); - - -Bt_getWorkBatch(); - -$query = "select docserver_id from docservers where is_readonly = 'N' and " - . " coll_id = ? and docserver_type_id = 'TNL'"; - -$stmt1 = $GLOBALS['db']->query($query, array($GLOBALS['collection'])); -if ($res = $stmt1->fetchObject()) { - $docserverId = $res->docserver_id; -} else { - $docserverId=''; -} - -if ($docserverId <> '') { - $GLOBALS['logger']->write("TNL docserver found !"); -} else { - $GLOBALS['logger']->write("TNL docserver not found ! (query : ".$query, "ERROR"); - exit(); -} - -$docserversList = array(); -$docServers = "select docserver_id, path_template, device_label from docservers"; -$stmt1 = $GLOBALS['db']->query($docServers); -while ($queryResult = $stmt1->fetchObject()) { - $pathToDocServer[$queryResult->docserver_id] = $queryResult->path_template; - $docserversList[] = $queryResult->docserver_id; -} -$docserversList = implode(', ', $docserversList); -//$GLOBALS['logger']->write("List of docServers : " . $docserversList); - -if (is_dir($pathToDocServer[(string)$docserverId])) { - $pathOutput = $pathToDocServer[(string)$docserverId]; - $GLOBALS['logger']->write("TNL path: ".$pathOutput); - -} else { - $pathOutput = $pathToDocServer[(string)$docserverId]; - $GLOBALS['logger']->write("Wrong TNL path ! (".$pathOutput.")", "ERROR"); - exit(); -} -$cpt_batch_size=0; - -$queryCount = "select count(1) as count from " - . $GLOBALS['tablename'] . " where (tnl_filename = '' or tnl_filename is null) " - . " and (filename <> '' or filename is not null)"; -$stmt1 = $GLOBALS['db']->query($queryCount); - -$nbResToProcess = $stmt1->fetchObject()->count; - -$queryMakeThumbnails = "select res_id, docserver_id, path, filename, format from " - . $GLOBALS['tablename'] . " where (tnl_filename = '' or tnl_filename is null) " - . " and (filename <> '' or filename is not null)"; - -$stmt1 = $GLOBALS['db']->query($queryMakeThumbnails); - -if ($nbResToProcess === 0) { - Bt_exitBatch(0, 'No document to process'); -} else { - $GLOBALS['logger']->write($nbResToProcess." document(s) to process..."); -} - -$i = 1; -$err = 0; -$errInfo = ''; -while ($queryResult=$stmt1->fetchObject()) { - if ($GLOBALS['max_batch_size'] >= $cpt_batch_size) { - $fileFormat = $queryResult->format; - $pathToFile = $pathToDocServer[$queryResult->docserver_id] - . str_replace("#", DIRECTORY_SEPARATOR, $queryResult->path) - . $queryResult->filename; - $outputPathFile = $pathOutput . str_replace("#", DIRECTORY_SEPARATOR, $queryResult->path) - . str_replace(pathinfo($pathToFile, PATHINFO_EXTENSION), "png",$queryResult->filename); - - $GLOBALS['logger']->write('Process n°'.$i.'/'.$nbResToProcess.' (RES_ID => '.$queryResult->res_id.', FORMAT => '.$fileFormat.', PATH => '.$pathToFile.')'); - - - if (strtoupper($fileFormat) <> 'PDF' - && strtoupper($fileFormat) <> 'HTML' - && strtoupper($fileFormat) <> 'MAARCH' - ) { - $errTxt = "file format not allowed : " . $fileFormat; - $errInfo = ' (Last Error : '.$errTxt.')'; - - $stmt2 = $GLOBALS['db']->query("UPDATE ".$GLOBALS['tablename']." SET tnl_path = 'ERR', tnl_filename = 'ERR' WHERE res_id = ?", array($queryResult->res_id)); - $GLOBALS['logger']->write('document not converted ! ('.$errTxt.')',"ERROR"); - $err++; - } else { - $racineOut = $pathOutput . str_replace("#", DIRECTORY_SEPARATOR, $queryResult->path); - if (!is_dir($racineOut)) { - r_mkdir($racineOut, 0777); - $GLOBALS['logger']->write("Create $racineOut directory "); - } - - $command = ''; - if (strtoupper($fileFormat) == 'PDF') { - /*$command = "convert -thumbnail 400x600 -background white -alpha remove " . escapeshellarg($pathToFile) . "[0] " - . escapeshellarg($outputPathFile);*/ - /* convert all pdf pages to img, without resize, low quality */ - $command = "convert -density 100x100 -quality 65 -background white -alpha remove " . escapeshellarg($pathToFile) . " ". escapeshellarg($outputPathFile); - } else { - $posPoint = strpos($pathToFile, '.'); - $extension = substr($pathToFile, $posPoint); - $chemin = substr($pathToFile, 0, $posPoint); - if ($extension == '.maarch') { - if (!copy($pathToFile, $chemin.'.html')) { - echo "La copie $pathToFile du fichier a échoué...\n"; - } else { - echo "La copie $pathToFile du fichier a réussi...\n"; - $cheminComplet = $chemin.".html"; - $command = "wkhtmltoimage --width 400 --height 600 --quality 100 --zoom 0.2 " . escapeshellarg($cheminComplet) . " " - . escapeshellarg($outputPathFile); - - } - } else { - $command = "wkhtmltoimage --width 400 --height 600 --quality 100 --zoom 0.2 " . escapeshellarg($pathToFile) . " " - . escapeshellarg($outputPathFile); - } - } - exec($command.' 2>&1', $output, $result); - if ($result > 0) { - - $err++; - $errInfo = ' (Last Error : '.$output[0].')'; - $stmt2 = $GLOBALS['db']->query("UPDATE ".$GLOBALS['tablename']." SET tnl_path = 'ERR', tnl_filename = 'ERR' WHERE res_id = ?", array($queryResult->res_id)); - $GLOBALS['logger']->write('document not converted ! ('.$output[0].') => '.$command,"ERROR"); - } else { - if (is_file($outputPathFile)) { - $stmt2 = $GLOBALS['db']->query("UPDATE ".$GLOBALS['tablename']." SET tnl_path = ?, tnl_filename = ? WHERE res_id = ?", array($queryResult->path, str_replace(pathinfo($pathToFile, PATHINFO_EXTENSION), "png",$queryResult->filename), $queryResult->res_id)); - - } else if (is_file(pathinfo($outputPathFile,PATHINFO_DIRNAME) . DIRECTORY_SEPARATOR . pathinfo($outputPathFile,PATHINFO_FILENAME).'-0.png')) { - $newFilename = pathinfo($outputPathFile,PATHINFO_FILENAME).'-0.png'; - $stmt2 = $GLOBALS['db']->query("UPDATE ".$GLOBALS['tablename']." SET tnl_path = ?, tnl_filename = ? WHERE res_id = ?", array($queryResult->path, $newFilename, $queryResult->res_id)); - } - $GLOBALS['logger']->write('document converted'); - } - } - } else { - $converted_doc = $i - $err; - $GLOBALS['logger']->write($converted_doc.' document(s) converted, MAX BATCH SIZE EXCEDEED !'.$errInfo); - Bt_logInDataBase( - $i, $err, $i.' document(s) converted, MAX BATCH SIZE EXCEDEED !'.$errInfo - ); - break; - } - $i++; - $cpt_batch_size++; -} -$i--; - -$converted_doc = $i - $err; -$GLOBALS['logger']->write($converted_doc.' document(s) converted'); - -Bt_logInDataBase( - $i, $err, $converted_doc.' document(s) converted'.$errInfo -); - -Bt_updateWorkBatch(); -$GLOBALS['logger']->write("End of application !"); - -exit(); diff --git a/modules/thumbnails/css/module.css b/modules/thumbnails/css/module.css deleted file mode 100755 index 31b1a8c7bb4..00000000000 --- a/modules/thumbnails/css/module.css +++ /dev/null @@ -1,66 +0,0 @@ -.iconDoc span { - display: none; -} -.iconDoc:hover span { - display: block; - position:fixed; - /*position:absolute;*/ - left:10px; - top:10px; - /*margin-left:-420px;*/ - /*margin-top:-110px;*/ - border: solid 1px rgb(0, 157, 197); - -moz-box-shadow: 0px 0px 5px 0px #656565; - -webkit-box-shadow: 0px 0px 5px 0px #656565; - -o-box-shadow: 0px 0px 5px 0px #656565; - box-shadow: 0px 0px 5px 0px #656565; - filter:progid:DXImageTransform.Microsoft.Shadow(color=#656565, Direction=NaN, Strength=5); - z-index:100; - height:600px; - width:auto; -} - -.iconDoc:hover span img { - height:600px; - width:auto; -} - -.iconDoc:hover #no_doc { - display: inline; - position:fixed; - /*position:absolute;*/ - left:10px; - top:10px; - /*margin-top:0px;*/ - padding: 10px; - background: #ffffff; - color: #AD5453; - -moz-box-shadow: 0px 0px 5px 0px #656565; - -webkit-box-shadow: 0px 0px 5px 0px #656565; - -o-box-shadow: 0px 0px 5px 0px #656565; - box-shadow: 0px 0px 5px 0px #656565; - filter:progid:DXImageTransform.Microsoft.Shadow(color=#656565, Direction=NaN, Strength=5); - z-index:100; - height:550px; - width: 400px; -} - -.iconDoc #no_doc:after { - content: 'AUCUN APERÇU DISPONIBLE'; - font-size:20px; - font-weight:bold; - position: absolute; - left:18%; - top: 50%; - color: rgb(0, 157, 197); - opacity:1; -} -.iconDoc span:after { - content: 'APERÇU'; - font-size:20px; - font-weight:bold; - position: absolute; - left:35%; - color: rgb(0, 157, 197); - opacity:0.2; -} diff --git a/modules/thumbnails/doc_thumb.php b/modules/thumbnails/doc_thumb.php deleted file mode 100755 index 58056a3f8d6..00000000000 --- a/modules/thumbnails/doc_thumb.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php - require_once 'modules/thumbnails/class/class_modules_tools.php'; - - $resId = $_REQUEST['res_id']; - $collId = $_REQUEST['coll_id']; - $advanced = $_REQUEST['advanced']; - - $tnl = new thumbnails(); - if (empty($advanced)) { - if (isset($_REQUEST['tablename'])) { - $path = $tnl->getPathTnl($resId, $collId,$_REQUEST['tablename']); - } - else { - $path = $tnl->getPathTnl($resId, $collId); - } - } else { - $path = $tnl->getTnlPathWithColl(['resId' => $resId, 'collId' => $collId]); // New Behaviour - } - if (!is_file($path) && !empty($advanced)){ - $path = 'modules/thumbnails/no_thumb.png'; - } elseif (!is_file($path)) { - exit(); - } - - $tab_tnl = $tnl->testMultiPage($path); - if (!isset($_REQUEST['num_page'])) $num_page = 0; - else $num_page = $_GET['num_page']; - $mime_type = 'image/png'; - $date = mktime(0,0,0,date("m" ) + 2 ,date("d" ) ,date("Y" ) ); - $date = date("D, d M Y H:i:s", $date); - $time = 30*12*60*60; - header("Pragma: public"); - header("Expires: ".$date." GMT"); - header("Cache-Control: max-age=".$time.", must-revalidate"); - header("Content-Description: File Transfer"); - header("Content-Type: ".$mime_type); - header("Content-Disposition: inline; filename=filename;"); - header("Content-Transfer-Encoding: binary"); - readfile($tab_tnl[$num_page]); - exit(); diff --git a/modules/thumbnails/doc_thumb_frame.php b/modules/thumbnails/doc_thumb_frame.php deleted file mode 100755 index 08f729df0cc..00000000000 --- a/modules/thumbnails/doc_thumb_frame.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php - require_once 'modules/thumbnails/class/class_modules_tools.php'; - - $res_id = $_REQUEST['res_id']; - $coll_id = $_REQUEST['coll_id']; - $advanced = $_REQUEST['advanced']; - $tnl = new thumbnails(); - - if (isset($_REQUEST['res_id_attach'])){ - $path = $tnl->getPathTnl($_REQUEST['res_id_attach'], $coll_id, 'res_attachments'); - - if (!is_file($path) && !empty($advanced)){ - $path = 'modules/thumbnails/no_thumb.png'; - } elseif (!is_file($path)) { - exit(); - } - $tab_tnl = $tnl->testMultiPage($path); - } - - else{ - if (empty($advanced)) { - $path = $tnl->getPathTnl($res_id, $coll_id); - } else { - $path = $tnl->getTnlPathWithColl(['resId' => $res_id, 'collId' => $coll_id]); // New Behaviour - } - if (!is_file($path) && !empty($advanced)){ - $path = 'modules/thumbnails/no_thumb.png'; - } elseif (!is_file($path)) { - exit(); - } - $tab_tnl = $tnl->testMultiPage($path); - } -?> -<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> - <div class="pswp__bg"></div> - <div class="pswp__scroll-wrap"> - <div class="pswp__container"> - <div class="pswp__item"></div> - <div class="pswp__item"></div> - <div class="pswp__item"></div> - </div> - <?php - if (count($tab_tnl) == 1) $style_bar = 'pswp__ui--idle'; - else $style_bar = ''; - ?> - <div class="pswp__ui pswp__ui--hidden <?php echo $style_bar; ?>"> - <div class="pswp__top-bar"> - <div class="pswp__counter " ></div> - <!--<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>--> - <button class="pswp__button pswp__button--share" title="Share"></button> - <!--<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>--> - <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> - <div class="pswp__preloader"> - <div class="pswp__preloader__icn"> - <div class="pswp__preloader__cut"> - <div class="pswp__preloader__donut"></div> - </div> - </div> - </div> - </div> - <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> - <div class="pswp__share-tooltip"></div> - </div> - <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> - </button> - <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> - </button> - <div class="pswp__caption"> - <div class="pswp__caption__center"></div> - </div> - </div> - </div> -</div> -<script> - var pswpElement = document.querySelectorAll('.pswp')[0]; - // build items array - var items = [ - <?php - //ksort($tab_tnl); - //echo "<pre>".print_r($tab_tnl,true)."</pre>"; - if (isset($_REQUEST['res_id_attach'])){ - foreach ($tab_tnl as $num_page=>$path){ - ?> - { - - src: 'index.php?page=doc_thumb&module=thumbnails&res_id=<?php echo $_REQUEST['res_id_attach'];?>&coll_id=letterbox_coll&body_loaded&display=true&num_page=<?php echo $num_page;?>&tablename=res_attachments', - w: 827, - h: 1169 - }, - <?php - } - } - else{ - foreach ($tab_tnl as $num_page=>$path){ - ?> - { - - src: 'index.php?page=doc_thumb&module=thumbnails&res_id=<?php echo $res_id;?>&coll_id=letterbox_coll&body_loaded&display=true&num_page=<?php echo $num_page;?>', - w: 827, - h: 1169 - }, - <?php - } - } - ?> - ]; - - var options = { - index: 0, - closeOnVerticalDrag : false, - closeOnScroll : false, - history : false, - pinchToClose : false - }; - var gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); - gallery.init(); - -</script> \ No newline at end of file diff --git a/modules/thumbnails/js/functions.js b/modules/thumbnails/js/functions.js deleted file mode 100755 index 8dd87f3ae73..00000000000 --- a/modules/thumbnails/js/functions.js +++ /dev/null @@ -1,32 +0,0 @@ -function showThumb(divName, resId, collId) -{ - var path_manage_script = 'index.php?module=thumbnails&page=ajaxShowThumb&display=true'; - /*new Ajax.Request(path_manage_script, - { - method:'post', - parameters: { resId : resId, collId : collId}, - onSuccess: function(answer) { - eval("response = "+answer.responseText); - $(divName+resId).innerHTML = response.toShow; - } - });*/ - $j.ajax({ - url: path_manage_script, - type: 'POST', - data: { - resId : resId, - collId : collId - }, - success: function(answer) - { - eval("response = "+answer); - if(response.status==0){ - $j('#'+divName+resId).html(response.toShow); - } - }, - error: function(error) - { - alert(error); - } - }); -} \ No newline at end of file diff --git a/modules/thumbnails/lang/en.php b/modules/thumbnails/lang/en.php deleted file mode 100755 index b9ec8ab30b4..00000000000 --- a/modules/thumbnails/lang/en.php +++ /dev/null @@ -1,3 +0,0 @@ -<?php -if (!defined('_THUMBNAILS_COMMENT')) - define('_THUMBNAILS_COMMENT', 'Unit of thumbnails'); diff --git a/modules/thumbnails/lang/fr.php b/modules/thumbnails/lang/fr.php deleted file mode 100755 index 928cbff44ae..00000000000 --- a/modules/thumbnails/lang/fr.php +++ /dev/null @@ -1,3 +0,0 @@ -<?php -if (!defined('_THUMBNAILS_COMMENT')) - define('_THUMBNAILS_COMMENT', 'Module des miniatures'); diff --git a/modules/thumbnails/log/test.txt b/modules/thumbnails/log/test.txt deleted file mode 100755 index e69de29bb2d..00000000000 diff --git a/modules/thumbnails/no_thumb.png b/modules/thumbnails/no_thumb.png deleted file mode 100755 index f1a0596d15fbe6096872c313773f14851f684283..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13380 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 diff --git a/modules/thumbnails/scripts/launch_batch_thumbnails.sh b/modules/thumbnails/scripts/launch_batch_thumbnails.sh deleted file mode 100755 index 0513ebfe00c..00000000000 --- a/modules/thumbnails/scripts/launch_batch_thumbnails.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -cd /var/www/html/maarch_courrier_trunk/modules/thumbnails/ -php /var/www/html/maarch_courrier_trunk/modules/thumbnails/create_tnl.php /var/www/html/maarch_courrier_trunk/modules/thumbnails/xml/config_batch_letterbox.xml -php /var/www/html/maarch_courrier_trunk/modules/thumbnails/create_tnl.php /var/www/html/maarch_courrier_trunk/modules/thumbnails/xml/config_batch_attachments.xml \ No newline at end of file diff --git a/modules/thumbnails/xml/IVS/data_types.xml b/modules/thumbnails/xml/IVS/data_types.xml deleted file mode 100755 index 710b3b56651..00000000000 --- a/modules/thumbnails/xml/IVS/data_types.xml +++ /dev/null @@ -1,3 +0,0 @@ -<dataTypes> - -</dataTypes> \ No newline at end of file diff --git a/modules/thumbnails/xml/IVS/requests_definitions.xml b/modules/thumbnails/xml/IVS/requests_definitions.xml deleted file mode 100755 index a8291960c19..00000000000 --- a/modules/thumbnails/xml/IVS/requests_definitions.xml +++ /dev/null @@ -1,23 +0,0 @@ -<requestDefinitions> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="get_thumbnails" > - <parameter name="module" value="thumbnails"/> - <parameter name="page" value="doc_thumb"/> - <parameter name="res_id"/> - <parameter name="coll_id"/> - <parameter name="num_page"/> - <parameter name="tablename"/> - <parameter name="display" value="true"/> - <parameter name="advanced"/> - </requestDefinition> - <requestDefinition method="GET" path="/apps/maarch_entreprise/index.php" validationRule="get_thumbnails" > - <parameter name="module" value="thumbnails"/> - <parameter name="page" value="doc_thumb_frame"/> - <parameter name="res_id"/> - <parameter name="coll_id"/> - <parameter name="num_page"/> - <parameter name="tablename"/> - <parameter name="getAttach"/> - <parameter name="display" value="true"/> - <parameter name="advanced"/> - </requestDefinition> -</requestDefinitions> \ No newline at end of file diff --git a/modules/thumbnails/xml/IVS/validation_rules.xml b/modules/thumbnails/xml/IVS/validation_rules.xml deleted file mode 100755 index 789bc4a1b7f..00000000000 --- a/modules/thumbnails/xml/IVS/validation_rules.xml +++ /dev/null @@ -1,10 +0,0 @@ -<validationRules> - <validationRule name="get_thumbnails" extends="standardForm" mode="error"> - <parameter name="coll_id" type="collection_list" /> - <parameter name="res_id" type="integer" /> - <parameter name="num_page" type="integer" /> - <parameter name="tablename" type="string" /> - <parameter name="module" type="identifier" /> - <parameter name="advanced" type="string" /> - </validationRule> -</validationRules> \ No newline at end of file diff --git a/modules/thumbnails/xml/config.xml b/modules/thumbnails/xml/config.xml deleted file mode 100755 index 967fa52e432..00000000000 --- a/modules/thumbnails/xml/config.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ROOT> - <CONFIG> - <name>thumbnails</name> - <comment>_THUMBNAILS_COMMENT</comment> - <loaded>true</loaded> - </CONFIG> -</ROOT> diff --git a/modules/thumbnails/xml/config.xml.default b/modules/thumbnails/xml/config.xml.default deleted file mode 100755 index 967fa52e432..00000000000 --- a/modules/thumbnails/xml/config.xml.default +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ROOT> - <CONFIG> - <name>thumbnails</name> - <comment>_THUMBNAILS_COMMENT</comment> - <loaded>true</loaded> - </CONFIG> -</ROOT> diff --git a/modules/thumbnails/xml/config_batch_attachments.xml.default b/modules/thumbnails/xml/config_batch_attachments.xml.default deleted file mode 100755 index 1c38ff0409e..00000000000 --- a/modules/thumbnails/xml/config_batch_attachments.xml.default +++ /dev/null @@ -1,23 +0,0 @@ -<ROOT> - <CONFIG> - <CONFIG_NAME>create_tnl_letterbox</CONFIG_NAME> - <MaarchDirectory>/var/www/MaarchCourrier/</MaarchDirectory> - <TABLE_NAME>res_attachments</TABLE_NAME> <!-- Table a surveiller pour les documents à convertir --> - <COLLECTION>letterbox_coll</COLLECTION> - <MAX_BATCH_SIZE>500</MAX_BATCH_SIZE> <!-- Nombre d'occurences max pour les conversions --> - </CONFIG> - <CONFIG_BASE> - <databaseserver>localhost</databaseserver> - <databaseserverport>5432</databaseserverport> - <databasetype>POSTGRESQL</databasetype> - <databasename>maarchcourrier</databasename> - <databaseuser>maarch</databaseuser> - <databasepassword>maarch</databasepassword> - </CONFIG_BASE> - <LOG4PHP> - <enabled>true</enabled> - <Log4PhpLogger>loggerTechnique</Log4PhpLogger> - <Log4PhpBusinessCode>thumbnails</Log4PhpBusinessCode> - <Log4PhpConfigPath>/var/www/MaarchCourrier/apps/maarch_entreprise/xml/log4php.xml</Log4PhpConfigPath> - </LOG4PHP> -</ROOT> \ No newline at end of file diff --git a/modules/thumbnails/xml/config_batch_letterbox.xml.default b/modules/thumbnails/xml/config_batch_letterbox.xml.default deleted file mode 100755 index 25d12867e0b..00000000000 --- a/modules/thumbnails/xml/config_batch_letterbox.xml.default +++ /dev/null @@ -1,23 +0,0 @@ -<ROOT> - <CONFIG> - <CONFIG_NAME>create_tnl_letterbox</CONFIG_NAME> - <MaarchDirectory>/var/www/MaarchCourrier/</MaarchDirectory> - <TABLE_NAME>res_letterbox</TABLE_NAME> <!-- Table a surveiller pour les documents à convertir --> - <COLLECTION>letterbox_coll</COLLECTION> - <MAX_BATCH_SIZE>500</MAX_BATCH_SIZE> <!-- Nombre d'occurences max pour les conversions --> - </CONFIG> - <CONFIG_BASE> - <databaseserver>localhost</databaseserver> - <databaseserverport>5432</databaseserverport> - <databasetype>POSTGRESQL</databasetype> - <databasename>maarchcourrier</databasename> - <databaseuser>maarch</databaseuser> - <databasepassword>maarch</databasepassword> - </CONFIG_BASE> - <LOG4PHP> - <enabled>true</enabled> - <Log4PhpLogger>loggerTechnique</Log4PhpLogger> - <Log4PhpBusinessCode>thumbnails</Log4PhpBusinessCode> - <Log4PhpConfigPath>/var/www/MaarchCourrier/apps/maarch_entreprise/xml/log4php.xml</Log4PhpConfigPath> - </LOG4PHP> -</ROOT> \ No newline at end of file diff --git a/modules/thumbnails/xml/services.xml b/modules/thumbnails/xml/services.xml deleted file mode 100755 index 125decc2e67..00000000000 --- a/modules/thumbnails/xml/services.xml +++ /dev/null @@ -1,3 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<root> -</root> diff --git a/sql/develop.sql b/sql/develop.sql index 93f539828ce..a583e945777 100644 --- a/sql/develop.sql +++ b/sql/develop.sql @@ -154,6 +154,7 @@ DO $$ BEGIN ALTER TABLE res_letterbox DROP COLUMN IF EXISTS tnl_filename; END IF; END$$; +INSERT INTO parameters (id, description, param_value_string) VALUES ('thumbnailsSize', 'Taille des imagettes', '750x900'); /* Refactoring */ DROP VIEW IF EXISTS af_view_customer_target_view; diff --git a/src/app/resource/controllers/ConvertThumbnailController.php b/src/app/resource/controllers/ConvertThumbnailController.php index eb903e6410e..b4b167bd5e1 100644 --- a/src/app/resource/controllers/ConvertThumbnailController.php +++ b/src/app/resource/controllers/ConvertThumbnailController.php @@ -19,6 +19,7 @@ namespace Resource\controllers; use Attachment\models\AttachmentModel; use Docserver\controllers\DocserverController; use Docserver\models\DocserverModel; +use Parameter\models\ParameterModel; use Resource\models\AdrModel; use Resource\models\ResModel; use SrcCore\models\CoreConfigModel; @@ -64,7 +65,12 @@ class ConvertThumbnailController $command = "wkhtmltoimage --height 600 --width 400 --quality 100 --zoom 0.2 " . escapeshellarg($pathToDocument) . ' ' . escapeshellarg("{$tmpPath}{$fileNameOnTmp}.png"); } else { - $command = "convert -thumbnail 1000x1500 -background white -alpha remove " + $size = '750x900'; + $parameter = ParameterModel::getById(['id' => 'thumbnailsSize', 'select' => ['param_value_string']]); + if (!empty($parameter) && preg_match('/[0-9]{3,4}[x][0-9]{3,4}/', $parameter['param_value_string'])) { + $size = $parameter['param_value_string']; + } + $command = "convert -thumbnail {$size} -background white -alpha remove " . escapeshellarg($pathToDocument) . '[0] ' . escapeshellarg("{$tmpPath}{$fileNameOnTmp}.png"); } exec($command, $output, $return); diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php index 624f1f572f1..10725b9c115 100755 --- a/src/app/resource/controllers/ResController.php +++ b/src/app/resource/controllers/ResController.php @@ -326,21 +326,47 @@ class ResController return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']); } + $pathToThumbnail = 'apps/maarch_entreprise/img/noThumbnail.png'; $tnlAdr = AdrModel::getTypedDocumentAdrByResId([ 'select' => ['docserver_id', 'path', 'filename'], 'resId' => $aArgs['resId'], 'type' => 'TNL' ]); if (empty($tnlAdr)) { - return $response->withStatus(400)->withJson(['errors' => 'Thumbnail does not exist']); + $extDocument = ResModel::getExtById(['select' => ['category_id'], 'resId' => $aArgs['resId']]); + if ($extDocument['category_id'] == 'outgoing') { + $attachment = AttachmentModel::getOnView([ + 'select' => ['res_id', 'res_id_version'], + 'where' => ['res_id_master = ?', 'attachment_type = ?', 'status not in (?)'], + 'data' => [$aArgs['resId'], 'outgoing_mail', ['DEL', 'OBS']], + 'limit' => 1 + ]); + if (!empty($attachment[0])) { + ConvertThumbnailController::convert([ + 'collId' => 'letterbox_coll', + 'resId' => $aArgs['resId'], + 'outgoingId' => empty($attachment[0]['res_id']) ? $attachment[0]['res_id_version'] : $attachment[0]['res_id'], + 'isOutgoingVersion' => empty($attachment[0]['res_id']) + ]); + } + } else { + ConvertThumbnailController::convert(['collId' => 'letterbox_coll', 'resId' => $aArgs['resId']]); + } + $tnlAdr = AdrModel::getTypedDocumentAdrByResId([ + 'select' => ['docserver_id', 'path', 'filename'], + 'resId' => $aArgs['resId'], + 'type' => 'TNL' + ]); } - $docserver = DocserverModel::getByDocserverId(['docserverId' => $tnlAdr['docserver_id'], 'select' => ['path_template']]); - if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { - return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']); - } + if (!empty($tnlAdr)) { + $docserver = DocserverModel::getByDocserverId(['docserverId' => $tnlAdr['docserver_id'], 'select' => ['path_template']]); + if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) { + return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']); + } - $pathToThumbnail = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $tnlAdr['path']) . $tnlAdr['filename']; + $pathToThumbnail = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $tnlAdr['path']) . $tnlAdr['filename']; + } $fileContent = file_get_contents($pathToThumbnail); if ($fileContent === false) { diff --git a/src/app/resource/controllers/StoreController.php b/src/app/resource/controllers/StoreController.php index c0b7801fb1e..d3f86b38d72 100644 --- a/src/app/resource/controllers/StoreController.php +++ b/src/app/resource/controllers/StoreController.php @@ -73,7 +73,7 @@ class StoreController $resId = false; if ($aArgs['table'] == 'res_letterbox') { $resId = ResModel::create($data); - ConvertThumbnailController::convert(['collId' => 'letterbox_coll', 'resId' => 260]); + ConvertThumbnailController::convert(['collId' => 'letterbox_coll', 'resId' => $resId]); } elseif ($aArgs['table'] == 'res_attachments') { $resId = AttachmentModel::create($data); } diff --git a/src/app/signatureBook/controllers/SignatureBookController.php b/src/app/signatureBook/controllers/SignatureBookController.php index c51f0ee0e2c..f565581e7ef 100644 --- a/src/app/signatureBook/controllers/SignatureBookController.php +++ b/src/app/signatureBook/controllers/SignatureBookController.php @@ -170,7 +170,7 @@ class SignatureBookController 'title' => $incomingMail['subject'], 'category_id' => $incomingMail['category_id'], 'viewerLink' => "index.php?display=true&dir=indexing_searching&page=view_resource_controler&visu&id={$resId}&collid=letterbox_coll", - 'thumbnailLink' => "index.php?page=doc_thumb&module=thumbnails&res_id={$resId}&coll_id=letterbox_coll&display=true&advanced=true" + 'thumbnailLink' => "rest/res/{$resId}/thumbnail" ] ]; @@ -202,7 +202,7 @@ class SignatureBookController 'format' => $value['format'], 'isConverted' => $isConverted, 'viewerLink' => "index.php?display=true&module=visa&page=view_pdf_attachement&res_id_master={$resId}&id={$viewerId}", - 'thumbnailLink' => "index.php?page=doc_thumb&module=thumbnails&res_id={$value['res_id']}&coll_id=attachments_coll&display=true&advanced=true" + 'thumbnailLink' => "rest/res/{$value['res_id']}/thumbnail" ]; } @@ -317,8 +317,6 @@ class SignatureBookController $attachments[$key]['icon'] = $attachmentTypes[$value['attachment_type']]['icon']; $attachments[$key]['sign'] = $attachmentTypes[$value['attachment_type']]['sign']; - $attachments[$key]['thumbnailLink'] = "index.php?page=doc_thumb&module=thumbnails&res_id={$realId}&coll_id={$collId}&display=true&advanced=true"; - if(!in_array(strtoupper($value['format']), ['PDF', 'JPG', 'JPEG', 'PNG', 'GIF']) ){ $isVersion = 'false'; } -- GitLab