[2] | 1 | <?php |
---|
[362] | 2 | // +-----------------------------------------------------------------------+ |
---|
[593] | 3 | // | PhpWebGallery - a PHP based picture gallery | |
---|
| 4 | // | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net | |
---|
[1109] | 5 | // | Copyright (C) 2003-2006 PhpWebGallery Team - http://phpwebgallery.net | |
---|
[362] | 6 | // +-----------------------------------------------------------------------+ |
---|
[593] | 7 | // | branch : BSF (Best So Far) |
---|
[1113] | 8 | // | file : $Id: functions.inc.php 1363 2006-06-18 12:04:59Z nikrou $ |
---|
[362] | 9 | // | last update : $Date: 2006-06-18 12:04:59 +0000 (Sun, 18 Jun 2006) $ |
---|
| 10 | // | last modifier : $Author: nikrou $ |
---|
| 11 | // | revision : $Revision: 1363 $ |
---|
| 12 | // +-----------------------------------------------------------------------+ |
---|
| 13 | // | This program is free software; you can redistribute it and/or modify | |
---|
| 14 | // | it under the terms of the GNU General Public License as published by | |
---|
| 15 | // | the Free Software Foundation | |
---|
| 16 | // | | |
---|
| 17 | // | This program is distributed in the hope that it will be useful, but | |
---|
| 18 | // | WITHOUT ANY WARRANTY; without even the implied warranty of | |
---|
| 19 | // | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
---|
| 20 | // | General Public License for more details. | |
---|
| 21 | // | | |
---|
| 22 | // | You should have received a copy of the GNU General Public License | |
---|
| 23 | // | along with this program; if not, write to the Free Software | |
---|
| 24 | // | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, | |
---|
| 25 | // | USA. | |
---|
| 26 | // +-----------------------------------------------------------------------+ |
---|
[405] | 27 | |
---|
[394] | 28 | include_once( PHPWG_ROOT_PATH .'include/functions_user.inc.php' ); |
---|
| 29 | include_once( PHPWG_ROOT_PATH .'include/functions_session.inc.php' ); |
---|
| 30 | include_once( PHPWG_ROOT_PATH .'include/functions_category.inc.php' ); |
---|
| 31 | include_once( PHPWG_ROOT_PATH .'include/functions_xml.inc.php' ); |
---|
| 32 | include_once( PHPWG_ROOT_PATH .'include/functions_group.inc.php' ); |
---|
[477] | 33 | include_once( PHPWG_ROOT_PATH .'include/functions_html.inc.php' ); |
---|
[1119] | 34 | include_once( PHPWG_ROOT_PATH .'include/functions_tag.inc.php' ); |
---|
[1109] | 35 | include_once( PHPWG_ROOT_PATH .'include/functions_url.inc.php' ); |
---|
[2] | 36 | |
---|
| 37 | //----------------------------------------------------------- generic functions |
---|
| 38 | |
---|
[777] | 39 | /** |
---|
| 40 | * returns an array containing the possible values of an enum field |
---|
| 41 | * |
---|
| 42 | * @param string tablename |
---|
| 43 | * @param string fieldname |
---|
| 44 | */ |
---|
| 45 | function get_enums($table, $field) |
---|
| 46 | { |
---|
| 47 | // retrieving the properties of the table. Each line represents a field : |
---|
| 48 | // columns are 'Field', 'Type' |
---|
| 49 | $result = pwg_query('desc '.$table); |
---|
| 50 | while ($row = mysql_fetch_array($result)) |
---|
| 51 | { |
---|
| 52 | // we are only interested in the the field given in parameter for the |
---|
| 53 | // function |
---|
| 54 | if ($row['Field'] == $field) |
---|
| 55 | { |
---|
| 56 | // retrieving possible values of the enum field |
---|
| 57 | // enum('blue','green','black') |
---|
| 58 | $options = explode(',', substr($row['Type'], 5, -1)); |
---|
| 59 | foreach ($options as $i => $option) |
---|
| 60 | { |
---|
| 61 | $options[$i] = str_replace("'", '',$option); |
---|
| 62 | } |
---|
| 63 | } |
---|
| 64 | } |
---|
| 65 | mysql_free_result($result); |
---|
| 66 | return $options; |
---|
| 67 | } |
---|
| 68 | |
---|
[6] | 69 | // get_boolean transforms a string to a boolean value. If the string is |
---|
| 70 | // "false" (case insensitive), then the boolean value false is returned. In |
---|
| 71 | // any other case, true is returned. |
---|
[2] | 72 | function get_boolean( $string ) |
---|
| 73 | { |
---|
| 74 | $boolean = true; |
---|
| 75 | if ( preg_match( '/^false$/i', $string ) ) |
---|
| 76 | { |
---|
| 77 | $boolean = false; |
---|
| 78 | } |
---|
| 79 | return $boolean; |
---|
| 80 | } |
---|
| 81 | |
---|
[661] | 82 | /** |
---|
| 83 | * returns boolean string 'true' or 'false' if the given var is boolean |
---|
| 84 | * |
---|
| 85 | * @param mixed $var |
---|
| 86 | * @return mixed |
---|
| 87 | */ |
---|
| 88 | function boolean_to_string($var) |
---|
| 89 | { |
---|
| 90 | if (is_bool($var)) |
---|
| 91 | { |
---|
| 92 | if ($var) |
---|
| 93 | { |
---|
| 94 | return 'true'; |
---|
| 95 | } |
---|
| 96 | else |
---|
| 97 | { |
---|
| 98 | return 'false'; |
---|
| 99 | } |
---|
| 100 | } |
---|
| 101 | else |
---|
| 102 | { |
---|
| 103 | return $var; |
---|
| 104 | } |
---|
| 105 | } |
---|
| 106 | |
---|
[2] | 107 | // The function get_moment returns a float value coresponding to the number |
---|
| 108 | // of seconds since the unix epoch (1st January 1970) and the microseconds |
---|
| 109 | // are precised : e.g. 1052343429.89276600 |
---|
| 110 | function get_moment() |
---|
| 111 | { |
---|
[9] | 112 | $t1 = explode( ' ', microtime() ); |
---|
| 113 | $t2 = explode( '.', $t1[0] ); |
---|
| 114 | $t2 = $t1[1].'.'.$t2[1]; |
---|
[2] | 115 | return $t2; |
---|
| 116 | } |
---|
| 117 | |
---|
| 118 | // The function get_elapsed_time returns the number of seconds (with 3 |
---|
| 119 | // decimals precision) between the start time and the end time given. |
---|
| 120 | function get_elapsed_time( $start, $end ) |
---|
| 121 | { |
---|
| 122 | return number_format( $end - $start, 3, '.', ' ').' s'; |
---|
| 123 | } |
---|
| 124 | |
---|
| 125 | // - The replace_space function replaces space and '-' characters |
---|
| 126 | // by their HTML equivalent &nbsb; and − |
---|
| 127 | // - The function does not replace characters in HTML tags |
---|
| 128 | // - This function was created because IE5 does not respect the |
---|
| 129 | // CSS "white-space: nowrap;" property unless space and minus |
---|
| 130 | // characters are replaced like this function does. |
---|
[15] | 131 | // - Example : |
---|
| 132 | // <div class="foo">My friend</div> |
---|
| 133 | // ( 01234567891111111111222222222233 ) |
---|
| 134 | // ( 0123456789012345678901 ) |
---|
| 135 | // becomes : |
---|
| 136 | // <div class="foo">My friend</div> |
---|
[2] | 137 | function replace_space( $string ) |
---|
| 138 | { |
---|
[15] | 139 | //return $string; |
---|
| 140 | $return_string = ''; |
---|
| 141 | // $remaining is the rest of the string where to replace spaces characters |
---|
[2] | 142 | $remaining = $string; |
---|
[15] | 143 | // $start represents the position of the next '<' character |
---|
| 144 | // $end represents the position of the next '>' character |
---|
[2] | 145 | $start = 0; |
---|
| 146 | $end = 0; |
---|
[15] | 147 | $start = strpos ( $remaining, '<' ); // -> 0 |
---|
| 148 | $end = strpos ( $remaining, '>' ); // -> 16 |
---|
| 149 | // as long as a '<' and his friend '>' are found, we loop |
---|
[2] | 150 | while ( is_numeric( $start ) and is_numeric( $end ) ) |
---|
| 151 | { |
---|
[15] | 152 | // $treatment is the part of the string to treat |
---|
| 153 | // In the first loop of our example, this variable is empty, but in the |
---|
| 154 | // second loop, it equals 'My friend' |
---|
[2] | 155 | $treatment = substr ( $remaining, 0, $start ); |
---|
[15] | 156 | // Replacement of ' ' by his equivalent ' ' |
---|
[6] | 157 | $treatment = str_replace( ' ', ' ', $treatment ); |
---|
| 158 | $treatment = str_replace( '-', '−', $treatment ); |
---|
[15] | 159 | // composing the string to return by adding the treated string and the |
---|
| 160 | // following HTML tag -> 'My friend</div>' |
---|
| 161 | $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 ); |
---|
| 162 | // the remaining string is deplaced to the part after the '>' of this |
---|
| 163 | // loop |
---|
[2] | 164 | $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) ); |
---|
[6] | 165 | $start = strpos ( $remaining, '<' ); |
---|
| 166 | $end = strpos ( $remaining, '>' ); |
---|
[2] | 167 | } |
---|
[6] | 168 | $treatment = str_replace( ' ', ' ', $remaining ); |
---|
| 169 | $treatment = str_replace( '-', '−', $treatment ); |
---|
[2] | 170 | $return_string.= $treatment; |
---|
[15] | 171 | |
---|
[2] | 172 | return $return_string; |
---|
| 173 | } |
---|
| 174 | |
---|
[13] | 175 | // get_extension returns the part of the string after the last "." |
---|
| 176 | function get_extension( $filename ) |
---|
| 177 | { |
---|
| 178 | return substr( strrchr( $filename, '.' ), 1, strlen ( $filename ) ); |
---|
| 179 | } |
---|
| 180 | |
---|
| 181 | // get_filename_wo_extension returns the part of the string before the last |
---|
| 182 | // ".". |
---|
| 183 | // get_filename_wo_extension( 'test.tar.gz' ) -> 'test.tar' |
---|
| 184 | function get_filename_wo_extension( $filename ) |
---|
| 185 | { |
---|
| 186 | return substr( $filename, 0, strrpos( $filename, '.' ) ); |
---|
| 187 | } |
---|
| 188 | |
---|
[345] | 189 | /** |
---|
[512] | 190 | * returns an array contening sub-directories, excluding "CVS" |
---|
[345] | 191 | * |
---|
| 192 | * @param string $dir |
---|
| 193 | * @return array |
---|
| 194 | */ |
---|
[512] | 195 | function get_dirs($directory) |
---|
[2] | 196 | { |
---|
[345] | 197 | $sub_dirs = array(); |
---|
[2] | 198 | |
---|
[512] | 199 | if ($opendir = opendir($directory)) |
---|
[2] | 200 | { |
---|
[512] | 201 | while ($file = readdir($opendir)) |
---|
[2] | 202 | { |
---|
[512] | 203 | if ($file != '.' |
---|
| 204 | and $file != '..' |
---|
| 205 | and is_dir($directory.'/'.$file) |
---|
[1035] | 206 | and $file != 'CVS' |
---|
[1092] | 207 | and $file != '.svn') |
---|
[2] | 208 | { |
---|
[512] | 209 | array_push($sub_dirs, $file); |
---|
[2] | 210 | } |
---|
| 211 | } |
---|
| 212 | } |
---|
[345] | 213 | return $sub_dirs; |
---|
[2] | 214 | } |
---|
| 215 | |
---|
| 216 | // The get_picture_size function return an array containing : |
---|
| 217 | // - $picture_size[0] : final width |
---|
| 218 | // - $picture_size[1] : final height |
---|
| 219 | // The final dimensions are calculated thanks to the original dimensions and |
---|
| 220 | // the maximum dimensions given in parameters. get_picture_size respects |
---|
| 221 | // the width/height ratio |
---|
| 222 | function get_picture_size( $original_width, $original_height, |
---|
| 223 | $max_width, $max_height ) |
---|
| 224 | { |
---|
| 225 | $width = $original_width; |
---|
| 226 | $height = $original_height; |
---|
| 227 | $is_original_size = true; |
---|
[1086] | 228 | |
---|
[2] | 229 | if ( $max_width != "" ) |
---|
| 230 | { |
---|
| 231 | if ( $original_width > $max_width ) |
---|
| 232 | { |
---|
| 233 | $width = $max_width; |
---|
| 234 | $height = floor( ( $width * $original_height ) / $original_width ); |
---|
| 235 | } |
---|
| 236 | } |
---|
| 237 | if ( $max_height != "" ) |
---|
| 238 | { |
---|
| 239 | if ( $original_height > $max_height ) |
---|
| 240 | { |
---|
| 241 | $height = $max_height; |
---|
| 242 | $width = floor( ( $height * $original_width ) / $original_height ); |
---|
| 243 | $is_original_size = false; |
---|
| 244 | } |
---|
| 245 | } |
---|
| 246 | if ( is_numeric( $max_width ) and is_numeric( $max_height ) |
---|
| 247 | and $max_width != 0 and $max_height != 0 ) |
---|
| 248 | { |
---|
| 249 | $ratioWidth = $original_width / $max_width; |
---|
| 250 | $ratioHeight = $original_height / $max_height; |
---|
| 251 | if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) ) |
---|
| 252 | { |
---|
| 253 | if ( $ratioWidth < $ratioHeight ) |
---|
[1086] | 254 | { |
---|
[2] | 255 | $width = floor( $original_width / $ratioHeight ); |
---|
| 256 | $height = $max_height; |
---|
| 257 | } |
---|
| 258 | else |
---|
[1086] | 259 | { |
---|
| 260 | $width = $max_width; |
---|
[2] | 261 | $height = floor( $original_height / $ratioWidth ); |
---|
| 262 | } |
---|
| 263 | $is_original_size = false; |
---|
| 264 | } |
---|
| 265 | } |
---|
| 266 | $picture_size = array(); |
---|
| 267 | $picture_size[0] = $width; |
---|
| 268 | $picture_size[1] = $height; |
---|
| 269 | return $picture_size; |
---|
| 270 | } |
---|
[1119] | 271 | |
---|
| 272 | /** |
---|
| 273 | * simplify a string to insert it into an URL |
---|
| 274 | * |
---|
| 275 | * based on str2url function from Dotclear |
---|
| 276 | * |
---|
| 277 | * @param string |
---|
| 278 | * @return string |
---|
| 279 | */ |
---|
| 280 | function str2url($str) |
---|
| 281 | { |
---|
| 282 | $str = strtr( |
---|
| 283 | $str, |
---|
| 284 | 'ÀÁÂÃÄÅàáâãäåÇçÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûü¾ÝÿýÑñ', |
---|
| 285 | 'AAAAAAaaaaaaCcOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuYYyyNn' |
---|
| 286 | ); |
---|
| 287 | |
---|
| 288 | $str = str_replace('Æ', 'AE', $str); |
---|
| 289 | $str = str_replace('æ', 'ae', $str); |
---|
| 290 | $str = str_replace('¼', 'OE', $str); |
---|
| 291 | $str = str_replace('½', 'oe', $str); |
---|
| 292 | |
---|
[1131] | 293 | $str = preg_replace('/[^a-z0-9_\s\'\:\/\[\],-]/','',strtolower($str)); |
---|
| 294 | $str = preg_replace('/[\s\'\:\/\[\],-]+/',' ',trim($str)); |
---|
[1119] | 295 | $res = str_replace(' ','_',$str); |
---|
[1131] | 296 | |
---|
[1119] | 297 | return $res; |
---|
| 298 | } |
---|
| 299 | |
---|
[2] | 300 | //-------------------------------------------- PhpWebGallery specific functions |
---|
| 301 | |
---|
[512] | 302 | /** |
---|
| 303 | * returns an array with a list of {language_code => language_name} |
---|
| 304 | * |
---|
| 305 | * @returns array |
---|
| 306 | */ |
---|
| 307 | function get_languages() |
---|
[2] | 308 | { |
---|
[512] | 309 | $dir = opendir(PHPWG_ROOT_PATH.'language'); |
---|
[2] | 310 | $languages = array(); |
---|
[512] | 311 | |
---|
| 312 | while ($file = readdir($dir)) |
---|
[2] | 313 | { |
---|
[749] | 314 | $path = PHPWG_ROOT_PATH.'language/'.$file; |
---|
[512] | 315 | if (is_dir($path) and !is_link($path) and file_exists($path.'/iso.txt')) |
---|
[2] | 316 | { |
---|
[512] | 317 | list($language_name) = @file($path.'/iso.txt'); |
---|
[528] | 318 | $languages[$file] = $language_name; |
---|
[2] | 319 | } |
---|
| 320 | } |
---|
[512] | 321 | closedir($dir); |
---|
| 322 | @asort($languages); |
---|
| 323 | @reset($languages); |
---|
| 324 | |
---|
[2] | 325 | return $languages; |
---|
| 326 | } |
---|
| 327 | |
---|
[409] | 328 | /** |
---|
| 329 | * replaces the $search into <span style="$style">$search</span> in the |
---|
| 330 | * given $string. |
---|
| 331 | * |
---|
| 332 | * case insensitive replacements, does not replace characters in HTML tags |
---|
| 333 | * |
---|
| 334 | * @param string $string |
---|
| 335 | * @param string $search |
---|
| 336 | * @param string $style |
---|
| 337 | * @return string |
---|
| 338 | */ |
---|
[17] | 339 | function add_style( $string, $search, $style ) |
---|
[2] | 340 | { |
---|
| 341 | //return $string; |
---|
[17] | 342 | $return_string = ''; |
---|
[2] | 343 | $remaining = $string; |
---|
| 344 | |
---|
| 345 | $start = 0; |
---|
| 346 | $end = 0; |
---|
[6] | 347 | $start = strpos ( $remaining, '<' ); |
---|
| 348 | $end = strpos ( $remaining, '>' ); |
---|
[2] | 349 | while ( is_numeric( $start ) and is_numeric( $end ) ) |
---|
| 350 | { |
---|
| 351 | $treatment = substr ( $remaining, 0, $start ); |
---|
[409] | 352 | $treatment = preg_replace( '/('.$search.')/i', |
---|
| 353 | '<span style="'.$style.'">\\0</span>', |
---|
| 354 | $treatment ); |
---|
[17] | 355 | $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 ); |
---|
[2] | 356 | $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) ); |
---|
[6] | 357 | $start = strpos ( $remaining, '<' ); |
---|
| 358 | $end = strpos ( $remaining, '>' ); |
---|
[2] | 359 | } |
---|
[409] | 360 | $treatment = preg_replace( '/('.$search.')/i', |
---|
| 361 | '<span style="'.$style.'">\\0</span>', |
---|
| 362 | $remaining ); |
---|
[2] | 363 | $return_string.= $treatment; |
---|
[1086] | 364 | |
---|
[2] | 365 | return $return_string; |
---|
| 366 | } |
---|
| 367 | |
---|
[17] | 368 | // replace_search replaces a searched words array string by the search in |
---|
| 369 | // another style for the given $string. |
---|
| 370 | function replace_search( $string, $search ) |
---|
| 371 | { |
---|
[717] | 372 | // FIXME : with new advanced search, this function needs a rewrite |
---|
| 373 | return $string; |
---|
[1086] | 374 | |
---|
[17] | 375 | $words = explode( ',', $search ); |
---|
| 376 | $style = 'background-color:white;color:red;'; |
---|
| 377 | foreach ( $words as $word ) { |
---|
| 378 | $string = add_style( $string, $word, $style ); |
---|
| 379 | } |
---|
| 380 | return $string; |
---|
| 381 | } |
---|
| 382 | |
---|
[2] | 383 | function pwg_log( $file, $category, $picture = '' ) |
---|
| 384 | { |
---|
[13] | 385 | global $conf, $user; |
---|
[2] | 386 | |
---|
[725] | 387 | if ($conf['log']) |
---|
[2] | 388 | { |
---|
[1070] | 389 | if ( ($conf['history_admin'] ) or ( (! $conf['history_admin']) and (!is_admin()) ) ) |
---|
[1092] | 390 | { |
---|
[876] | 391 | $login = ($user['id'] == $conf['guest_id']) |
---|
| 392 | ? 'guest' : addslashes($user['username']); |
---|
[1086] | 393 | |
---|
[725] | 394 | $query = ' |
---|
| 395 | INSERT INTO '.HISTORY_TABLE.' |
---|
| 396 | (date,login,IP,file,category,picture) |
---|
| 397 | VALUES |
---|
| 398 | (NOW(), |
---|
[876] | 399 | \''.$login.'\', |
---|
[725] | 400 | \''.$_SERVER['REMOTE_ADDR'].'\', |
---|
[868] | 401 | \''.addslashes($file).'\', |
---|
[876] | 402 | \''.addslashes(strip_tags($category)).'\', |
---|
[868] | 403 | \''.addslashes($picture).'\') |
---|
[725] | 404 | ;'; |
---|
| 405 | pwg_query($query); |
---|
[2] | 406 | } |
---|
[894] | 407 | } |
---|
[2] | 408 | } |
---|
| 409 | |
---|
[85] | 410 | // format_date returns a formatted date for display. The date given in |
---|
| 411 | // argument can be a unixdate (number of seconds since the 01.01.1970) or an |
---|
| 412 | // american format (2003-09-15). By option, you can show the time. The |
---|
| 413 | // output is internationalized. |
---|
| 414 | // |
---|
| 415 | // format_date( "2003-09-15", 'us', true ) -> "Monday 15 September 2003 21:52" |
---|
[599] | 416 | function format_date($date, $type = 'us', $show_time = false) |
---|
[61] | 417 | { |
---|
| 418 | global $lang; |
---|
| 419 | |
---|
[599] | 420 | list($year,$month,$day,$hour,$minute,$second) = array(0,0,0,0,0,0); |
---|
[1086] | 421 | |
---|
[61] | 422 | switch ( $type ) |
---|
| 423 | { |
---|
[599] | 424 | case 'us' : |
---|
| 425 | { |
---|
| 426 | list($year,$month,$day) = explode('-', $date); |
---|
| 427 | break; |
---|
| 428 | } |
---|
| 429 | case 'unix' : |
---|
| 430 | { |
---|
[667] | 431 | list($year,$month,$day,$hour,$minute) = |
---|
[599] | 432 | explode('.', date('Y.n.j.G.i', $date)); |
---|
| 433 | break; |
---|
| 434 | } |
---|
| 435 | case 'mysql_datetime' : |
---|
| 436 | { |
---|
| 437 | preg_match('/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/', |
---|
| 438 | $date, $out); |
---|
| 439 | list($year,$month,$day,$hour,$minute,$second) = |
---|
| 440 | array($out[1],$out[2],$out[3],$out[4],$out[5],$out[6]); |
---|
| 441 | break; |
---|
| 442 | } |
---|
[61] | 443 | } |
---|
[599] | 444 | $formated_date = ''; |
---|
| 445 | // before 1970, Microsoft Windows can't mktime |
---|
[698] | 446 | if ($year >= 1970) |
---|
[61] | 447 | { |
---|
[618] | 448 | // we ask midday because Windows think it's prior to midnight with a |
---|
| 449 | // zero and refuse to work |
---|
| 450 | $formated_date.= $lang['day'][date('w', mktime(12,0,0,$month,$day,$year))]; |
---|
[61] | 451 | } |
---|
[599] | 452 | $formated_date.= ' '.$day; |
---|
| 453 | $formated_date.= ' '.$lang['month'][(int)$month]; |
---|
| 454 | $formated_date.= ' '.$year; |
---|
| 455 | if ($show_time) |
---|
| 456 | { |
---|
| 457 | $formated_date.= ' '.$hour.':'.$minute; |
---|
| 458 | } |
---|
[61] | 459 | |
---|
| 460 | return $formated_date; |
---|
| 461 | } |
---|
[85] | 462 | |
---|
[587] | 463 | function pwg_query($query) |
---|
[345] | 464 | { |
---|
[1033] | 465 | global $conf,$page,$debug,$t2; |
---|
[1086] | 466 | |
---|
[345] | 467 | $start = get_moment(); |
---|
[672] | 468 | $result = mysql_query($query) or my_error($query."\n"); |
---|
[1086] | 469 | |
---|
[659] | 470 | $time = get_moment() - $start; |
---|
[672] | 471 | |
---|
| 472 | if (!isset($page['count_queries'])) |
---|
| 473 | { |
---|
| 474 | $page['count_queries'] = 0; |
---|
| 475 | $page['queries_time'] = 0; |
---|
| 476 | } |
---|
[1086] | 477 | |
---|
[672] | 478 | $page['count_queries']++; |
---|
| 479 | $page['queries_time']+= $time; |
---|
[1086] | 480 | |
---|
[592] | 481 | if ($conf['show_queries']) |
---|
[587] | 482 | { |
---|
| 483 | $output = ''; |
---|
[672] | 484 | $output.= '<pre>['.$page['count_queries'].'] '; |
---|
| 485 | $output.= "\n".$query; |
---|
| 486 | $output.= "\n".'(this query time : '; |
---|
[1012] | 487 | $output.= '<b>'.number_format($time, 3, '.', ' ').' s)</b>'; |
---|
[672] | 488 | $output.= "\n".'(total SQL time : '; |
---|
| 489 | $output.= number_format($page['queries_time'], 3, '.', ' ').' s)'; |
---|
[1033] | 490 | $output.= "\n".'(total time : '; |
---|
| 491 | $output.= number_format( ($time+$start-$t2), 3, '.', ' ').' s)'; |
---|
[1012] | 492 | $output.= "</pre>\n"; |
---|
[1086] | 493 | |
---|
[1012] | 494 | $debug .= $output; |
---|
[587] | 495 | } |
---|
[1086] | 496 | |
---|
[345] | 497 | return $result; |
---|
| 498 | } |
---|
| 499 | |
---|
| 500 | function pwg_debug( $string ) |
---|
| 501 | { |
---|
[1033] | 502 | global $debug,$t2,$page; |
---|
[345] | 503 | |
---|
| 504 | $now = explode( ' ', microtime() ); |
---|
| 505 | $now2 = explode( '.', $now[0] ); |
---|
| 506 | $now2 = $now[1].'.'.$now2[1]; |
---|
| 507 | $time = number_format( $now2 - $t2, 3, '.', ' ').' s'; |
---|
[1012] | 508 | $debug .= '<p>'; |
---|
[345] | 509 | $debug.= '['.$time.', '; |
---|
[1033] | 510 | $debug.= $page['count_queries'].' queries] : '.$string; |
---|
[1012] | 511 | $debug.= "</p>\n"; |
---|
[345] | 512 | } |
---|
[351] | 513 | |
---|
[405] | 514 | /** |
---|
| 515 | * Redirects to the given URL |
---|
| 516 | * |
---|
| 517 | * Note : once this function called, the execution doesn't go further |
---|
| 518 | * (presence of an exit() instruction. |
---|
| 519 | * |
---|
| 520 | * @param string $url |
---|
[1156] | 521 | * @param string $title_msg |
---|
| 522 | * @param integer $refreh_time |
---|
[405] | 523 | * @return void |
---|
| 524 | */ |
---|
[1156] | 525 | function redirect( $url , $msg = '', $refreh_time = 0) |
---|
[405] | 526 | { |
---|
[1027] | 527 | global $user, $template, $lang_info, $conf, $lang, $t2, $page, $debug; |
---|
[405] | 528 | |
---|
[1298] | 529 | unset($template); |
---|
| 530 | $template = new Template(PHPWG_ROOT_PATH.'template/'.$user['template']); |
---|
| 531 | if (!isset($page['body_id'])) |
---|
| 532 | { |
---|
| 533 | $page['body_id'] = 'adminPage'; |
---|
| 534 | } |
---|
| 535 | |
---|
[1156] | 536 | // $redirect_msg, $refresh, $url_link and $title are required for creating an automated |
---|
[405] | 537 | // refresh page in header.tpl |
---|
[1156] | 538 | if (!isset($msg) or ($msg == '')) |
---|
| 539 | { |
---|
| 540 | $redirect_msg = l10n('redirect_msg'); |
---|
| 541 | } |
---|
| 542 | else |
---|
| 543 | { |
---|
| 544 | $redirect_msg = $msg; |
---|
| 545 | } |
---|
[1160] | 546 | $redirect_msg = nl2br($redirect_msg); |
---|
[1156] | 547 | $refresh = $refreh_time; |
---|
[405] | 548 | $url_link = $url; |
---|
| 549 | $title = 'redirection'; |
---|
[688] | 550 | |
---|
[405] | 551 | include( PHPWG_ROOT_PATH.'include/page_header.php' ); |
---|
[1086] | 552 | |
---|
[405] | 553 | $template->set_filenames( array( 'redirect' => 'redirect.tpl' ) ); |
---|
[688] | 554 | $template->parse('redirect'); |
---|
[1086] | 555 | |
---|
[405] | 556 | include( PHPWG_ROOT_PATH.'include/page_tail.php' ); |
---|
| 557 | |
---|
| 558 | exit(); |
---|
| 559 | } |
---|
[507] | 560 | |
---|
| 561 | /** |
---|
| 562 | * returns $_SERVER['QUERY_STRING'] whitout keys given in parameters |
---|
| 563 | * |
---|
| 564 | * @param array $rejects |
---|
| 565 | * @returns string |
---|
| 566 | */ |
---|
| 567 | function get_query_string_diff($rejects = array()) |
---|
| 568 | { |
---|
| 569 | $query_string = ''; |
---|
[1086] | 570 | |
---|
[507] | 571 | $str = $_SERVER['QUERY_STRING']; |
---|
| 572 | parse_str($str, $vars); |
---|
[1086] | 573 | |
---|
[507] | 574 | $is_first = true; |
---|
| 575 | foreach ($vars as $key => $value) |
---|
| 576 | { |
---|
| 577 | if (!in_array($key, $rejects)) |
---|
| 578 | { |
---|
[764] | 579 | $query_string.= $is_first ? '?' : '&'; |
---|
| 580 | $is_first = false; |
---|
[507] | 581 | $query_string.= $key.'='.$value; |
---|
| 582 | } |
---|
| 583 | } |
---|
| 584 | |
---|
| 585 | return $query_string; |
---|
| 586 | } |
---|
[512] | 587 | |
---|
[1020] | 588 | function url_is_remote($url) |
---|
| 589 | { |
---|
| 590 | if (preg_match('/^https?:\/\/[~\/\.\w-]+$/', $url)) |
---|
| 591 | { |
---|
| 592 | return true; |
---|
| 593 | } |
---|
| 594 | return false; |
---|
| 595 | } |
---|
| 596 | |
---|
[512] | 597 | /** |
---|
[1048] | 598 | * returns available template/theme |
---|
[512] | 599 | */ |
---|
[1363] | 600 | function get_pwg_themes($template_root = 'public') |
---|
[512] | 601 | { |
---|
[960] | 602 | $themes = array(); |
---|
[579] | 603 | |
---|
[1363] | 604 | $template_dir = PHPWG_ROOT_PATH.'template'.'/'.$template_root; |
---|
[1086] | 605 | |
---|
[1048] | 606 | foreach (get_dirs($template_dir) as $template) |
---|
[960] | 607 | { |
---|
[1048] | 608 | foreach (get_dirs($template_dir.'/'.$template.'/theme') as $theme) |
---|
[960] | 609 | { |
---|
| 610 | array_push($themes, $template.'/'.$theme); |
---|
| 611 | } |
---|
| 612 | } |
---|
| 613 | |
---|
| 614 | return $themes; |
---|
| 615 | } |
---|
| 616 | |
---|
[579] | 617 | /** |
---|
| 618 | * returns thumbnail filepath (or distant URL if thumbnail is remote) for a |
---|
| 619 | * given element |
---|
| 620 | * |
---|
| 621 | * the returned string can represente the filepath of the thumbnail or the |
---|
| 622 | * filepath to the corresponding icon for non picture elements |
---|
| 623 | * |
---|
[606] | 624 | * @param string path |
---|
[579] | 625 | * @param string tn_ext |
---|
[1090] | 626 | * @param bool with_rewrite if true returned path can't be used from the script |
---|
[579] | 627 | * @return string |
---|
| 628 | */ |
---|
[1090] | 629 | function get_thumbnail_src($path, $tn_ext = '', $with_rewrite = true) |
---|
[579] | 630 | { |
---|
[606] | 631 | global $conf, $user; |
---|
| 632 | |
---|
[579] | 633 | if ($tn_ext != '') |
---|
| 634 | { |
---|
[1082] | 635 | $src = substr_replace( |
---|
| 636 | get_filename_wo_extension($path), |
---|
| 637 | '/thumbnail/'.$conf['prefix_thumbnail'], |
---|
| 638 | strrpos($path,'/'), |
---|
| 639 | 1 |
---|
| 640 | ); |
---|
[579] | 641 | $src.= '.'.$tn_ext; |
---|
[1090] | 642 | if ($with_rewrite==true and !url_is_remote($src) ) |
---|
| 643 | { |
---|
| 644 | $src = get_root_url().$src; |
---|
| 645 | } |
---|
[579] | 646 | } |
---|
| 647 | else |
---|
| 648 | { |
---|
[1090] | 649 | $src = ($with_rewrite==true) ? get_root_url() : ''; |
---|
| 650 | $src .= get_themeconf('mime_icon_dir'); |
---|
[606] | 651 | $src.= strtolower(get_extension($path)).'.png'; |
---|
[579] | 652 | } |
---|
[1086] | 653 | |
---|
[579] | 654 | return $src; |
---|
| 655 | } |
---|
[672] | 656 | |
---|
| 657 | // my_error returns (or send to standard output) the message concerning the |
---|
| 658 | // error occured for the last mysql query. |
---|
[735] | 659 | function my_error($header) |
---|
[672] | 660 | { |
---|
[1221] | 661 | global $conf; |
---|
| 662 | |
---|
[672] | 663 | $error = '<pre>'; |
---|
| 664 | $error.= $header; |
---|
| 665 | $error.= '[mysql error '.mysql_errno().'] '; |
---|
| 666 | $error.= mysql_error(); |
---|
| 667 | $error.= '</pre>'; |
---|
[1221] | 668 | |
---|
| 669 | if ($conf['die_on_sql_error']) |
---|
| 670 | { |
---|
| 671 | die($error); |
---|
| 672 | } |
---|
| 673 | else |
---|
| 674 | { |
---|
| 675 | echo $error; |
---|
| 676 | } |
---|
[672] | 677 | } |
---|
[755] | 678 | |
---|
| 679 | /** |
---|
| 680 | * creates an array based on a query, this function is a very common pattern |
---|
| 681 | * used here |
---|
| 682 | * |
---|
| 683 | * @param string $query |
---|
| 684 | * @param string $fieldname |
---|
| 685 | * @return array |
---|
| 686 | */ |
---|
| 687 | function array_from_query($query, $fieldname) |
---|
| 688 | { |
---|
| 689 | $array = array(); |
---|
[1086] | 690 | |
---|
[755] | 691 | $result = pwg_query($query); |
---|
| 692 | while ($row = mysql_fetch_array($result)) |
---|
| 693 | { |
---|
| 694 | array_push($array, $row[$fieldname]); |
---|
| 695 | } |
---|
| 696 | |
---|
| 697 | return $array; |
---|
| 698 | } |
---|
[762] | 699 | |
---|
| 700 | /** |
---|
| 701 | * instantiate number list for days in a template block |
---|
| 702 | * |
---|
| 703 | * @param string blockname |
---|
| 704 | * @param string selection |
---|
| 705 | */ |
---|
| 706 | function get_day_list($blockname, $selection) |
---|
| 707 | { |
---|
| 708 | global $template; |
---|
[1086] | 709 | |
---|
[762] | 710 | $template->assign_block_vars( |
---|
| 711 | $blockname, array('SELECTED' => '', 'VALUE' => 0, 'OPTION' => '--')); |
---|
[1086] | 712 | |
---|
[762] | 713 | for ($i = 1; $i <= 31; $i++) |
---|
| 714 | { |
---|
| 715 | $selected = ''; |
---|
| 716 | if ($i == (int)$selection) |
---|
| 717 | { |
---|
| 718 | $selected = 'selected="selected"'; |
---|
| 719 | } |
---|
| 720 | $template->assign_block_vars( |
---|
| 721 | $blockname, array('SELECTED' => $selected, |
---|
| 722 | 'VALUE' => $i, |
---|
| 723 | 'OPTION' => str_pad($i, 2, '0', STR_PAD_LEFT))); |
---|
| 724 | } |
---|
| 725 | } |
---|
| 726 | |
---|
| 727 | /** |
---|
| 728 | * instantiate month list in a template block |
---|
| 729 | * |
---|
| 730 | * @param string blockname |
---|
| 731 | * @param string selection |
---|
| 732 | */ |
---|
| 733 | function get_month_list($blockname, $selection) |
---|
| 734 | { |
---|
| 735 | global $template, $lang; |
---|
[1086] | 736 | |
---|
[762] | 737 | $template->assign_block_vars( |
---|
| 738 | $blockname, array('SELECTED' => '', |
---|
| 739 | 'VALUE' => 0, |
---|
| 740 | 'OPTION' => '------------')); |
---|
| 741 | |
---|
| 742 | for ($i = 1; $i <= 12; $i++) |
---|
| 743 | { |
---|
| 744 | $selected = ''; |
---|
| 745 | if ($i == (int)$selection) |
---|
| 746 | { |
---|
| 747 | $selected = 'selected="selected"'; |
---|
| 748 | } |
---|
| 749 | $template->assign_block_vars( |
---|
| 750 | $blockname, array('SELECTED' => $selected, |
---|
| 751 | 'VALUE' => $i, |
---|
| 752 | 'OPTION' => $lang['month'][$i])); |
---|
| 753 | } |
---|
| 754 | } |
---|
[764] | 755 | |
---|
| 756 | /** |
---|
| 757 | * fill the current user caddie with given elements, if not already in |
---|
| 758 | * caddie |
---|
| 759 | * |
---|
| 760 | * @param array elements_id |
---|
| 761 | */ |
---|
| 762 | function fill_caddie($elements_id) |
---|
| 763 | { |
---|
| 764 | global $user; |
---|
[1086] | 765 | |
---|
[764] | 766 | include_once(PHPWG_ROOT_PATH.'admin/include/functions.php'); |
---|
[1086] | 767 | |
---|
[764] | 768 | $query = ' |
---|
| 769 | SELECT element_id |
---|
| 770 | FROM '.CADDIE_TABLE.' |
---|
| 771 | WHERE user_id = '.$user['id'].' |
---|
| 772 | ;'; |
---|
| 773 | $in_caddie = array_from_query($query, 'element_id'); |
---|
| 774 | |
---|
| 775 | $caddiables = array_diff($elements_id, $in_caddie); |
---|
| 776 | |
---|
| 777 | $datas = array(); |
---|
| 778 | |
---|
| 779 | foreach ($caddiables as $caddiable) |
---|
| 780 | { |
---|
| 781 | array_push($datas, array('element_id' => $caddiable, |
---|
| 782 | 'user_id' => $user['id'])); |
---|
| 783 | } |
---|
| 784 | |
---|
| 785 | if (count($caddiables) > 0) |
---|
| 786 | { |
---|
| 787 | mass_inserts(CADDIE_TABLE, array('element_id','user_id'), $datas); |
---|
| 788 | } |
---|
| 789 | } |
---|
[793] | 790 | |
---|
| 791 | /** |
---|
| 792 | * returns the element name from its filename |
---|
| 793 | * |
---|
| 794 | * @param string filename |
---|
| 795 | * @return string name |
---|
| 796 | */ |
---|
| 797 | function get_name_from_file($filename) |
---|
| 798 | { |
---|
| 799 | return str_replace('_',' ',get_filename_wo_extension($filename)); |
---|
| 800 | } |
---|
| 801 | |
---|
| 802 | /** |
---|
| 803 | * returns the corresponding value from $lang if existing. Else, the key is |
---|
| 804 | * returned |
---|
| 805 | * |
---|
| 806 | * @param string key |
---|
| 807 | * @return string |
---|
| 808 | */ |
---|
[1290] | 809 | function l10n($key) |
---|
[793] | 810 | { |
---|
[808] | 811 | global $lang, $conf; |
---|
[793] | 812 | |
---|
[862] | 813 | if ($conf['debug_l10n'] and !isset($lang[$key])) |
---|
[808] | 814 | { |
---|
| 815 | echo '[l10n] language key "'.$key.'" is not defined<br />'; |
---|
| 816 | } |
---|
[1086] | 817 | |
---|
[808] | 818 | return isset($lang[$key]) ? $lang[$key] : $key; |
---|
[793] | 819 | } |
---|
[960] | 820 | |
---|
| 821 | /** |
---|
[1361] | 822 | * Translate string in string ascii7bits |
---|
| 823 | * It's possible to do that with iconv_substr but this fonction is not avaible on all the providers. |
---|
| 824 | * |
---|
| 825 | * @param string str |
---|
| 826 | * @return string |
---|
| 827 | */ |
---|
| 828 | function str_translate_to_ascii7bits($str) |
---|
| 829 | { |
---|
| 830 | global $lang_table_translate_ascii7bits; |
---|
| 831 | |
---|
| 832 | $src_table = array_keys($lang_table_translate_ascii7bits); |
---|
| 833 | $dst_table = array_values($lang_table_translate_ascii7bits); |
---|
| 834 | |
---|
| 835 | return str_replace($src_table , $dst_table, $str); |
---|
| 836 | } |
---|
| 837 | |
---|
| 838 | /** |
---|
[1008] | 839 | * returns the corresponding value from $themeconf if existing. Else, the |
---|
| 840 | * key is returned |
---|
[960] | 841 | * |
---|
| 842 | * @param string key |
---|
| 843 | * @return string |
---|
| 844 | */ |
---|
| 845 | function get_themeconf($key) |
---|
| 846 | { |
---|
| 847 | global $themeconf; |
---|
| 848 | |
---|
| 849 | return $themeconf[$key]; |
---|
| 850 | } |
---|
[1008] | 851 | |
---|
| 852 | /** |
---|
[1021] | 853 | * Returns webmaster mail address depending on $conf['webmaster_id'] |
---|
| 854 | * |
---|
| 855 | * @return string |
---|
| 856 | */ |
---|
| 857 | function get_webmaster_mail_address() |
---|
| 858 | { |
---|
| 859 | global $conf; |
---|
| 860 | |
---|
| 861 | $query = ' |
---|
| 862 | SELECT '.$conf['user_fields']['email'].' |
---|
| 863 | FROM '.USERS_TABLE.' |
---|
| 864 | WHERE '.$conf['user_fields']['id'].' = '.$conf['webmaster_id'].' |
---|
| 865 | ;'; |
---|
| 866 | list($email) = mysql_fetch_array(pwg_query($query)); |
---|
| 867 | |
---|
| 868 | return $email; |
---|
| 869 | } |
---|
[1027] | 870 | |
---|
| 871 | /** |
---|
| 872 | * which upgrades are available ? |
---|
| 873 | * |
---|
| 874 | * @return array |
---|
| 875 | */ |
---|
| 876 | function get_available_upgrade_ids() |
---|
| 877 | { |
---|
| 878 | $upgrades_path = PHPWG_ROOT_PATH.'install/db'; |
---|
| 879 | |
---|
| 880 | $available_upgrade_ids = array(); |
---|
[1086] | 881 | |
---|
[1027] | 882 | if ($contents = opendir($upgrades_path)) |
---|
| 883 | { |
---|
| 884 | while (($node = readdir($contents)) !== false) |
---|
| 885 | { |
---|
| 886 | if (is_file($upgrades_path.'/'.$node) |
---|
| 887 | and preg_match('/^(.*?)-database\.php$/', $node, $match)) |
---|
| 888 | { |
---|
| 889 | array_push($available_upgrade_ids, $match[1]); |
---|
| 890 | } |
---|
| 891 | } |
---|
| 892 | } |
---|
| 893 | natcasesort($available_upgrade_ids); |
---|
| 894 | |
---|
| 895 | return $available_upgrade_ids; |
---|
| 896 | } |
---|
[1156] | 897 | |
---|
[1284] | 898 | /** |
---|
| 899 | * Add configuration parameters from database to global $conf array |
---|
| 900 | * |
---|
| 901 | * @return void |
---|
| 902 | */ |
---|
| 903 | function load_conf_from_db() |
---|
| 904 | { |
---|
| 905 | global $conf; |
---|
| 906 | |
---|
| 907 | $query = ' |
---|
| 908 | SELECT param,value |
---|
| 909 | FROM '.CONFIG_TABLE.' |
---|
| 910 | ;'; |
---|
| 911 | $result = pwg_query($query); |
---|
| 912 | |
---|
| 913 | if (mysql_num_rows($result) == 0) |
---|
| 914 | { |
---|
| 915 | die('No configuration data'); |
---|
| 916 | } |
---|
| 917 | |
---|
| 918 | while ($row = mysql_fetch_array($result)) |
---|
| 919 | { |
---|
| 920 | $conf[ $row['param'] ] = isset($row['value']) ? $row['value'] : ''; |
---|
| 921 | |
---|
| 922 | // If the field is true or false, the variable is transformed into a |
---|
| 923 | // boolean value. |
---|
| 924 | if ($conf[$row['param']] == 'true' or $conf[$row['param']] == 'false') |
---|
| 925 | { |
---|
| 926 | $conf[ $row['param'] ] = get_boolean($conf[ $row['param'] ]); |
---|
| 927 | } |
---|
| 928 | } |
---|
| 929 | } |
---|
[1119] | 930 | ?> |
---|