source: trunk/include/functions.inc.php @ 345

Last change on this file since 345 was 345, checked in by gweltas, 21 years ago

Merge of the 1.3.1 release
Creation of an unique include file (common.php)
Creation of an unique define file (include/constants.php)
Modification of the installation procedure

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 14.3 KB
Line 
1<?php
2/***************************************************************************
3 *                             functions.inc.php                           *
4 *                            -------------------                          *
5 *   application   : PhpWebGallery 1.3 <http://phpwebgallery.net>          *
6 *   author        : Pierrick LE GALL <pierrick@z0rglub.com>               *
7 *                                                                         *
8 *   $Id: functions.inc.php 345 2004-02-02 00:55:18Z gweltas $
9 *                                                                         *
10 ***************************************************************************
11
12 ***************************************************************************
13 *                                                                         *
14 *   This program is free software; you can redistribute it and/or modify  *
15 *   it under the terms of the GNU General Public License as published by  *
16 *   the Free Software Foundation;                                         *
17 *                                                                         *
18 ***************************************************************************/
19include( PREFIX_INCLUDE.'./include/functions_user.inc.php' );
20include( PREFIX_INCLUDE.'./include/functions_session.inc.php' );
21include( PREFIX_INCLUDE.'./include/functions_category.inc.php' );
22include( PREFIX_INCLUDE.'./include/functions_xml.inc.php' );
23include( PREFIX_INCLUDE.'./include/functions_group.inc.php' );
24
25//----------------------------------------------------------- generic functions
26
27// get_enums returns an array containing the possible values of a enum field
28// in a table of the database.
29/**
30 * possible values of an "enum" field
31 *
32 * get_enums returns an array containing the possible values of a enum field
33 * in a table of the database.
34 *
35 * @param string table in the database
36 * @param string field name in this table
37 * @uses str_replace
38 */
39function get_enums( $table, $field )
40{
41  // retrieving the properties of the table. Each line represents a field :
42  // columns are 'Field', 'Type'
43  $result=mysql_query("desc $table");
44  while ( $row = mysql_fetch_array( $result ) ) 
45  {
46    // we are only interested in the the field given in parameter for the
47    // function
48    if ( $row['Field']==$field )
49    {
50      // retrieving possible values of the enum field
51      // enum('blue','green','black')
52      $option = explode( ',', substr($row['Type'], 5, -1 ) );
53      for ( $i = 0; $i < sizeof( $option ); $i++ )
54      {
55        // deletion of quotation marks
56        $option[$i] = str_replace( "'", '',$option[$i] );
57      }                 
58    }
59  }
60  mysql_free_result( $result );
61  return $option;
62}
63
64// get_boolean transforms a string to a boolean value. If the string is
65// "false" (case insensitive), then the boolean value false is returned. In
66// any other case, true is returned.
67function get_boolean( $string )
68{
69  $boolean = true;
70  if ( preg_match( '/^false$/i', $string ) )
71  {
72    $boolean = false;
73  }
74  return $boolean;
75}
76
77// array_remove removes a value from the given array if the value existed in
78// this array.
79function array_remove( $array, $value )
80{
81  $output = array();
82  foreach ( $array as $v ) {
83    if ( $v != $value ) array_push( $output, $v );
84  }
85  return $output;
86}
87
88// The function get_moment returns a float value coresponding to the number
89// of seconds since the unix epoch (1st January 1970) and the microseconds
90// are precised : e.g. 1052343429.89276600
91function get_moment()
92{
93  $t1 = explode( ' ', microtime() );
94  $t2 = explode( '.', $t1[0] );
95  $t2 = $t1[1].'.'.$t2[1];
96  return $t2;
97}
98
99// The function get_elapsed_time returns the number of seconds (with 3
100// decimals precision) between the start time and the end time given.
101function get_elapsed_time( $start, $end )
102{
103  return number_format( $end - $start, 3, '.', ' ').' s';
104}
105
106// - The replace_space function replaces space and '-' characters
107//   by their HTML equivalent  &nbsb; and &minus;
108// - The function does not replace characters in HTML tags
109// - This function was created because IE5 does not respect the
110//   CSS "white-space: nowrap;" property unless space and minus
111//   characters are replaced like this function does.
112// - Example :
113//                 <div class="foo">My friend</div>
114//               ( 01234567891111111111222222222233 )
115//               (           0123456789012345678901 )
116// becomes :
117//             <div class="foo">My&nbsp;friend</div>
118function replace_space( $string )
119{
120  //return $string;
121  $return_string = '';
122  // $remaining is the rest of the string where to replace spaces characters
123  $remaining = $string;
124  // $start represents the position of the next '<' character
125  // $end   represents the position of the next '>' character
126  $start = 0;
127  $end = 0;
128  $start = strpos ( $remaining, '<' ); // -> 0
129  $end   = strpos ( $remaining, '>' ); // -> 16
130  // as long as a '<' and his friend '>' are found, we loop
131  while ( is_numeric( $start ) and is_numeric( $end ) )
132  {
133    // $treatment is the part of the string to treat
134    // In the first loop of our example, this variable is empty, but in the
135    // second loop, it equals 'My friend'
136    $treatment = substr ( $remaining, 0, $start );
137    // Replacement of ' ' by his equivalent '&nbsp;'
138    $treatment = str_replace( ' ', '&nbsp;', $treatment );
139    $treatment = str_replace( '-', '&minus;', $treatment );
140    // composing the string to return by adding the treated string and the
141    // following HTML tag -> 'My&nbsp;friend</div>'
142    $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 );
143    // the remaining string is deplaced to the part after the '>' of this
144    // loop
145    $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
146    $start = strpos ( $remaining, '<' );
147    $end   = strpos ( $remaining, '>' );
148  }
149  $treatment = str_replace( ' ', '&nbsp;', $remaining );
150  $treatment = str_replace( '-', '&minus;', $treatment );
151  $return_string.= $treatment;
152
153  return $return_string;
154}
155
156// get_extension returns the part of the string after the last "."
157function get_extension( $filename )
158{
159  return substr( strrchr( $filename, '.' ), 1, strlen ( $filename ) );
160}
161
162// get_filename_wo_extension returns the part of the string before the last
163// ".".
164// get_filename_wo_extension( 'test.tar.gz' ) -> 'test.tar'
165function get_filename_wo_extension( $filename )
166{
167  return substr( $filename, 0, strrpos( $filename, '.' ) );
168}
169
170/**
171 * returns an array contening sub-directories
172 *
173 * @param string $dir
174 * @return array
175 */
176function get_dirs( $directory )
177{
178  $sub_dirs = array();
179
180  if ( $opendir = opendir( $directory ) )
181  {
182    while ( $file = readdir ( $opendir ) )
183    {
184      if ( $file != '.' and $file != '..' and is_dir ( $directory.'/'.$file ) )
185      {
186        array_push( $sub_dirs, $file );
187      }
188    }
189  }
190  return $sub_dirs;
191}
192
193// The get_picture_size function return an array containing :
194//      - $picture_size[0] : final width
195//      - $picture_size[1] : final height
196// The final dimensions are calculated thanks to the original dimensions and
197// the maximum dimensions given in parameters.  get_picture_size respects
198// the width/height ratio
199function get_picture_size( $original_width, $original_height,
200                           $max_width, $max_height )
201{
202  $width = $original_width;
203  $height = $original_height;
204  $is_original_size = true;
205               
206  if ( $max_width != "" )
207  {
208    if ( $original_width > $max_width )
209    {
210      $width = $max_width;
211      $height = floor( ( $width * $original_height ) / $original_width );
212    }
213  }
214  if ( $max_height != "" )
215  {
216    if ( $original_height > $max_height )
217    {
218      $height = $max_height;
219      $width = floor( ( $height * $original_width ) / $original_height );
220      $is_original_size = false;
221    }
222  }
223  if ( is_numeric( $max_width ) and is_numeric( $max_height )
224       and $max_width != 0 and $max_height != 0 )
225  {
226    $ratioWidth = $original_width / $max_width;
227    $ratioHeight = $original_height / $max_height;
228    if ( ( $ratioWidth > 1 ) or ( $ratioHeight > 1 ) )
229    {
230      if ( $ratioWidth < $ratioHeight )
231      { 
232        $width = floor( $original_width / $ratioHeight );
233        $height = $max_height;
234      }
235      else
236      { 
237        $width = $max_width; 
238        $height = floor( $original_height / $ratioWidth );
239      }
240      $is_original_size = false;
241    }
242  }
243  $picture_size = array();
244  $picture_size[0] = $width;
245  $picture_size[1] = $height;
246  return $picture_size;
247}
248//-------------------------------------------- PhpWebGallery specific functions
249
250// get_languages retourne un tableau contenant tous les languages
251// disponibles pour PhpWebGallery
252function get_languages( $rep_language )
253{
254  $languages = array();
255  $i = 0;
256  if ( $opendir = opendir ( $rep_language ) )
257  {
258    while ( $file = readdir ( $opendir ) )
259    {
260      if ( is_file ( $rep_language.$file )
261           and $file != "index.php"
262           and strrchr ( $file, "." ) == ".php" )
263      {
264        $languages[$i++] =
265          substr ( $file, 0, strlen ( $file )
266                   - strlen ( strrchr ( $file, "." ) ) );
267      }
268    }
269  }
270  return $languages;
271}
272
273// - add_style replaces the
274//         $search  into <span style="$style">$search</span>
275// in the given $string.
276// - The function does not replace characters in HTML tags
277function add_style( $string, $search, $style )
278{
279  //return $string;
280  $return_string = '';
281  $remaining = $string;
282
283  $start = 0;
284  $end = 0;
285  $start = strpos ( $remaining, '<' );
286  $end   = strpos ( $remaining, '>' );
287  while ( is_numeric( $start ) and is_numeric( $end ) )
288  {
289    $treatment = substr ( $remaining, 0, $start );
290    $treatment = str_replace( $search, '<span style="'.$style.'">'.
291                              $search.'</span>', $treatment );
292    $return_string.= $treatment.substr( $remaining, $start, $end-$start+1 );
293    $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
294    $start = strpos ( $remaining, '<' );
295    $end   = strpos ( $remaining, '>' );
296  }
297  $treatment = str_replace( $search, '<span style="'.$style.'">'.
298                            $search.'</span>', $remaining );
299  $return_string.= $treatment;
300               
301  return $return_string;
302}
303
304// replace_search replaces a searched words array string by the search in
305// another style for the given $string.
306function replace_search( $string, $search )
307{
308  $words = explode( ',', $search );
309  $style = 'background-color:white;color:red;';
310  foreach ( $words as $word ) {
311    $string = add_style( $string, $word, $style );
312  }
313  return $string;
314}
315
316function pwg_log( $file, $category, $picture = '' )
317{
318  global $conf, $user;
319
320  if ( $conf['log'] )
321  {
322    $query = 'insert into '.PREFIX_TABLE.'history';
323    $query.= ' (date,login,IP,file,category,picture) values';
324    $query.= " (".time().", '".$user['username']."'";
325    $query.= ",'".$_SERVER['REMOTE_ADDR']."'";
326    $query.= ",'".$file."','".$category."','".$picture."');";
327    mysql_query( $query );
328  }
329}
330
331function templatize_array( $array, $global_array_name, $handle )
332{
333  global $vtp, $lang, $page, $user, $conf;
334
335  foreach ( $array as $value ) {
336  if (isset(${$global_array_name}[$value]))
337    $vtp->setGlobalVar( $handle, $value, ${$global_array_name}[$value] );
338  }
339}
340
341// format_date returns a formatted date for display. The date given in
342// argument can be a unixdate (number of seconds since the 01.01.1970) or an
343// american format (2003-09-15). By option, you can show the time. The
344// output is internationalized.
345//
346// format_date( "2003-09-15", 'us', true ) -> "Monday 15 September 2003 21:52"
347function format_date( $date, $type = 'us', $show_time = false )
348{
349  global $lang;
350
351  switch ( $type )
352  {
353  case 'us' :
354    list( $year,$month,$day ) = explode( '-', $date );
355    $unixdate = mktime(0,0,0,$month,$day,$year);
356    break;
357  case 'unix' :
358    $unixdate = $date;
359    break;
360  }
361  $formated_date = $lang['day'][date( "w", $unixdate )];
362  $formated_date.= date( " j ", $unixdate );
363  $formated_date.= $lang['month'][date( "n", $unixdate )];
364  $formated_date.= date( ' Y', $unixdate );
365  if ( $show_time )
366  {
367    $formated_date.= date( ' G:i', $unixdate );
368  }
369
370  return $formated_date;
371}
372
373// notify sends a email to every admin of the gallery
374function notify( $type, $infos = '' )
375{
376  global $conf;
377
378  $headers = 'From: '.$conf['webmaster'].' <'.$conf['mail_webmaster'].'>'."\n";
379  $headers.= 'Reply-To: '.$conf['mail_webmaster']."\n";
380  $headers.= 'X-Mailer: PhpWebGallery, PHP '.phpversion();
381
382  $options = '-f '.$conf['mail_webmaster'];
383  // retrieving all administrators
384  $query = 'SELECT username,mail_address,language';
385  $query.= ' FROM '.PREFIX_TABLE.'users';
386  $query.= " WHERE status = 'admin'";
387  $query.= ' AND mail_address IS NOT NULL';
388  $query.= ';';
389  $result = mysql_query( $query );
390  while ( $row = mysql_fetch_array( $result ) )
391  {
392    $to = $row['mail_address'];
393    include( PREFIX_INCLUDE.'./language/'.$row['language'].'.php' );
394    $content = $lang['mail_hello']."\n\n";
395    switch ( $type )
396    {
397    case 'upload' :
398      $subject = $lang['mail_new_upload_subject'];
399      $content.= $lang['mail_new_upload_content'];
400      break;
401    case 'comment' :
402      $subject = $lang['mail_new_comment_subject'];
403      $content.= $lang['mail_new_comment_content'];
404      break;
405    }
406    $infos = str_replace( '&nbsp;',  ' ', $infos );
407    $infos = str_replace( '&minus;', '-', $infos );
408    $content.= "\n\n".$infos;
409    $content.= "\n\n-- \nPhpWebGallery ".$conf['version'];
410    $content = wordwrap( $content, 72 );
411    @mail( $to, $subject, $content, $headers, $options );
412  }
413}
414
415function pwg_write_debug()
416{
417  global $debug;
418 
419  $fp = @fopen( './log/debug.log', 'a+' );
420  fwrite( $fp, "\n\n" );
421  fwrite( $fp, $debug );
422  fclose( $fp );
423}
424
425function pwg_query( $query )
426{
427  global $count_queries,$queries_time;
428
429  $start = get_moment();
430  $output = '';
431 
432  $count_queries++;
433  $output.= '<br /><br />['.$count_queries.'] '.$query;
434  $result = mysql_query( $query );
435  $time = get_moment() - $start;
436  $queries_time+= $time;
437  $output.= '<b>('.number_format( $time, 3, '.', ' ').' s)</b>';
438  $output.= '('.number_format( $queries_time, 3, '.', ' ').' s)';
439
440  // echo $output;
441 
442  return $result;
443}
444
445function pwg_debug( $string )
446{
447  global $debug,$t2,$count_queries;
448
449  $now = explode( ' ', microtime() );
450  $now2 = explode( '.', $now[0] );
451  $now2 = $now[1].'.'.$now2[1];
452  $time = number_format( $now2 - $t2, 3, '.', ' ').' s';
453  $debug.= '['.$time.', ';
454  $debug.= $count_queries.' queries] : '.$string;
455  $debug.= "\n";
456}
457?>
Note: See TracBrowser for help on using the repository browser.