source: extensions/event_cats/include/evntcats_main_funcs.inc.php @ 7099

Last change on this file since 7099 was 7099, checked in by LucMorizur, 14 years ago

Preparation for feature:1891; remove mysql_num_rows

File size: 18.9 KB
Line 
1<?php
2
3// +-----------------------------------------------------------------------+
4// | Piwigo - a PHP based picture gallery                                  |
5// +-----------------------------------------------------------------------+
6// | Copyright(C) 2008-2009 Piwigo Team                  http://piwigo.org |
7// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
8// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
9// +-----------------------------------------------------------------------+
10// | This program is free software; you can redistribute it and/or modify  |
11// | it under the terms of the GNU General Public License as published by  |
12// | the Free Software Foundation                                          |
13// |                                                                       |
14// | This program is distributed in the hope that it will be useful, but   |
15// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
16// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
17// | General Public License for more details.                              |
18// |                                                                       |
19// | You should have received a copy of the GNU General Public License     |
20// | along with this program; if not, write to the Free Software           |
21// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
22// | USA.                                                                  |
23// +-----------------------------------------------------------------------+
24
25// Look out, do sit before reading that :
26// keeps file coded in UTF-8 without BOM in Notepad++ : é
27// !!!
28
29if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!');
30
31// ***************************************************************************
32// ** evntcats_admin_funcs.php : Main functions (include)                   **
33// ** for Piwigo plugin Event Cats                                          **
34// ***************************************************************************
35
36// +-----------------------------------------------------------------------+
37// | Header                                                                |
38// +-----------------------------------------------------------------------+
39
40include_once(EVNTCATS_PATH.'include/ec_conf.inc.php');
41
42if (!isset($ec_lists)) {
43  $ec_lists               = array();
44  $ec_lists['add_pages']  = array();
45  $ec_lists['categories'] = array();
46  $ec_lists['user_ids']   = array();
47  $ec_lists['ec_table']   = array();
48}
49
50// +-----------------------------------------------------------------------+
51// | Utilities functions                                                   |
52// +-----------------------------------------------------------------------+
53
54/*
55 * is_in($haystack, $needle)
56 * returns true or false whether $needle is a string found in string $haystack
57 *
58 * @param
59 *   $haystack : the string in which to search
60 *   $needle   : the string looked for
61 * @return
62 *   true if $needle is found in $haystack ; false if not
63 */
64function is_in($haystack, $needle) {
65  return (strpos($haystack, $needle) !== false);
66}
67
68/*
69 * ec_image_exists($cat, $img)
70 * returns true or false whether the image is associated with the category.
71 *
72 * @param
73 *   $cat : the category
74 *   $img : the image
75 * @return
76 *   treu or false whether the image is associated with the category.
77 */
78function ec_image_exists($cat, $img) {
79  return (pwg_db_fetch_row(pwg_query("
80    SELECT *
81    FROM `".IMAGE_CATEGORY_TABLE."`
82    WHERE `category_id` = ".$cat."
83     AND `image_id` = ".$img
84  )) !== false);
85}
86
87/*
88 * str_from_var($var)
89 * returns a string easing array var informations displaying in Piwigo :
90 *   _ the string return value starts with"<p align="left">" ;
91 *   _ all "TAB" characters (chr(10)) are replaced by "<br>" ;
92 *   _ all spaces are replaced by "&nbsp;".
93 *
94 * @param
95 *   $var : variable to display
96 * @return
97 *   string easy to display in Piwigo
98 */
99function str_from_var($var) {
100  return
101   '<p align="left">'.
102   str_replace(
103    chr(10),'<br>',
104    str_replace(' ','&nbsp;', print_r /* var_dump */ ($var,true))
105   ).
106   '</p>';
107}
108
109/*
110 * ec_inspect()
111 * goes through ec_lists['ec_table'] to check errors on (multiple) entries
112 * using the same code. Cannot really be used elsewhere than here in
113 * build_ec_table() .
114 *
115 * @param
116 *   
117 * @return
118 *   (no return value)
119 */
120function ec_inspect($checked_item, $new_action, $check_ec_nok = true) {
121  global $ec_lists;
122  $first = array();
123  $to_correct = array();
124 
125  /*
126  // $to_correct is needed cause following code would not work everywhere :
127  foreach ($table as $value) {
128    if ($value == $value_to_check and $value == $problem) {
129      foreach ($table as &$value2) { // key index of $table can be reset
130        if ($value2 == $value_to_check) {
131          $value2 = $better_value;
132        }
133      }
134    }
135  }
136  // It works with WinAmp Server, but not on Apache server of Free (french
137  // Internet provider).
138  */
139 
140  foreach ($ec_lists['ec_table'] as $ec_entry) {
141    $ec_current_code = $ec_entry['code'];
142    if (
143     $ec_entry['action'] == 'ec_ok' or
144     ($check_ec_nok and $ec_entry['action'] == 'ec_nok')
145    ) {
146      if (isset($first[$ec_current_code])) {
147        // $first[$ec_current_code] is set <=> code has already been met.
148        // Checked item MUST be equal to the first item (thus all items) for
149        // this code.
150        if (
151         $first[$ec_current_code] != $ec_entry[$checked_item] or
152         ($new_action == '' and $ec_entry[$checked_item] == 'true')
153        ) $to_correct[$ec_current_code] = true; // value not used in fact
154        // but using $ec_current_code as a key makes a smaller table
155      } // if the error comes back several times
156      else $first[$ec_current_code] = $ec_entry[$checked_item];
157    }
158  }
159  foreach ($ec_lists['ec_table'] as &$ec_entry) { // & is needed here
160    if (isset($to_correct[$ec_entry['code']])) {
161      if ($new_action == '') {
162        if (!pwg_query("
163          UPDATE `".EVNTCATS_TABLE."`
164          SET `forced` = 'false'
165          WHERE `id` = ".$ec_entry['id']
166        )) die('Could not fix a "_f_pb"');
167        $ec_entry['forced'] = 'false';
168      }
169      else $ec_entry['action'] = $new_action;
170    }
171  }
172}
173
174// +-----------------------------------------------------------------------+
175// | Tables building functions                                             |
176// +-----------------------------------------------------------------------+
177
178/*
179 * build_ec_addp()
180 * builds $ec_lists['add_pages'].
181 *
182 * @param
183 *   (no parameter)
184 * @return
185 *   (no return value)
186 */
187function build_ec_addp() {
188  global $ec_lists;
189  $ec_lists['add_pages'] = array();
190  if (defined('ADD_PAGES_TABLE')) {
191    $res = pwg_query("SELECT `id`, `title` FROM `".ADD_PAGES_TABLE."`;");
192    while ($r = pwg_db_fetch_assoc($res)) {
193      $a = (is_in($r['title'], '/user_id=')) ?
194       explode('/user_id=' , $r['title']) : array($r['title']);
195      $b = (is_in($a[0], '/group_id=')) ?
196       explode('/group_id=' , $a[0]) : $a;
197      $ec_lists['add_pages'][$r['id']] = $b[0];
198    }
199  }
200}
201
202/*
203 * build_ec_categories($dsp)
204 * builds $ec_lists['categories'].
205 *
206 * @param
207 *   whether $ec_lists['categories'] must be of type "cat / sub-cat" or
208 *   or "cat <CR LF> - sub-cat".
209 * @return
210 *   (no return value)
211 */
212function build_ec_categories($dsp) {
213  global $template, $ec_lists;
214  $ec_lists['categories'] = array();
215  $c = array();
216  display_select_cat_wrapper("
217     SELECT `id`, `name`, `uppercats`, `global_rank`
218     FROM `".CATEGORIES_TABLE."`
219   ", $c, 'category_options', $dsp);
220  $ec_lists['categories'] = $template->smarty->_tpl_vars['category_options'];
221}
222
223/*
224 * build_ec_userids()
225 * builds $ec_lists['user_ids'].
226 *
227 * @param
228 *   (no parameter)
229 * @return
230 *   (no return value)
231 */
232function build_ec_userids() {
233  global $ec_lists, $conf;
234  $ec_lists['user_ids'] = array();
235  $ec_lists['user_ids'] = simple_hash_from_query("
236    SELECT
237      ".$conf['user_fields']['id']." AS id,
238      ".$conf['user_fields']['username']." AS username
239    FROM `".USERS_TABLE."`
240    WHERE id > 2;",
241    'id', 'username'
242  );
243}
244
245/*
246 * build_ec_table()
247 * builds a table showing the content of the <pwg>_event_cats database table,
248 * and a table showing the eventual errors.
249 *
250 * @param
251 *   no parameters passed ; the main material on which works the function, is
252 *   the global array variable $ec_lists.
253 * @return
254 *   (no return value)
255 */
256function build_ec_table() {
257  global $ec_lists;
258 
259  $ec_lists['ec_table'] = array();
260  $q = pwg_query("
261    SELECT *
262    FROM `".EVNTCATS_TABLE."`
263    WHERE `code`   IS NOT NULL
264      AND `action` IS NOT NULL
265    ORDER BY `id`
266  ");
267  while ($r = pwg_db_fetch_assoc($q))
268   $ec_lists['ec_table'][intval($r['id'])] = $r;
269 
270  // Construction of behaviour
271 
272  // Multiple action params for a single code check
273  ec_inspect('action', 'ec_nok_action_pb');
274 
275  // Multiple user_ids for a single code check
276  ec_inspect('user_id', 'ec_nok_userid_pb', false);
277 
278  // Multiple "forced" params for a single code check
279  ec_inspect('forced', '');
280 
281  // User id and associated page validities checks
282  foreach ($ec_lists['ec_table'] as &$ec_entry) {
283   
284    // Check if associated user_id exists
285    if (
286     is_in($ec_entry['action'], 'ec_ok') and
287     !array_key_exists($ec_entry['user_id'], $ec_lists['user_ids'])
288    ) $ec_entry['action'] = 'ec_nok_userid_miss';
289   
290    // Check if associated displayed page exists
291    $a = 0;
292    if (
293      !empty($ec_entry['arg1']) and
294      // (Only arg2 is significant if action is ec_nok[_xxx] .)
295      is_in($ec_entry['action'], 'ec_ok')
296    ) $a++;
297    if (!empty($ec_entry['arg2'])) $a+= 2;
298    switch ($a) {
299      // case 0 : home, nothing to check
300     
301      case 2: // Additional Page
302        if (
303          defined('ADD_PAGES_TABLE') and (
304            is_in($ec_entry['action'], 'ec_ok') or
305            $ec_entry['action'] == 'ec_nok'
306          ) and
307          !array_key_exists($ec_entry['arg2'], $ec_lists['add_pages'])
308        ) $ec_entry['action'].= '_ap_pb';
309      break;
310     
311      case 1: // Category
312      case 3: // Image
313        if (is_in($ec_entry['action'], 'ec_ok')) {
314          if (array_key_exists($ec_entry['arg1'], $ec_lists['categories'])) {
315           if ($a == 3) // case 3: // Image
316            if (!ec_image_exists($ec_entry['arg1'], $ec_entry['arg2']))
317             $ec_entry['action'].= '_img_pb';
318          }
319          else $ec_entry['action'].= '_cat_pb';
320        }
321      break;
322    }
323  }
324}
325
326/*
327 * build_dup_groups()
328 * builds the information telling who is allowed to duplicate
329 *
330 * @param
331 *   no parameter passed, the main material on which works the function, is
332 *   the global array variable $ec_lists.
333 * @return
334 *   (no return value)
335 */
336function build_dup_groups() {
337  global $ec_lists;
338 
339  if (count($ec_lists['user_ids']) == 0) build_ec_userids();
340 
341  // Existing groups (needed later)
342  $ec_lists['groups'] = simple_hash_from_query("
343    SELECT `id`, `name`
344      FROM `".GROUPS_TABLE."`
345      ORDER BY `name` ASC;
346    ",
347    'id', 'name'
348  );
349 
350  // groups granted to duplication
351  $ec_lists['groups_granted_ids'] = order_by_name(
352    array_from_query("
353      SELECT `arg2`
354        FROM ".EVNTCATS_TABLE."
355        WHERE `code` IS NULL
356          AND `arg1` = 1
357          AND `arg2` IS NOT NULL
358      ;",
359      'arg2'
360    ),
361    $ec_lists['groups']
362  );
363 
364  // users directly granted to duplication
365  $ec_lists['users_granted_direct_ids'] = order_by_name(
366    array_from_query("
367      SELECT `arg2`
368        FROM `".EVNTCATS_TABLE."`
369        WHERE `code` IS NULL
370          AND `arg1` = 2
371          AND `arg2` IS NOT NULL
372      ;",
373      'arg2'
374    ),
375    $ec_lists['user_ids']
376  );
377 
378  // Calculate users granted to duplication thanks to belonging to a
379  // certain group (in groups, level (friends, family, contacts),
380  // or user status (generic))
381  $types_entry_exists = (($t = pwg_db_fetch_row(pwg_query("
382    SELECT `arg2`
383    FROM `".EVNTCATS_TABLE."`
384    WHERE `code` IS NULL
385      AND `arg1` = 3
386      AND `arg2` IS NOT NULL
387    LIMIT 1;
388  "))) !== false);
389  $ec_lists['types_granted'] = ($types_entry_exists) ? $t[0] : 0;
390 
391  return $types_entry_exists;
392}
393
394/*
395 * build_ec_lists()
396 * builds the main array variable contaning all informations for the plugin
397 *
398 * @param
399 *   no parameter passed, the main material on which works the function, is
400 *   the global array variable $ec_lists.
401 * @return
402 *   (no return value)
403 */
404function build_ec_lists() {
405 
406  // Construction of $ec_lists['add_pages'] array var
407  build_ec_addp();
408 
409  // Construction of $ec_lists['categories'] array var
410  build_ec_categories(true);
411 
412  // Construction of $ec_lists['user_ids'] array var
413  build_ec_userids();
414 
415  // Construction of $ec_lists['ec_table'] array var
416  build_ec_table();
417}
418
419// +-----------------------------------------------------------------------+
420// | Duplication analysis functions                                        |
421// +-----------------------------------------------------------------------+
422
423/*
424 * build_dup_arrays($append_tpl = false)
425 * builds arrays telling which accounts are allowed to display a duplicate
426 * account link. Returns an array of all the user ids allowed to duplicate.
427 *
428 * @param
429 *   $append_tpl : tells if $template must be appended with built arrays
430 * @return
431 *   array of all the user ids allowed to duplicate
432 */
433function build_dup_arrays($append_tpl = false) {
434  global $template, $ec_lists, $conf;
435 
436  // A lot of below code has simply been copied from file cat_perm.php .
437  // Many thanks to people who wrote it !
438 
439  build_dup_groups();
440 
441  $users_granted_ids = array();
442 
443  $users_granted_thks_gen_ids = array();
444  if ($ec_gen_granted = (($ec_lists['types_granted'] & 8) != 0)) {
445    $users_granted_thks_gen_ids = order_by_name(
446      array_diff(
447        array_from_query("
448          SELECT `user_id`
449          FROM `".USER_INFOS_TABLE."`
450          WHERE `status` = 'generic'
451            AND `user_id` > 2;",
452          'user_id'
453        ),
454        $ec_lists['users_granted_direct_ids']
455      ),
456      $ec_lists['user_ids']
457    );
458    foreach ($users_granted_thks_gen_ids as $user_id)
459     $users_granted_ids[$user_id] = l10n('user_status_generic');
460  }
461
462  $types = array(
463    '1' => l10n('Level 1'),
464    '2' => l10n('Level 2'),
465    '4' => l10n('Level 4'),
466  );
467  $types_granted_ids = array();
468  $users_granted_thks_types_ids = array();
469  if (($ec_lists['types_granted'] & 7) != 0) {
470    if (($ec_lists['types_granted'] & 1) != 0) $types_granted_ids[] = '1';
471    if (($ec_lists['types_granted'] & 2) != 0) $types_granted_ids[] = '2';
472    if (($ec_lists['types_granted'] & 4) != 0) $types_granted_ids[] = '4';
473    if (count($types_granted_ids) > 0) {
474      $user_granted_from_type = array();
475      $result = pwg_query("
476        SELECT `user_id`, `level`
477        FROM `".USER_INFOS_TABLE."`
478        WHERE `level` IN (".implode(',', $types_granted_ids).")
479          AND `user_id` > 2;
480      ");
481      while ($row = pwg_db_fetch_assoc($result)) {
482        if (!isset($user_granted_from_type[$row['level']])) {
483          $user_granted_from_type[$row['level']] = array();
484        }
485        $user_granted_from_type[$row['level']][] = $row['user_id'];
486      }
487      $user_granted_by_type_ids = array();
488      foreach ($user_granted_from_type as $type_users)
489       $user_granted_by_type_ids = array_merge(
490        $user_granted_by_type_ids,
491        $type_users
492       );
493      $users_granted_thks_types_ids = order_by_name(
494        array_diff(
495          array_unique($user_granted_by_type_ids),
496          $ec_lists['users_granted_direct_ids']
497        ),
498        $ec_lists['user_ids']
499      );
500      foreach ($users_granted_thks_types_ids as $user_id)
501       foreach ($user_granted_from_type as $type_id => $type_users) {
502        if (in_array($user_id, $type_users)) {
503          $users_granted_ids[$user_id]= $types[$type_id];
504          break;
505        }
506       }
507    }
508  }
509
510  $users_granted_thks_groups_ids = array();
511  if (count($ec_lists['groups_granted_ids']) > 0) {
512    $granted_groups = array();
513
514    $result = pwg_query("
515      SELECT `user_id`, `group_id`
516      FROM `".USER_GROUP_TABLE."`
517      WHERE `group_id` IN (".implode(',', $ec_lists['groups_granted_ids']).")
518        AND `user_id` > 2;
519    ");
520    while ($row = pwg_db_fetch_assoc($result)) {
521      if (!isset($granted_groups[$row['group_id']])) {
522        $granted_groups[$row['group_id']] = array();
523      }
524      $granted_groups[$row['group_id']][] = $row['user_id'];
525    }
526   
527    $user_granted_by_group_ids = array();
528   
529    foreach ($granted_groups as $group_users)
530     $user_granted_by_group_ids = array_merge(
531      $user_granted_by_group_ids,
532      $group_users
533     );
534    $users_granted_thks_groups_ids = order_by_name(
535      array_diff(
536        array_unique($user_granted_by_group_ids),
537        $ec_lists['users_granted_direct_ids']
538      ),
539      $ec_lists['user_ids']
540    );
541    foreach ($users_granted_thks_groups_ids as $user_id)
542     foreach ($granted_groups as $group_id => $group_users)
543      if (in_array($user_id, $group_users)) {
544        $users_granted_ids[$user_id]= $ec_lists['groups'][$group_id];
545        break;
546      }
547   
548  }
549
550  if ($append_tpl) {
551    $users_denied_ids = order_by_name(
552      array_diff(
553        array_keys($ec_lists['user_ids']),
554        $users_granted_thks_gen_ids,
555        $users_granted_thks_types_ids,
556        $users_granted_thks_groups_ids,
557        $ec_lists['users_granted_direct_ids']
558      ),
559      $ec_lists['user_ids']
560    );
561   
562    foreach ($users_granted_ids as $u => $g) $template->append(
563      'user_granted_indirects',
564      array(
565        'USER'  => $ec_lists['user_ids'][$u],
566        'GROUP' => $g
567      )
568    );
569   
570    $template->assign('all_groups', $ec_lists['groups']);
571    $template->assign('groups_granted_ids', $ec_lists['groups_granted_ids']);
572    $template->assign('groups_denied_ids', order_by_name(
573      array_diff(
574        array_keys($ec_lists['groups']),
575        $ec_lists['groups_granted_ids']
576      ),
577      $ec_lists['groups']
578    ));
579    $template->assign('ec_gen_granted', $ec_gen_granted);
580    $template->assign('all_types', $types);
581    $template->assign('types_granted_ids', $types_granted_ids);
582    $template->assign('types_denied_ids', order_by_name(
583      array_diff(array_keys($types), $types_granted_ids), $types
584    ));
585    $template->assign('all_users', $ec_lists['user_ids']);
586    $template->assign(
587      'users_granted_direct_ids',
588      $ec_lists['users_granted_direct_ids']
589    );
590    $template->assign('users_denied_ids', $users_denied_ids);
591  }
592  $users_granted_ids = array_merge(
593    array_keys($users_granted_ids),
594    $ec_lists['users_granted_direct_ids']
595  );
596 
597  // Returns an array which values are all the user_ids allowed to display a
598  // "duplicate" link. The keys of this array are strange (for direct allowed
599  // users, keys are usernames), but should not used
600  return $users_granted_ids;
601}
602
603/*
604 * dup_allowed($user_id)
605 * returns true if the user_id is allowed to display a duplicate link
606 *
607 * @param
608 *   $user_id : the user_id
609 * @return
610 *   true if the user_id is allowed to display a duplicate link
611 */
612function dup_allowed($user_id) {
613  return in_array($user_id, build_dup_arrays());
614}
615
616?>
Note: See TracBrowser for help on using the repository browser.