This file describes changes made on external libraries after being included in Dolibarr root. ALL: ---- Check "@CHANGE" PrestaShopWebservice: --------------------- Replace $params = array('filter', 'display', 'sort', 'limit', 'id_shop', 'id_group_shop'); With $params = array('filter', 'display', 'sort', 'limit', 'id_shop', 'id_group_shop', 'date'); CKEDITOR (4.6.2): ----------------- * In ckeditor/ckeditor/contents.css Replace: body { ... margin: 20px; With body { ... margin: 5px; ESCPOS: ------- Replace private $connector; With protected $connector; NUSOAP: ------- * In file nusoap.php, to avoid a warning, Replace if (isset($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { By if (! is_array($this->methodreturn) && isset($this->methodreturn) && ((get_class($this->methodreturn) == 'soap_fault') || (get_class($this->methodreturn) == 'nusoap_fault'))) { * In file nusoap.php, to avoid a warning, Replace call to serialize_val with no bugged value * In all files, replace constructor names into __construct. Replace also parent::constructor_name with parent::__construct * Line 4222 of file nusoap.php $rev = array(); preg_match('/\$Revision: ([^ ]+)/', $this->revision, $rev); $this->outgoing_headers[] = "X-SOAP-Server: $this->title/$this->version (".(isset($rev[1]) ? $rev[1] : '').")"; TCPDF: ------ * Replace in tcpdf.php: if (isset($this->imagekeys)) { foreach($this->imagekeys as $file) { unlink($file); } } with if (isset($this->imagekeys)) { foreach($this->imagekeys as $file) { // DOL CHANGE If we keep this, source image files are physically destroyed // unlink($file); } } * Replace in tcpdf.php $preserve = array( 'file_id', 'internal_encoding', 'state', 'bufferlen', 'buffer', 'cached_files', with $preserve = array( 'file_id', 'internal_encoding', 'state', 'bufferlen', 'buffer', 'cached_files', // @CHANGE DOL 'imagekeys', * Replace in tcpdf.php if (!@TCPDF_STATIC::file_exists($file)) { return false; } with if (!@TCPDF_STATIC::file_exists($file)) { // DOL CHANGE If we keep this, the image is not visible on pages after the first one. //var_dump($file.' '.(!@TCPDF_STATIC::file_exists($file))); //return false; $tfile = str_replace(' ', '%20', $file); if (@TCPDF_STATIC::file_exists($tfile)) { $file = $tfile; } } * Replace in tcpdf.php if (($imgsrc[0] === '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { with // @CHANGE LDR Add support for src="file://..." links if (strpos($imgsrc, 'file://') === 0) { $imgsrc = str_replace('file://', '/', $imgsrc); $imgsrc = urldecode($imgsrc); $testscrtype = @parse_url($imgsrc); if (empty($testscrtype['query'])) { // convert URL to server path $imgsrc = str_replace(K_PATH_URL, K_PATH_MAIN, $imgsrc); } elseif (preg_match('|^https?://|', $imgsrc) !== 1) { // convert URL to server path $imgsrc = str_replace(K_PATH_MAIN, K_PATH_URL, $imgsrc); } } elseif (($imgsrc[0] === '/') AND !empty($_SERVER['DOCUMENT_ROOT']) AND ($_SERVER['DOCUMENT_ROOT'] != '/')) { * In tecnickcom/tcpdf/include/tcpdf_static.php, in function fopenLocal, replace if (strpos($filename, '://') === false) { with if (strpos($filename, '//') === 0) { // Share folder on a (windows) server // e.g.: "//[MyServerName]/[MySharedFolder]/" // // nothing to change } elseif (strpos($filename, '://') === false) * To avoid to have QRcode changed because generated with a random mask, replace define('QR_FIND_FROM_RANDOM', 2); with define('QR_FIND_FROM_RANDOM', false); * Removed useless directories ("examples", "tools") * Optionnaly, removed all fonts except dejavusans* (used by greek, arab, persan, romanian, turkish), freemono* (russian), cid*+msungstdlight+stsongstdlight+uni2cid* (chinese), helvetica* (all other languages), zapfdingbats.php (for special chars like form checkboxes) * Optionnaly, made freemono the default monotype font if we removed courier In htdocs/includes/tecnickcom/tcpdf/tcpdf.php - protected $default_monospaced_font = 'courier'; + protected $default_monospaced_font = 'freemono'; * In tecnickcom/tcpdf/include/tcpdf_static, in function intToRoman, right at the beginning of the function, replace: $roman = ''; with: $roman = ''; if ($number >= 4000) { // do not represent numbers above 4000 in Roman numerals return strval($number); } TCPDI: ------ Add file fpdf_tpl.php 1.2 Add file tcpdi.php Add file tcpdi_parser.php and replace: require_once(dirname(__FILE__).'/include/tcpdf_filters.php'); with: require_once(dirname(__FILE__).'/../tecnickcom/tcpdf/include/tcpdf_filters.php'); * Fix syntax error by replacing } elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1] >= 2))) { with } elseif (($key == '/Index') AND ($v[0] == PDF_TYPE_ARRAY AND count($v[1]) >= 2)) { * Fix php fatal error on php 8.0 on tcpdi.php while (list($k, $v) = each($value[1])) { with foreach ($value[1] as $k => $v) { * Fix by replacing if ($res[0] == PDF_TYPE_OBJECT) with if (isset($res[0]) && $res[0] == PDF_TYPE_OBJECT) JSGANTT: -------- * Replace in function JSGantt.taskLink var OpenWindow=window.open(pRef, "newwin", "height="+vHeight+",width="+vWidth); with // LDR To open in same window //var OpenWindow=window.open(pRef, "newwin", "height="+vHeight+",width="+vWidth); window.location.href=pRef * Replace vTmpDiv=this.newNode(vTmpCell, 'div', null, null, vTaskList[i].getResource()); with var vTmpNode=this.newNode(vTmpCell, 'div', null, ''); vTmpNode=this.newNode(vTmpNode, 'a', null, '', vLangs[vLang]['moreinfo']); vTmpNode.setAttribute('href',vTaskList[i].getLink()); * Replace '% Comp.' to have a smaller text column header 'comp':'% Comp.' with 'comp':'%' JCROP: ------ * Remove analytics tag into file index.html JQUERYFILETREE: --------------- * Remove directory htdocs/includes/jquery/plugins/jqueryFileTree/connectors RESTLER: -------- * Add line into Util.php to complete function public static function getShortName($className) { // @CHANGE LDR if (!is_string($className)) return; //var_dump($className); * Add line into Data/Text.php to complete function public static function endsWith($haystack, $needle) { $length = strlen($needle); if ($length == 0) { return true; } // @CHANGE LDR if (!is_string($haystack)) return false; * Replace $loaders = array_unique(static::$rogueLoaders); with $loaders = array_unique(static::$rogueLoaders, SORT_REGULAR); * Replace CommentParser.php line 423 elseif (count($value) && is_numeric($value[0])) with elseif (count($value) && isset($value[0]) && is_numeric($value[0])) * Add CommentParser.php line 406 & 407 to remove a warning on api request in php 8.1 empty($value[0]) ? null : empty($value[1]) ? null : +With swagger 2 provided into /explorer: ---------------------------------------- Change content of file htdocs/includes/restler/framework/Luracast/Restler/explorer/index.html PARSEDOWN --------- * Add support of css by adding in Parsedown.php: // @CHANGE LDR 'class' => $Link['element']['attributes']['class'] ... // @CHANGE LDR if (preg_match('/{([^}]+)}/', $remainder, $matches2)) { $Element['attributes']['class'] = $matches2[1]; $remainder = preg_replace('/{'.preg_quote($matches2[1],'/').'}/', '', $remainder); } // @CHANGE LDR //$markup .= $this->{$Element['handler']}($Element['text']); $markup .= preg_replace('/>{[^}]+}/', '>', $this->{$Element['handler']}($Element['text'])); * Fix to avoid fatal error when mb_strlen not available: // @CHANGE LDR Fix when mb_strlen is not available //$shortage = 4 - mb_strlen($line, 'utf-8') % 4; if (function_exists('mb_strlen')) $len = mb_strlen($line, 'utf-8'); else $len = strlen($line); $shortage = 4 - $len % 4; OAUTH ----- Add into Class Google of file OAuth2/Service/Google: // LDR CHANGE Add approval_prompt to force the prompt if value is set to 'force' so it force return of a "refresh token" in addition to "standard token" public $approvalPrompt='auto'; public function setApprouvalPrompt($prompt) { if (!in_array($prompt, array('auto', 'force'), true)) { // @todo Maybe could we rename this exception throw new InvalidAccessTypeException('Invalid approuvalPrompt, expected either auto or force.'); } $this->approvalPrompt = $prompt; } JEDITABLE.JS ------------ *