source: trunk/admin/notification_by_mail.php @ 21894

Last change on this file since 21894 was 19703, checked in by plg, 12 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 23.1 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
8// +-----------------------------------------------------------------------+
9// | This program is free software; you can redistribute it and/or modify  |
10// | it under the terms of the GNU General Public License as published by  |
11// | the Free Software Foundation                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24// +-----------------------------------------------------------------------+
25// | include                                                               |
26// +-----------------------------------------------------------------------+
27
28if (!defined('PHPWG_ROOT_PATH'))
29{
30  die ("Hacking attempt!");
31}
32
33include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
34include_once(PHPWG_ROOT_PATH.'admin/include/functions_notification_by_mail.inc.php');
35include_once(PHPWG_ROOT_PATH.'admin/include/tabsheet.class.php');
36include_once(PHPWG_ROOT_PATH.'include/common.inc.php');
37include_once(PHPWG_ROOT_PATH.'include/functions_notification.inc.php');
38include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
39
40// +-----------------------------------------------------------------------+
41// | Check Access and exit when user status is not ok                      |
42// +-----------------------------------------------------------------------+
43check_status(ACCESS_ADMINISTRATOR);
44
45// +-----------------------------------------------------------------------+
46// | Initialization                                                        |
47// +-----------------------------------------------------------------------+
48$base_url = get_root_url().'admin.php';
49$must_repost = false;
50
51// +-----------------------------------------------------------------------+
52// | functions                                                             |
53// +-----------------------------------------------------------------------+
54
55/*
56 * Do timeout treatment in order to finish to send mails
57 *
58 * @param $post_keyname: key of check_key post array
59 * @param check_key_treated: array of check_key treated
60 * @return none
61 */
62function do_timeout_treatment($post_keyname, $check_key_treated = array())
63{
64  global $env_nbm, $base_url, $page, $must_repost;
65
66  if ($env_nbm['is_sendmail_timeout'])
67  {
68    if (isset($_POST[$post_keyname]))
69    {
70      $post_count = count($_POST[$post_keyname]);
71      $treated_count = count($check_key_treated);
72      if ($treated_count != 0)
73      {
74        $time_refresh = ceil((get_moment() - $env_nbm['start_time']) * $post_count / $treated_count);
75      }
76      else
77      {
78        $time_refresh = 0;
79      }
80      $_POST[$post_keyname] = array_diff($_POST[$post_keyname], $check_key_treated);
81
82      $must_repost = true;
83      array_push($page['errors'],
84        l10n_dec('Execution time is out, treatment must be continue [Estimated time: %d second].',
85                 'Execution time is out, treatment must be continue [Estimated time: %d seconds].',
86                  $time_refresh));
87    }
88  }
89
90}
91
92/*
93 * Get the authorized_status for each tab
94 * return corresponding status
95 */
96function get_tab_status($mode)
97{
98  $result = ACCESS_WEBMASTER;
99  switch ($mode)
100  {
101    case 'param':
102    case 'subscribe':
103      $result = ACCESS_WEBMASTER;
104      break;
105    case 'send':
106      $result = ACCESS_ADMINISTRATOR;
107      break;
108    default:
109      $result = ACCESS_WEBMASTER;
110      break;
111  }
112  return $result;
113}
114
115/*
116 * Inserting News users
117 */
118function insert_new_data_user_mail_notification()
119{
120  global $conf, $page, $env_nbm;
121
122  // Set null mail_address empty
123  $query = '
124update
125  '.USERS_TABLE.'
126set
127  '.$conf['user_fields']['email'].' = null
128where
129  trim('.$conf['user_fields']['email'].') = \'\';';
130  pwg_query($query);
131
132  // null mail_address are not selected in the list
133  $query = '
134select
135  u.'.$conf['user_fields']['id'].' as user_id,
136  u.'.$conf['user_fields']['username'].' as username,
137  u.'.$conf['user_fields']['email'].' as mail_address
138from
139  '.USERS_TABLE.' as u left join '.USER_MAIL_NOTIFICATION_TABLE.' as m on u.'.$conf['user_fields']['id'].' = m.user_id
140where
141  u.'.$conf['user_fields']['email'].' is not null and
142  m.user_id is null
143order by
144  user_id;';
145
146  $result = pwg_query($query);
147
148  if (pwg_db_num_rows($result) > 0)
149  {
150    $inserts = array();
151    $check_key_list = array();
152
153    while ($nbm_user = pwg_db_fetch_assoc($result))
154    {
155      // Calculate key
156      $nbm_user['check_key'] = find_available_check_key();
157
158      // Save key
159      array_push($check_key_list, $nbm_user['check_key']);
160
161      // Insert new nbm_users
162      array_push
163      (
164        $inserts,
165        array
166        (
167          'user_id' => $nbm_user['user_id'],
168          'check_key' => $nbm_user['check_key'],
169          'enabled' => 'false' // By default if false, set to true with specific functions
170        )
171      );
172
173      array_push
174      (
175        $page['infos'],
176        sprintf(
177          l10n('User %s [%s] added.'),
178          stripslashes($nbm_user['username']),
179          get_email_address_as_display_text($nbm_user['mail_address'])
180        )
181      );
182    }
183
184    // Insert new nbm_users
185    mass_inserts(USER_MAIL_NOTIFICATION_TABLE, array('user_id', 'check_key', 'enabled'), $inserts);
186    // Update field enabled with specific function
187    $check_key_treated = do_subscribe_unsubscribe_notification_by_mail
188    (
189      true,
190      $conf['nbm_default_value_user_enabled'],
191      $check_key_list
192    );
193
194     // On timeout simulate like tabsheet send
195    if ($env_nbm['is_sendmail_timeout'])
196    {
197      $quoted_check_key_list = quote_check_key_list(array_diff($check_key_list, $check_key_treated));
198      if (count($quoted_check_key_list) != 0 )
199      {
200        $query = 'delete from '.USER_MAIL_NOTIFICATION_TABLE.' where check_key in ('.implode(",", $quoted_check_key_list).');';
201        $result = pwg_query($query);
202
203        redirect($base_url.get_query_string_diff(array(), false), l10n('Operation in progress')."\n".l10n('Please wait...'));
204      }
205    }
206  }
207}
208
209/*
210 * Apply global functions to mail content
211 * return customize mail content rendered
212 */
213function render_global_customize_mail_content($customize_mail_content)
214{
215  global $conf;
216
217  if ($conf['nbm_send_html_mail'] and !(strpos($customize_mail_content, '<') === 0))
218  {
219    // On HTML mail, detects if the content are HTML format.
220    // If it's plain text format, convert content to readable HTML
221    return nl2br(htmlspecialchars($customize_mail_content));
222  }
223  else
224  {
225    return $customize_mail_content;
226  }
227}
228
229/*
230 * Send mail for notification to all users
231 * Return list of "selected" users for 'list_to_send'
232 * Return list of "treated" check_key for 'send'
233 */
234function do_action_send_mail_notification($action = 'list_to_send', $check_key_list = array(), $customize_mail_content = '')
235{
236  global $conf, $page, $user, $lang_info, $lang, $env_nbm;
237  $return_list = array();
238
239  if (in_array($action, array('list_to_send', 'send')))
240  {
241    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
242
243    $is_action_send = ($action == 'send');
244
245    // disabled and null mail_address are not selected in the list
246    $data_users = get_user_notifications('send', $check_key_list);
247
248    // List all if it's define on options or on timeout
249    $is_list_all_without_test = ($env_nbm['is_sendmail_timeout'] or $conf['nbm_list_all_enabled_users_to_send']);
250
251    // Check if exist news to list user or send mails
252    if ((!$is_list_all_without_test) or ($is_action_send))
253    {
254      if (count($data_users) > 0)
255      {
256        $datas = array();
257
258        if (!isset($customize_mail_content))
259        {
260          $customize_mail_content = $conf['nbm_complementary_mail_content'];
261        }
262
263        $customize_mail_content = 
264          trigger_event('nbm_render_global_customize_mail_content', $customize_mail_content);
265
266
267        // Prepare message after change language
268        if ($is_action_send)
269        {
270          $msg_break_timeout = l10n('Time to send mail is limited. Others mails are skipped.');
271        }
272        else
273        {
274          $msg_break_timeout = l10n('Prepared time for list of users to send mail is limited. Others users are not listed.');
275        }
276
277        // Begin nbm users environment
278        begin_users_env_nbm($is_action_send);
279
280        foreach ($data_users as $nbm_user)
281        {
282          if ((!$is_action_send) and check_sendmail_timeout())
283          {
284            // Stop fill list on 'list_to_send', if the quota is override
285            array_push($page['infos'], $msg_break_timeout);
286            break;
287          }
288          if (($is_action_send) and check_sendmail_timeout())
289          {
290            // Stop fill list on 'send', if the quota is override
291            array_push($page['errors'], $msg_break_timeout);
292            break;
293          }
294
295          // set env nbm user
296          set_user_on_env_nbm($nbm_user, $is_action_send);
297
298          if ($is_action_send)
299          {
300            set_make_full_url();
301            // Fill return list of "treated" check_key for 'send'
302            array_push($return_list, $nbm_user['check_key']);
303
304            if ($conf['nbm_send_detailed_content'])
305            {
306               $news = news($nbm_user['last_send'], $dbnow, false, $conf['nbm_send_html_mail']);
307               $exist_data = count($news) > 0;
308            }
309            else
310            {
311              $exist_data = news_exists($nbm_user['last_send'], $dbnow);
312            }
313
314            if ($exist_data)
315            {
316              $subject = '['.$conf['gallery_title'].']: '.l10n('New photos added');
317
318              // Assign current var for nbm mail
319              assign_vars_nbm_mail_content($nbm_user);
320
321              if (!is_null($nbm_user['last_send']))
322              {
323                $env_nbm['mail_template']->assign
324                (
325                  'content_new_elements_between',
326                  array
327                  (
328                    'DATE_BETWEEN_1' => $nbm_user['last_send'],
329                    'DATE_BETWEEN_2' => $dbnow,
330                  )
331                );
332              }
333              else
334              {
335                $env_nbm['mail_template']->assign
336                (
337                  'content_new_elements_single',
338                  array
339                  (
340                    'DATE_SINGLE' => $dbnow,
341                  )
342                );
343              }
344
345              if ($conf['nbm_send_detailed_content'])
346              {
347                $env_nbm['mail_template']->assign('global_new_lines', $news);
348              }
349
350              $nbm_user_customize_mail_content = 
351                trigger_event('nbm_render_user_customize_mail_content',
352                  $customize_mail_content, $nbm_user);
353              if (!empty($nbm_user_customize_mail_content))
354              {
355                $env_nbm['mail_template']->assign
356                (
357                  'custom_mail_content', $nbm_user_customize_mail_content
358                );
359              }
360
361              if ($conf['nbm_send_html_mail'] and $conf['nbm_send_recent_post_dates'])
362              {
363                $recent_post_dates = get_recent_post_dates_array(
364                  $conf['recent_post_dates']['NBM']);
365                foreach ($recent_post_dates as $date_detail)
366                {
367                  $env_nbm['mail_template']->append
368                  (
369                    'recent_posts',
370                    array
371                    (
372                      'TITLE' => get_title_recent_post_date($date_detail),
373                      'HTML_DATA' => get_html_description_recent_post_date($date_detail)
374                    )
375                  );
376                }
377              }
378
379              $env_nbm['mail_template']->assign
380              (
381                array
382                (
383                  'GOTO_GALLERY_TITLE' => $conf['gallery_title'],
384                  'GOTO_GALLERY_URL' => get_gallery_home_url(),
385                  'SEND_AS_NAME'      => $env_nbm['send_as_name'],
386                )
387              );
388
389              if (pwg_mail
390                  (
391                    format_email(stripslashes($nbm_user['username']), $nbm_user['mail_address']),
392                    array
393                    (
394                      'from' => $env_nbm['send_as_mail_formated'],
395                      'subject' => $subject,
396                      'email_format' => $env_nbm['email_format'],
397                      'content' => $env_nbm['mail_template']->parse('notification_by_mail', true),
398                      'content_format' => $env_nbm['email_format'],
399                      'theme' => $nbm_user['theme']
400                    )
401                  ))
402              {
403                inc_mail_sent_success($nbm_user);
404
405                $data = array('user_id' => $nbm_user['user_id'],
406                              'last_send' => $dbnow);
407                array_push($datas, $data);
408              }
409              else
410              {
411                inc_mail_sent_failed($nbm_user);
412              }
413
414              unset_make_full_url();
415            }
416          }
417          else
418          {
419            if (news_exists($nbm_user['last_send'], $dbnow))
420            {
421              // Fill return list of "selected" users for 'list_to_send'
422              array_push($return_list, $nbm_user);
423            }
424          }
425
426          // unset env nbm user
427          unset_user_on_env_nbm();
428        }
429
430        // Restore nbm environment
431        end_users_env_nbm();
432
433        if ($is_action_send)
434        {
435          mass_updates(
436            USER_MAIL_NOTIFICATION_TABLE,
437            array(
438              'primary' => array('user_id'),
439              'update' => array('last_send')
440             ),
441             $datas
442             );
443
444          display_counter_info();
445        }
446      }
447      else
448      {
449        if ($is_action_send)
450        {
451          array_push($page['errors'], l10n('No user to send notifications by mail.'));
452        }
453      }
454    }
455    else
456    {
457      // Quick List, don't check news
458      // Fill return list of "selected" users for 'list_to_send'
459      $return_list = $data_users;
460    }
461  }
462
463  // Return list of "selected" users for 'list_to_send'
464  // Return list of "treated" check_key for 'send'
465  return $return_list;
466}
467
468// +-----------------------------------------------------------------------+
469// | Main                                                                  |
470// +-----------------------------------------------------------------------+
471if (!isset($_GET['mode']))
472{
473  $page['mode'] = 'send';
474}
475else
476{
477  $page['mode'] = $_GET['mode'];
478}
479
480// +-----------------------------------------------------------------------+
481// | Check Access and exit when user status is not ok                      |
482// +-----------------------------------------------------------------------+
483check_status(get_tab_status($page['mode']));
484
485
486// +-----------------------------------------------------------------------+
487// | Add event handler                                                     |
488// +-----------------------------------------------------------------------+
489add_event_handler('nbm_render_global_customize_mail_content', 'render_global_customize_mail_content');
490trigger_action('nbm_event_handler_added');
491
492
493// +-----------------------------------------------------------------------+
494// | Insert new users with mails                                           |
495// +-----------------------------------------------------------------------+
496if (!isset($_POST) or (count($_POST) ==0))
497{
498  // No insert data in post mode
499  insert_new_data_user_mail_notification();
500}
501
502// +-----------------------------------------------------------------------+
503// | Treatment of tab post                                                 |
504// +-----------------------------------------------------------------------+
505switch ($page['mode'])
506{
507  case 'param' :
508  {
509    if (isset($_POST['param_submit']))
510    {
511      $updated_param_count = 0;
512      // Update param
513      $result = pwg_query('select param, value from '.CONFIG_TABLE.' where param like \'nbm\\_%\'');
514      while ($nbm_user = pwg_db_fetch_assoc($result))
515      {
516        if (isset($_POST[$nbm_user['param']]))
517        {
518          $value = $_POST[$nbm_user['param']];
519
520          $query = '
521update
522'.CONFIG_TABLE.'
523set
524  value = \''. str_replace("\'", "''", $value).'\'
525where
526  param = \''.$nbm_user['param'].'\';';
527          pwg_query($query);
528          $updated_param_count += 1;
529        }
530      }
531
532      array_push($page['infos'],
533        l10n_dec('%d parameter was updated.', '%d parameters were updated.',
534          $updated_param_count));
535
536      // Reload conf with new values
537      load_conf_from_db('param like \'nbm\\_%\'');
538    }
539  }
540  case 'subscribe' :
541  {
542    if (isset($_POST['falsify']) and isset($_POST['cat_true']))
543    {
544      $check_key_treated = unsubscribe_notification_by_mail(true, $_POST['cat_true']);
545      do_timeout_treatment('cat_true', $check_key_treated);
546    }
547    else
548    if (isset($_POST['trueify']) and isset($_POST['cat_false']))
549    {
550      $check_key_treated = subscribe_notification_by_mail(true, $_POST['cat_false']);
551      do_timeout_treatment('cat_false', $check_key_treated);
552    }
553    break;
554  }
555
556  case 'send' :
557  {
558    if (isset($_POST['send_submit']) and isset($_POST['send_selection']) and isset($_POST['send_customize_mail_content']))
559    {
560      $check_key_treated = do_action_send_mail_notification('send', $_POST['send_selection'], stripslashes($_POST['send_customize_mail_content']));
561      do_timeout_treatment('send_selection', $check_key_treated);
562    }
563  }
564}
565
566// +-----------------------------------------------------------------------+
567// | template initialization                                               |
568// +-----------------------------------------------------------------------+
569$template->set_filenames
570(
571  array
572  (
573    'double_select' => 'double_select.tpl',
574    'notification_by_mail'=>'notification_by_mail.tpl'
575  )
576);
577
578$template->assign
579(
580  array
581  (
582    'U_HELP' => get_root_url().'admin/popuphelp.php?page=notification_by_mail',
583    'F_ACTION'=> $base_url.get_query_string_diff(array())
584  )
585);
586
587if (is_autorize_status(ACCESS_WEBMASTER))
588{
589  // TabSheet
590  $tabsheet = new tabsheet();
591  $tabsheet->set_id('nbm');
592  $tabsheet->select($page['mode']);
593  $tabsheet->assign();
594}
595
596if ($must_repost)
597{
598  // Get name of submit button
599  $repost_submit_name = '';
600  if (isset($_POST['falsify']))
601  {
602    $repost_submit_name = 'falsify';
603  }
604  elseif (isset($_POST['trueify']))
605  {
606    $repost_submit_name = 'trueify';
607  }
608  elseif (isset($_POST['send_submit']))
609  {
610    $repost_submit_name = 'send_submit';
611  }
612
613  $template->assign('REPOST_SUBMIT_NAME', $repost_submit_name);
614}
615
616switch ($page['mode'])
617{
618  case 'param' :
619  {
620    $template->assign(
621      $page['mode'],
622      array(
623        'SEND_HTML_MAIL' => $conf['nbm_send_html_mail'],
624        'SEND_MAIL_AS' => $conf['nbm_send_mail_as'],
625        'SEND_DETAILED_CONTENT' => $conf['nbm_send_detailed_content'],
626        'COMPLEMENTARY_MAIL_CONTENT' => $conf['nbm_complementary_mail_content'],
627        'SEND_RECENT_POST_DATES' => $conf['nbm_send_recent_post_dates'],
628        ));
629    break;
630  }
631
632  case 'subscribe' :
633  {
634    $template->assign( $page['mode'], true );
635
636    $template->assign(
637      array(
638        'L_CAT_OPTIONS_TRUE' => l10n('Subscribed'),
639        'L_CAT_OPTIONS_FALSE' => l10n('Unsubscribed')
640        )
641      );
642
643    $data_users = get_user_notifications('subscribe');
644   
645    $opt_true = array();
646    $opt_true_selected = array();
647    $opt_false = array();
648    $opt_false_selected = array();
649    foreach ($data_users as $nbm_user)
650    {
651      if (get_boolean($nbm_user['enabled']))
652      {
653        $opt_true[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
654        if ((isset($_POST['falsify']) and isset($_POST['cat_true']) and in_array($nbm_user['check_key'], $_POST['cat_true'])))
655        {
656          $opt_true_selected[] = $nbm_user['check_key'];
657        }
658      }
659      else
660      {
661        $opt_false[ $nbm_user['check_key'] ] = stripslashes($nbm_user['username']).'['.get_email_address_as_display_text($nbm_user['mail_address']).']';
662        if (isset($_POST['trueify']) and isset($_POST['cat_false']) and in_array($nbm_user['check_key'], $_POST['cat_false']))
663        {
664          $opt_false_selected[] = $nbm_user['check_key'];
665        }
666      }
667    }
668    $template->assign( array(
669        'category_option_true'          => $opt_true,
670        'category_option_true_selected' => $opt_true_selected,
671        'category_option_false'         => $opt_false,
672        'category_option_false_selected' => $opt_false_selected,
673        )
674    );
675    $template->assign_var_from_handle('DOUBLE_SELECT', 'double_select');
676    break;
677  }
678
679  case 'send' :
680  {
681    $tpl_var = array('users'=> array() );
682
683    $data_users = do_action_send_mail_notification('list_to_send');
684
685    $tpl_var['CUSTOMIZE_MAIL_CONTENT'] = 
686      isset($_POST['send_customize_mail_content']) 
687        ? stripslashes($_POST['send_customize_mail_content']) 
688        : $conf['nbm_complementary_mail_content'];
689
690    if  (count($data_users))
691    {
692      foreach ($data_users as $nbm_user)
693      {
694        if (
695            (!$must_repost) or // Not timeout, normal treatment
696            (($must_repost) and in_array($nbm_user['check_key'], $_POST['send_selection']))  // Must be repost, show only user to send
697            )
698        {
699          $tpl_var['users'][] = 
700            array(
701              'ID' => $nbm_user['check_key'],
702              'CHECKED' =>  ( // not check if not selected,  on init select<all
703                              isset($_POST['send_selection']) and // not init
704                              !in_array($nbm_user['check_key'], $_POST['send_selection']) // not selected
705                            )   ? '' : 'checked="checked"',
706              'USERNAME'=> stripslashes($nbm_user['username']),
707              'EMAIL' => get_email_address_as_display_text($nbm_user['mail_address']),
708              'LAST_SEND'=> $nbm_user['last_send']
709              );
710        }
711      }
712    }
713    $template->assign($page['mode'], $tpl_var);
714    break;
715  }
716}
717
718// +-----------------------------------------------------------------------+
719// | Sending html code                                                     |
720// +-----------------------------------------------------------------------+
721$template->assign_var_from_handle('ADMIN_CONTENT', 'notification_by_mail');
722
723?>
Note: See TracBrowser for help on using the repository browser.