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 >
2016-03-02 11:23:57 +01:00
* Copyright ( C ) 2005 - 2016 Regis Houssin < regis . houssin @ capnetworks . 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 >
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
2011-08-01 01:24:38 +02:00
* along with this program . If not , see < http :// www . gnu . org / licenses />.
2008-06-10 20:29:23 +02:00
* or see http :// www . gnu . org /
*/
/**
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
2015-08-31 17:42:08 +02: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
2009-01-26 22:57:14 +01:00
*/
2008-06-10 20:29:23 +02:00
function versiontostring ( $versionarray )
{
2011-09-21 17:53:54 +02:00
$string = '?' ;
if ( isset ( $versionarray [ 0 ])) $string = $versionarray [ 0 ];
if ( isset ( $versionarray [ 1 ])) $string .= '.' . $versionarray [ 1 ];
if ( isset ( $versionarray [ 2 ])) $string .= '.' . $versionarray [ 2 ];
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 "
2016-07-12 13:03:56 +02:00
* For example : if ( versioncompare ( versiondolibarrarray (), array ( 4 , 0 , - 4 )) >= 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 )
2009-05-04 22:57:26 +02:00
*/
2008-06-10 20:29:23 +02:00
function versioncompare ( $versionarray1 , $versionarray2 )
{
2011-09-21 17:53:54 +02:00
$ret = 0 ;
$level = 0 ;
$count1 = count ( $versionarray1 );
$count2 = count ( $versionarray2 );
$maxcount = max ( $count1 , $count2 );
while ( $level < $maxcount )
{
$operande1 = isset ( $versionarray1 [ $level ]) ? $versionarray1 [ $level ] : 0 ;
$operande2 = isset ( $versionarray2 [ $level ]) ? $versionarray2 [ $level ] : 0 ;
2016-03-02 11:23:57 +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 ;
2016-03-04 15:21:26 +01:00
if ( preg_match ( '/beta([0-9])+/i' , $operande1 )) $operande1 =- 3 ;
if ( preg_match ( '/beta([0-9])+/i' , $operande2 )) $operande2 =- 3 ;
2016-03-02 11:23:57 +01:00
if ( preg_match ( '/rc$/i' , $operande1 )) $operande1 =- 2 ;
if ( preg_match ( '/rc$/i' , $operande2 )) $operande2 =- 2 ;
2016-03-04 15:21:26 +01:00
if ( preg_match ( '/rc([0-9])+/i' , $operande1 )) $operande1 =- 1 ;
if ( preg_match ( '/rc([0-9])+/i' , $operande2 )) $operande2 =- 1 ;
2011-09-21 17:53:54 +02:00
$level ++ ;
//print 'level '.$level.' '.$operande1.'-'.$operande2.'<br>';
if ( $operande1 < $operande2 ) { $ret = - $level ; break ; }
if ( $operande1 > $operande2 ) { $ret = $level ; break ; }
}
2014-10-05 20:26:35 +02:00
//print join('.',$versionarray1).'('.count($versionarray1).') / '.join('.',$versionarray2).'('.count($versionarray2).') => '.$ret.'<br>'."\n";
2011-09-21 17:53:54 +02:00
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 )
2009-05-04 22:57:26 +02:00
*/
2008-06-10 20:29:23 +02:00
function versionphparray ()
{
2011-09-21 17:53:54 +02: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 )
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
{
2011-09-21 17:53:54 +02:00
return explode ( '.' , DOL_VERSION );
2008-06-10 20:29:23 +02:00
}
/**
2010-09-29 01:17:31 +02:00
* Launch a sql file . Function used by :
* - Migrate process ( dolibarr - xyz - abc . sql )
* - Loading sql menus ( auguria )
* - Running specific Sql by a module init
* Install process however does not use it .
* Note that Sql files must have all comments at start of line .
2011-09-16 20:25:10 +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 ) .
* @ param string $handler Handler targeted for menu
2012-02-10 17:09:13 +01:00
* @ param string $okerror Family of errors we accept ( 'default' , 'none' )
2011-09-16 20:25:10 +02:00
* @ return int <= 0 if KO , > 0 if OK
2009-05-04 22:57:26 +02:00
*/
2012-02-10 17:09:13 +01:00
function run_sql ( $sqlfile , $silent = 1 , $entity = '' , $usesavepoint = 1 , $handler = '' , $okerror = 'default' )
2008-06-10 20:29:23 +02:00
{
2011-09-21 17:53:54 +02:00
global $db , $conf , $langs , $user ;
2012-02-10 17:09:13 +01:00
dol_syslog ( " Admin.lib::run_sql run sql file " . $sqlfile . " silent= " . $silent . " entity= " . $entity . " usesavepoint= " . $usesavepoint . " handler= " . $handler . " okerror= " . $okerror , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$ok = 0 ;
$error = 0 ;
$i = 0 ;
$buffer = '' ;
$arraysql = Array ();
// Get version of database
$versionarray = $db -> getVersionArray ();
$fp = fopen ( $sqlfile , " r " );
if ( $fp )
{
while ( ! feof ( $fp ))
{
$buf = fgets ( $fp , 4096 );
2009-01-21 15:09:42 +01:00
2011-12-10 11:26:04 +01:00
// Test if request must be ran only for particular database or version (if yes, we must remove the -- comment)
if ( preg_match ( '/^--\sV(MYSQL|PGSQL|)([0-9\.]+)/i' , $buf , $reg ))
2011-09-21 17:53:54 +02:00
{
2011-12-10 11:26:04 +01:00
$qualified = 1 ;
2011-12-13 00:30:54 +01:00
2011-12-10 11:26:04 +01:00
// restrict on database type
if ( ! empty ( $reg [ 1 ]))
{
2012-02-10 13:02:42 +01:00
if ( ! preg_match ( '/' . preg_quote ( $reg [ 1 ]) . '/i' , $db -> type )) $qualified = 0 ;
2011-12-10 11:26:04 +01:00
}
2011-12-13 00:30:54 +01:00
2011-12-10 11:26:04 +01:00
// restrict on version
if ( $qualified )
{
2012-02-10 13:02:42 +01:00
2011-12-10 11:26:04 +01:00
$versionrequest = explode ( '.' , $reg [ 2 ]);
//print var_dump($versionrequest);
//print var_dump($versionarray);
if ( ! count ( $versionrequest ) || ! count ( $versionarray ) || versioncompare ( $versionrequest , $versionarray ) > 0 )
{
$qualified = 0 ;
}
}
2011-12-13 00:30:54 +01:00
2011-12-10 11:26:04 +01:00
if ( $qualified )
2011-09-21 17:53:54 +02:00
{
// Version qualified, delete SQL comments
2011-12-10 11:26:04 +01:00
$buf = preg_replace ( '/^--\sV(MYSQL|PGSQL|)([0-9\.]+)/i' , '' , $buf );
2011-09-21 17:53:54 +02:00
//print "Ligne $i qualifi?e par version: ".$buf.'<br>';
}
}
// Add line buf to buffer if not a comment
if ( ! preg_match ( '/^--/' , $buf ))
{
2011-06-17 20:44:08 +02:00
$buf = preg_replace ( '/--.*$/' , '' , $buf ); //remove comment from a line that not start with -- before add it to the buffer
2011-09-21 17:53:54 +02:00
$buffer .= trim ( $buf );
}
2011-04-02 20:55:41 +02:00
2011-09-21 17:53:54 +02:00
// print $buf.'<br>';
2011-03-29 22:41:57 +02:00
2011-09-21 17:53:54 +02:00
if ( preg_match ( '/;/' , $buffer )) // If string contains ';', it's end of a request string, we save it in arraysql.
{
// Found new request
if ( $buffer ) $arraysql [ $i ] = $buffer ;
$i ++ ;
$buffer = '' ;
}
}
2009-01-21 15:09:42 +01:00
2011-09-21 17:53:54 +02:00
if ( $buffer ) $arraysql [ $i ] = $buffer ;
fclose ( $fp );
}
else
{
dol_syslog ( " Admin.lib::run_sql failed to open file " . $sqlfile , LOG_ERR );
}
2010-04-05 21:24:23 +02:00
2011-09-21 17:53:54 +02:00
// Loop on each request to see if there is a __+MAX_table__ key
$listofmaxrowid = array (); // This is a cache table
foreach ( $arraysql as $i => $sql )
{
$newsql = $sql ;
// Replace __+MAX_table__ with max of table
while ( preg_match ( '/__\+MAX_([A-Za-z_]+)__/i' , $newsql , $reg ))
{
$table = $reg [ 1 ];
if ( ! isset ( $listofmaxrowid [ $table ]))
{
//var_dump($db);
$sqlgetrowid = 'SELECT MAX(rowid) as max from ' . $table ;
$resql = $db -> query ( $sqlgetrowid );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
$listofmaxrowid [ $table ] = $obj -> max ;
if ( empty ( $listofmaxrowid [ $table ])) $listofmaxrowid [ $table ] = 0 ;
}
else
{
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " Failed to get max rowid for " . $table ) . " </div></td> " ;
if ( ! $silent ) print '</tr>' ;
$error ++ ;
break ;
}
}
$from = '__+MAX_' . $table . '__' ;
$to = '+' . $listofmaxrowid [ $table ];
$newsql = str_replace ( $from , $to , $newsql );
2014-06-13 01:42:00 +02:00
dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ) . ' (replacing ' . $from . ' to ' . $to . ')' , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$arraysql [ $i ] = $newsql ;
}
}
// Loop on each request to execute request
$cursorinsert = 0 ;
$listofinsertedrowid = array ();
foreach ( $arraysql as $i => $sql )
{
if ( $sql )
{
2011-11-24 08:23:16 +01:00
// Replace the prefix tables
if ( MAIN_DB_PREFIX != 'llx_' )
{
$sql = preg_replace ( '/llx_/i' , MAIN_DB_PREFIX , $sql );
}
2011-12-02 23:23:07 +01:00
2011-09-21 17:53:54 +02:00
if ( ! empty ( $handler )) $sql = preg_replace ( '/__HANDLER__/i' , " ' " . $handler . " ' " , $sql );
$newsql = preg_replace ( '/__ENTITY__/i' ,( ! empty ( $entity ) ? $entity : $conf -> entity ), $sql );
// Ajout trace sur requete (eventuellement a commenter si beaucoup de requetes)
2013-03-13 11:06:28 +01:00
if ( ! $silent ) print '<tr><td valign="top">' . $langs -> trans ( " Request " ) . ' ' . ( $i + 1 ) . " sql=' " . dol_htmlentities ( $newsql , ENT_NOQUOTES ) . " '</td></tr> \n " ;
2014-06-13 01:42:00 +02:00
dol_syslog ( 'Admin.lib::run_sql Request ' . ( $i + 1 ), LOG_DEBUG );
2013-04-10 20:45:38 +02:00
$sqlmodified = 0 ;
2011-09-21 17:53:54 +02:00
// Replace for encrypt data
2013-04-10 20:45:38 +02:00
if ( preg_match_all ( '/__ENCRYPT\(\'([^\']+)\'\)__/i' , $newsql , $reg ))
2011-09-21 17:53:54 +02:00
{
$num = count ( $reg [ 0 ]);
2013-04-10 20:45:38 +02:00
for ( $j = 0 ; $j < $num ; $j ++ )
2011-09-21 17:53:54 +02:00
{
2013-04-10 20:45:38 +02:00
$from = $reg [ 0 ][ $j ];
$to = $db -> encrypt ( $reg [ 1 ][ $j ], 1 );
2011-09-21 17:53:54 +02:00
$newsql = str_replace ( $from , $to , $newsql );
}
2013-04-10 20:45:38 +02:00
$sqlmodified ++ ;
2011-09-21 17:53:54 +02:00
}
// Replace for decrypt data
2012-08-21 11:46:50 +02:00
if ( preg_match_all ( '/__DECRYPT\(\'([A-Za-z0-9_]+)\'\)__/i' , $newsql , $reg ))
2011-09-21 17:53:54 +02:00
{
$num = count ( $reg [ 0 ]);
2013-04-10 20:45:38 +02:00
for ( $j = 0 ; $j < $num ; $j ++ )
2011-09-21 17:53:54 +02:00
{
2013-04-10 20:45:38 +02:00
$from = $reg [ 0 ][ $j ];
$to = $db -> decrypt ( $reg [ 1 ][ $j ]);
2011-09-21 17:53:54 +02:00
$newsql = str_replace ( $from , $to , $newsql );
}
2013-04-10 20:45:38 +02:00
$sqlmodified ++ ;
2011-09-21 17:53:54 +02:00
}
// Replace __x__ with rowid of insert nb x
while ( preg_match ( '/__([0-9]+)__/' , $newsql , $reg ))
{
$cursor = $reg [ 1 ];
if ( empty ( $listofinsertedrowid [ $cursor ]))
{
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " FileIsNotCorrect " ) . " </div></td> " ;
if ( ! $silent ) print '</tr>' ;
$error ++ ;
break ;
}
$from = '__' . $cursor . '__' ;
$to = $listofinsertedrowid [ $cursor ];
$newsql = str_replace ( $from , $to , $newsql );
2013-04-10 20:45:38 +02:00
$sqlmodified ++ ;
2011-09-21 17:53:54 +02:00
}
2014-06-13 01:42:00 +02:00
if ( $sqlmodified ) dol_syslog ( 'Admin.lib::run_sql New Request ' . ( $i + 1 ), LOG_DEBUG );
2013-04-10 20:45:38 +02:00
2011-09-21 17:53:54 +02:00
$result = $db -> query ( $newsql , $usesavepoint );
if ( $result )
{
if ( ! $silent ) print '<!-- Result = OK -->' . " \n " ;
if ( preg_replace ( '/insert into ([^\s]+)/i' , $newsql , $reg ))
{
$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 align="right">OK</td>';
}
else
{
$errno = $db -> errno ();
if ( ! $silent ) print '<!-- Result = ' . $errno . ' -->' . " \n " ;
2012-02-10 17:09:13 +01:00
// Define list of errors we accept (array $okerrors)
$okerrors = array ( // By default
'DB_ERROR_TABLE_ALREADY_EXISTS' ,
'DB_ERROR_COLUMN_ALREADY_EXISTS' ,
'DB_ERROR_KEY_NAME_ALREADY_EXISTS' ,
'DB_ERROR_TABLE_OR_KEY_ALREADY_EXISTS' , // PgSql use same code for table and key already exist
'DB_ERROR_RECORD_ALREADY_EXISTS' ,
'DB_ERROR_NOSUCHTABLE' ,
'DB_ERROR_NOSUCHFIELD' ,
'DB_ERROR_NO_FOREIGN_KEY_TO_DROP' ,
'DB_ERROR_NO_INDEX_TO_DROP' ,
'DB_ERROR_CANNOT_CREATE' , // Qd contrainte deja existante
'DB_ERROR_CANT_DROP_PRIMARY_KEY' ,
2016-04-28 13:56:17 +02:00
'DB_ERROR_PRIMARY_KEY_ALREADY_EXISTS' ,
'DB_ERROR_22P02'
2008-06-10 20:29:23 +02:00
);
2012-02-10 17:09:13 +01:00
if ( $okerror == 'none' ) $okerrors = array ();
// Is it an error we accept
if ( ! in_array ( $errno , $okerrors ))
2008-06-10 20:29:23 +02:00
{
2011-09-21 17:53:54 +02:00
if ( ! $silent ) print '<tr><td valign="top" colspan="2">' ;
if ( ! $silent ) print '<div class="error">' . $langs -> trans ( " Error " ) . " " . $db -> errno () . " : " . $newsql . " <br> " . $db -> error () . " </div></td> " ;
if ( ! $silent ) print '</tr>' . " \n " ;
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
}
2011-09-21 17:53:54 +02:00
}
if ( ! $silent ) print '</tr>' . " \n " ;
}
}
if ( $error == 0 )
{
if ( ! $silent ) print '<tr><td>' . $langs -> trans ( " ProcessMigrateScript " ) . '</td>' ;
if ( ! $silent ) print '<td align="right">' . $langs -> trans ( " OK " ) . '</td></tr>' . " \n " ;
$ok = 1 ;
}
else
{
if ( ! $silent ) print '<tr><td>' . $langs -> trans ( " ProcessMigrateScript " ) . '</td>' ;
if ( ! $silent ) print '<td align="right"><font class="error">' . $langs -> trans ( " KO " ) . '</font></td></tr>' . " \n " ;
$ok = 0 ;
}
return $ok ;
2008-06-10 20:29:23 +02:00
}
/**
2011-03-01 10:23:47 +01:00
* Effacement d ' une constante dans la base de donnees
2011-09-16 20:25:10 +02:00
*
* @ param DoliDB $db Database handler
* @ param string $name Name of constant or rowid of line
* @ param int $entity Multi company id , - 1 for all entities
* @ return int < 0 if KO , > 0 if OK
*
2012-01-15 19:07:01 +01:00
* @ see dolibarr_get_const , dolibarr_set_const , dol_set_user_param
2009-05-04 22:57:26 +02:00
*/
2009-04-27 22:37:50 +02:00
function dolibarr_del_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2011-09-21 17:53:54 +02:00
global $conf ;
2015-03-18 21:44:57 +01:00
if ( empty ( $name ))
{
dol_print_error ( '' , 'Error call dolibar_del_const with parameter name empty' );
return - 1 ;
}
2011-09-21 17:53:54 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
$sql .= " WHERE ( " . $db -> decrypt ( 'name' ) . " = ' " . $db -> escape ( $name ) . " ' " ;
if ( is_numeric ( $name )) $sql .= " OR rowid = ' " . $db -> escape ( $name ) . " ' " ;
$sql .= " ) " ;
if ( $entity >= 0 ) $sql .= " AND entity = " . $entity ;
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::dolibarr_del_const " , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$resql = $db -> query ( $sql );
if ( $resql )
{
$conf -> global -> $name = '' ;
return 1 ;
}
else
{
dol_print_error ( $db );
return - 1 ;
}
2008-02-01 01:09:23 +01:00
}
/**
2011-03-01 10:23:47 +01:00
* Recupere une constante depuis la base de donnees .
2011-09-16 20:25:10 +02:00
*
* @ param DoliDB $db Database handler
* @ param string $name Nom de la constante
* @ param int $entity Multi company id
* @ return string Valeur de la constante
*
2012-01-15 19:07:01 +01:00
* @ see dolibarr_del_const , dolibarr_set_const , dol_set_user_param
2009-05-04 22:57:26 +02:00
*/
2009-04-27 22:37:50 +02:00
function dolibarr_get_const ( $db , $name , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2011-09-21 17:53:54 +02:00
global $conf ;
$value = '' ;
$sql = " SELECT " . $db -> decrypt ( 'value' ) . " as value " ;
$sql .= " FROM " . MAIN_DB_PREFIX . " const " ;
$sql .= " WHERE name = " . $db -> encrypt ( $name , 1 );
$sql .= " AND entity = " . $entity ;
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::dolibarr_get_const " , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$resql = $db -> query ( $sql );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
if ( $obj ) $value = $obj -> value ;
}
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
* @ param string $type Type of constante ( chaine par defaut )
* @ 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
*
2012-01-15 19:07:01 +01:00
* @ see dolibarr_del_const , dolibarr_get_const , dol_set_user_param
2009-05-04 22:57:26 +02:00
*/
2009-04-27 22:37:50 +02:00
function dolibarr_set_const ( $db , $name , $value , $type = 'chaine' , $visible = 0 , $note = '' , $entity = 1 )
2008-02-01 01:09:23 +01:00
{
2011-09-21 17:53:54 +02:00
global $conf ;
2009-04-27 22:37:50 +02:00
2011-09-21 17:53:54 +02:00
// Clean parameters
$name = trim ( $name );
2010-01-13 11:55:23 +01:00
2011-09-21 17:53:54 +02:00
// Check parameters
if ( empty ( $name ))
{
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
2011-09-21 17:53:54 +02: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
2011-09-21 17:53:54 +02:00
$db -> begin ();
2009-04-14 20:54:13 +02:00
2011-09-21 17:53:54 +02:00
$sql = " DELETE FROM " . MAIN_DB_PREFIX . " const " ;
$sql .= " WHERE name = " . $db -> encrypt ( $name , 1 );
2012-01-09 23:57:44 +01:00
if ( $entity >= 0 ) $sql .= " AND entity = " . $entity ;
2009-12-23 16:26:29 +01:00
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::dolibarr_set_const " , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$resql = $db -> query ( $sql );
2008-02-01 01:09:23 +01:00
2011-09-21 17:53:54 +02:00
if ( strcmp ( $value , '' )) // true if different. Must work for $value='0' or $value=0
{
2011-11-23 21:43:25 +01:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " const(name,value,type,visible,note,entity) " ;
2011-09-21 17:53:54 +02:00
$sql .= " VALUES ( " ;
$sql .= $db -> encrypt ( $name , 1 );
$sql .= " , " . $db -> encrypt ( $value , 1 );
$sql .= " ,' " . $type . " ', " . $visible . " ,' " . $db -> escape ( $note ) . " ', " . $entity . " ) " ;
2010-08-18 16:01:23 +02:00
2011-09-21 17:53:54 +02:00
//print "sql".$value."-".pg_escape_string($value)."-".$sql;exit;
2010-09-02 00:45:10 +02:00
//print "xx".$db->escape($value);
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::dolibarr_set_const " , LOG_DEBUG );
2011-09-21 17:53:54 +02:00
$resql = $db -> query ( $sql );
}
if ( $resql )
{
$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
/**
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 ()
{
2011-09-21 17:53:54 +02:00
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
2008-06-10 20:29:23 +02:00
2011-09-21 17:53:54 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_other.php " ;
2013-03-24 07:11:44 +01:00
$head [ $h ][ 1 ] = $langs -> trans ( " Miscellaneous " );
2011-09-21 17:53:54 +02:00
$head [ $h ][ 2 ] = 'misc' ;
$h ++ ;
2008-06-10 20:29:23 +02:00
2011-04-02 20:55:41 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Passwords " );
$head [ $h ][ 2 ] = 'passwords' ;
$h ++ ;
2015-01-12 13:20:27 +01:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/security_file.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " Files " );
$head [ $h ][ 2 ] = 'file' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/proxy.php " ;
$head [ $h ][ 1 ] = $langs -> trans ( " ExternalAccess " );
$head [ $h ][ 2 ] = 'proxy' ;
$h ++ ;
2011-09-21 17:53:54 +02: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
2011-09-21 17:53:54 +02:00
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/perms.php " ;
2011-04-02 20:55:41 +02:00
$head [ $h ][ 1 ] = $langs -> trans ( " DefaultRights " );
$head [ $h ][ 2 ] = 'default' ;
$h ++ ;
return $head ;
2008-06-10 20:29:23 +02:00
}
2008-02-01 01:09:23 +01:00
2009-09-02 00:20:55 +02: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 ()
{
global $langs , $conf , $user ;
$h = 0 ;
$head = array ();
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/translation.php?mode=overwrite " ;
$head [ $h ][ 1 ] = $langs -> trans ( " TranslationOverwriteKey " );
$head [ $h ][ 2 ] = 'overwrite' ;
$h ++ ;
$head [ $h ][ 0 ] = DOL_URL_ROOT . " /admin/translation.php?mode=searchkey " ;
$head [ $h ][ 1 ] = $langs -> trans ( " TranslationKeySearch " );
$head [ $h ][ 2 ] = 'searchkey' ;
$h ++ ;
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'translation_admin' );
complete_head_from_modules ( $conf , $langs , null , $head , $h , 'translation_admin' , 'remove' );
return $head ;
}
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 ()
{
2011-09-21 17:53:54 +02:00
global $conf ;
2009-09-02 00:20:55 +02:00
2011-09-21 17:53:54 +02:00
$arrayofSessions = array ();
2014-01-20 02:21:30 +01:00
// 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
2011-09-21 17:53:54 +02:00
dol_syslog ( 'admin.lib:listOfSessions sessPath=' . $sessPath );
$dh = @ opendir ( dol_osencode ( $sessPath ));
if ( $dh )
{
while (( $file = @ readdir ( $dh )) !== false )
{
if ( preg_match ( '/^sess_/i' , $file ) && $file != " . " && $file != " .. " )
{
$fullpath = $sessPath . $file ;
if ( ! @ is_dir ( $fullpath ) && is_readable ( $fullpath ))
{
$sessValues = file_get_contents ( $fullpath ); // get raw session data
2016-02-03 01:00:10 +01:00
// Example of possible value
//$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
2011-09-21 17:53:54 +02:00
if ( preg_match ( '/dol_login/i' , $sessValues ) && // limit to dolibarr session
2016-02-28 12:43:00 +01:00
( preg_match ( '/dol_entity\|i:' . $conf -> entity . ';/i' , $sessValues ) || preg_match ( '/dol_entity\|s:([0-9]+):"' . $conf -> entity . '"/i' , $sessValues )) && // limit to current entity
2011-09-21 17:53:54 +02:00
preg_match ( '/dol_company\|s:([0-9]+):"(' . $conf -> global -> MAIN_INFO_SOCIETE_NOM . ')"/i' , $sessValues )) // limit to company name
{
$tmp = explode ( '_' , $file );
$idsess = $tmp [ 1 ];
$login = preg_match ( '/dol_login\|s:[0-9]+:"([A-Za-z0-9]+)"/i' , $sessValues , $regs );
$arrayofSessions [ $idsess ][ " login " ] = $regs [ 1 ];
$arrayofSessions [ $idsess ][ " age " ] = time () - filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " creation " ] = filectime ( $fullpath );
$arrayofSessions [ $idsess ][ " modification " ] = filemtime ( $fullpath );
$arrayofSessions [ $idsess ][ " raw " ] = $sessValues ;
}
}
}
}
@ closedir ( $dh );
}
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 )
{
2011-09-21 17:53:54 +02:00
global $conf ;
$arrayofSessions = array ();
$sessPath = ini_get ( " session.save_path " ) . " / " ;
dol_syslog ( 'admin.lib:purgeSessions mysessionid=' . $mysessionid . ' sessPath=' . $sessPath );
$error = 0 ;
$dh = @ opendir ( dol_osencode ( $sessPath ));
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
preg_match ( '/dol_company\|s:([0-9]+):"(' . $conf -> global -> MAIN_INFO_SOCIETE_NOM . ')"/i' , $sessValues )) // limit to company name
{
$tmp = explode ( '_' , $file );
$idsess = $tmp [ 1 ];
// We remove session if it's not ourself
if ( $idsess != $mysessionid )
{
$res =@ unlink ( $fullpath );
if ( ! $res ) $error ++ ;
}
}
}
}
}
@ closedir ( $dh );
2009-09-02 00:20:55 +02:00
2011-09-21 17:53:54 +02: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
*
* @ param string $value Name of module to activate
* @ param int $withdeps Activate / Disable also all dependencies
* @ return string Error message or '' ;
2010-11-13 19:57:10 +01:00
*/
2012-02-15 13:55:00 +01:00
function activateModule ( $value , $withdeps = 1 )
2010-11-13 19:57:10 +01:00
{
global $db , $modules , $langs , $conf ;
2011-09-16 20:25:10 +02:00
// Check parameters
if ( empty ( $value )) return 'ErrorBadParameter' ;
2010-11-13 19:57:10 +01:00
$ret = '' ;
2011-09-16 20:25:10 +02:00
$modName = $value ;
$modFile = $modName . " .class.php " ;
2010-11-13 19:57:10 +01:00
2011-12-02 23:23:07 +01:00
// Loop on each directory to fill $modulesdir
2015-10-21 05:06:19 +02:00
$modulesdir = dolGetModulesDirs ();
2010-11-13 19:57:10 +01:00
2015-10-22 13:13:02 +02:00
// Loop on each modulesdir directories
2011-12-02 23:23:07 +01:00
$found = false ;
2011-09-16 20:25:10 +02:00
foreach ( $modulesdir as $dir )
{
2011-09-21 17:53:54 +02:00
if ( file_exists ( $dir . $modFile ))
{
2012-08-23 02:04:35 +02:00
$found =@ include_once $dir . $modFile ;
2011-09-21 17:53:54 +02:00
if ( $found ) break ;
}
2011-09-16 20:25:10 +02:00
}
2010-11-13 19:57:10 +01:00
2011-09-16 20:25:10 +02:00
$objMod = new $modName ( $db );
2010-11-13 19:57:10 +01:00
2011-09-16 20:25:10 +02:00
// Test if PHP version ok
$verphp = versionphparray ();
$vermin = isset ( $objMod -> phpmin ) ? $objMod -> phpmin : 0 ;
if ( is_array ( $vermin ) && versioncompare ( $verphp , $vermin ) < 0 )
{
return $langs -> trans ( " ErrorModuleRequirePHPVersion " , versiontostring ( $vermin ));
}
2010-11-13 19:57:10 +01:00
2011-09-16 20:25:10 +02:00
// Test if Dolibarr version ok
$verdol = versiondolibarrarray ();
$vermin = isset ( $objMod -> need_dolibarr_version ) ? $objMod -> need_dolibarr_version : 0 ;
2014-10-05 20:26:35 +02:00
//print 'eee '.versioncompare($verdol,$vermin).' - '.join(',',$verdol).' - '.join(',',$vermin);exit;
2011-09-16 20:25:10 +02:00
if ( is_array ( $vermin ) && versioncompare ( $verdol , $vermin ) < 0 )
{
return $langs -> trans ( " ErrorModuleRequireDolibarrVersion " , versiontostring ( $vermin ));
}
2010-11-13 19:57:10 +01:00
2011-09-16 20:25:10 +02:00
// Test if javascript requirement ok
if ( ! empty ( $objMod -> need_javascript_ajax ) && empty ( $conf -> use_javascript_ajax ))
{
return $langs -> trans ( " ErrorModuleRequireJavascript " );
2010-11-13 19:57:10 +01:00
}
2011-09-16 20:25:10 +02:00
$result = $objMod -> init ();
if ( $result <= 0 ) $ret = $objMod -> error ;
2010-11-13 22:06:43 +01:00
if ( ! $ret && $withdeps )
2010-11-13 19:57:10 +01:00
{
2012-07-11 15:55:56 +02:00
if ( isset ( $objMod -> depends ) && is_array ( $objMod -> depends ) && ! empty ( $objMod -> depends ))
2010-11-13 19:57:10 +01:00
{
// Activation des modules dont le module depend
2016-06-04 17:17:22 +02:00
$TError = array ();
2011-09-20 18:12:52 +02:00
$num = count ( $objMod -> depends );
for ( $i = 0 ; $i < $num ; $i ++ )
2010-11-13 19:57:10 +01:00
{
2016-06-04 17:17:22 +02:00
$activate = false ;
2012-07-02 19:30:37 +02:00
foreach ( $modulesdir as $dir )
2012-06-06 14:00:23 +02:00
{
2012-07-02 19:30:37 +02:00
if ( file_exists ( $dir . $objMod -> depends [ $i ] . " .class.php " ))
{
activateModule ( $objMod -> depends [ $i ]);
2016-06-04 17:17:22 +02:00
$activate = true ;
2012-06-06 14:00:23 +02:00
}
}
2016-06-04 17:17:22 +02:00
if ( ! $activate ) $TError [] = $langs -> trans ( 'activateModuleDependNotSatisfied' , $objMod -> name , $objMod -> depends [ $i ]);
2010-11-13 19:57:10 +01:00
}
2016-06-04 17:17:22 +02:00
setEventMessages ( '' , $TError , 'errors' );
2010-11-13 19:57:10 +01:00
}
2012-07-11 15:55:56 +02:00
if ( isset ( $objMod -> conflictwith ) && is_array ( $objMod -> conflictwith ) && ! empty ( $objMod -> conflictwith ))
2010-11-13 19:57:10 +01:00
{
// Desactivation des modules qui entrent en conflit
2011-09-20 18:12:52 +02:00
$num = count ( $objMod -> conflictwith );
for ( $i = 0 ; $i < $num ; $i ++ )
2010-11-13 19:57:10 +01:00
{
2012-07-02 19:30:37 +02:00
foreach ( $modulesdir as $dir )
2012-06-06 14:00:23 +02:00
{
2012-07-02 19:30:37 +02:00
if ( file_exists ( $dir . $objMod -> conflictwith [ $i ] . " .class.php " ))
{
unActivateModule ( $objMod -> conflictwith [ $i ], 0 );
2012-06-06 14:00:23 +02:00
}
}
2010-11-13 19:57:10 +01:00
}
}
}
return $ret ;
}
/**
* 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
*/
2012-02-15 13:55:00 +01:00
function unActivateModule ( $value , $requiredby = 1 )
2010-11-13 19:57:10 +01:00
{
global $db , $modules , $conf ;
2011-09-16 20:25:10 +02:00
// Check parameters
if ( empty ( $value )) return 'ErrorBadParameter' ;
2010-11-13 19:57:10 +01:00
$ret = '' ;
2011-09-16 20:25:10 +02:00
$modName = $value ;
$modFile = $modName . " .class.php " ;
2011-01-16 02:14:48 +01:00
2011-12-02 23:23:07 +01:00
// Loop on each directory to fill $modulesdir
2015-10-21 05:06:19 +02:00
$modulesdir = dolGetModulesDirs ();
2011-01-16 02:14:48 +01:00
2015-10-22 13:13:02 +02:00
// Loop on each modulesdir directories
2011-12-02 23:23:07 +01:00
$found = false ;
2011-09-16 20:25:10 +02:00
foreach ( $modulesdir as $dir )
{
2011-09-21 17:53:54 +02:00
if ( file_exists ( $dir . $modFile ))
{
2012-08-23 02:04:35 +02:00
$found =@ include_once $dir . $modFile ;
2011-09-21 17:53:54 +02:00
if ( $found ) break ;
}
2011-09-16 20:25:10 +02:00
}
2010-11-13 19:57:10 +01:00
2011-09-16 20:25:10 +02:00
if ( $found )
{
$objMod = new $modName ( $db );
$result = $objMod -> remove ();
2015-06-05 03:32:09 +02:00
if ( $result <= 0 ) $ret = $objMod -> error ;
2011-09-16 20:25:10 +02:00
}
else
{
2015-11-04 16:43:24 +01:00
//print $dir.$modFile;
// 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
2015-07-10 09:40:18 +02:00
$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 ));
2012-02-15 13:55:00 +01:00
dol_syslog ( " modules::unActivateModule Failed to find module file, we use generic function with name " . $modName );
2015-11-04 16:43:24 +01:00
$genericMod -> _remove ( array ());
2010-11-13 19:57:10 +01:00
}
// Desactivation des modules qui dependent de lui
2015-06-05 03:32:09 +02:00
if ( ! $ret && $requiredby )
2010-11-13 19:57:10 +01:00
{
2011-09-16 20:25:10 +02:00
$countrb = count ( $objMod -> requiredby );
for ( $i = 0 ; $i < $countrb ; $i ++ )
2010-11-13 19:57:10 +01:00
{
2015-09-07 17:15:41 +02:00
//var_dump($objMod->requiredby[$i]);
2012-02-15 13:55:00 +01:00
unActivateModule ( $objMod -> requiredby [ $i ]);
2010-11-13 19:57:10 +01:00
}
}
return $ret ;
}
2011-01-23 20:51:29 +01:00
/**
2014-02-10 01:30:48 +01:00
* Add external modules to list of dictionaries
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
2014-09-28 02:46:20 +02:00
* @ param array $tabfieldcheck Tabfieldcheck
2011-09-16 20:25:10 +02:00
* @ return int 1
2011-01-23 20:51:29 +01:00
*/
2014-07-28 00:47:27 +02:00
function complete_dictionary_with_modules ( & $taborder , & $tabname , & $tablib , & $tabsql , & $tabsqlsort , & $tabfield , & $tabfieldvalue , & $tabfieldinsert , & $tabrowid , & $tabcond , & $tabhelp , & $tabfieldcheck )
2011-01-23 20:51:29 +01:00
{
global $db , $modules , $conf , $langs ;
// Search modules
2015-08-31 17:42:08 +02:00
$modulesdir = dolGetModulesDirs ();
2011-01-23 20:51:29 +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
foreach ( $modulesdir as $dir )
{
// 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 ));
if ( is_resource ( $handle ))
{
2011-01-23 20:51:29 +01:00
while (( $file = readdir ( $handle )) !== false )
{
//print "$i ".$file."\n<br>";
if ( is_readable ( $dir . $file ) && substr ( $file , 0 , 3 ) == 'mod' && substr ( $file , dol_strlen ( $file ) - 10 ) == '.class.php' )
{
$modName = substr ( $file , 0 , dol_strlen ( $file ) - 10 );
if ( $modName )
{
2012-08-23 02:04:35 +02:00
include_once $dir . $file ;
2011-01-23 20:51:29 +01:00
$objMod = new $modName ( $db );
if ( $objMod -> numero > 0 )
{
$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 )));
if ( $objMod -> version == 'development' && $conf -> global -> MAIN_FEATURES_LEVEL < 2 && ! $conf -> global -> $const_name ) $modulequalified = 0 ;
if ( $objMod -> version == 'experimental' && $conf -> global -> MAIN_FEATURES_LEVEL < 1 && ! $conf -> global -> $const_name ) $modulequalified = 0 ;
2014-06-12 15:28:11 +02:00
//If module is not activated disqualified
if ( empty ( $conf -> global -> $const_name )) $modulequalified = 0 ;
2011-01-23 20:51:29 +01:00
if ( $modulequalified )
{
2011-10-19 01:51:40 +02:00
// Load languages files of module
2015-10-21 05:06:19 +02:00
if ( isset ( $objMod -> langfiles ) && is_array ( $objMod -> langfiles ))
{
foreach ( $objMod -> langfiles as $langfile )
{
$langs -> load ( $langfile );
}
}
2011-10-19 01:51:40 +02:00
2011-01-23 20:51:29 +01:00
// Complete arrays
//&$tabname,&$tablib,&$tabsql,&$tabsqlsort,&$tabfield,&$tabfieldvalue,&$tabfieldinsert,&$tabrowid,&$tabcond
2014-07-27 23:51:58 +02:00
if ( empty ( $objMod -> dictionaries ) && ! empty ( $objMod -> dictionnaries )) $objMod -> dictionaries = $objMod -> dictionnaries ; // For backward compatibility
2014-02-10 01:30:48 +01:00
if ( ! empty ( $objMod -> dictionaries ))
2011-01-23 20:51:29 +01:00
{
2014-02-10 01:30:48 +01:00
//var_dump($objMod->dictionaries['tabname']);
2016-03-02 23:07:42 +01:00
$nbtabname = $nbtablib = $nbtabsql = $nbtabsqlsort = $nbtabfield = $nbtabfieldvalue = $nbtabfieldinsert = $nbtabrowid = $nbtabcond = $nbtabfieldcheck = $nbtabhelp = 0 ;
foreach ( $objMod -> dictionaries [ 'tabname' ] as $val ) { $nbtabname ++ ; $taborder [] = count ( $tabname ) + 1 ; $tabname [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tablib' ] as $val ) { $nbtablib ++ ; $tablib [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabsql' ] as $val ) { $nbtabsql ++ ; $tabsql [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabsqlsort' ] as $val ) { $nbtabsqlsort ++ ; $tabsqlsort [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabfield' ] as $val ) { $nbtabfield ++ ; $tabfield [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabfieldvalue' ] as $val ) { $nbtabfieldvalue ++ ; $tabfieldvalue [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabfieldinsert' ] as $val ) { $nbtabfieldinsert ++ ; $tabfieldinsert [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabrowid' ] as $val ) { $nbtabrowid ++ ; $tabrowid [] = $val ; }
foreach ( $objMod -> dictionaries [ 'tabcond' ] as $val ) { $nbtabcond ++ ; $tabcond [] = $val ; }
if ( ! empty ( $objMod -> dictionaries [ 'tabhelp' ])) foreach ( $objMod -> dictionaries [ 'tabhelp' ] as $val ) { $nbtabhelp ++ ; $tabhelp [] = $val ; }
if ( ! empty ( $objMod -> dictionaries [ 'tabfieldcheck' ])) foreach ( $objMod -> dictionaries [ 'tabfieldcheck' ] as $val ) { $nbtabfieldcheck ++ ; $tabfieldcheck [] = $val ; }
2016-04-28 13:56:17 +02:00
2016-03-02 23:07:42 +01:00
if ( $nbtabname != $nbtablib || $nbtablib != $nbtabsql || $nbtabsql != $nbtabsqlsort )
2011-01-23 22:24:47 +01:00
{
2016-03-02 23:07:42 +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";
2011-01-23 22:24:47 +01:00
}
2011-01-23 20:51:29 +01:00
}
$j ++ ;
$i ++ ;
}
else dol_syslog ( " Module " . get_class ( $objMod ) . " not qualified " );
}
}
}
closedir ( $handle );
}
else
{
dol_syslog ( " htdocs/admin/modules.php: Failed to open directory " . $dir . " . See permission and open_basedir option. " , LOG_WARNING );
}
}
2011-09-16 20:25:10 +02:00
return 1 ;
2011-01-23 20:51:29 +01:00
}
2015-09-08 13:11:26 +02:00
/**
* Add external modules to list of contact element
*
* @ param array $elementList elementList
* @ return int 1
*/
function complete_elementList_with_modules ( & $elementList )
{
global $db , $modules , $conf , $langs ;
// Search modules
$filename = array ();
$modules = array ();
$orders = array ();
$categ = array ();
$dirmod = array ();
2015-10-21 05:06:19 +02:00
2015-09-08 13:11:26 +02:00
$i = 0 ; // is a sequencer of modules found
$j = 0 ; // j is module number. Automatically affected if module number not defined.
2015-10-21 05:06:19 +02:00
$modulesdir = dolGetModulesDirs ();
2015-09-08 13:11:26 +02:00
foreach ( $modulesdir as $dir )
{
// 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 ));
if ( is_resource ( $handle ))
{
while (( $file = readdir ( $handle )) !== false )
{
//print "$i ".$file."\n<br>";
if ( is_readable ( $dir . $file ) && substr ( $file , 0 , 3 ) == 'mod' && substr ( $file , dol_strlen ( $file ) - 10 ) == '.class.php' )
{
$modName = substr ( $file , 0 , dol_strlen ( $file ) - 10 );
if ( $modName )
{
include_once $dir . $file ;
$objMod = new $modName ( $db );
if ( $objMod -> numero > 0 )
{
$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 )));
if ( $objMod -> version == 'development' && $conf -> global -> MAIN_FEATURES_LEVEL < 2 && ! $conf -> global -> $const_name ) $modulequalified = 0 ;
if ( $objMod -> version == 'experimental' && $conf -> global -> MAIN_FEATURES_LEVEL < 1 && ! $conf -> global -> $const_name ) $modulequalified = 0 ;
//If module is not activated disqualified
if ( empty ( $conf -> global -> $const_name )) $modulequalified = 0 ;
if ( $modulequalified )
{
// Load languages files of module
if ( isset ( $objMod -> langfiles ) && is_array ( $objMod -> langfiles ))
{
foreach ( $objMod -> langfiles as $langfile )
{
$langs -> load ( $langfile );
}
}
$modules [ $i ] = $objMod ;
$filename [ $i ] = $modName ;
$orders [ $i ] = $objMod -> family . " _ " . $j ; // Tri par famille puis numero module
//print "x".$modName." ".$orders[$i]."\n<br>";
if ( isset ( $categ [ $objMod -> special ])) $categ [ $objMod -> special ] ++ ; // Array of all different modules categories
else $categ [ $objMod -> special ] = 1 ;
$dirmod [ $i ] = $dirroot ;
2015-10-21 05:06:19 +02:00
if ( ! empty ( $objMod -> module_parts [ 'contactelement' ]))
2015-09-08 13:11:26 +02:00
{
$elementList [ $objMod -> name ] = $langs -> trans ( $objMod -> name );
}
$j ++ ;
$i ++ ;
}
else dol_syslog ( " Module " . get_class ( $objMod ) . " not qualified " );
}
}
}
closedir ( $handle );
}
else
{
dol_syslog ( " htdocs/admin/modules.php: Failed to open directory " . $dir . " . See permission and open_basedir option. " , LOG_WARNING );
}
}
return 1 ;
}
2012-01-11 18:43:38 +01:00
/**
* Show array with constants to edit
*
* @ param array $tableau Array of constants
2015-10-23 14:40:45 +02:00
* @ param int $strictw3c 0 = Include form into table ( deprecated ), 1 = Form is outside table to respect W3C ( no form into table ), 2 = No form nor button at all
2012-01-11 18:43:38 +01:00
* @ return void
*/
2013-05-09 22:39:31 +02:00
function form_constantes ( $tableau , $strictw3c = 0 )
2012-01-11 18:43:38 +01:00
{
global $db , $bc , $langs , $conf , $_Avery_Labels ;
$form = new Form ( $db );
2015-10-23 14:40:45 +02:00
if ( ! empty ( $strictw3c ) && $strictw3c == 1 ) print " \n " . '<form action="' . $_SERVER [ " PHP_SELF " ] . '" method="POST">' ;
2013-06-05 15:44:42 +02:00
2012-01-11 18:43:38 +01:00
print '<table class="noborder" width="100%">' ;
print '<tr class="liste_titre">' ;
print '<td>' . $langs -> trans ( " Description " ) . '</td>' ;
print '<td>' . $langs -> trans ( " Value " ) . '*</td>' ;
2013-05-09 22:39:31 +02:00
if ( empty ( $strictw3c )) print '<td align="center" width="80">' . $langs -> trans ( " Action " ) . '</td>' ;
2012-01-11 18:43:38 +01:00
print " </tr> \n " ;
$var = true ;
$listofparam = array ();
foreach ( $tableau as $const ) // Loop on each param
{
$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' ) . " = ' " . $const . " ' " ;
2012-09-13 11:52:50 +02:00
$sql .= " AND entity IN (0, " . $conf -> entity . " ) " ;
2012-01-11 18:43:38 +01:00
$sql .= " ORDER BY name ASC, entity DESC " ;
$result = $db -> query ( $sql );
2014-06-12 11:31:53 +02:00
dol_syslog ( " List params " , LOG_DEBUG );
2012-01-11 18:43:38 +01:00
if ( $result )
{
$obj = $db -> fetch_object ( $result ); // Take first result of select
$var =! $var ;
2012-09-13 11:52:50 +02:00
// For avoid warning in strict mode
if ( empty ( $obj )) {
$obj = ( object ) array ( 'rowid' => '' , 'name' => '' , 'value' => '' , 'type' => '' , 'note' => '' );
}
2013-05-09 22:39:31 +02:00
if ( empty ( $strictw3c )) print " \n " . '<form action="' . $_SERVER [ " PHP_SELF " ] . '" method="POST">' ;
2012-01-11 18:43:38 +01:00
print " <tr " . $bc [ $var ] . " > " ;
2013-05-09 22:39:31 +02:00
// Show constant
2012-01-11 18:43:38 +01:00
print '<td>' ;
print '<input type="hidden" name="token" value="' . $_SESSION [ 'newtoken' ] . '">' ;
print '<input type="hidden" name="action" value="update">' ;
2013-05-09 22:39:31 +02: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' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="' . nl2br ( dol_escape_htmltag ( $obj -> note )) . '">' ;
2012-01-11 18:43:38 +01:00
2012-07-30 08:21:05 +02:00
print $langs -> trans ( 'Desc' . $const );
2012-01-11 18:43:38 +01:00
2012-07-30 08:21:05 +02:00
if ( $const == 'ADHERENT_MAILMAN_URL' )
2012-01-11 18:43:38 +01:00
{
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick1">' . img_down () . '</a><br>' ;
2015-06-08 17:13:23 +02:00
//print 'http://lists.exampe.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&subscribees=%EMAIL%&send_welcome_msg_to_this_batch=1';
2012-01-11 18:43:38 +01:00
print '<div id="example1" class="hidden">' ;
2015-06-08 17:13:23 +02:00
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' ;
2012-01-11 18:43:38 +01:00
print '</div>' ;
}
2012-07-30 08:21:05 +02:00
if ( $const == 'ADHERENT_MAILMAN_UNSUB_URL' )
2012-01-11 18:43:38 +01:00
{
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick2">' . img_down () . '</a><br>' ;
print '<div id="example2" class="hidden">' ;
2015-06-08 17:13:23 +02:00
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' ;
2012-01-11 18:43:38 +01:00
print '</div>' ;
2015-06-08 17:13:23 +02:00
//print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/remove?adminpw=%MAILMAN_ADMINPW%&unsubscribees=%EMAIL%';
2012-01-11 18:43:38 +01:00
}
2013-06-05 15:44:42 +02:00
if ( $const == 'ADHERENT_MAILMAN_LISTS' )
{
2013-06-05 16:24:32 +02:00
print '. ' . $langs -> trans ( " Example " ) . ': <a href="#" id="exampleclick3">' . img_down () . '</a><br>' ;
2013-06-05 15:44:42 +02:00
print '<div id="example3" class="hidden">' ;
2013-06-05 16:24:32 +02:00
print 'mymailmanlist<br>' ;
2013-06-05 15:44:42 +02:00
print 'mymailmanlist1,mymailmanlist2<br>' ;
2013-06-05 15:53:27 +02:00
print 'TYPE:Type1:mymailmanlist1,TYPE:Type2:mymailmanlist2<br>' ;
2013-06-06 18:31:33 +02:00
if ( $conf -> categorie -> enabled ) print 'CATEG:Categ1:mymailmanlist1,CATEG:Categ2:mymailmanlist2<br>' ;
print '</div>' ;
2015-06-08 17:13:23 +02:00
//print 'http://lists.example.com/cgi-bin/mailman/admin/%LISTE%/members/remove?adminpw=%MAILMAN_ADMINPW%&unsubscribees=%EMAIL%';
2013-06-05 15:44:42 +02:00
}
2012-01-11 18:43:38 +01:00
print " </td> \n " ;
2013-05-09 22:39:31 +02:00
// Value
2012-01-11 18:43:38 +01:00
if ( $const == 'ADHERENT_CARD_TYPE' || $const == 'ADHERENT_ETIQUETTE_TYPE' )
{
print '<td>' ;
// List of possible labels (defined into $_Avery_Labels variable set into format_cards.lib.php)
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/lib/format_cards.lib.php' ;
2012-01-11 18:43:38 +01:00
$arrayoflabels = array ();
foreach ( array_keys ( $_Avery_Labels ) as $codecards )
{
$arrayoflabels [ $codecards ] = $_Avery_Labels [ $codecards ][ 'name' ];
}
2016-03-25 15:34:37 +01:00
print $form -> selectarray ( 'constvalue' . ( empty ( $strictw3c ) ? '' : '[]' ), $arrayoflabels ,( $obj -> value ? $obj -> value : 'CARD' ), 1 , 0 , 0 );
2012-01-11 18:43:38 +01:00
print '<input type="hidden" name="consttype" value="yesno">' ;
print '</td>' ;
}
else
{
print '<td>' ;
2012-04-28 16:37:58 +02:00
if ( in_array ( $const , array ( 'ADHERENT_CARD_TEXT' , 'ADHERENT_CARD_TEXT_RIGHT' , 'ADHERENT_ETIQUETTE_TEXT' )))
2012-01-11 18:43:38 +01:00
{
2013-05-09 22:39:31 +02:00
print '<textarea class="flat" name="constvalue' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" cols="50" rows="5" wrap="soft">' . " \n " ;
2012-01-11 18:43:38 +01:00
print $obj -> value ;
print " </textarea> \n " ;
print '<input type="hidden" name="consttype" value="texte">' ;
}
2012-08-26 22:33:27 +02:00
else if ( in_array ( $const , array ( 'ADHERENT_AUTOREGISTER_NOTIF_MAIL' , 'ADHERENT_AUTOREGISTER_MAIL' , 'ADHERENT_MAIL_VALID' , 'ADHERENT_MAIL_COTIS' , 'ADHERENT_MAIL_RESIL' )))
2012-01-11 18:43:38 +01:00
{
2012-08-22 23:11:24 +02:00
require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php' ;
2013-05-09 22:39:31 +02:00
$doleditor = new DolEditor ( 'constvalue_' . $const . ( empty ( $strictw3c ) ? '' : '[]' ), $obj -> value , '' , 160 , 'dolibarr_notes' , '' , false , false , $conf -> fckeditor -> enabled , 5 , 60 );
2012-01-11 18:43:38 +01:00
$doleditor -> Create ();
2013-05-09 22:39:31 +02:00
print '<input type="hidden" name="consttype' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="texte">' ;
2012-01-11 18:43:38 +01:00
}
else if ( $obj -> type == 'yesno' )
{
2016-03-25 15:53:44 +01:00
print $form -> selectyesno ( 'constvalue' . ( empty ( $strictw3c ) ? '' : '[]' ), $obj -> value , 1 );
2013-05-09 22:39:31 +02:00
print '<input type="hidden" name="consttype' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="yesno">' ;
2012-01-11 18:43:38 +01:00
}
else
{
2013-05-09 22:39:31 +02:00
print '<input type="text" class="flat" size="48" name="constvalue' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="' . dol_escape_htmltag ( $obj -> value ) . '">' ;
print '<input type="hidden" name="consttype' . ( empty ( $strictw3c ) ? '' : '[]' ) . '" value="chaine">' ;
2012-01-11 18:43:38 +01:00
}
print '</td>' ;
}
2013-05-09 22:39:31 +02:00
// Submit
if ( empty ( $strictw3c ))
{
print '<td align="center">' ;
print '<input type="submit" class="button" value="' . $langs -> trans ( " Update " ) . '" name="Button">' ;
print " </td> " ;
2013-06-05 15:44:42 +02:00
}
2013-05-09 22:39:31 +02:00
print " </tr> \n " ;
if ( empty ( $strictw3c )) print " </form> \n " ;
2012-01-11 18:43:38 +01:00
}
}
print '</table>' ;
2013-05-09 22:39:31 +02:00
2015-10-23 14:40:45 +02:00
if ( ! empty ( $strictw3c ) && $strictw3c == 1 )
2013-05-09 22:39:31 +02:00
{
print '<div align="center"><input type="submit" class="button" value="' . $langs -> trans ( " Update " ) . '" name="update"></div>' ;
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 )
{
2013-01-02 18:43:59 +01:00
global $conf , $langs ;
2013-01-05 19:23:16 +01:00
$text = $langs -> trans ( " OnlyFollowingModulesAreOpenedToExternalUsers " );
$listofmodules = explode ( ',' , $conf -> global -> MAIN_MODULES_FOR_EXTERNAL );
$i = 0 ;
2013-03-05 19:05:12 +01:00
if ( ! empty ( $modules )) {
foreach ( $modules as $module )
{
$moduleconst = $module -> const_name ;
$modulename = strtolower ( $module -> name );
//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;
if ( ! in_array ( $modulename , $listofmodules )) continue ;
2013-03-13 11:06:28 +01:00
2013-03-05 19:05:12 +01:00
if ( $i > 0 ) $text .= ', ' ;
else $text .= ' ' ;
$i ++ ;
$text .= $langs -> trans ( 'Module' . $module -> numero . 'Name' );
}
2013-01-05 19:23:16 +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
* @ return int < 0 if KO , > 0 if OK
*/
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
2012-04-03 11:01:07 +02:00
$sql = " INSERT INTO " . MAIN_DB_PREFIX . " document_model (nom, type, entity, libelle, description) " ;
$sql .= " VALUES (' " . $db -> escape ( $name ) . " ',' " . $type . " ', " . $conf -> entity . " , " ;
$sql .= ( $label ? " ' " . $db -> escape ( $label ) . " ' " : 'null' ) . " , " ;
$sql .= ( ! empty ( $description ) ? " ' " . $db -> escape ( $description ) . " ' " : " null " );
$sql .= " ) " ;
2012-04-28 14:52:53 +02:00
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::addDocumentModel " , LOG_DEBUG );
2012-07-02 19:30:37 +02:00
$resql = $db -> query ( $sql );
if ( $resql )
{
2012-04-03 11:01:07 +02:00
$db -> commit ();
2012-07-02 19:30:37 +02:00
return 1 ;
}
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
* @ return int < 0 if KO , > 0 if OK
*/
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 " ;
$sql .= " WHERE nom = ' " . $db -> escape ( $name ) . " ' " ;
$sql .= " AND type = ' " . $type . " ' " ;
2012-07-02 19:30:37 +02:00
$sql .= " AND entity = " . $conf -> entity ;
2014-06-12 11:31:53 +02:00
dol_syslog ( " admin.lib::delDocumentModel " , LOG_DEBUG );
2012-07-02 19:30:37 +02:00
$resql = $db -> query ( $sql );
if ( $resql )
{
2012-04-03 11:01:07 +02:00
$db -> commit ();
2012-07-02 19:30:37 +02:00
return 1 ;
}
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 ();
$info_arr = array ();
$info_lines = explode ( " \n " , strip_tags ( ob_get_clean (), " <tr><td><h2> " )); // end of ob_start()
$cat = " General " ;
foreach ( $info_lines as $line )
{
// new cat?
preg_match ( " ~<h2>(.*)</h2>~ " , $line , $title ) ? $cat = $title [ 1 ] : null ;
if ( preg_match ( " ~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~ " , $line , $val ))
{
$info_arr [ trim ( $cat )][ trim ( $val [ 1 ])] = $val [ 2 ];
}
elseif ( preg_match ( " ~<tr><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td><td[^>]+>([^<]*)</td></tr>~ " , $line , $val ))
{
$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
}