2008-06-10 20:29:23 +02:00
< ? php
2015-08-31 17:42:08 +02:00
/* Copyright ( C ) 2008 - 2011 Laurent Destailleur < eldy @ users . sourceforge . net >
2018-10-27 14:43:12 +02:00
* Copyright ( C ) 2005 - 2016 Regis Houssin < regis . houssin @ inodbox . com >
2015-08-31 17:42:08 +02:00
* Copyright ( C ) 2012 J . Fernando Lagrange < fernando @ demo - tic . org >
* Copyright ( C ) 2015 Raphaël Doursenaud < rdoursenaud @ gpcsolutions . fr >
2023-02-17 00:29:14 +01:00
* Copyright ( C ) 2023 Eric Seigne < eric . seigne @ cap - rel . fr >
2024-03-13 00:29:40 +01:00
* Copyright ( C ) 2024 MDW < mdeweerd @ users . noreply . github . com >
2008-06-10 20:29:23 +02:00
*
* 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
2013-01-16 15:36:08 +01:00
* the Free Software Foundation ; either version 3 of the License , or
2008-06-10 20:29:23 +02:00
* ( 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
2019-09-23 21:55:30 +02:00
* along with this program . If not , see < https :// www . gnu . org / licenses />.
* or see https :// www . gnu . org /
2008-06-10 20:29:23 +02:00
*/
/**
2011-10-24 11:25:54 +02:00
* \file htdocs / core / lib / admin . lib . php
2008-11-15 22:10:10 +01:00
* \brief Library of admin functions
*/
2008-06-10 20:29:23 +02:00
2019-12-16 13:06:25 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/functions2.lib.php' ;
2008-06-10 20:29:23 +02:00
/**
2011-09-16 20:25:10 +02:00
* Renvoi une version en chaine depuis une version en tableau
*
* @ param array $versionarray Tableau de version ( vermajeur , vermineur , autre )
* @ return string Chaine version
2019-03-11 01:01:15 +01:00
* @ see versioncompare ()
2009-01-26 22:57:14 +01:00
*/
2008-06-10 20:29:23 +02:00
function versiontostring ( $versionarray )
{
2020-10-31 14:32:18 +01:00
$string = '?' ;
2020-12-04 20:28:05 +01:00
if ( isset ( $versionarray [ 0 ])) {
$string = $versionarray [ 0 ];
}
if ( isset ( $versionarray [ 1 ])) {
$string .= '.' . $versionarray [ 1 ];
}
if ( isset ( $versionarray [ 2 ])) {
$string .= '.' . $versionarray [ 2 ];
}
2020-10-31 14:32:18 +01:00
return $string ;
2008-06-10 20:29:23 +02:00
}
/**
2015-07-27 17:09:16 +02:00
* Compare 2 versions ( stored into 2 arrays ) .
2016-03-25 17:14:20 +01:00
* To check if Dolibarr version is lower than ( x , y , z ), do " if versioncompare(versiondolibarrarray(), array(x.y.z)) <= 0 "
2020-10-12 14:01:15 +02:00
* For example : if ( versioncompare ( versiondolibarrarray (), array ( 4 , 0 , - 5 )) >= 0 ) is true if version is 4.0 alpha or higher .
2016-03-25 17:14:20 +01:00
* For example : if ( versioncompare ( versiondolibarrarray (), array ( 4 , 0 , 0 )) >= 0 ) is true if version is 4.0 final or higher .
* For example : if ( versioncompare ( versiondolibarrarray (), array ( 4 , 0 , 1 )) >= 0 ) is true if version is 4.0 . 1 or higher .
2016-07-12 13:03:56 +02:00
* Alternative way to compare : if (( float ) DOL_VERSION >= 4.0 ) is true if version is 4.0 alpha or higher ( works only to compare first and second level )
2011-09-16 20:25:10 +02:00
*
* @ param array $versionarray1 Array of version ( vermajor , verminor , patch )
* @ param array $versionarray2 Array of version ( vermajor , verminor , patch )
* @ return int - 4 , - 3 , - 2 , - 1 if versionarray1 < versionarray2 ( value depends on level of difference )
* 0 if same
* 1 , 2 , 3 , 4 if versionarray1 > versionarray2 ( value depends on level of difference )
2019-03-11 01:01:15 +01:00
* @ see versiontostring ()
2009-05-04 22:57:26 +02:00
*/
2019-01-27 15:20:16 +01:00
function versioncompare ( $versionarray1 , $versionarray2 )
2008-06-10 20:29:23 +02:00
{
2020-10-31 14:32:18 +01:00
$ret = 0 ;
$level = 0 ;
$count1 = count ( $versionarray1 );
$count2 = count ( $versionarray2 );
$maxcount = max ( $count1 , $count2 );
2020-12-04 20:28:05 +01:00
while ( $level < $maxcount ) {
2020-10-31 14:32:18 +01:00
$operande1 = isset ( $versionarray1 [ $level ]) ? $versionarray1 [ $level ] : 0 ;
$operande2 = isset ( $versionarray2 [ $level ]) ? $versionarray2 [ $level ] : 0 ;
2020-12-04 20:28:05 +01:00
if ( preg_match ( '/alpha|dev/i' , $operande1 )) {
$operande1 = - 5 ;
}
if ( preg_match ( '/alpha|dev/i' , $operande2 )) {
$operande2 = - 5 ;
}
if ( preg_match ( '/beta$/i' , $operande1 )) {
$operande1 = - 4 ;
}
if ( preg_match ( '/beta$/i' , $operande2 )) {
$operande2 = - 4 ;
}
if ( preg_match ( '/beta([0-9])+/i' , $operande1 )) {
$operande1 = - 3 ;
}
if ( preg_match ( '/beta([0-9])+/i' , $operande2 )) {
$operande2 = - 3 ;
}
if ( preg_match ( '/rc$/i' , $operande1 )) {
$operande1 = - 2 ;
}
if ( preg_match ( '/rc$/i' , $operande2 )) {
$operande2 = - 2 ;
}
if ( preg_match ( '/rc([0-9])+/i' , $operande1 )) {
$operande1 = - 1 ;
}
if ( preg_match ( '/rc([0-9])+/i' , $operande2 )) {
$operande2 = - 1 ;
}
2020-10-31 14:32:18 +01:00
$level ++ ;
//print 'level '.$level.' '.$operande1.'-'.$operande2.'<br>';
2020-12-04 20:28:05 +01:00
if ( $operande1 < $operande2 ) {
2021-03-01 20:37:16 +01:00
$ret = - $level ;
break ;
2020-12-04 20:28:05 +01:00
}
if ( $operande1 > $operande2 ) {
2021-03-01 20:37:16 +01:00
$ret = $level ;
break ;
2020-12-04 20:28:05 +01:00
}
2020-10-31 14:32:18 +01:00
}
//print join('.',$versionarray1).'('.count($versionarray1).') / '.join('.',$versionarray2).'('.count($versionarray2).') => '.$ret.'<br>'."\n";
return $ret ;
2008-02-01 01:09:23 +01:00
}
/**
2011-01-16 02:14:48 +01:00
* Return version PHP
2011-09-16 20:25:10 +02:00
*
2011-01-16 02:14:48 +01:00
* @ return array Tableau de version ( vermajeur , vermineur , autre )
2021-08-04 20:07:12 +02:00
* @ see versioncompare ()
2009-05-04 22:57:26 +02:00
*/
2008-06-10 20:29:23 +02:00
function versionphparray ()
{
2020-10-31 14:32:18 +01:00
return explode ( '.' , PHP_VERSION );
2008-06-10 20:29:23 +02:00
}
/**
2011-09-16 20:25:10 +02:00
* Return version Dolibarr
*
* @ return array Tableau de version ( vermajeur , vermineur , autre )
2021-08-04 20:07:12 +02:00
* @ see versioncompare ()
2009-05-04 22:57:26 +02:00
*/
2011-09-16 20:25:10 +02:00
function versiondolibarrarray ()
2010-04-30 19:31:46 +02:00
{
2020-10-31 14:32:18 +01:00
return explode ( '.' , DOL_VERSION );
2008-06-10 20:29:23 +02:00
}
/**
2018-08-16 21:48:16 +02:00
* Launch a sql file . Function is used by :
2010-09-29 01:17:31 +02:00
* - Migrate process ( dolibarr - xyz - abc . sql )
* - Loading sql menus ( auguria )
* - Running specific Sql by a module init
2018-08-16 21:48:16 +02:00
* - Loading sql file of website import package
2010-09-29 01:17:31 +02:00
* Install process however does not use it .
2018-08-16 21:48:16 +02:00
* Note that Sql files must have all comments at start of line . Also this function take ';' as the char to detect end of sql request
2011-09-16 20:25:10 +02:00
*
2023-06-26 23:02:17 +02:00
* @ param string $sqlfile Full path to sql file
* @ param int $silent 1 = Do not output anything , 0 = Output line for update page
* @ param int $entity Entity targeted for multicompany module
* @ param int $usesavepoint 1 = Run a savepoint before each request and a rollback to savepoint if error ( this allow to have some request with errors inside global transactions ) .
2023-06-26 23:12:56 +02:00
* @ param string $handler Handler targeted for menu ( replace __HANDLER__ with this value between quotes )
2023-06-26 23:02:17 +02:00
* @ param string $okerror Family of errors we accept ( 'default' , 'none' )
* @ param int $linelengthlimit Limit for length of each line ( Use 0 if unknown , may be faster if defined )
* @ param int $nocommentremoval Do no try to remove comments ( in such a case , we consider that each line is a request , so use also $linelengthlimit = 0 )
* @ param int $offsetforchartofaccount Offset to use to load chart of account table to update sql on the fly to add offset to rowid and account_parent value
* @ param int $colspan 2 = Add a colspan = 2 on td
2024-01-13 19:48:20 +01:00
* @ param int $onlysqltoimportwebsite Only sql requests used to import a website template are allowed
2023-06-26 23:02:17 +02:00
* @ param string $database Database ( replace __DATABASE__ with this value )
2023-12-06 15:46:39 +01:00
* @ return int Return integer <= 0 if KO , > 0 if OK
2009-05-04 22:57:26 +02:00
*/
2023-06-26 23:02:17 +02:00
function run_sql ( $sqlfile , $silent = 1 , $entity = 0 , $usesavepoint = 1 , $handler = '' , $okerror = 'default' , $linelengthlimit = 32768 , $nocommentremoval = 0 , $offsetforchartofaccount = 0 , $colspan = 0 , $onlysqltoimportwebsite = 0 , $database = '' )
2008-06-10 20:29:23 +02:00
{
2020-10-31 18:51:30 +01:00
global $db , $conf , $langs , $user ;
dol_syslog ( " Admin.lib::run_sql run sql file " . $sqlfile . " silent= " . $silent . " entity= " . $entity . " usesavepoint= " . $usesavepoint . " handler= " . $handler . " okerror= " . $okerror , LOG_DEBUG );
2020-12-04 20:28:05 +01:00
if ( ! is_numeric ( $linelengthlimit )) {
2020-10-31 18:51:30 +01:00
dol_syslog ( " Admin.lib::run_sql param linelengthlimit is not a numeric " , LOG_ERR );
return - 1 ;
}
$ok = 0 ;
$error = 0 ;
$i = 0 ;
$buffer = '' ;
$arraysql = array ();
// Get version of database
$versionarray = $db -> getVersionArray ();
$fp = fopen ( $sqlfile , " r " );
2020-12-04 20:28:05 +01:00
if ( $fp ) {
while ( ! feof ( $fp )) {
2020-10-31 18:51:30 +01:00
// Warning fgets with second parameter that is null or 0 hang.
2020-12-04 20:28:05 +01:00
if ( $linelengthlimit > 0 ) {
$buf = fgets ( $fp , $linelengthlimit );
} else {
$buf = fgets ( $fp );
}
2020-10-31 18:51:30 +01:00
// Test if request must be ran only for particular database or version (if yes, we must remove the -- comment)
$reg = array ();
2020-12-04 20:28:05 +01:00
if ( preg_match ( '/^--\sV(MYSQL|PGSQL)([^\s]*)/i' , $buf , $reg )) {
2020-10-31 18:51:30 +01:00
$qualified = 1 ;
// restrict on database type
2020-12-04 20:28:05 +01:00
if ( ! empty ( $reg [ 1 ])) {
if ( ! preg_match ( '/' . preg_quote ( $reg [ 1 ]) . '/i' , $db -> type )) {
$qualified = 0 ;
}
2020-10-31 18:51:30 +01:00
}
// restrict on version
2020-12-04 20:28:05 +01:00
if ( $qualified ) {
if ( ! empty ( $reg [ 2 ])) {
if ( is_numeric ( $reg [ 2 ])) { // This is a version
2020-10-31 18:51:30 +01:00
$versionrequest = explode ( '.' , $reg [ 2 ]);
2022-05-17 15:10:20 +02:00
//var_dump($versionrequest);
//var_dump($versionarray);
2020-12-04 20:28:05 +01:00
if ( ! count ( $versionrequest ) || ! count ( $versionarray ) || versioncompare ( $versionrequest , $versionarray ) > 0 ) {
2020-10-31 18:51:30 +01:00
$qualified = 0 ;
}
2023-12-04 12:05:28 +01:00
} else { // This is a test on a constant. For example when we have -- VMYSQLUTF8UNICODE, we test constant $conf->global->UTF8UNICODE
2020-10-31 18:51:30 +01:00
$dbcollation = strtoupper ( preg_replace ( '/_/' , '' , $conf -> db -> dolibarr_main_db_collation ));
//var_dump($reg[2]);
//var_dump($dbcollation);
2020-12-04 20:28:05 +01:00
if ( empty ( $conf -> db -> dolibarr_main_db_collation ) || ( $reg [ 2 ] != $dbcollation )) {
$qualified = 0 ;
}
2020-10-31 18:51:30 +01:00
//var_dump($qualified);
}
}
}
2020-12-04 20:28:05 +01:00
if ( $qualified ) {
2020-10-31 18:51:30 +01:00
// Version qualified, delete SQL comments
$buf = preg_replace ( '/^--\sV(MYSQL|PGSQL)([^\s]*)/i' , '' , $buf );
//print "Ligne $i qualifi?e par version: ".$buf.'<br>';
}
}
// Add line buf to buffer if not a comment
2020-12-04 20:28:05 +01:00
if ( $nocommentremoval || ! preg_match ( '/^\s*--/' , $buf )) {
if ( empty ( $nocommentremoval )) {
$buf = preg_replace ( '/([,;ERLT\)])\s*--.*$/i' , '\1' , $buf ); //remove comment from a line that not start with -- before add it to the buffer
}
2023-12-04 12:05:28 +01:00
if ( $buffer ) {
$buffer .= ' ' ;
}
2020-10-31 18:51:30 +01:00
$buffer .= trim ( $buf );
}
//print $buf.'<br>';exit;
2020-12-04 20:28:05 +01:00
if ( preg_match ( '/;/' , $buffer )) { // If string contains ';', it's end of a request string, we save it in arraysql.
2020-12-04 20:31:53 +01:00
// Found new request
2020-12-04 20:28:05 +01:00
if ( $buffer ) {
$arraysql [ $i ] = $buffer ;
}
2020-10-31 18:51:30 +01:00
$i ++ ;
$buffer = '' ;
}
}
2020-12-04 20:28:05 +01:00
if ( $buffer ) {
$arraysql [ $i ] = $buffer ;
}
2020-10-31 18:51:30 +01:00
fclose ( $fp );
} else {
dol_syslog ( " Admin.lib::run_sql failed to open file " . $sqlfile , LOG_ERR );
}
// Loop on each request to see if there is a __+MAX_table__ key
$listofmaxrowid = array (); // This is a cache table
2020-12-04 20:28:05 +01:00
foreach ( $arraysql as $i => $sql ) {
2020-10-31 18:51:30 +01:00
$newsql = $sql ;
// Replace __+MAX_table__ with max of table
2020-12-04 20:28:05 +01:00
while ( preg_match ( '/__\+MAX_([A-Za-z0-9_]+)__/i' , $newsql , $reg )) {
2020-10-31 18:51:30 +01:00
$table = $reg [ 1 ];
2020-12-04 20:28:05 +01:00
if ( ! isset ( $listofmaxrowid [ $table ])) {
2020-10-31 18:51:30 +01:00
//var_dump($db);
$sqlgetrowid = 'SELECT MAX(rowid) as max from ' . preg_replace ( '/^llx_/' , MAIN_DB_PREFIX , $table );
$resql = $db -> query ( $sqlgetrowid );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2020-10-31 18:51:30 +01:00
$obj = $db -> fetch_object ( $resql );
$listofmaxrowid [ $table ] = $obj -> max ;
2020-12-04 20:28:05 +01:00
if ( empty ( $listofmaxrowid [ $table ])) {
$listofmaxrowid [ $table ] = 0 ;
}
2020-10-31 18:51:30 +01:00
} else {
2020-12-04 20:28:05 +01:00
if ( ! $silent ) {
2021-08-18 19:32:07 +02:00
print '<tr><td class="tdtop"' . ( $colspan ? ' colspan="' . $colspan . '"' : '' ) . '>' ;
print '<div class="error">' . $langs -> trans ( " Failed to get max rowid for " . $table ) . " </div> " ;
print '</td></tr>' ;
2020-12-04 20:28:05 +01:00
}
2020-10-31 18:51:30 +01:00
$error ++ ;
break ;
}
}
// Replace __+MAX_llx_table__ with +999
$from = '__+MAX_' . $table . '__' ;
$to = '+' . $listofmaxrowid [ $table ];
$newsql = str_replace ( $from , $to , $newsql );
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ) . ' (replacing ' . $from . ' to ' . $to . ')' , LOG_DEBUG );
$arraysql [ $i ] = $newsql ;
}
2020-12-04 20:28:05 +01:00
if ( $offsetforchartofaccount > 0 ) {
2020-10-31 18:51:30 +01:00
// Replace lines
2021-03-26 13:10:06 +01:00
// 'INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 1401, 'PCG99-ABREGE', 'CAPIT', '1234', 1400,...'
2020-10-31 18:51:30 +01:00
// with
2021-03-26 13:10:06 +01:00
// 'INSERT INTO llx_accounting_account (entity, rowid, fk_pcg_version, pcg_type, account_number, account_parent, label, active) VALUES (__ENTITY__, 1401 + 200100000, 'PCG99-ABREGE','CAPIT', '1234', 1400 + 200100000,...'
// Note: string with 'PCG99-ABREGE','CAPIT', 1234 instead of 'PCG99-ABREGE','CAPIT', '1234' is also supported
2021-08-28 00:55:51 +02:00
$newsql = preg_replace ( '/VALUES\s*\(__ENTITY__, \s*(\d+)\s*,(\s*\'[^\',]*\'\s*,\s*\'[^\',]*\'\s*,\s*\'?[^\',]*\'?\s*),\s*\'?([^\',]*)\'?/ims' , 'VALUES (__ENTITY__, \1 + ' . (( int ) $offsetforchartofaccount ) . ', \2, \3 + ' . (( int ) $offsetforchartofaccount ), $newsql );
$newsql = preg_replace ( '/([,\s])0 \+ ' . (( int ) $offsetforchartofaccount ) . '/ims' , '\1 0' , $newsql );
2020-10-31 18:51:30 +01:00
//var_dump($newsql);
$arraysql [ $i ] = $newsql ;
2021-03-26 13:10:06 +01:00
// FIXME Because we force the rowid during insert, we must also update the sequence with postgresql by running
// SELECT dol_util_rebuild_sequences();
2020-10-31 18:51:30 +01:00
}
}
// Loop on each request to execute request
$cursorinsert = 0 ;
$listofinsertedrowid = array ();
2022-02-23 19:24:17 +01:00
$keyforsql = md5 ( $sqlfile );
2020-12-04 20:28:05 +01:00
foreach ( $arraysql as $i => $sql ) {
if ( $sql ) {
2022-07-12 10:56:03 +02:00
// Test if th SQL is allowed SQL
2022-06-07 16:05:01 +02:00
if ( $onlysqltoimportwebsite ) {
2023-06-26 23:02:17 +02:00
$newsql = str_replace ( array ( " \ ' " ), '__BACKSLASHQUOTE__' , $sql ); // Replace the \' char
2022-07-12 10:56:03 +02:00
// Remove all strings contents including the ' so we can analyse SQL instruction only later
2022-06-07 16:05:01 +02:00
$l = strlen ( $newsql );
$is = 0 ;
$quoteopen = 0 ;
$newsqlclean = '' ;
while ( $is < $l ) {
$char = $newsql [ $is ];
if ( $char == " ' " ) {
if ( $quoteopen ) {
$quoteopen -- ;
} else {
$quoteopen ++ ;
}
} elseif ( empty ( $quoteopen )) {
$newsqlclean .= $char ;
}
$is ++ ;
}
$newsqlclean = str_replace ( array ( " null " ), '__000__' , $newsqlclean );
//print $newsqlclean."<br>\n";
$qualified = 0 ;
2022-07-12 10:56:03 +02:00
// A very small control. This can still by bypassed by adding a second SQL request concatenated
2022-06-07 16:05:01 +02:00
if ( preg_match ( '/^--/' , $newsqlclean )) {
$qualified = 1 ;
2022-07-12 10:56:03 +02:00
} elseif ( preg_match ( '/^UPDATE llx_website SET \w+ = \d+\+\d+ WHERE rowid = \d+;$/' , $newsqlclean )) {
2022-06-07 16:05:01 +02:00
$qualified = 1 ;
} elseif ( preg_match ( '/^INSERT INTO llx_website_page\([a-z0-9_\s,]+\) VALUES\([0-9_\s,\+]+\);$/' , $newsqlclean )) {
// Insert must match
// INSERT INTO llx_website_page(rowid, fk_page, fk_website, pageurl, aliasalt, title, description, lang, image, keywords, status, date_creation, tms, import_key, grabbed_from, type_container, htmlheader, content, author_alias) VALUES(1+123, null, 17, , , , , , , , , , , null, , , , , );
$qualified = 1 ;
}
2022-07-12 10:56:03 +02:00
// Another check to allow some legitimate original urls
if ( ! $qualified ) {
if ( preg_match ( '/^UPDATE llx_website SET \w+ = \'[a-zA-Z,\s]*\' WHERE rowid = \d+;$/' , $sql )) {
$qualified = 1 ;
}
}
2022-06-07 16:05:01 +02:00
if ( ! $qualified ) {
$error ++ ;
//print 'Request '.($i + 1)." contains non allowed instructions.<br>\n";
//print "newsqlclean = ".$newsqlclean."<br>\n";
2022-07-12 10:56:03 +02:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ) . " contains non allowed instructions. " , LOG_WARNING );
2022-06-07 16:05:01 +02:00
dol_syslog ( '$newsqlclean=' . $newsqlclean , LOG_DEBUG );
break ;
}
}
2020-10-31 18:51:30 +01:00
// Replace the prefix tables
2020-12-04 20:28:05 +01:00
if ( MAIN_DB_PREFIX != 'llx_' ) {
2020-10-31 18:51:30 +01:00
$sql = preg_replace ( '/llx_/i' , MAIN_DB_PREFIX , $sql );
}
2020-12-04 20:28:05 +01:00
if ( ! empty ( $handler )) {
$sql = preg_replace ( '/__HANDLER__/i' , " ' " . $db -> escape ( $handler ) . " ' " , $sql );
}
2020-10-31 18:51:30 +01:00
2023-06-26 23:02:17 +02:00
if ( ! empty ( $database )) {
2023-06-26 23:12:56 +02:00
$sql = preg_replace ( '/__DATABASE__/i' , $db -> escape ( $database ), $sql );
2023-06-26 23:02:17 +02:00
}
2020-10-31 18:51:30 +01:00
$newsql = preg_replace ( '/__ENTITY__/i' , ( ! empty ( $entity ) ? $entity : $conf -> entity ), $sql );
// Add log of request
2020-12-04 20:28:05 +01:00
if ( ! $silent ) {
2022-02-23 19:24:17 +01:00
print '<tr class="trforrunsql' . $keyforsql . '"><td class="tdtop opacitymedium"' . ( $colspan ? ' colspan="' . $colspan . '"' : '' ) . '>' . $langs -> trans ( " Request " ) . ' ' . ( $i + 1 ) . " sql=' " . dol_htmlentities ( $newsql , ENT_NOQUOTES ) . " '</td></tr> \n " ;
2020-12-04 20:28:05 +01:00
}
2020-10-31 18:51:30 +01:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ), LOG_DEBUG );
2019-12-16 13:06:25 +01:00
$sqlmodified = 0 ;
2011-09-21 17:53:54 +02:00
2020-10-31 18:51:30 +01:00
// Replace for encrypt data
2020-12-04 20:28:05 +01:00
if ( preg_match_all ( '/__ENCRYPT\(\'([^\']+)\'\)__/i' , $newsql , $reg )) {
2020-10-31 18:51:30 +01:00
$num = count ( $reg [ 0 ]);
2020-12-04 20:28:05 +01:00
for ( $j = 0 ; $j < $num ; $j ++ ) {
2020-10-31 18:51:30 +01:00
$from = $reg [ 0 ][ $j ];
2021-09-02 13:25:00 +02:00
$to = $db -> encrypt ( $reg [ 1 ][ $j ]);
2020-10-31 18:51:30 +01:00
$newsql = str_replace ( $from , $to , $newsql );
}
$sqlmodified ++ ;
}
// Replace for decrypt data
2020-12-04 20:28:05 +01:00
if ( preg_match_all ( '/__DECRYPT\(\'([A-Za-z0-9_]+)\'\)__/i' , $newsql , $reg )) {
2020-10-31 18:51:30 +01:00
$num = count ( $reg [ 0 ]);
2020-12-04 20:28:05 +01:00
for ( $j = 0 ; $j < $num ; $j ++ ) {
2020-10-31 18:51:30 +01:00
$from = $reg [ 0 ][ $j ];
$to = $db -> decrypt ( $reg [ 1 ][ $j ]);
$newsql = str_replace ( $from , $to , $newsql );
}
$sqlmodified ++ ;
}
2022-06-07 16:05:01 +02:00
// Replace __x__ with the rowid of the result of the insert number x
2020-12-04 20:28:05 +01:00
while ( preg_match ( '/__([0-9]+)__/' , $newsql , $reg )) {
2020-10-31 18:51:30 +01:00
$cursor = $reg [ 1 ];
2020-12-04 20:28:05 +01:00
if ( empty ( $listofinsertedrowid [ $cursor ])) {
if ( ! $silent ) {
2021-08-18 19:32:07 +02:00
print '<tr><td class="tdtop"' . ( $colspan ? ' colspan="' . $colspan . '"' : '' ) . '>' ;
print '<div class="error">' . $langs -> trans ( " FileIsNotCorrect " ) . " </div> " ;
print '</td></tr>' ;
2020-12-04 20:28:05 +01:00
}
2020-10-31 18:51:30 +01:00
$error ++ ;
break ;
}
2022-07-12 10:56:03 +02:00
2020-10-31 18:51:30 +01:00
$from = '__' . $cursor . '__' ;
$to = $listofinsertedrowid [ $cursor ];
$newsql = str_replace ( $from , $to , $newsql );
$sqlmodified ++ ;
}
2020-12-04 20:28:05 +01:00
if ( $sqlmodified ) {
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ), LOG_DEBUG );
}
2020-10-31 18:51:30 +01:00
$result = $db -> query ( $newsql , $usesavepoint );
2020-12-04 20:28:05 +01:00
if ( $result ) {
if ( ! $silent ) {
print '<!-- Result = OK -->' . " \n " ;
}
2020-10-31 18:51:30 +01:00
2020-12-04 20:28:05 +01:00
if ( preg_replace ( '/insert into ([^\s]+)/i' , $newsql , $reg )) {
2020-10-31 18:51:30 +01:00
$cursorinsert ++ ;
// It's an insert
$table = preg_replace ( '/([^a-zA-Z_]+)/i' , '' , $reg [ 1 ]);
$insertedrowid = $db -> last_insert_id ( $table );
$listofinsertedrowid [ $cursorinsert ] = $insertedrowid ;
dol_syslog ( 'Admin.lib::run_sql Insert nb ' . $cursorinsert . ', done in table ' . $table . ', rowid is ' . $listofinsertedrowid [ $cursorinsert ], LOG_DEBUG );
}
// print '<td class="right">OK</td>';
} else {
$errno = $db -> errno ();
2020-12-04 20:28:05 +01:00
if ( ! $silent ) {
print '<!-- Result = ' . $errno . ' -->' . " \n " ;
}
2011-09-21 17:53:54 +02:00
2012-02-10 17:09:13 +01:00
// Define list of errors we accept (array $okerrors)
2020-10-31 18:51:30 +01:00
$okerrors = array ( // By default
2012-02-10 17:09:13 +01:00
'DB_ERROR_TABLE_ALREADY_EXISTS' ,
'DB_ERROR_COLUMN_ALREADY_EXISTS' ,
'DB_ERROR_KEY_NAME_ALREADY_EXISTS' ,
2019-12-16 13:06:25 +01:00
'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS' , // PgSql use same code for table and key already exist
2012-02-10 17:09:13 +01:00
'DB_ERROR_RECORD_ALREADY_EXISTS' ,
'DB_ERROR_NOSUCHTABLE' ,
'DB_ERROR_NOSUCHFIELD' ,
'DB_ERROR_NO_FOREIGN_KEY_TO_DROP' ,
'DB_ERROR_NO_INDEX_TO_DROP' ,
2019-12-16 13:06:25 +01:00
'DB_ERROR_CANNOT_CREATE' , // Qd contrainte deja existante
2012-02-10 17:09:13 +01:00
'DB_ERROR_CANT_DROP_PRIMARY_KEY' ,
2016-04-28 13:56:17 +02:00
'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS' ,
2020-10-31 18:51:30 +01:00
'DB_ERROR_22P02'
2008-06-10 20:29:23 +02:00
);
2020-12-04 20:28:05 +01:00
if ( $okerror == 'none' ) {
$okerrors = array ();
}
2012-02-10 17:09:13 +01:00
2020-10-31 18:51:30 +01:00
// Is it an error we accept
2020-12-04 20:28:05 +01:00
if ( ! in_array ( $errno , $okerrors )) {
if ( ! $silent ) {
2021-08-18 19:32:07 +02:00
print '<tr><td class="tdtop"' . ( $colspan ? ' colspan="' . $colspan . '"' : '' ) . '>' ;
2023-06-26 22:16:19 +02:00
print '<div class="error">' . $langs -> trans ( " Error " ) . " " . $db -> errno () . " (Req " . ( $i + 1 ) . " ): " . $newsql . " <br> " . $db -> error () . " </div> " ;
2021-08-18 19:32:07 +02:00
print '</td></tr>' . " \n " ;
2020-12-04 20:28:05 +01:00
}
2020-10-31 18:51:30 +01:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ) . " Error " . $db -> errno () . " " . $newsql . " <br> " . $db -> error (), LOG_ERR );
$error ++ ;
2008-06-10 20:29:23 +02:00
}
2020-10-31 18:51:30 +01:00
}
}
}
2020-11-26 11:09:35 +01:00
if ( ! $silent ) {
print '<tr><td>' . $langs -> trans ( " ProcessMigrateScript " ) . '</td>' ;
print '<td class="right">' ;
if ( $error == 0 ) {
print '<span class="ok">' . $langs -> trans ( " OK " ) . '</span>' ;
} else {
print '<span class="error">' . $langs -> trans ( " Error " ) . '</span>' ;
}
2021-02-27 12:45:07 +01:00
//if (!empty($conf->use_javascript_ajax)) { // use_javascript_ajax is not defined
2021-11-29 15:09:18 +01:00
print ' < script type = " text/javascript " >
2021-02-27 12:45:07 +01:00
jQuery ( document ) . ready ( function () {
2022-02-23 19:24:17 +01:00
function init_trrunsql '.$keyforsql.' ()
2021-02-27 12:45:07 +01:00
{
2022-02-23 19:24:17 +01:00
console . log ( " toggle .trforrunsql'. $keyforsql .' " );
jQuery ( " .trforrunsql'. $keyforsql .' " ) . toggle ();
2021-02-27 12:45:07 +01:00
}
2022-02-23 19:24:17 +01:00
init_trrunsql '.$keyforsql.' ();
jQuery ( " .trforrunsqlshowhide'. $keyforsql .' " ) . click ( function () {
init_trrunsql '.$keyforsql.' ();
2020-11-26 11:09:35 +01:00
});
2021-02-27 12:45:07 +01:00
});
</ script > ' ;
2022-09-05 12:27:06 +02:00
if ( count ( $arraysql )) {
print ' - <a class="trforrunsqlshowhide' . $keyforsql . '" href="#" title="' . ( $langs -> trans ( " ShowHideTheNRequests " , count ( $arraysql ))) . '">' . $langs -> trans ( " ShowHideDetails " ) . '</a>' ;
} else {
print ' - <span class="opacitymedium">' . $langs -> trans ( " ScriptIsEmpty " ) . '</span>' ;
}
2020-11-26 11:09:35 +01:00
//}
2021-02-27 12:45:07 +01:00
2020-11-26 11:09:35 +01:00
print '</td></tr>' . " \n " ;
}
if ( $error == 0 ) {
2020-10-31 18:51:30 +01:00
$ok = 1 ;
} else {
2024-03-13 00:29:40 +01:00
$ok = 0 ; // @phan-suppress-current-line PhanPluginRedundantAssignment
2020-10-31 18:51:30 +01:00
}
return $ok ;
2008-06-10 20:29:23 +02:00
}
/**
2021-09-02 13:25:00 +02:00
* Delete a constant
2011-09-16 20:25:10 +02:00
*
* @ param DoliDB $db Database handler
2021-09-02 13:25:00 +02:00
* @ param string | int $name Name of constant or rowid of line
2011-09-16 20:25:10 +02:00
* @ param int $entity Multi company id , - 1 for all entities
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2011-09-16 20:25:10 +02:00
*
2019-03-11 01:01:15 +01:00
* @ see dolibarr_get_const (), dolibarr_set_const (), dol_set_user_param ()
2009-05-04 22:57:26 +02:00
*/
2019-01-27 15:20:16 +01:00
function dolibarr_del_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2020-10-31 14:32:18 +01:00
global $conf ;
2011-09-21 17:53:54 +02:00
2020-12-04 20:28:05 +01:00
if ( empty ( $name )) {
2024-01-20 09:22:38 +01:00
dol_print_error ( null , 'Error call dolibar_del_const with parameter name empty' );
2020-10-31 14:32:18 +01:00
return - 1 ;
}
2015-03-18 21:44:57 +01:00
2020-10-31 14:32:18 +01:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
$sql .= " WHERE ( " . $db -> decrypt ( 'name' ) . " = ' " . $db -> escape ( $name ) . " ' " ;
2020-12-04 20:28:05 +01:00
if ( is_numeric ( $name )) {
2021-09-02 13:25:00 +02:00
$sql .= " OR rowid = " . (( int ) $name );
2020-12-04 20:28:05 +01:00
}
2020-10-31 14:32:18 +01:00
$sql .= " ) " ;
2020-12-04 20:28:05 +01:00
if ( $entity >= 0 ) {
2021-05-02 16:24:52 +02:00
$sql .= " AND entity = " . (( int ) $entity );
2020-12-04 20:28:05 +01:00
}
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " admin.lib::dolibarr_del_const " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$conf -> global -> $name = '' ;
return 1 ;
} else {
dol_print_error ( $db );
return - 1 ;
}
2008-02-01 01:09:23 +01:00
}
/**
2021-04-10 12:44:41 +02:00
* Get the value of a setup constant from database
2011-09-16 20:25:10 +02:00
*
* @ param DoliDB $db Database handler
2021-04-10 12:44:41 +02:00
* @ param string $name Name of constant
2011-09-16 20:25:10 +02:00
* @ param int $entity Multi company id
2021-04-10 12:44:41 +02:00
* @ return string Value of constant
2011-09-16 20:25:10 +02:00
*
2019-03-11 01:01:15 +01:00
* @ see dolibarr_del_const (), dolibarr_set_const (), dol_set_user_param ()
2009-05-04 22:57:26 +02:00
*/
2019-01-27 15:20:16 +01:00
function dolibarr_get_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2020-10-31 14:32:18 +01:00
$value = '' ;
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
$sql = " SELECT " . $db -> decrypt ( 'value' ) . " as value " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " const " ;
2021-09-02 13:25:00 +02:00
$sql .= " WHERE name = " . $db -> encrypt ( $name );
2021-04-10 12:44:41 +02:00
$sql .= " AND entity = " . (( int ) $entity );
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " admin.lib::dolibarr_get_const " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$obj = $db -> fetch_object ( $resql );
2020-12-04 20:28:05 +01:00
if ( $obj ) {
2022-08-24 10:22:48 +02:00
include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php' ;
$value = dolDecrypt ( $obj -> value );
2020-12-04 20:28:05 +01:00
}
2020-10-31 14:32:18 +01:00
}
return $value ;
2008-02-01 01:09:23 +01:00
}
/**
2015-03-18 21:44:57 +01:00
* Insert a parameter ( key , value ) into database ( delete old key then insert it again ) .
2011-09-16 20:25:10 +02:00
*
* @ param DoliDB $db Database handler
* @ param string $name Name of constant
* @ param string $value Value of constant
2021-04-10 12:42:43 +02:00
* @ param string $type Type of constant . Deprecated , only strings are allowed for $value . Caller must json encode / decode to store other type of data .
2011-09-16 20:25:10 +02:00
* @ param int $visible Is constant visible in Setup -> Other page ( 0 by default )
* @ param string $note Note on parameter
* @ param int $entity Multi company id ( 0 means all entities )
* @ return int - 1 if KO , 1 if OK
*
2019-03-11 01:01:15 +01:00
* @ see dolibarr_del_const (), dolibarr_get_const (), dol_set_user_param ()
2009-05-04 22:57:26 +02:00
*/
2019-01-27 15:20:16 +01:00
function dolibarr_set_const ( $db , $name , $value , $type = 'chaine' , $visible = 0 , $note = '' , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2020-10-31 14:32:18 +01:00
global $conf ;
2009-04-27 22:37:50 +02:00
2020-10-31 14:32:18 +01:00
// Clean parameters
$name = trim ( $name );
2010-01-13 11:55:23 +01:00
2020-10-31 14:32:18 +01:00
// Check parameters
2020-12-04 20:28:05 +01:00
if ( empty ( $name )) {
2020-10-31 14:32:18 +01:00
dol_print_error ( $db , " Error: Call to function dolibarr_set_const with wrong parameters " , LOG_ERR );
exit ;
}
2009-04-27 22:37:50 +02:00
2020-10-31 14:32:18 +01:00
//dol_syslog("dolibarr_set_const name=$name, value=$value type=$type, visible=$visible, note=$note entity=$entity");
2010-01-21 23:44:57 +01:00
2020-10-31 14:32:18 +01:00
$db -> begin ();
2009-04-14 20:54:13 +02:00
2020-10-31 14:32:18 +01:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
2021-09-02 13:25:00 +02:00
$sql .= " WHERE name = " . $db -> encrypt ( $name );
2020-12-04 20:28:05 +01:00
if ( $entity >= 0 ) {
2021-04-10 12:44:41 +02:00
$sql .= " AND entity = " . (( int ) $entity );
2020-12-04 20:28:05 +01:00
}
2009-12-23 16:26:29 +01:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " admin.lib::dolibarr_set_const " , LOG_DEBUG );
$resql = $db -> query ( $sql );
2008-02-01 01:09:23 +01:00
2020-12-04 20:28:05 +01:00
if ( strcmp ( $value , '' )) { // true if different. Must work for $value='0' or $value=0
2023-08-20 22:20:04 +02:00
if ( ! preg_match ( '/^(MAIN_LOGEVENTS|MAIN_AGENDA_ACTIONAUTO)/' , $name ) && ( preg_match ( '/(_KEY|_EXPORTKEY|_SECUREKEY|_SERVERKEY|_PASS|_PASSWORD|_PW|_PW_TICKET|_PW_EMAILING|_SECRET|_SECURITY_TOKEN|_WEB_TOKEN)$/' , $name ))) {
2022-08-24 10:22:48 +02:00
// This seems a sensitive constant, we encrypt its value
// To list all sensitive constant, you can make a
// WHERE name like '%\_KEY' or name like '%\_EXPORTKEY' or name like '%\_SECUREKEY' or name like '%\_SERVERKEY' or name like '%\_PASS' or name like '%\_PASSWORD' or name like '%\_SECRET'
// or name like '%\_SECURITY_TOKEN' or name like '%\WEB_TOKEN'
include_once DOL_DOCUMENT_ROOT . '/core/lib/security.lib.php' ;
$newvalue = dolEncrypt ( $value );
} else {
$newvalue = $value ;
}
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " const(name, value, type, visible, note, entity) " ;
2020-10-31 14:32:18 +01:00
$sql .= " VALUES ( " ;
2021-09-02 13:25:00 +02:00
$sql .= $db -> encrypt ( $name );
2022-08-24 10:22:48 +02:00
$sql .= " , " . $db -> encrypt ( $newvalue );
$sql .= " , ' " . $db -> escape ( $type ) . " ', " . (( int ) $visible ) . " , ' " . $db -> escape ( $note ) . " ', " . (( int ) $entity ) . " ) " ;
2020-10-31 14:32:18 +01:00
//print "sql".$value."-".pg_escape_string($value)."-".$sql;exit;
//print "xx".$db->escape($value);
dol_syslog ( " admin.lib::dolibarr_set_const " , LOG_DEBUG );
$resql = $db -> query ( $sql );
}
2011-09-21 17:53:54 +02:00
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$db -> commit ();
$conf -> global -> $name = $value ;
return 1 ;
} else {
$error = $db -> lasterror ();
$db -> rollback ();
return - 1 ;
}
2008-02-01 01:09:23 +01:00
}
2008-06-10 20:29:23 +02:00
2017-08-22 14:47:01 +02:00
/**
* Prepare array with list of tabs
*
2023-02-09 00:47:33 +01:00
* @ param int $nbofactivatedmodules Number if activated modules
* @ param int $nboftotalmodules Nb of total modules
* @ param int $nbmodulesnotautoenabled Nb of modules not auto enabled that are activated
* @ return array Array of tabs to show
2017-08-22 14:47:01 +02:00
*/
2023-02-09 00:47:33 +01:00
function modules_prepare_head ( $nbofactivatedmodules , $nboftotalmodules , $nbmodulesnotautoenabled )
2017-08-22 14:47:01 +02:00
{
2021-03-27 13:59:50 +01:00
global $langs , $conf , $user , $form ;
$desc = $langs -> trans ( " ModulesDesc " , '{picto}' );
$desc = str_replace ( '{picto}' , img_picto ( '' , 'switch_off' ), $desc );
2017-08-22 14:47:01 +02:00
$h = 0 ;
$head = array ();
2023-10-13 15:00:51 +02:00
$mode = getDolGlobalString ( 'MAIN_MODULE_SETUP_ON_LIST_BY_DEFAULT' , 'commonkanban' );
2020-12-04 20:28:05 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modules.php?mode= " . $mode ;
2023-02-09 00:47:33 +01:00
if ( $nbmodulesnotautoenabled <= getDolGlobalInt ( 'MAIN_MIN_NB_ENABLED_MODULE_FOR_WARNING' , 1 )) { // If only minimal initial modules enabled)
2021-11-25 09:40:54 +01:00
//$head[$h][1] = $form->textwithpicto($langs->trans("AvailableModules"), $desc);
$head [ $h ][ 1 ] = $langs -> trans ( " AvailableModules " );
2022-01-12 16:09:31 +01:00
$head [ $h ][ 1 ] .= $form -> textwithpicto ( '' , $langs -> trans ( " YouMustEnableOneModule " ) . '.<br><br><span class="opacitymedium">' . $desc . '</span>' , 1 , 'warning' );
2021-03-27 13:59:50 +01:00
} else {
//$head[$h][1] = $langs->trans("AvailableModules").$form->textwithpicto('<span class="badge marginleftonly">'.$nbofactivatedmodules.' / '.$nboftotalmodules.'</span>', $desc, 1, 'help', '', 1, 3);
$head [ $h ][ 1 ] = $langs -> trans ( " AvailableModules " ) . '<span class="badge marginleftonly">' . $nbofactivatedmodules . ' / ' . $nboftotalmodules . '</span>' ;
}
2020-12-04 20:28:05 +01:00
$head [ $h ][ 2 ] = 'modules' ;
2017-08-22 14:47:01 +02:00
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modules.php?mode=marketplace " ;
$head [ $h ][ 1 ] = $langs -> trans ( " ModulesMarketPlaces " );
$head [ $h ][ 2 ] = 'marketplace' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modules.php?mode=deploy " ;
$head [ $h ][ 1 ] = $langs -> trans ( " AddExtensionThemeModuleOrOther " );
$head [ $h ][ 2 ] = 'deploy' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modules.php?mode=develop " ;
$head [ $h ][ 1 ] = $langs -> trans ( " ModulesDevelopYourModule " );
$head [ $h ][ 2 ] = 'develop' ;
$h ++ ;
return $head ;
}
2021-08-17 21:29:15 +02:00
/**
* Prepare array with list of tabs
*
* @ return array Array of tabs to show
*/
function ihm_prepare_head ()
{
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
2021-09-10 10:18:46 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/ihm.php?mode=other " ;
$head [ $h ][ 1 ] = $langs -> trans ( " LanguageAndPresentation " );
$head [ $h ][ 2 ] = 'other' ;
2021-08-17 21:29:15 +02:00
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/ihm.php?mode=template " ;
2021-09-10 10:18:46 +02:00
$head [ $h ][ 1 ] = $langs -> trans ( " SkinAndColors " );
2021-08-17 21:29:15 +02:00
$head [ $h ][ 2 ] = 'template' ;
$h ++ ;
2021-08-22 05:25:13 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/ihm.php?mode=dashboard " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Dashboard " );
$head [ $h ][ 2 ] = 'dashboard' ;
$h ++ ;
2021-08-17 21:29:15 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/ihm.php?mode=login " ;
$head [ $h ][ 1 ] = $langs -> trans ( " LoginPage " );
$head [ $h ][ 2 ] = 'login' ;
$h ++ ;
2023-02-17 00:29:14 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/ihm.php?mode=css " ;
$head [ $h ][ 1 ] = $langs -> trans ( " CSSPage " );
$head [ $h ][ 2 ] = 'css' ;
$h ++ ;
2021-08-17 21:29:15 +02:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'ihm_admin' );
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'ihm_admin' , 'remove' );
return $head ;
}
2017-08-22 14:47:01 +02:00
2008-06-10 20:29:23 +02:00
/**
2012-02-04 10:48:47 +01:00
* Prepare array with list of tabs
2011-09-16 20:25:10 +02:00
*
2014-08-30 05:30:37 +02:00
* @ return array Array of tabs to show
2008-11-26 20:37:25 +01:00
*/
2008-06-10 20:29:23 +02:00
function security_prepare_head ()
{
2020-10-31 14:32:18 +01:00
global $db , $langs , $conf , $user ;
$h = 0 ;
$head = array ();
2008-06-10 20:29:23 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_other.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Miscellaneous " );
$head [ $h ][ 2 ] = 'misc' ;
$h ++ ;
2008-06-10 20:29:23 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Passwords " );
$head [ $h ][ 2 ] = 'passwords' ;
$h ++ ;
2011-04-02 20:55:41 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_file.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Files " ) . ' (' . $langs -> trans ( " Upload " ) . ')' ;
$head [ $h ][ 2 ] = 'file' ;
$h ++ ;
2015-01-12 13:20:27 +01:00
2020-10-31 14:32:18 +01:00
/*
2020-12-04 20:28:05 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_file_download.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Files " ) . ' (' . $langs -> trans ( " Download " ) . ')' ;
$head [ $h ][ 2 ] = 'filedownload' ;
$h ++ ;
2017-08-18 16:10:21 +02:00
*/
2017-08-22 14:47:01 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/proxy.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " ExternalAccess " );
$head [ $h ][ 2 ] = 'proxy' ;
$h ++ ;
2015-01-12 13:20:27 +01:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/events.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Audit " );
$head [ $h ][ 2 ] = 'audit' ;
$h ++ ;
2009-01-21 15:09:42 +01:00
2018-01-25 12:06:22 +01:00
2020-10-31 14:32:18 +01:00
// Show permissions lines
$nbPerms = 0 ;
$sql = " SELECT COUNT(r.id) as nb " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " rights_def as r " ;
$sql .= " WHERE r.libelle NOT LIKE 'tou%' " ; // On ignore droits "tous"
2021-09-02 13:25:00 +02:00
$sql .= " AND entity = " . (( int ) $conf -> entity );
2020-10-31 14:32:18 +01:00
$sql .= " AND bydefault = 1 " ;
2023-11-27 11:39:32 +01:00
if ( ! getDolGlobalString ( 'MAIN_USE_ADVANCED_PERMS' )) {
2020-12-04 20:28:05 +01:00
$sql .= " AND r.perms NOT LIKE '%_advance' " ; // Hide advanced perms if option is not enabled
}
2020-10-31 14:32:18 +01:00
$resql = $db -> query ( $sql );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2020-10-31 14:32:18 +01:00
$obj = $db -> fetch_object ( $resql );
2020-12-04 20:28:05 +01:00
if ( $obj ) {
$nbPerms = $obj -> nb ;
}
} else {
dol_print_error ( $db );
}
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/perms.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultRights " );
2020-12-04 20:28:05 +01:00
if ( $nbPerms > 0 ) {
2023-11-27 11:39:32 +01:00
$head [ $h ][ 1 ] .= ( ! getDolGlobalString ( 'MAIN_OPTIMIZEFORTEXTBROWSER' ) ? '<span class="badge marginleftonlyshort">' . $nbPerms . '</span>' : '' );
2020-12-04 20:28:05 +01:00
}
2020-10-31 14:32:18 +01:00
$head [ $h ][ 2 ] = 'default' ;
$h ++ ;
2011-04-02 20:55:41 +02:00
2020-10-31 14:32:18 +01:00
return $head ;
2008-06-10 20:29:23 +02:00
}
2008-02-01 01:09:23 +01:00
2019-10-29 11:15:03 +01:00
/**
* Prepare array with list of tabs
2023-12-03 20:32:08 +01:00
*
* @ param object $object Descriptor class
2019-10-29 11:15:03 +01:00
* @ return array Array of tabs to show
*/
function modulehelp_prepare_head ( $object )
{
2023-12-03 20:32:08 +01:00
global $langs , $conf ;
2020-10-31 14:32:18 +01:00
$h = 0 ;
$head = array ();
2019-10-29 11:16:49 +01:00
2024-01-13 19:48:20 +01:00
// FIX for compatibility habitual tabs
2020-10-31 14:32:18 +01:00
$object -> id = $object -> numero ;
2019-10-29 11:15:03 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modulehelp.php?id= " . $object -> id . '&mode=desc' ;
$head [ $h ][ 1 ] = $langs -> trans ( " Description " );
$head [ $h ][ 2 ] = 'desc' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modulehelp.php?id= " . $object -> id . '&mode=feature' ;
$head [ $h ][ 1 ] = $langs -> trans ( " TechnicalServicesProvided " );
$head [ $h ][ 2 ] = 'feature' ;
$h ++ ;
2020-12-04 20:28:05 +01:00
if ( $object -> isCoreOrExternalModule () == 'external' ) {
2019-10-29 11:15:03 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/modulehelp.php?id= " . $object -> id . '&mode=changelog' ;
$head [ $h ][ 1 ] = $langs -> trans ( " ChangeLog " );
$head [ $h ][ 2 ] = 'changelog' ;
$h ++ ;
}
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'modulehelp_admin' );
2009-09-02 00:20:55 +02:00
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , $object , $head , $h , 'modulehelp_admin' , 'remove' );
2019-10-29 11:15:03 +01:00
2020-10-31 14:32:18 +01:00
return $head ;
2019-10-29 11:15:03 +01:00
}
2016-09-03 18:47:04 +02:00
/**
* Prepare array with list of tabs
*
* @ return array Array of tabs to show
*/
function translation_prepare_head ()
{
2023-12-03 20:32:08 +01:00
global $langs , $conf ;
2020-10-31 14:32:18 +01:00
$h = 0 ;
$head = array ();
2016-09-03 18:47:04 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/translation.php?mode=searchkey " ;
$head [ $h ][ 1 ] = $langs -> trans ( " TranslationKeySearch " );
$head [ $h ][ 2 ] = 'searchkey' ;
$h ++ ;
2016-09-03 18:47:04 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/translation.php?mode=overwrite " ;
2021-10-18 16:22:19 +02:00
$head [ $h ][ 1 ] = '<span class="valignmiddle">' . $langs -> trans ( " TranslationOverwriteKey " ) . '</span><span class="fa fa-plus-circle valignmiddle paddingleft"></span>' ;
2020-10-31 14:32:18 +01:00
$head [ $h ][ 2 ] = 'overwrite' ;
$h ++ ;
2020-07-24 01:50:57 +02:00
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'translation_admin' );
2016-09-03 18:47:04 +02:00
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'translation_admin' , 'remove' );
2016-09-03 18:47:04 +02:00
2020-10-31 14:32:18 +01:00
return $head ;
2016-09-03 18:47:04 +02:00
}
2017-04-08 14:18:10 +02:00
/**
* Prepare array with list of tabs
*
* @ return array Array of tabs to show
*/
function defaultvalues_prepare_head ()
{
2020-10-31 14:32:18 +01:00
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
2017-04-08 14:18:10 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/defaultvalues.php?mode=createform " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultCreateForm " );
$head [ $h ][ 2 ] = 'createform' ;
$h ++ ;
2017-04-10 12:51:52 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/defaultvalues.php?mode=filters " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultSearchFilters " );
$head [ $h ][ 2 ] = 'filters' ;
$h ++ ;
2017-04-10 12:51:52 +02:00
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/defaultvalues.php?mode=sortorder " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultSortOrder " );
$head [ $h ][ 2 ] = 'sortorder' ;
$h ++ ;
2017-04-08 14:18:10 +02:00
2020-12-04 20:28:05 +01:00
if ( ! empty ( $conf -> use_javascript_ajax )) {
2020-10-31 14:32:18 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/defaultvalues.php?mode=focus " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultFocus " );
$head [ $h ][ 2 ] = 'focus' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/defaultvalues.php?mode=mandatory " ;
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultMandatory " );
$head [ $h ][ 2 ] = 'mandatory' ;
$h ++ ;
}
2018-09-27 16:38:18 +02:00
2020-10-31 14:32:18 +01:00
/* $head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/translation.php?mode=searchkey " ;
2020-12-04 20:28:05 +01:00
$head [ $h ][ 1 ] = $langs -> trans ( " TranslationKeySearch " );
$head [ $h ][ 2 ] = 'searchkey' ;
$h ++ ; */
2017-04-08 14:18:10 +02:00
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'defaultvalues_admin' );
2017-04-08 14:18:10 +02:00
2020-10-31 14:32:18 +01:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'defaultvalues_admin' , 'remove' );
2017-04-08 14:18:10 +02:00
2020-10-31 14:32:18 +01:00
return $head ;
2017-04-08 14:18:10 +02:00
}
2016-09-03 18:47:04 +02:00
2009-09-02 00:20:55 +02:00
/**
* Return list of session
2011-09-16 20:25:10 +02:00
*
2009-09-02 00:20:55 +02:00
* @ return array Array list of sessions
*/
function listOfSessions ()
{
2020-10-31 14:32:18 +01:00
global $conf ;
$arrayofSessions = array ();
// session.save_path can be returned empty so we set a default location and work from there
$sessPath = '/tmp' ;
$iniPath = ini_get ( " session.save_path " );
if ( $iniPath ) {
$sessPath = $iniPath ;
}
$sessPath .= '/' ; // We need the trailing slash
dol_syslog ( 'admin.lib:listOfSessions sessPath=' . $sessPath );
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
$dh = @ opendir ( dol_osencode ( $sessPath ));
2020-12-04 20:28:05 +01:00
if ( $dh ) {
while (( $file = @ readdir ( $dh )) !== false ) {
if ( preg_match ( '/^sess_/i' , $file ) && $file != " . " && $file != " .. " ) {
2020-10-31 14:32:18 +01:00
$fullpath = $sessPath . $file ;
2020-12-04 20:28:05 +01:00
if ( !@ is_dir ( $fullpath ) && is_readable ( $fullpath )) {
2020-10-31 14:32:18 +01:00
$sessValues = file_get_contents ( $fullpath ); // get raw session data
// Example of possible value
2018-05-27 15:04:12 +02:00
//$sessValues = 'newtoken|s:32:"1239f7a0c4b899200fe9ca5ea394f307";dol_loginmesg|s:0:"";newtoken|s:32:"1236457104f7ae0f328c2928973f3cb5";dol_loginmesg|s:0:"";token|s:32:"123615ad8d650c5cc4199b9a1a76783f";
// dol_login|s:5:"admin";dol_authmode|s:8:"dolibarr";dol_tz|s:1:"1";dol_tz_string|s:13:"Europe/Berlin";dol_dst|i:0;dol_dst_observed|s:1:"1";dol_dst_first|s:0:"";dol_dst_second|s:0:"";dol_screenwidth|s:4:"1920";
// dol_screenheight|s:3:"971";dol_company|s:12:"MyBigCompany";dol_entity|i:1;mainmenu|s:4:"home";leftmenuopened|s:10:"admintools";idmenu|s:0:"";leftmenu|s:10:"admintools";';
2016-03-02 11:23:57 +01:00
2020-10-31 14:32:18 +01:00
if ( preg_match ( '/dol_login/i' , $sessValues ) && // limit to dolibarr session
( preg_match ( '/dol_entity\|i:' . $conf -> entity . ';/i' , $sessValues ) || preg_match ( '/dol_entity\|s:([0-9]+):"' . $conf -> entity . '"/i' , $sessValues )) && // limit to current entity
2021-04-23 18:01:11 +02:00
preg_match ( '/dol_company\|s:([0-9]+):"(' . getDolGlobalString ( 'MAIN_INFO_SOCIETE_NOM' ) . ')"/i' , $sessValues )) { // limit to company name
2020-10-31 14:32:18 +01:00
$tmp = explode ( '_' , $file );
$idsess = $tmp [ 1 ];
$regs = array ();
$loginfound = preg_match ( '/dol_login\|s:[0-9]+:"([A-Za-z0-9]+)"/i' , $sessValues , $regs );
2020-12-04 20:28:05 +01:00
if ( $loginfound ) {
$arrayofSessions [ $idsess ][ " login " ] = $regs [ 1 ];
}
2020-10-31 14:32:18 +01:00
$arrayofSessions [ $idsess ][ " age " ] = time () - filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " creation " ] = filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " modification " ] = filemtime ( $fullpath );
$arrayofSessions [ $idsess ][ " raw " ] = $sessValues ;
}
}
}
}
@ closedir ( $dh );
}
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
return $arrayofSessions ;
2009-09-02 00:20:55 +02:00
}
/**
* Purge existing sessions
2011-09-16 20:25:10 +02:00
*
* @ param int $mysessionid To avoid to try to delete my own session
* @ return int > 0 if OK , < 0 if KO
2009-09-02 00:20:55 +02:00
*/
function purgeSessions ( $mysessionid )
{
2020-10-31 14:32:18 +01:00
global $conf ;
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
$sessPath = ini_get ( " session.save_path " ) . " / " ;
dol_syslog ( 'admin.lib:purgeSessions mysessionid=' . $mysessionid . ' sessPath=' . $sessPath );
2011-09-21 17:53:54 +02:00
2020-10-31 14:32:18 +01:00
$error = 0 ;
2020-12-07 15:51:22 +01:00
2020-10-31 14:32:18 +01:00
$dh = @ opendir ( dol_osencode ( $sessPath ));
2020-12-07 15:51:22 +01:00
if ( $dh ) {
while (( $file = @ readdir ( $dh )) !== false ) {
if ( $file != " . " && $file != " .. " ) {
$fullpath = $sessPath . $file ;
if ( !@ is_dir ( $fullpath )) {
$sessValues = file_get_contents ( $fullpath ); // get raw session data
if ( preg_match ( '/dol_login/i' , $sessValues ) && // limit to dolibarr session
preg_match ( '/dol_entity\|s:([0-9]+):"(' . $conf -> entity . ')"/i' , $sessValues ) && // limit to current entity
2023-10-15 15:32:35 +02:00
preg_match ( '/dol_company\|s:([0-9]+):"(' . getDolGlobalString ( 'MAIN_INFO_SOCIETE_NOM' ) . ')"/i' , $sessValues )) { // limit to company name
2020-12-07 15:51:22 +01:00
$tmp = explode ( '_' , $file );
$idsess = $tmp [ 1 ];
// We remove session if it's not ourself
if ( $idsess != $mysessionid ) {
$res = @ unlink ( $fullpath );
if ( ! $res ) {
$error ++ ;
}
2020-12-04 20:28:05 +01:00
}
2020-10-31 14:32:18 +01:00
}
}
}
}
2020-12-07 15:51:22 +01:00
@ closedir ( $dh );
2020-10-31 14:32:18 +01:00
}
2009-09-02 00:20:55 +02:00
2020-12-04 20:28:05 +01:00
if ( ! $error ) {
return 1 ;
} else {
return - $error ;
}
2009-09-02 00:20:55 +02:00
}
2010-11-13 19:57:10 +01:00
/**
* Enable a module
2011-09-16 20:25:10 +02:00
*
2023-01-12 16:26:39 +01:00
* @ param string $value Name of module to activate
* @ param int $withdeps Activate / Disable also all dependencies
* @ param int $noconfverification Remove verification of $conf variable for module
* @ return array array ( 'nbmodules' => nb modules activated with success , 'errors=>array of error messages, ' nbperms ' => Nb permission added );
2010-11-13 19:57:10 +01:00
*/
2023-01-12 16:26:39 +01:00
function activateModule ( $value , $withdeps = 1 , $noconfverification = 0 )
2010-11-13 19:57:10 +01:00
{
2020-10-31 14:32:18 +01:00
global $db , $langs , $conf , $mysoc ;
2019-04-23 10:24:16 +02:00
2020-10-31 14:32:18 +01:00
$ret = array ();
2010-11-13 19:57:10 +01:00
2016-10-11 10:24:10 +02:00
// Check parameters
if ( empty ( $value )) {
$ret [ 'errors' ][] = 'ErrorBadParameter' ;
return $ret ;
}
2010-11-13 19:57:10 +01:00
2024-03-13 00:29:40 +01:00
$ret = array ( 'nbmodules' => 0 , 'errors' => array (), 'nbperms' => 0 );
2020-10-31 14:32:18 +01:00
$modName = $value ;
$modFile = $modName . " .class.php " ;
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Loop on each directory to fill $modulesdir
$modulesdir = dolGetModulesDirs ();
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Loop on each modulesdir directories
$found = false ;
2020-12-04 20:28:05 +01:00
foreach ( $modulesdir as $dir ) {
if ( file_exists ( $dir . $modFile )) {
2020-10-31 14:32:18 +01:00
$found = @ include_once $dir . $modFile ;
2020-12-04 20:28:05 +01:00
if ( $found ) {
break ;
}
2020-10-31 14:32:18 +01:00
}
}
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
$objMod = new $modName ( $db );
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Test if PHP version ok
$verphp = versionphparray ();
$vermin = isset ( $objMod -> phpmin ) ? $objMod -> phpmin : 0 ;
2016-10-11 10:24:10 +02:00
if ( is_array ( $vermin ) && versioncompare ( $verphp , $vermin ) < 0 ) {
$ret [ 'errors' ][] = $langs -> trans ( " ErrorModuleRequirePHPVersion " , versiontostring ( $vermin ));
return $ret ;
}
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Test if Dolibarr version ok
$verdol = versiondolibarrarray ();
$vermin = isset ( $objMod -> need_dolibarr_version ) ? $objMod -> need_dolibarr_version : 0 ;
//print 'version: '.versioncompare($verdol,$vermin).' - '.join(',',$verdol).' - '.join(',',$vermin);exit;
2016-10-11 10:24:10 +02:00
if ( is_array ( $vermin ) && versioncompare ( $verdol , $vermin ) < 0 ) {
$ret [ 'errors' ][] = $langs -> trans ( " ErrorModuleRequireDolibarrVersion " , versiontostring ( $vermin ));
return $ret ;
}
// Test if javascript requirement ok
if ( ! empty ( $objMod -> need_javascript_ajax ) && empty ( $conf -> use_javascript_ajax )) {
$ret [ 'errors' ][] = $langs -> trans ( " ErrorModuleRequireJavascript " );
return $ret ;
}
2010-11-13 19:57:10 +01:00
2017-02-16 09:26:18 +01:00
$const_name = $objMod -> const_name ;
2023-01-12 16:26:39 +01:00
if ( $noconfverification == 0 ) {
2023-10-16 21:15:03 +02:00
if ( getDolGlobalString ( $const_name )) {
2023-01-12 16:26:39 +01:00
return $ret ;
}
2020-10-31 14:32:18 +01:00
}
2017-02-16 09:26:18 +01:00
2020-10-31 14:32:18 +01:00
$result = $objMod -> init (); // Enable module
2018-03-15 21:48:51 +01:00
2020-12-04 20:28:05 +01:00
if ( $result <= 0 ) {
2020-10-31 14:32:18 +01:00
$ret [ 'errors' ][] = $objMod -> error ;
} else {
2020-12-04 20:28:05 +01:00
if ( $withdeps ) {
if ( isset ( $objMod -> depends ) && is_array ( $objMod -> depends ) && ! empty ( $objMod -> depends )) {
2020-10-31 14:32:18 +01:00
// Activation of modules this module depends on
2023-04-21 13:27:50 +02:00
// this->depends may be array('modModule1', 'mmodModule2') or array('always'=>array('modModule1'), 'FR'=>array('modModule2"))
foreach ( $objMod -> depends as $key => $modulestringorarray ) {
2020-10-31 14:32:18 +01:00
//var_dump((! is_numeric($key)) && ! preg_match('/^always/', $key) && $mysoc->country_code && ! preg_match('/^'.$mysoc->country_code.'/', $key));exit;
2020-12-04 20:28:05 +01:00
if (( ! is_numeric ( $key )) && ! preg_match ( '/^always/' , $key ) && $mysoc -> country_code && ! preg_match ( '/^' . $mysoc -> country_code . '/' , $key )) {
2020-10-31 14:32:18 +01:00
dol_syslog ( " We are not concerned by dependency with key= " . $key . " because our country is " . $mysoc -> country_code );
continue ;
}
2023-04-21 13:27:50 +02:00
if ( ! is_array ( $modulestringorarray )) {
$modulestringorarray = array ( $modulestringorarray );
}
2023-04-21 16:02:30 +02:00
foreach ( $modulestringorarray as $modulestring ) {
2023-04-21 13:27:50 +02:00
$activate = false ;
$activateerr = '' ;
foreach ( $modulesdir as $dir ) {
if ( file_exists ( $dir . $modulestring . " .class.php " )) {
$resarray = activateModule ( $modulestring );
if ( empty ( $resarray [ 'errors' ])) {
$activate = true ;
} else {
Qual: Apply automatic phan fixes (deprecations, unneeded imports) (#28154)
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
* Qual: Apply automatic phan fixes (deprecations, unneeded imports)
# Qual: Apply automatic phan fixes (deprecations, unneeded imports)
This applies automatic fixes by phan for deprecated functions, unneeded imports).
2024-02-13 21:46:12 +01:00
$activateerr = implode ( ', ' , $resarray [ 'errors' ]);
2023-04-21 13:27:50 +02:00
foreach ( $resarray [ 'errors' ] as $errorMessage ) {
dol_syslog ( $errorMessage , LOG_ERR );
}
2020-10-31 14:32:18 +01:00
}
2023-04-21 13:27:50 +02:00
break ;
2020-10-31 14:32:18 +01:00
}
}
2017-06-17 11:43:00 +02:00
2023-04-21 13:27:50 +02:00
if ( $activate ) {
$ret [ 'nbmodules' ] += $resarray [ 'nbmodules' ];
$ret [ 'nbperms' ] += $resarray [ 'nbperms' ];
} else {
if ( $activateerr ) {
$ret [ 'errors' ][] = $activateerr ;
}
$ret [ 'errors' ][] = $langs -> trans ( 'activateModuleDependNotSatisfied' , $objMod -> name , $modulestring );
}
2020-10-31 14:32:18 +01:00
}
}
}
2010-11-13 19:57:10 +01:00
2020-12-04 20:28:05 +01:00
if ( isset ( $objMod -> conflictwith ) && is_array ( $objMod -> conflictwith ) && ! empty ( $objMod -> conflictwith )) {
2024-01-13 19:48:20 +01:00
// Deactivation des modules qui entrent en conflict
2020-10-31 14:32:18 +01:00
$num = count ( $objMod -> conflictwith );
2020-12-04 20:28:05 +01:00
for ( $i = 0 ; $i < $num ; $i ++ ) {
foreach ( $modulesdir as $dir ) {
if ( file_exists ( $dir . $objMod -> conflictwith [ $i ] . " .class.php " )) {
2020-10-31 14:32:18 +01:00
unActivateModule ( $objMod -> conflictwith [ $i ], 0 );
}
}
}
}
}
}
2020-12-04 20:28:05 +01:00
if ( ! count ( $ret [ 'errors' ])) {
2020-10-31 14:32:18 +01:00
$ret [ 'nbmodules' ] ++ ;
2023-12-04 12:05:28 +01:00
$ret [ 'nbperms' ] += ( is_array ( $objMod -> rights ) ? count ( $objMod -> rights ) : 0 );
2020-10-31 14:32:18 +01:00
}
2017-06-17 11:43:00 +02:00
2020-10-31 14:32:18 +01:00
return $ret ;
2010-11-13 19:57:10 +01:00
}
/**
* Disable a module
2011-09-16 20:25:10 +02:00
*
* @ param string $value Nom du module a desactiver
* @ param int $requiredby 1 = Desactive aussi modules dependants
* @ return string Error message or '' ;
2010-11-13 19:57:10 +01:00
*/
2019-01-27 15:20:16 +01:00
function unActivateModule ( $value , $requiredby = 1 )
2010-11-13 19:57:10 +01:00
{
2020-10-31 14:32:18 +01:00
global $db , $modules , $conf ;
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Check parameters
2020-12-04 20:28:05 +01:00
if ( empty ( $value )) {
return 'ErrorBadParameter' ;
}
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
$ret = '' ;
$modName = $value ;
$modFile = $modName . " .class.php " ;
2011-01-16 02:14:48 +01:00
2020-10-31 14:32:18 +01:00
// Loop on each directory to fill $modulesdir
$modulesdir = dolGetModulesDirs ();
2011-01-16 02:14:48 +01:00
2020-10-31 14:32:18 +01:00
// Loop on each modulesdir directories
$found = false ;
2020-12-04 20:28:05 +01:00
foreach ( $modulesdir as $dir ) {
if ( file_exists ( $dir . $modFile )) {
2020-10-31 14:32:18 +01:00
$found = @ include_once $dir . $modFile ;
2020-12-04 20:28:05 +01:00
if ( $found ) {
break ;
}
2020-10-31 14:32:18 +01:00
}
}
2010-11-13 19:57:10 +01:00
2020-12-04 20:28:05 +01:00
if ( $found ) {
2020-10-31 14:32:18 +01:00
$objMod = new $modName ( $db );
$result = $objMod -> remove ();
2020-12-04 20:28:05 +01:00
if ( $result <= 0 ) {
$ret = $objMod -> error ;
}
2023-12-04 12:05:28 +01:00
} else { // We come here when we try to unactivate a module when module does not exists anymore in sources
2020-10-31 14:32:18 +01:00
//print $dir.$modFile;exit;
// TODO Replace this after DolibarrModules is moved as abstract class with a try catch to show module we try to disable has not been found or could not be loaded
include_once DOL_DOCUMENT_ROOT . '/core/modules/DolibarrModules.class.php' ;
$genericMod = new DolibarrModules ( $db );
$genericMod -> name = preg_replace ( '/^mod/i' , '' , $modName );
$genericMod -> rights_class = strtolower ( preg_replace ( '/^mod/i' , '' , $modName ));
$genericMod -> const_name = 'MAIN_MODULE_' . strtoupper ( preg_replace ( '/^mod/i' , '' , $modName ));
dol_syslog ( " modules::unActivateModule Failed to find module file, we use generic function with name " . $modName );
$genericMod -> remove ( '' );
}
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
// Disable modules that depends on module we disable
2020-12-04 20:28:05 +01:00
if ( ! $ret && $requiredby && is_object ( $objMod ) && is_array ( $objMod -> requiredby )) {
2020-10-31 14:32:18 +01:00
$countrb = count ( $objMod -> requiredby );
2020-12-04 20:28:05 +01:00
for ( $i = 0 ; $i < $countrb ; $i ++ ) {
2020-10-31 14:32:18 +01:00
//var_dump($objMod->requiredby[$i]);
unActivateModule ( $objMod -> requiredby [ $i ]);
}
}
2010-11-13 19:57:10 +01:00
2020-10-31 14:32:18 +01:00
return $ret ;
2010-11-13 19:57:10 +01:00
}
2011-01-23 20:51:29 +01:00
/**
2018-03-13 12:13:47 +01:00
* Add external modules to list of dictionaries .
* Addition is done into var $taborder , $tabname , etc ... that are passed with pointers .
2011-09-16 20:25:10 +02:00
*
2014-09-27 16:00:11 +02:00
* @ param array $taborder Taborder
* @ param array $tabname Tabname
2014-09-28 02:46:20 +02:00
* @ param array $tablib Tablib
* @ param array $tabsql Tabsql
* @ param array $tabsqlsort Tabsqlsort
2014-09-27 16:00:11 +02:00
* @ param array $tabfield Tabfield
* @ param array $tabfieldvalue Tabfieldvalue
2014-09-28 02:46:20 +02:00
* @ param array $tabfieldinsert Tabfieldinsert
2014-09-27 16:00:11 +02:00
* @ param array $tabrowid Tabrowid
* @ param array $tabcond Tabcond
* @ param array $tabhelp Tabhelp
2021-05-06 18:06:19 +02:00
* @ param array $tabcomplete Tab complete ( will replace all other in future ) . Key is table name .
2011-09-16 20:25:10 +02:00
* @ return int 1
2011-01-23 20:51:29 +01:00
*/
2021-05-06 18:31:36 +02:00
function complete_dictionary_with_modules ( & $taborder , & $tabname , & $tablib , & $tabsql , & $tabsqlsort , & $tabfield , & $tabfieldvalue , & $tabfieldinsert , & $tabrowid , & $tabcond , & $tabhelp , & $tabcomplete )
2011-01-23 20:51:29 +01:00
{
2020-10-31 14:32:18 +01:00
global $db , $modules , $conf , $langs ;
2011-01-23 20:51:29 +01:00
2024-01-13 19:48:20 +01:00
dol_syslog ( " complete_dictionary_with_modules Search external modules to complete the list of dictionary tables " , LOG_DEBUG , 1 );
2019-09-05 20:06:09 +02:00
2020-10-31 14:32:18 +01:00
// Search modules
2015-08-31 17:42:08 +02:00
$modulesdir = dolGetModulesDirs ();
2020-10-31 14:32:18 +01:00
$i = 0 ; // is a sequencer of modules found
$j = 0 ; // j is module number. Automatically affected if module number not defined.
2011-12-13 00:30:54 +01:00
2020-12-04 20:28:05 +01:00
foreach ( $modulesdir as $dir ) {
2020-10-31 14:32:18 +01:00
// Load modules attributes in arrays (name, numero, orders) from dir directory
//print $dir."\n<br>";
dol_syslog ( " Scan directory " . $dir . " for modules " );
$handle = @ opendir ( dol_osencode ( $dir ));
2020-12-04 20:28:05 +01:00
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
2020-10-31 14:32:18 +01:00
//print "$i ".$file."\n<br>";
2020-12-04 20:28:05 +01:00
if ( is_readable ( $dir . $file ) && substr ( $file , 0 , 3 ) == 'mod' && substr ( $file , dol_strlen ( $file ) - 10 ) == '.class.php' ) {
2020-10-31 14:32:18 +01:00
$modName = substr ( $file , 0 , dol_strlen ( $file ) - 10 );
2020-12-04 20:28:05 +01:00
if ( $modName ) {
2020-10-31 14:32:18 +01:00
include_once $dir . $file ;
$objMod = new $modName ( $db );
2020-12-04 20:28:05 +01:00
if ( $objMod -> numero > 0 ) {
2020-10-31 14:32:18 +01:00
$j = $objMod -> numero ;
} else {
$j = 1000 + $i ;
}
$modulequalified = 1 ;
// We discard modules according to features level (PS: if module is activated we always show it)
$const_name = 'MAIN_MODULE_' . strtoupper ( preg_replace ( '/^mod/i' , '' , get_class ( $objMod )));
2023-08-27 15:55:44 +02:00
if ( $objMod -> version == 'development' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 2 && ! getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-08-27 15:55:44 +02:00
if ( $objMod -> version == 'experimental' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 1 && ! getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-08-27 15:55:44 +02:00
// If module is not activated disqualified
if ( ! getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2020-10-31 14:32:18 +01:00
2020-12-04 20:28:05 +01:00
if ( $modulequalified ) {
2011-10-19 01:51:40 +02:00
// Load languages files of module
2018-03-13 12:13:47 +01:00
if ( isset ( $objMod -> langfiles ) && is_array ( $objMod -> langfiles )) {
foreach ( $objMod -> langfiles as $langfile ) {
$langs -> load ( $langfile );
}
}
2024-01-13 19:48:20 +01:00
// phpcs:disable
2020-10-31 14:32:18 +01:00
// Complete the arrays &$tabname,&$tablib,&$tabsql,&$tabsqlsort,&$tabfield,&$tabfieldvalue,&$tabfieldinsert,&$tabrowid,&$tabcond
2024-01-18 23:04:20 +01:00
if ( empty ( $objMod -> dictionaries ) && ! empty ( $objMod -> { " dictionnaries " })) {
$objMod -> dictionaries = $objMod -> { " dictionnaries " }; // For backward compatibility
2020-12-04 20:28:05 +01:00
}
2024-01-13 19:48:20 +01:00
// phpcs:enable
2011-01-23 20:51:29 +01:00
2020-12-04 20:28:05 +01:00
if ( ! empty ( $objMod -> dictionaries )) {
2020-10-31 14:32:18 +01:00
//var_dump($objMod->dictionaries['tabname']);
$nbtabname = $nbtablib = $nbtabsql = $nbtabsqlsort = $nbtabfield = $nbtabfieldvalue = $nbtabfieldinsert = $nbtabrowid = $nbtabcond = $nbtabfieldcheck = $nbtabhelp = 0 ;
2021-05-06 18:06:19 +02:00
$tabnamerelwithkey = array ();
foreach ( $objMod -> dictionaries [ 'tabname' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $val );
2021-03-01 20:37:16 +01:00
$nbtabname ++ ;
$taborder [] = max ( $taborder ) + 1 ;
$tabname [] = $val ;
2021-05-06 18:06:19 +02:00
$tabnamerelwithkey [ $key ] = $val ;
$tabcomplete [ $tmptablename ][ 'picto' ] = $objMod -> picto ;
2020-12-04 20:28:05 +01:00
} // Position
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tablib' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtablib ++ ;
$tablib [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'lib' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabsql' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabsql ++ ;
$tabsql [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'sql' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabsqlsort' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabsqlsort ++ ;
$tabsqlsort [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'sqlsort' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabfield' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabfield ++ ;
$tabfield [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'field' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabfieldvalue' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabfieldvalue ++ ;
$tabfieldvalue [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'value' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabfieldinsert' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabfieldinsert ++ ;
$tabfieldinsert [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'fieldinsert' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabrowid' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabrowid ++ ;
$tabrowid [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'rowid' ] = $val ;
2020-12-04 20:28:05 +01:00
}
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabcond' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabcond ++ ;
$tabcond [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'rowid' ] = $val ;
2020-12-04 20:28:05 +01:00
}
if ( ! empty ( $objMod -> dictionaries [ 'tabhelp' ])) {
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabhelp' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabhelp ++ ;
$tabhelp [] = $val ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'help' ] = $val ;
2020-12-04 20:28:05 +01:00
}
}
if ( ! empty ( $objMod -> dictionaries [ 'tabfieldcheck' ])) {
2021-05-06 18:06:19 +02:00
foreach ( $objMod -> dictionaries [ 'tabfieldcheck' ] as $key => $val ) {
$tmptablename = preg_replace ( '/' . MAIN_DB_PREFIX . '/' , '' , $tabnamerelwithkey [ $key ]);
2021-03-01 20:37:16 +01:00
$nbtabfieldcheck ++ ;
2021-05-06 18:06:19 +02:00
$tabcomplete [ $tmptablename ][ 'fieldcheck' ] = $val ;
2020-12-04 20:28:05 +01:00
}
}
if ( $nbtabname != $nbtablib || $nbtablib != $nbtabsql || $nbtabsql != $nbtabsqlsort ) {
2020-10-31 14:32:18 +01:00
print 'Error in descriptor of module ' . $const_name . '. Array ->dictionaries has not same number of record for key "tabname", "tablib", "tabsql" and "tabsqlsort"' ;
//print "$const_name: $nbtabname=$nbtablib=$nbtabsql=$nbtabsqlsort=$nbtabfield=$nbtabfieldvalue=$nbtabfieldinsert=$nbtabrowid=$nbtabcond=$nbtabfieldcheck=$nbtabhelp\n";
} else {
$taborder [] = 0 ; // Add an empty line
}
}
2019-09-05 20:06:09 +02:00
2020-10-31 14:32:18 +01:00
$j ++ ;
$i ++ ;
2020-12-04 20:28:05 +01:00
} else {
dol_syslog ( " Module " . get_class ( $objMod ) . " not qualified " );
}
2020-10-31 14:32:18 +01:00
}
}
}
closedir ( $handle );
} else {
dol_syslog ( " htdocs/admin/modules.php: Failed to open directory " . $dir . " . See permission and open_basedir option. " , LOG_WARNING );
}
}
dol_syslog ( " " , LOG_DEBUG , - 1 );
return 1 ;
2011-01-23 20:51:29 +01:00
}
2017-12-08 10:13:03 +01:00
/**
2018-03-19 12:52:09 +01:00
* Activate external modules mandatory when country is country_code
2017-12-08 10:13:03 +01:00
*
* @ param string $country_code CountryCode
* @ return int 1
*/
2017-12-08 16:15:41 +01:00
function activateModulesRequiredByCountry ( $country_code )
2017-12-08 10:13:03 +01:00
{
global $db , $conf , $langs ;
$modulesdir = dolGetModulesDirs ();
2017-12-08 16:15:41 +01:00
2020-12-04 20:28:05 +01:00
foreach ( $modulesdir as $dir ) {
2017-12-08 10:13:03 +01:00
// Load modules attributes in arrays (name, numero, orders) from dir directory
dol_syslog ( " Scan directory " . $dir . " for modules " );
2019-12-16 13:06:25 +01:00
$handle = @ opendir ( dol_osencode ( $dir ));
2020-12-04 20:28:05 +01:00
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
if ( is_readable ( $dir . $file ) && substr ( $file , 0 , 3 ) == 'mod' && substr ( $file , dol_strlen ( $file ) - 10 ) == '.class.php' ) {
2017-12-08 10:13:03 +01:00
$modName = substr ( $file , 0 , dol_strlen ( $file ) - 10 );
2017-12-08 16:15:41 +01:00
2020-12-04 20:28:05 +01:00
if ( $modName ) {
2017-12-08 10:13:03 +01:00
include_once $dir . $file ;
$objMod = new $modName ( $db );
2017-12-08 16:15:41 +01:00
2019-12-16 13:06:25 +01:00
$modulequalified = 1 ;
2017-12-08 16:15:41 +01:00
2017-12-08 10:13:03 +01:00
// We discard modules according to features level (PS: if module is activated we always show it)
2019-01-27 11:55:16 +01:00
$const_name = 'MAIN_MODULE_' . strtoupper ( preg_replace ( '/^mod/i' , '' , get_class ( $objMod )));
2017-12-08 16:15:41 +01:00
2023-10-16 21:15:03 +02:00
if ( $objMod -> version == 'development' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 2 ) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-10-16 21:15:03 +02:00
if ( $objMod -> version == 'experimental' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 1 ) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-10-16 21:15:03 +02:00
if ( getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ; // already activated
}
2017-12-08 16:15:41 +01:00
2020-12-04 20:28:05 +01:00
if ( $modulequalified ) {
2017-12-08 10:13:03 +01:00
// Load languages files of module
2020-12-04 20:28:05 +01:00
if ( isset ( $objMod -> automatic_activation ) && is_array ( $objMod -> automatic_activation ) && isset ( $objMod -> automatic_activation [ $country_code ])) {
2017-12-08 10:13:03 +01:00
activateModule ( $modName );
2017-12-08 16:15:41 +01:00
2018-07-25 15:25:23 +02:00
setEventMessages ( $objMod -> automatic_activation [ $country_code ], null , 'warnings' );
2017-12-08 10:13:03 +01:00
}
2020-12-04 20:28:05 +01:00
} else {
dol_syslog ( " Module " . get_class ( $objMod ) . " not qualified " );
}
2017-12-08 10:13:03 +01:00
}
}
}
closedir ( $handle );
2020-05-21 15:05:19 +02:00
} else {
2017-12-08 10:13:03 +01:00
dol_syslog ( " htdocs/admin/modules.php: Failed to open directory " . $dir . " . See permission and open_basedir option. " , LOG_WARNING );
}
}
2017-12-08 16:15:41 +01:00
2017-12-08 10:13:03 +01:00
return 1 ;
}
2015-09-08 13:11:26 +02:00
/**
2019-09-05 20:06:09 +02:00
* Search external modules to complete the list of contact element
2015-09-08 13:11:26 +02:00
*
* @ param array $elementList elementList
* @ return int 1
*/
function complete_elementList_with_modules ( & $elementList )
{
2020-10-31 14:32:18 +01:00
global $db , $modules , $conf , $langs ;
2015-09-08 13:11:26 +02:00
2020-10-31 14:32:18 +01:00
// Search modules
$filename = array ();
$modules = array ();
$orders = array ();
$categ = array ();
$dirmod = array ();
2015-10-21 05:06:19 +02:00
2020-10-31 14:32:18 +01:00
$i = 0 ; // is a sequencer of modules found
$j = 0 ; // j is module number. Automatically affected if module number not defined.
2015-09-08 13:11:26 +02:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " complete_elementList_with_modules Search external modules to complete the list of contact element " , LOG_DEBUG , 1 );
2019-09-05 20:06:09 +02:00
2020-10-31 14:32:18 +01:00
$modulesdir = dolGetModulesDirs ();
2015-09-08 13:11:26 +02:00
2020-12-04 20:28:05 +01:00
foreach ( $modulesdir as $dir ) {
2020-10-31 14:32:18 +01:00
// Load modules attributes in arrays (name, numero, orders) from dir directory
//print $dir."\n<br>";
dol_syslog ( " Scan directory " . $dir . " for modules " );
$handle = @ opendir ( dol_osencode ( $dir ));
2020-12-04 20:28:05 +01:00
if ( is_resource ( $handle )) {
while (( $file = readdir ( $handle )) !== false ) {
2020-10-31 14:32:18 +01:00
//print "$i ".$file."\n<br>";
2020-12-04 20:28:05 +01:00
if ( is_readable ( $dir . $file ) && substr ( $file , 0 , 3 ) == 'mod' && substr ( $file , dol_strlen ( $file ) - 10 ) == '.class.php' ) {
2020-10-31 14:32:18 +01:00
$modName = substr ( $file , 0 , dol_strlen ( $file ) - 10 );
2020-12-04 20:28:05 +01:00
if ( $modName ) {
2020-10-31 14:32:18 +01:00
include_once $dir . $file ;
$objMod = new $modName ( $db );
2020-12-04 20:28:05 +01:00
if ( $objMod -> numero > 0 ) {
2020-10-31 14:32:18 +01:00
$j = $objMod -> numero ;
} else {
$j = 1000 + $i ;
}
$modulequalified = 1 ;
// We discard modules according to features level (PS: if module is activated we always show it)
$const_name = 'MAIN_MODULE_' . strtoupper ( preg_replace ( '/^mod/i' , '' , get_class ( $objMod )));
2023-10-16 21:15:03 +02:00
if ( $objMod -> version == 'development' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 2 && getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-10-16 21:15:03 +02:00
if ( $objMod -> version == 'experimental' && getDolGlobalInt ( 'MAIN_FEATURES_LEVEL' ) < 1 && getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2023-10-16 21:15:03 +02:00
// If module is not activated disqualified
if ( ! getDolGlobalString ( $const_name )) {
2020-12-04 20:28:05 +01:00
$modulequalified = 0 ;
}
2020-10-31 14:32:18 +01:00
2020-12-04 20:28:05 +01:00
if ( $modulequalified ) {
2015-09-08 13:11:26 +02:00
// Load languages files of module
2020-12-04 20:28:05 +01:00
if ( isset ( $objMod -> langfiles ) && is_array ( $objMod -> langfiles )) {
foreach ( $objMod -> langfiles as $langfile ) {
$langs -> load ( $langfile );
}
}
2020-10-31 14:32:18 +01:00
$modules [ $i ] = $objMod ;
$filename [ $i ] = $modName ;
$orders [ $i ] = $objMod -> family . " _ " . $j ; // Sort on family then module number
$dirmod [ $i ] = $dir ;
//print "x".$modName." ".$orders[$i]."\n<br>";
2021-02-23 22:03:23 +01:00
if ( ! empty ( $objMod -> module_parts [ 'contactelement' ])) {
if ( is_array ( $objMod -> module_parts [ 'contactelement' ])) {
2021-01-03 16:05:04 +01:00
foreach ( $objMod -> module_parts [ 'contactelement' ] as $elem => $title ) {
$elementList [ $elem ] = $langs -> trans ( $title );
}
2021-01-04 12:02:41 +01:00
} else {
2021-01-03 16:05:04 +01:00
$elementList [ $objMod -> name ] = $langs -> trans ( $objMod -> name );
}
2021-02-23 22:03:23 +01:00
}
2020-10-31 14:32:18 +01:00
$j ++ ;
$i ++ ;
2020-12-04 20:28:05 +01:00
} else {
dol_syslog ( " Module " . get_class ( $objMod ) . " not qualified " );
}
2020-10-31 14:32:18 +01:00
}
}
}
closedir ( $handle );
} else {
dol_syslog ( " htdocs/admin/modules.php: Failed to open directory " . $dir . " . See permission and open_basedir option. " , LOG_WARNING );
}
}
2015-09-08 13:11:26 +02:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " " , LOG_DEBUG , - 1 );
2019-09-05 20:06:09 +02:00
2020-10-31 14:32:18 +01:00
return 1 ;
2015-09-08 13:11:26 +02:00
}
2012-01-11 18:43:38 +01:00
/**
* Show array with constants to edit
*
2018-11-03 12:37:52 +01:00
* @ param array $tableau Array of constants array ( 'key' => array ( 'type' => type , 'label' => label )
* where type can be 'string' , 'text' , 'textarea' , 'html' , 'yesno' , 'emailtemplate:xxx' , ...
2021-03-20 21:29:36 +01:00
* @ param int $strictw3c 0 = Include form into table ( deprecated ), 1 = Form is outside table to respect W3C ( deprecated ), 2 = No form nor button at all , 3 = No form nor button at all and each field has a unique name ( form is output by caller , recommended )
2021-08-17 04:41:33 +02:00
* @ param string $helptext Tooltip help to use for the column name of values
* @ param string $text Text to use for the column name of values
2012-01-11 18:43:38 +01:00
* @ return void
*/
2021-08-17 03:20:57 +02:00
function form_constantes ( $tableau , $strictw3c = 0 , $helptext = '' , $text = 'Value' )
2012-01-11 18:43:38 +01:00
{
2020-10-31 14:32:18 +01:00
global $db , $langs , $conf , $user ;
global $_Avery_Labels ;
2012-01-11 18:43:38 +01:00
2020-10-31 14:32:18 +01:00
$form = new Form ( $db );
2012-01-11 18:43:38 +01:00
2020-10-31 14:32:18 +01:00
if ( empty ( $strictw3c )) {
2024-01-13 19:48:20 +01:00
dol_syslog ( " Warning: Function 'form_constantes' was called with parameter strictw3c = 0, this is deprecated. Value must be 2 now. " , LOG_DEBUG );
2020-10-31 14:32:18 +01:00
}
2020-12-04 20:28:05 +01:00
if ( ! empty ( $strictw3c ) && $strictw3c == 1 ) {
2020-10-31 14:32:18 +01:00
print " \n " . '<form action="' . $_SERVER [ " PHP_SELF " ] . '" method="POST">' ;
print '<input type="hidden" name="token" value="' . newToken () . '">' ;
print '<input type="hidden" name="action" value="updateall">' ;
}
2013-06-05 15:44:42 +02:00
2021-05-24 19:05:25 +02:00
print '<div class="div-table-responsive-no-min">' ;
2020-10-31 14:32:18 +01:00
print '<table class="noborder centpercent">' ;
print '<tr class="liste_titre">' ;
2021-04-29 10:01:10 +02:00
print '<td class="">' . $langs -> trans ( " Description " ) . '</td>' ;
2020-10-31 14:32:18 +01:00
print '<td>' ;
2021-08-17 03:20:57 +02:00
$text = $langs -> trans ( $text );
2020-10-31 14:32:18 +01:00
print $form -> textwithpicto ( $text , $helptext , 1 , 'help' , '' , 0 , 2 , 'idhelptext' );
print '</td>' ;
2020-12-04 20:28:05 +01:00
if ( empty ( $strictw3c )) {
print '<td class="center" width="80">' . $langs -> trans ( " Action " ) . '</td>' ;
}
2020-10-31 14:32:18 +01:00
print " </tr> \n " ;
$label = '' ;
2020-12-04 20:28:05 +01:00
foreach ( $tableau as $key => $const ) { // Loop on each param
2020-10-31 14:32:18 +01:00
$label = '' ;
// $const is a const key like 'MYMODULE_ABC'
if ( is_numeric ( $key )) { // Very old behaviour
$type = 'string' ;
} else {
2020-12-04 20:28:05 +01:00
if ( is_array ( $const )) {
2020-10-31 14:32:18 +01:00
$type = $const [ 'type' ];
2018-11-03 12:37:52 +01:00
$label = $const [ 'label' ];
2020-10-31 14:32:18 +01:00
$const = $key ;
} else {
$type = $const ;
$const = $key ;
}
}
2018-03-23 16:09:46 +01:00
2020-10-31 14:32:18 +01:00
$sql = " SELECT " ;
$sql .= " rowid " ;
$sql .= " , " . $db -> decrypt ( 'name' ) . " as name " ;
$sql .= " , " . $db -> decrypt ( 'value' ) . " as value " ;
$sql .= " , type " ;
$sql .= " , note " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " const " ;
$sql .= " WHERE " . $db -> decrypt ( 'name' ) . " = ' " . $db -> escape ( $const ) . " ' " ;
$sql .= " AND entity IN (0, " . $conf -> entity . " ) " ;
$sql .= " ORDER BY name ASC, entity DESC " ;
$result = $db -> query ( $sql );
dol_syslog ( " List params " , LOG_DEBUG );
2020-12-04 20:28:05 +01:00
if ( $result ) {
2020-10-31 14:32:18 +01:00
$obj = $db -> fetch_object ( $result ); // Take first result of select
2017-06-17 11:43:00 +02:00
2020-12-04 20:28:05 +01:00
if ( empty ( $obj )) { // If not yet into table
2024-03-13 00:29:40 +01:00
$obj = ( object ) array ( 'rowid' => '' , 'name' => $const , 'value' => '' , 'type' => $type , 'note' => '' );
2020-10-31 14:32:18 +01:00
}
2012-09-13 11:52:50 +02:00
2020-12-04 20:28:05 +01:00
if ( empty ( $strictw3c )) {
2020-10-31 14:32:18 +01:00
print " \n " . '<form action="' . $_SERVER [ " PHP_SELF " ] . '" method="POST">' ;
print '<input type="hidden" name="token" value="' . newToken () . '">' ;
2022-02-18 14:14:34 +01:00
print '<input type="hidden" name="page_y" value="' . newToken () . '">' ;
2020-10-31 14:32:18 +01:00
}
2012-01-11 18:43:38 +01:00
2020-10-31 14:32:18 +01:00
print '<tr class="oddeven">' ;
2012-01-11 18:43:38 +01:00
2023-03-25 12:40:23 +01:00
// Show label of parameter
2020-10-31 14:32:18 +01:00
print '<td>' ;
2020-12-04 20:28:05 +01:00
if ( empty ( $strictw3c )) {
print '<input type="hidden" name="action" value="update">' ;
}
2020-10-31 14:32:18 +01:00
print '<input type="hidden" name="rowid' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="' . $obj -> rowid . '">' ;
print '<input type="hidden" name="constname' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="' . $const . '">' ;
print '<input type="hidden" name="constnote_' . $obj -> name . '" value="' . nl2br ( dol_escape_htmltag ( $obj -> note )) . '">' ;
print '<input type="hidden" name="consttype_' . $obj -> name . '" value="' . ( $obj -> type ? $obj -> type : 'string' ) . '">' ;
2023-03-25 12:40:23 +01:00
if ( ! empty ( $tableau [ $key ][ 'tooltip' ])) {
print $form -> textwithpicto ( $label ? $label : $langs -> trans ( 'Desc' . $const ), $tableau [ $key ][ 'tooltip' ]);
} else {
2023-12-04 12:05:28 +01:00
print ( $label ? $label : $langs -> trans ( 'Desc' . $const ));
2023-03-25 12:40:23 +01:00
}
2012-01-11 18:43:38 +01:00
2020-12-04 20:28:05 +01:00
if ( $const == 'ADHERENT_MAILMAN_URL' ) {
2020-10-31 14:32:18 +01:00
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick1">' . img_down () . '</a><br>' ;
2024-02-09 15:58:49 +01:00
//print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&subscribees=%EMAIL%&send_welcome_msg_to_this_batch=1';
2020-10-31 14:32:18 +01:00
print '<div id="example1" class="hidden">' ;
print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/add?subscribees_upload=%EMAIL%&adminpw=%MAILMAN_ADMINPW%&subscribe_or_invite=0&send_welcome_msg_to_this_batch=0&notification_to_list_owner=0' ;
print '</div>' ;
2022-10-24 19:40:51 +02:00
} elseif ( $const == 'ADHERENT_MAILMAN_UNSUB_URL' ) {
2020-10-31 14:32:18 +01:00
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick2">' . img_down () . '</a><br>' ;
print '<div id="example2" class="hidden">' ;
print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/remove?unsubscribees_upload=%EMAIL%&adminpw=%MAILMAN_ADMINPW%&send_unsub_ack_to_this_batch=0&send_unsub_notifications_to_list_owner=0' ;
print '</div>' ;
//print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/remove?adminpw=%MAILMAN_ADMINPW%&unsubscribees=%EMAIL%';
2022-10-24 19:40:51 +02:00
} elseif ( $const == 'ADHERENT_MAILMAN_LISTS' ) {
2020-10-31 14:32:18 +01:00
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick3">' . img_down () . '</a><br>' ;
print '<div id="example3" class="hidden">' ;
print 'mymailmanlist<br>' ;
print 'mymailmanlist1,mymailmanlist2<br>' ;
print 'TYPE:Type1:mymailmanlist1,TYPE:Type2:mymailmanlist2<br>' ;
2024-02-27 15:30:37 +01:00
if ( isModEnabled ( 'category' )) {
2020-12-04 20:28:05 +01:00
print 'CATEG:Categ1:mymailmanlist1,CATEG:Categ2:mymailmanlist2<br>' ;
}
2020-10-31 14:32:18 +01:00
print '</div>' ;
//print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/remove?adminpw=%MAILMAN_ADMINPW%&unsubscribees=%EMAIL%';
2023-05-23 14:12:41 +02:00
} elseif ( in_array ( $const , [ 'ADHERENT_MAIL_FROM' , 'ADHERENT_CC_MAIL_FROM' ])) {
2022-10-23 03:25:55 +02:00
print ' ' . img_help ( 1 , $langs -> trans ( " EMailHelpMsgSPFDKIM " ));
2020-10-31 14:32:18 +01:00
}
2012-01-11 18:43:38 +01:00
2020-10-31 14:32:18 +01:00
print " </td> \n " ;
2012-01-11 18:43:38 +01:00
2020-10-31 14:32:18 +01:00
// Value
2020-12-04 20:28:05 +01:00
if ( $const == 'ADHERENT_CARD_TYPE' || $const == 'ADHERENT_ETIQUETTE_TYPE' ) {
2020-10-31 14:32:18 +01:00
print '<td>' ;
// List of possible labels (defined into $_Avery_Labels variable set into format_cards.lib.php)
require_once DOL_DOCUMENT_ROOT . '/core/lib/format_cards.lib.php' ;
$arrayoflabels = array ();
2020-12-04 20:28:05 +01:00
foreach ( array_keys ( $_Avery_Labels ) as $codecards ) {
2020-10-31 14:32:18 +01:00
$arrayoflabels [ $codecards ] = $_Avery_Labels [ $codecards ][ 'name' ];
}
2021-03-20 21:29:36 +01:00
print $form -> selectarray ( 'constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )), $arrayoflabels , ( $obj -> value ? $obj -> value : 'CARD' ), 1 , 0 , 0 );
2020-10-31 14:32:18 +01:00
print '<input type="hidden" name="consttype" value="yesno">' ;
print '<input type="hidden" name="constnote' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="' . nl2br ( dol_escape_htmltag ( $obj -> note )) . '">' ;
print '</td>' ;
} else {
print '<td>' ;
2021-03-20 21:29:36 +01:00
print '<input type="hidden" name="consttype' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )) . '" value="' . ( $obj -> type ? $obj -> type : 'string' ) . '">' ;
print '<input type="hidden" name="constnote' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )) . '" value="' . nl2br ( dol_escape_htmltag ( $obj -> note )) . '">' ;
2020-12-04 20:28:05 +01:00
if ( $obj -> type == 'textarea' || in_array ( $const , array ( 'ADHERENT_CARD_TEXT' , 'ADHERENT_CARD_TEXT_RIGHT' , 'ADHERENT_ETIQUETTE_TEXT' ))) {
2021-03-20 21:29:36 +01:00
print '<textarea class="flat" name="constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )) . '" cols="50" rows="5" wrap="soft">' . " \n " ;
2020-10-31 14:32:18 +01:00
print $obj -> value ;
print " </textarea> \n " ;
2020-12-04 20:28:05 +01:00
} elseif ( $obj -> type == 'html' ) {
2020-10-31 14:32:18 +01:00
require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php' ;
2022-06-09 22:10:51 +02:00
$doleditor = new DolEditor ( 'constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )), $obj -> value , '' , 160 , 'dolibarr_notes' , '' , false , false , isModEnabled ( 'fckeditor' ), ROWS_5 , '90%' );
2020-10-31 14:32:18 +01:00
$doleditor -> Create ();
2020-12-04 20:28:05 +01:00
} elseif ( $obj -> type == 'yesno' ) {
2021-03-20 21:29:36 +01:00
print $form -> selectyesno ( 'constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )), $obj -> value , 1 );
2020-12-04 20:28:05 +01:00
} elseif ( preg_match ( '/emailtemplate/' , $obj -> type )) {
2020-10-31 14:32:18 +01:00
include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php' ;
$formmail = new FormMail ( $db );
2019-01-31 20:53:59 +01:00
2020-10-31 14:32:18 +01:00
$tmp = explode ( ':' , $obj -> type );
2013-05-09 22:39:31 +02:00
2020-10-31 14:32:18 +01:00
$nboftemplates = $formmail -> fetchAllEMailTemplate ( $tmp [ 1 ], $user , null , - 1 ); // We set lang=null to get in priority record with no lang
//$arraydefaultmessage = $formmail->getEMailTemplate($db, $tmp[1], $user, null, 0, 1, '');
$arrayofmessagename = array ();
2020-12-04 20:28:05 +01:00
if ( is_array ( $formmail -> lines_model )) {
foreach ( $formmail -> lines_model as $modelmail ) {
2020-10-31 14:32:18 +01:00
//var_dump($modelmail);
$moreonlabel = '' ;
2020-12-04 20:28:05 +01:00
if ( ! empty ( $arrayofmessagename [ $modelmail -> label ])) {
$moreonlabel = ' <span class="opacitymedium">(' . $langs -> trans ( " SeveralLangugeVariatFound " ) . ')</span>' ;
}
2020-10-31 14:32:18 +01:00
// The 'label' is the key that is unique if we exclude the language
$arrayofmessagename [ $modelmail -> label . ':' . $tmp [ 1 ]] = $langs -> trans ( preg_replace ( '/\(|\)/' , '' , $modelmail -> label )) . $moreonlabel ;
}
}
//var_dump($arraydefaultmessage);
//var_dump($arrayofmessagename);
2021-03-20 21:29:36 +01:00
print $form -> selectarray ( 'constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )), $arrayofmessagename , $obj -> value . ':' . $tmp [ 1 ], 'None' , 0 , 0 , '' , 0 , 0 , 0 , '' , '' , 1 );
2021-04-29 10:01:10 +02:00
} elseif ( preg_match ( '/MAIL_FROM$/i' , $const )) {
print img_picto ( '' , 'email' , 'class="pictofixedwidth"' ) . '<input type="text" class="flat minwidth300" name="constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )) . '" value="' . dol_escape_htmltag ( $obj -> value ) . '">' ;
2021-03-20 21:29:36 +01:00
} else { // type = 'string' ou 'chaine'
print '<input type="text" class="flat minwidth300" name="constvalue' . ( empty ( $strictw3c ) ? '' : ( $strictw3c == 3 ? '_' . $const : '[]' )) . '" value="' . dol_escape_htmltag ( $obj -> value ) . '">' ;
2020-10-31 14:32:18 +01:00
}
print '</td>' ;
}
2021-04-29 10:01:10 +02:00
2020-10-31 14:32:18 +01:00
// Submit
2020-12-04 20:28:05 +01:00
if ( empty ( $strictw3c )) {
2020-10-31 14:32:18 +01:00
print '<td class="center">' ;
2022-02-18 14:14:34 +01:00
print '<input type="submit" class="button small reposition" value="' . $langs -> trans ( " Update " ) . '" name="update">' ;
2020-10-31 14:32:18 +01:00
print " </td> " ;
}
2021-04-29 10:01:10 +02:00
2020-10-31 14:32:18 +01:00
print " </tr> \n " ;
2020-12-04 20:28:05 +01:00
if ( empty ( $strictw3c )) {
print " </form> \n " ;
}
2020-10-31 14:32:18 +01:00
}
}
print '</table>' ;
2021-05-24 19:05:25 +02:00
print '</div>' ;
2020-10-31 14:32:18 +01:00
2020-12-04 20:28:05 +01:00
if ( ! empty ( $strictw3c ) && $strictw3c == 1 ) {
2022-02-18 14:14:34 +01:00
print '<div align="center"><input type="submit" class="button small reposition" value="' . $langs -> trans ( " Update " ) . '" name="update"></div>' ;
2020-10-31 14:32:18 +01:00
print " </form> \n " ;
}
2012-01-11 18:43:38 +01:00
}
2013-01-02 18:43:59 +01:00
2013-01-05 19:23:16 +01:00
/**
* Show array with constants to edit
*
* @ param array $modules Array of all modules
* @ return string HTML string with warning
*/
function showModulesExludedForExternal ( $modules )
{
2019-12-16 13:06:25 +01:00
global $conf , $langs ;
2013-01-02 18:43:59 +01:00
2019-12-16 13:06:25 +01:00
$text = $langs -> trans ( " OnlyFollowingModulesAreOpenedToExternalUsers " );
2023-12-13 15:20:53 +01:00
$listofmodules = explode ( ',' , getDolGlobalString ( 'MAIN_MODULES_FOR_EXTERNAL' )); // List of modules qualified for external user management
2022-12-12 10:25:03 +01:00
2019-12-16 13:06:25 +01:00
$i = 0 ;
2013-03-05 19:05:12 +01:00
if ( ! empty ( $modules )) {
2022-12-12 10:25:03 +01:00
$tmpmodules = dol_sort_array ( $modules , 'module_position' );
foreach ( $tmpmodules as $module ) { // Loop on array of modules
2019-12-16 13:06:25 +01:00
$moduleconst = $module -> const_name ;
$modulename = strtolower ( $module -> name );
2013-03-05 19:05:12 +01:00
//print 'modulename='.$modulename;
2013-03-13 11:06:28 +01:00
2013-03-05 19:05:12 +01:00
//if (empty($conf->global->$moduleconst)) continue;
2020-12-04 20:28:05 +01:00
if ( ! in_array ( $modulename , $listofmodules )) {
continue ;
}
2018-02-26 15:03:09 +01:00
//var_dump($modulename.' - '.$langs->trans('Module'.$module->numero.'Name'));
2017-06-17 11:43:00 +02:00
2020-12-04 20:28:05 +01:00
if ( $i > 0 ) {
$text .= ', ' ;
} else {
$text .= ' ' ;
}
2013-03-05 19:05:12 +01:00
$i ++ ;
2022-12-12 10:25:03 +01:00
$tmptext = $langs -> trans ( 'Module' . $module -> numero . 'Name' );
if ( $tmptext != 'Module' . $module -> numero . 'Name' ) {
$text .= $langs -> trans ( 'Module' . $module -> numero . 'Name' );
} else {
$text .= $langs -> trans ( $module -> name );
}
2013-03-05 19:05:12 +01:00
}
2013-01-05 19:23:16 +01:00
}
2022-12-12 10:25:03 +01:00
2014-11-28 19:49:42 +01:00
return $text ;
2013-01-02 18:43:59 +01:00
}
2012-07-02 19:30:37 +02:00
/**
* Add document model used by doc generator
*
2012-04-03 11:01:07 +02:00
* @ param string $name Model name
2012-07-02 19:30:37 +02:00
* @ param string $type Model type
* @ param string $label Model label
* @ param string $description Model description
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2012-07-02 19:30:37 +02:00
*/
2019-01-27 15:20:16 +01:00
function addDocumentModel ( $name , $type , $label = '' , $description = '' )
2012-04-03 11:01:07 +02:00
{
global $db , $conf ;
2012-04-28 14:52:53 +02:00
2012-04-03 11:01:07 +02:00
$db -> begin ();
2012-04-28 14:52:53 +02:00
2020-10-31 14:32:18 +01:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " document_model (nom, type, entity, libelle, description) " ;
2021-08-27 22:42:04 +02:00
$sql .= " VALUES (' " . $db -> escape ( $name ) . " ',' " . $db -> escape ( $type ) . " ', " . (( int ) $conf -> entity ) . " , " ;
2020-10-31 14:32:18 +01:00
$sql .= ( $label ? " ' " . $db -> escape ( $label ) . " ' " : 'null' ) . " , " ;
$sql .= ( ! empty ( $description ) ? " ' " . $db -> escape ( $description ) . " ' " : " null " );
$sql .= " ) " ;
2017-06-17 11:43:00 +02:00
2020-10-31 14:32:18 +01:00
dol_syslog ( " admin.lib::addDocumentModel " , LOG_DEBUG );
2019-12-16 13:06:25 +01:00
$resql = $db -> query ( $sql );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2012-04-03 11:01:07 +02:00
$db -> commit ();
2012-07-02 19:30:37 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2012-04-03 11:01:07 +02:00
dol_print_error ( $db );
2012-07-02 19:30:37 +02:00
$db -> rollback ();
return - 1 ;
}
2012-04-03 11:01:07 +02:00
}
2012-07-02 19:30:37 +02:00
/**
* Delete document model used by doc generator
*
* @ param string $name Model name
* @ param string $type Model type
2023-12-01 19:51:32 +01:00
* @ return int Return integer < 0 if KO , > 0 if OK
2012-07-02 19:30:37 +02:00
*/
function delDocumentModel ( $name , $type )
{
2012-04-03 11:01:07 +02:00
global $db , $conf ;
2012-04-28 14:52:53 +02:00
2012-04-03 11:01:07 +02:00
$db -> begin ();
2012-07-02 19:30:37 +02:00
2012-04-03 11:01:07 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " document_model " ;
2019-12-16 13:06:25 +01:00
$sql .= " WHERE nom = ' " . $db -> escape ( $name ) . " ' " ;
2020-09-19 21:19:04 +02:00
$sql .= " AND type = ' " . $db -> escape ( $type ) . " ' " ;
2021-09-02 13:25:00 +02:00
$sql .= " AND entity = " . (( int ) $conf -> entity );
2012-07-02 19:30:37 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::delDocumentModel " , LOG_DEBUG );
2019-12-16 13:06:25 +01:00
$resql = $db -> query ( $sql );
2020-12-04 20:28:05 +01:00
if ( $resql ) {
2012-04-03 11:01:07 +02:00
$db -> commit ();
2012-07-02 19:30:37 +02:00
return 1 ;
2020-05-21 15:05:19 +02:00
} else {
2012-04-03 11:01:07 +02:00
dol_print_error ( $db );
2012-07-02 19:30:37 +02:00
$db -> rollback ();
return - 1 ;
}
2012-04-03 11:01:07 +02:00
}
2012-09-21 00:13:20 +02:00
2012-09-22 09:18:36 +02:00
/**
* Return the php_info into an array
*
* @ return array Array with PHP infos
*/
function phpinfo_array ()
{
ob_start ();
phpinfo ();
2020-10-02 19:10:30 +02:00
$phpinfostring = ob_get_contents ();
ob_end_clean ();
2012-09-22 09:18:36 +02:00
$info_arr = array ();
2020-10-02 19:10:30 +02:00
$info_lines = explode ( " \n " , strip_tags ( $phpinfostring , " <tr><td><h2> " ));
2012-09-22 09:18:36 +02:00
$cat = " General " ;
2020-12-04 20:28:05 +01:00
foreach ( $info_lines as $line ) {
2012-09-22 09:18:36 +02:00
// new cat?
2019-04-23 10:24:16 +02:00
$title = array ();
2012-09-22 09:18:36 +02:00
preg_match ( " ~<h2>(.*)</h2>~ " , $line , $title ) ? $cat = $title [ 1 ] : null ;
2019-04-23 10:24:16 +02:00
$val = array ();
2020-12-04 20:28:05 +01:00
if ( preg_match ( " ~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~ " , $line , $val )) {
2012-09-22 09:18:36 +02:00
$info_arr [ trim ( $cat )][ trim ( $val [ 1 ])] = $val [ 2 ];
2020-12-04 20:28:05 +01:00
} elseif ( preg_match ( " ~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~ " , $line , $val )) {
2012-09-22 09:18:36 +02:00
$info_arr [ trim ( $cat )][ trim ( $val [ 1 ])] = array ( " local " => $val [ 2 ], " master " => $val [ 3 ]);
}
2012-09-21 00:13:20 +02:00
}
2012-09-22 09:18:36 +02:00
return $info_arr ;
2012-09-21 00:13:20 +02:00
}
2018-03-18 06:09:50 +01:00
/**
2024-01-13 19:48:20 +01:00
* Return array head with list of tabs to view object information .
2018-03-18 06:09:50 +01:00
*
* @ return array head array with tabs
*/
function company_admin_prepare_head ()
{
2019-04-23 10:24:16 +02:00
global $langs , $conf ;
2018-03-18 06:09:50 +01:00
$h = 0 ;
$head = array ();
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/company.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Company " );
$head [ $h ][ 2 ] = 'company' ;
$h ++ ;
2020-12-04 20:28:05 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/openinghours.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " OpeningHours " );
$head [ $h ][ 2 ] = 'openinghours' ;
$h ++ ;
2019-01-16 12:42:54 +01:00
2018-03-18 06:09:50 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/accountant.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Accountant " );
$head [ $h ][ 2 ] = 'accountant' ;
$h ++ ;
2020-12-12 18:26:54 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/company_socialnetworks.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " SocialNetworksInformation " );
$head [ $h ][ 2 ] = 'socialnetworks' ;
$h ++ ;
2020-03-30 19:23:25 +02:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'mycompany_admin' , 'add' );
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'mycompany_admin' , 'remove' );
2020-03-31 00:11:31 +02:00
2018-03-18 06:09:50 +01:00
return $head ;
}
2017-10-13 12:02:26 +02:00
/**
2024-01-13 19:48:20 +01:00
* Return array head with list of tabs to view object information .
2017-10-13 12:02:26 +02:00
*
* @ return array head array with tabs
*/
function email_admin_prepare_head ()
{
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
2020-12-04 20:28:05 +01:00
if ( ! empty ( $user -> admin ) && ( empty ( $_SESSION [ 'leftmenu' ]) || $_SESSION [ 'leftmenu' ] != 'email_templates' )) {
2017-10-13 12:02:26 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " OutGoingEmailSetup " );
$head [ $h ][ 2 ] = 'common' ;
$h ++ ;
2022-06-09 22:10:51 +02:00
if ( isModEnabled ( 'mailing' )) {
2017-10-13 12:02:26 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails_emailing.php " ;
2020-04-05 15:42:39 +02:00
$head [ $h ][ 1 ] = $langs -> trans ( " OutGoingEmailSetupForEmailing " , $langs -> transnoentitiesnoconv ( " EMailing " ));
2017-10-13 12:02:26 +02:00
$head [ $h ][ 2 ] = 'common_emailing' ;
$h ++ ;
}
2020-09-02 15:33:18 +02:00
2022-06-09 22:10:51 +02:00
if ( isModEnabled ( 'ticket' )) {
2020-09-02 15:33:18 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails_ticket.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " OutGoingEmailSetupForEmailing " , $langs -> transnoentitiesnoconv ( " Ticket " ));
$head [ $h ][ 2 ] = 'common_ticket' ;
$h ++ ;
}
2017-10-13 12:02:26 +02:00
}
2021-03-19 13:37:43 +01:00
// admin and non admin can view this menu entry, but it is not shown yet when we on user menu "Email templates"
if ( empty ( $_SESSION [ 'leftmenu' ]) || $_SESSION [ 'leftmenu' ] != 'email_templates' ) {
2017-10-13 12:02:26 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails_senderprofile_list.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " EmailSenderProfiles " );
$head [ $h ][ 2 ] = 'senderprofiles' ;
$h ++ ;
}
2021-01-26 11:19:13 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails_templates.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " EMailTemplates " );
$head [ $h ][ 2 ] = 'templates' ;
$h ++ ;
2023-02-07 11:05:09 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/mails_ingoing.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " InGoingEmailSetup " , $langs -> transnoentitiesnoconv ( " EMailing " ));
$head [ $h ][ 2 ] = 'common_ingoing' ;
$h ++ ;
2019-01-27 11:55:16 +01:00
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'email_admin' , 'remove' );
2017-10-13 12:02:26 +02:00
return $head ;
}