if ($mode == 'm_update') { foreach ($_REQUEST['subscribers'] as $subscriber_id => $v) { db_query("UPDATE ?:subscribers SET ?u WHERE subscriber_id = ?i", $v, $subscriber_id); if (!empty($v['list_ids'])) { foreach ($v['list_ids'] as $list_id) { $_data = array('confirmed' => $v['mailing_lists'][$list_id]['confirmed'], 'lang_code' => $v['mailing_lists'][$list_id]['lang_code'], 'format' => $v['mailing_lists'][$list_id]['format']); $list_exist = db_get_field('SELECT list_id FROM ?:user_mailing_lists WHERE subscriber_id = ?i AND list_id = ?i', $subscriber_id, $list_id); if (empty($list_exist)) { $_data['subscriber_id'] = $subscriber_id; $_data['list_id'] = $list_id; $_data['timestamp'] = TIME; $_data['activation_key'] = md5(uniqid(rand())); $_data['unsubscribe_key'] = md5(uniqid(rand())); db_query("INSERT INTO ?:user_mailing_lists ?e", $_data); if (empty($v['mailing_lists'][$list_id]['confirmed'])) { fn_send_confirmation_email($subscriber_id, $list_id, $v['email'], $v['mailing_lists'][$list_id]['format'], $v['mailing_lists'][$list_id]['lang_code']); } } else { db_query("UPDATE ?:user_mailing_lists SET ?u WHERE subscriber_id = ?i AND list_id = ?i", $_data, $subscriber_id, $list_id); } } db_query("DELETE FROM ?:user_mailing_lists WHERE subscriber_id = ?i AND list_id NOT IN(?n)", $subscriber_id, $v['list_ids']); } else { db_query("DELETE FROM ?:user_mailing_lists WHERE subscriber_id = ?i", $subscriber_id); } } } if ($mode == 'delete') { fn_delete_subscribers($_REQUEST['subscriber_ids']); } return array(CONTROLLER_STATUS_OK, "subscribers.manage");
/** * Save user mailing lists settings. * * @param int $subscriber_id * @param array $user_list_ids * @param mixed $confirmed - if passed, subscription status set to passed value, if null, depends on autoresponder * @param boolean $notify * @param string $lang_code */ function fn_update_subscriptions($subscriber_id, $user_list_ids = array(), $confirmed = NULL, $force_notification = array(), $lang_code = CART_LANGUAGE) { if (!empty($user_list_ids)) { list($lists) = fn_get_mailing_lists(); $subscriber = db_get_row("SELECT * FROM ?:subscribers WHERE subscriber_id = ?i", $subscriber_id); // to prevent user from subscribing to hidden and disabled mailing lists by manual link edit if (AREA != 'A') { foreach ($user_list_ids as $k => $l_id) { if ($lists[$l_id]['status'] != 'A') { unset($user_list_ids[$k]); } } } foreach ($user_list_ids as $list_id) { $subscribed = db_get_array("SELECT confirmed FROM ?:user_mailing_lists WHERE subscriber_id = ?i AND list_id = ?i", $subscriber_id, $list_id); $already_confirmed = !empty($subscribed['confirmed']) ? true : false; $already_subscribed = !empty($subscribed) ? true : false; if ($already_confirmed) { $_confirmed = 1; } else { if (is_array($confirmed)) { $_confirmed = !empty($confirmed[$list_id]['confirmed']) ? $confirmed[$list_id]['confirmed'] : 0; } else { $_confirmed = !empty($lists[$list_id]['register_autoresponder']) ? 0 : 1; } } if ($already_subscribed && $already_confirmed == $_confirmed) { continue; } $_data = array('subscriber_id' => $subscriber_id, 'list_id' => $list_id, 'activation_key' => md5(uniqid(rand())), 'unsubscribe_key' => md5(uniqid(rand())), 'email' => $subscriber['email'], 'timestamp' => TIME, 'lang_code' => $lang_code, 'confirmed' => $_confirmed); db_query("REPLACE INTO ?:user_mailing_lists ?e", $_data); // send confirmation email for each mailing list if (empty($_confirmed)) { fn_send_confirmation_email($subscriber_id, $list_id, $subscriber['email'], $lang_code); } } } // Delete unchecked mailing lists if (!empty($user_list_ids)) { $lists_to_delete = db_get_field("SELECT list_id FROM ?:user_mailing_lists WHERE subscriber_id = ?i AND list_id NOT IN (?n)", $subscriber_id, $user_list_ids); if (!empty($lists_to_delete)) { db_query("DELETE FROM ?:user_mailing_lists WHERE subscriber_id = ?i AND list_id IN (?n)", $subscriber_id, $lists_to_delete); // Delete subscriber in the frontend if all lists are unchecked if (AREA == 'C') { $c = db_get_field("SELECT COUNT(*) FROM ?:user_mailing_lists WHERE subscriber_id = ?i", $subscriber_id); if (empty($c)) { db_query("DELETE FROM ?:subscribers WHERE subscriber_id = ?i", $subscriber_id); } } } // Delete subscriber in the frontend area if all lists are unchecked } else { fn_delete_subscribers(array($subscriber_id), AREA == 'C'); } }
/** * Save user mailing lists settings. * * @param int $subscriber_id * @param array $user_lists_ids * @param int $format - newsletters format for that user * @param int $mode - updating mode for $user_lists_ids. We need this to disable unchecked mailing lists if user disables them on profile, but we don't need that for subscription block (we just subscribe to checked there) * NEWSLETTER_SAVE_UNCHECKED - for sidebar mode * NEWSLETTER_DELETE_UNCHECKED - for user profile mode * NEWSLETTER_ONLY_CHECKED - for admin user picker mode, when all $user_lists_ids are enabled * @param mixed $confirmed - if passed, subscription status set to passed value, if null, depends on autoresponder * @param boolean $notify * @param string $lang_code */ function fn_update_subscriptions($subscriber_id, $user_lists_ids = array(), $format = NEWSLETTER_FORMAT_TXT, $mode = NEWSLETTER_SAVE_UNCHECKED, $confirmed = NULL, $force_notification = array(), $lang_code = CART_LANGUAGE) { $lists = fn_get_mailing_lists(); $subscriber = db_get_row("SELECT * FROM ?:subscribers WHERE subscriber_id = ?i", $subscriber_id); $exising_subscriptions = db_get_fields("SELECT list_id FROM ?:user_mailing_lists WHERE subscriber_id = ?i", $subscriber_id); // to prevent user from subscribing to hidden and disabled mailing lists by manual link edit if (AREA != 'A') { $_statuses = array('D', 'H'); $denied = db_get_fields("SELECT list_id FROM ?:mailing_lists WHERE status in (?a)", 'list_id', $_statuses); foreach ($denied as $denied_list_id) { unset($user_lists_ids[$denied_list_id]); } } $checked_lists_ids = array(); $unchecked_lists_ids = array(); // if array with list ids as values passed if ($mode == NEWSLETTER_ONLY_CHECKED) { $checked_lists_ids = $user_lists_ids; // if array with list_id => enabled pairs passed } else { foreach ((array) $user_lists_ids as $list_id => $enabled) { if ($enabled) { $checked_lists_ids[] = $list_id; } else { $unchecked_lists_ids[] = $list_id; } } } foreach ($checked_lists_ids as $list_id) { $_data = array('subscriber_id' => $subscriber_id, 'list_id' => $list_id, 'activation_key' => md5(uniqid(rand())), 'unsubscribe_key' => md5(uniqid(rand())), 'email' => $subscriber['email'], 'timestamp' => TIME, 'lang_code' => $lang_code, 'confirmed' => $confirmed == NULL ? !empty($lists[$list_id]['register_autoresponder']) ? 0 : 1 : ($confirmed ? 1 : 0), 'format' => intval($format)); db_query("REPLACE INTO ?:user_mailing_lists ?e", $_data); // send confirmation email for each mailing list if (!empty($force_notification['C'])) { fn_send_confirmation_email($subscriber_id, $list_id, $subscriber['email'], $format, $lang_code); } } if ($mode == NEWSLETTER_DELETE_UNCHECKED && !empty($unchecked_lists_ids)) { db_query("DELETE FROM ?:user_mailing_lists WHERE subscriber_id=?i AND list_id IN (?n)", $subscriber_id, $unchecked_lists_ids); $c = db_get_field("SELECT COUNT(*) FROM ?:user_mailing_lists WHERE subscriber_id = ?i", $subscriber_id); if (empty($c)) { db_query("DELETE FROM ?:subscribers WHERE subscriber_id = ?i", $subscriber_id); } } }