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

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

Clean duplication.tpl thanks to HTMLvalidator; fix bug:1947

File size: 19.2 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 style = "text-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 style = "text-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 *   true or false whether duplication based on user type exists
335 *   (user types are guest (0), contact (1), friend (2), family (4), and
336 *   admin should be 8, but is not used, as admins can't duplicate; 8 is used
337 *   for generic users, and is managed slightly differently as it is not
338 *   actually a "user type")
339 */
340function build_dup_groups() {
341  global $ec_lists;
342 
343  if (count($ec_lists['user_ids']) == 0) build_ec_userids();
344 
345  // Existing groups (needed later)
346  $ec_lists['groups'] = simple_hash_from_query("
347    SELECT `id`, `name`
348      FROM `".GROUPS_TABLE."`
349      ORDER BY `name` ASC;
350    ",
351    'id', 'name'
352  );
353 
354  // groups granted to duplication
355  $ec_lists['groups_granted_ids'] = order_by_name(
356    array_from_query("
357      SELECT `arg2`
358        FROM ".EVNTCATS_TABLE."
359        WHERE `code` IS NULL
360          AND `arg1` = 1
361          AND `arg2` IS NOT NULL
362      ;",
363      'arg2'
364    ),
365    $ec_lists['groups']
366  );
367 
368  // users directly granted to duplication
369  $ec_lists['users_granted_direct_ids'] = order_by_name(
370    array_from_query("
371      SELECT `arg2`
372        FROM `".EVNTCATS_TABLE."`
373        WHERE `code` IS NULL
374          AND `arg1` = 2
375          AND `arg2` IS NOT NULL
376      ;",
377      'arg2'
378    ),
379    $ec_lists['user_ids']
380  );
381 
382  // Calculate users granted to duplication thanks to belonging to a
383  // certain group (in groups, level (friends, family, contacts),
384  // or user status (generic))
385  $types_entry_exists = (($t = pwg_db_fetch_row(pwg_query("
386    SELECT `arg2`
387    FROM `".EVNTCATS_TABLE."`
388    WHERE `code` IS NULL
389      AND `arg1` = 3
390      AND `arg2` IS NOT NULL
391    LIMIT 1;
392  "))) !== false);
393  $ec_lists['types_granted'] = ($types_entry_exists) ? $t[0] : 0;
394 
395  return $types_entry_exists;
396}
397
398/*
399 * build_ec_lists()
400 * builds the main array variable contaning all informations for the plugin
401 *
402 * @param
403 *   no parameter passed, the main material on which works the function, is
404 *   the global array variable $ec_lists.
405 * @return
406 *   (no return value)
407 */
408function build_ec_lists() {
409 
410  // Construction of $ec_lists['add_pages'] array var
411  build_ec_addp();
412 
413  // Construction of $ec_lists['categories'] array var
414  build_ec_categories(true);
415 
416  // Construction of $ec_lists['user_ids'] array var
417  build_ec_userids();
418 
419  // Construction of $ec_lists['ec_table'] array var
420  build_ec_table();
421}
422
423// +-----------------------------------------------------------------------+
424// | Duplication analysis functions                                        |
425// +-----------------------------------------------------------------------+
426
427/*
428 * build_dup_arrays($append_tpl = false)
429 * builds arrays telling which accounts are allowed to display a duplicate
430 * account link. Returns an array of all the user ids allowed to duplicate.
431 *
432 * @param
433 *   $append_tpl : tells if $template must be appended with built arrays
434 * @return
435 *   array of all the user ids allowed to duplicate
436 */
437function build_dup_arrays($append_tpl = false) {
438  global $template, $ec_lists, $conf;
439 
440  // A lot of below code has simply been copied from file cat_perm.php .
441  // Many thanks to people who wrote it !
442 
443  build_dup_groups();
444 
445  $users_granted_ids = array();
446 
447  $users_granted_thks_gen_ids = array();
448  if ($ec_gen_granted = (($ec_lists['types_granted'] & 8) != 0)) {
449    $users_granted_thks_gen_ids = order_by_name(
450      array_diff(
451        array_from_query("
452          SELECT `user_id`
453          FROM `".USER_INFOS_TABLE."`
454          WHERE `status` = 'generic'
455            AND `user_id` > 2;",
456          'user_id'
457        ),
458        $ec_lists['users_granted_direct_ids']
459      ),
460      $ec_lists['user_ids']
461    );
462    foreach ($users_granted_thks_gen_ids as $user_id)
463     $users_granted_ids[$user_id] = l10n('user_status_generic');
464  }
465
466  $types = array(
467    '1' => l10n('Level 1'),
468    '2' => l10n('Level 2'),
469    '4' => l10n('Level 4'),
470  );
471  $types_granted_ids = array();
472  $users_granted_thks_types_ids = array();
473  if (($ec_lists['types_granted'] & 7) != 0) {
474    if (($ec_lists['types_granted'] & 1) != 0) $types_granted_ids[] = '1';
475    if (($ec_lists['types_granted'] & 2) != 0) $types_granted_ids[] = '2';
476    if (($ec_lists['types_granted'] & 4) != 0) $types_granted_ids[] = '4';
477    if (count($types_granted_ids) > 0) {
478      $user_granted_from_type = array();
479      $result = pwg_query("
480        SELECT `user_id`, `level`
481        FROM `".USER_INFOS_TABLE."`
482        WHERE `level` IN (".implode(',', $types_granted_ids).")
483          AND `user_id` > 2;
484      ");
485      while ($row = pwg_db_fetch_assoc($result)) {
486        if (!isset($user_granted_from_type[$row['level']])) {
487          $user_granted_from_type[$row['level']] = array();
488        }
489        $user_granted_from_type[$row['level']][] = $row['user_id'];
490      }
491      $user_granted_by_type_ids = array();
492      foreach ($user_granted_from_type as $type_users)
493       $user_granted_by_type_ids = array_merge(
494        $user_granted_by_type_ids,
495        $type_users
496       );
497      $users_granted_thks_types_ids = order_by_name(
498        array_diff(
499          array_unique($user_granted_by_type_ids),
500          $ec_lists['users_granted_direct_ids']
501        ),
502        $ec_lists['user_ids']
503      );
504      foreach ($users_granted_thks_types_ids as $user_id)
505       foreach ($user_granted_from_type as $type_id => $type_users) {
506        if (in_array($user_id, $type_users)) {
507          $users_granted_ids[$user_id]= $types[$type_id];
508          break;
509        }
510       }
511    }
512  }
513
514  $users_granted_thks_groups_ids = array();
515  if (count($ec_lists['groups_granted_ids']) > 0) {
516    $granted_groups = array();
517
518    $result = pwg_query("
519      SELECT `user_id`, `group_id`
520      FROM `".USER_GROUP_TABLE."`
521      WHERE `group_id` IN (".implode(',', $ec_lists['groups_granted_ids']).")
522        AND `user_id` > 2;
523    ");
524    while ($row = pwg_db_fetch_assoc($result)) {
525      if (!isset($granted_groups[$row['group_id']])) {
526        $granted_groups[$row['group_id']] = array();
527      }
528      $granted_groups[$row['group_id']][] = $row['user_id'];
529    }
530   
531    $user_granted_by_group_ids = array();
532   
533    foreach ($granted_groups as $group_users)
534     $user_granted_by_group_ids = array_merge(
535      $user_granted_by_group_ids,
536      $group_users
537     );
538    $users_granted_thks_groups_ids = order_by_name(
539      array_diff(
540        array_unique($user_granted_by_group_ids),
541        $ec_lists['users_granted_direct_ids']
542      ),
543      $ec_lists['user_ids']
544    );
545    foreach ($users_granted_thks_groups_ids as $user_id)
546     foreach ($granted_groups as $group_id => $group_users)
547      if (in_array($user_id, $group_users)) {
548        $users_granted_ids[$user_id]= $ec_lists['groups'][$group_id];
549        break;
550      }
551   
552  }
553
554  if ($append_tpl) {
555    $users_denied_ids = order_by_name(
556      array_diff(
557        array_keys($ec_lists['user_ids']),
558        $users_granted_thks_gen_ids,
559        $users_granted_thks_types_ids,
560        $users_granted_thks_groups_ids,
561        $ec_lists['users_granted_direct_ids']
562      ),
563      $ec_lists['user_ids']
564    );
565   
566    foreach ($users_granted_ids as $u => $g) $template->append(
567      'user_granted_indirects',
568      array(
569        'USER'  => $ec_lists['user_ids'][$u],
570        'GROUP' => $g
571      )
572    );
573   
574    $template->assign('all_groups', $ec_lists['groups']);
575    $template->assign('groups_granted_ids', $ec_lists['groups_granted_ids']);
576    $template->assign('groups_denied_ids', order_by_name(
577      array_diff(
578        array_keys($ec_lists['groups']),
579        $ec_lists['groups_granted_ids']
580      ),
581      $ec_lists['groups']
582    ));
583    $template->assign('ec_gen_granted', $ec_gen_granted);
584    $template->assign('all_types', $types);
585    $template->assign('types_granted_ids', $types_granted_ids);
586    $template->assign('types_denied_ids', order_by_name(
587      array_diff(array_keys($types), $types_granted_ids), $types
588    ));
589    $template->assign('all_users', $ec_lists['user_ids']);
590    $template->assign(
591      'users_granted_direct_ids',
592      $ec_lists['users_granted_direct_ids']
593    );
594    $template->assign('users_denied_ids', $users_denied_ids);
595  }
596  $users_granted_ids = array_merge(
597    array_keys($users_granted_ids),
598    $ec_lists['users_granted_direct_ids']
599  );
600 
601  // Returns an array which values are all the user_ids allowed to display a
602  // "duplicate" link. The keys of this array are strange (for direct allowed
603  // users, keys are usernames), but should not used
604  return $users_granted_ids;
605}
606
607/*
608 * dup_allowed($user_id)
609 * returns true if the user_id is allowed to display a duplicate link
610 *
611 * @param
612 *   $user_id : the user_id
613 * @return
614 *   true if the user_id is allowed to display a duplicate link
615 */
616function dup_allowed($user_id) {
617  return in_array($user_id, build_dup_arrays());
618}
619
620?>
Note: See TracBrowser for help on using the repository browser.