function edit($id = false) { if (empty($_REQUEST['id']) && empty($id)) { $this->error('Cannot edit element primary key is missing : ' . get_class($this)); return; } if (!$id) { $id = $_REQUEST['id']; } // get detail info of current user $this->data['user'] = $this->modelObj->getDetails(array('user_id' => $id)); if (!$this->data['user']) { $this->notice(__('No subscriber found, most probably because he was deleted.', WYSIJA)); return $this->redirect(); } // get list info $model_list = WYSIJA::get('list', 'model'); $model_list->limitON = false; $model_list->orderBy('is_enabled', 'DESC'); $this->data['list'] = $model_list->get(false, array('greater' => array('is_enabled' => '-1'))); $this->viewObj->title = __('Edit', WYSIJA) . ' ' . $this->data['user']['details']['email']; // execute hooks $hook_params = array('user_id' => $id); $this->data['hooks']['hook_subscriber_left'] = apply_filters('hook_subscriber_left', WYSIJA_module::execute_hook('hook_subscriber_left', $hook_params), $hook_params); $this->data['hooks']['hook_subscriber_right'] = apply_filters('hook_subscriber_right', WYSIJA_module::execute_hook('hook_subscriber_right', $hook_params), $hook_params); $this->data['hooks']['hook_subscriber_bottom'] = apply_filters('hook_subscriber_bottom', WYSIJA_module::execute_hook('hook_subscriber_bottom', $hook_params), $hook_params); // prepare js, for rendering $this->js[] = 'wysija-validator'; }
function save() { $_REQUEST = stripslashes_deep($_REQUEST); $_POST = stripslashes_deep($_POST); $this->requireSecurity(); $hook_settings_before_save = array('REQUEST' => &$_REQUEST); apply_filters('hook_settings_before_save', WYSIJA_module::execute_hook('hook_settings_before_save', $hook_settings_before_save), $hook_settings_before_save); $this->modelObj->save($_REQUEST['wysija']['config'], true); $hook_settings_super_advanced_params = array(); $this->data['hooks']['hook_settings_super_advanced'] = apply_filters('hook_settings_super_advanced', WYSIJA_module::execute_hook('hook_settings_super_advanced', $hook_settings_super_advanced_params), $hook_settings_super_advanced_params); // redirect so that javascript values get updated wp_redirect('admin.php?page=wysija_config' . $_REQUEST['redirecttab']); }
function viewstats() { $this->js[] = 'wysija-admin-list'; $this->js[] = 'wysija-charts'; $this->viewShow = 'viewstats'; $this->modelObj = WYSIJA::get("email", "model"); $this->modelObj->limitON = false; $email_object = $this->modelObj->getOne(false, array("email_id" => $_REQUEST['id'])); if (empty($email_object)) { $this->redirect('admin.php?page=wysija_campaigns'); return; } $this->viewObj->model = $this->modelObj; $this->viewObj->namecampaign = $email_object['subject']; $this->viewObj->title = sprintf(__('Stats : %1$s', WYSIJA), $email_object['subject']); $modelObjCamp = WYSIJA::get("campaign", "model"); $limit_pp = false; if (isset($modelObjCamp->limit_pp)) { $limit_pp = $modelObjCamp->limit_pp; } $modelObjCamp->limitON = false; $campaign = $modelObjCamp->getOne(false, array("campaign_id" => $email_object['campaign_id'])); $this->setviewStatsfilter(); $this->modelObj->reset(); $this->modelObj->noCheck = true; // 0 - counting request $queryCmmonStart = 'SELECT count(distinct B.user_id) as users FROM `[wysija]user` as A'; $queryCmmonStart .= ' LEFT JOIN `[wysija]' . $this->tableQuery . '` as B on A.user_id=B.user_id'; // all the counts query $query = "SELECT count(user_id) as users, status FROM `[wysija]email_user_stat` as A\n\t\t\tWHERE A.email_id=" . $email_object['email_id'] . " GROUP BY status"; $countss = $this->modelObj->query("get_res", $query, ARRAY_A); // we also count what is in the queue $query = "SELECT count(user_id) as users FROM `[wysija]queue` as A\n\t\t\tWHERE A.email_id=" . $email_object['email_id']; $countss[-2]['status'] = -3; $countss[-2]['users'] = $this->modelObj->count($query, 'users'); $counts = array(); $truetotal = $total = 0; foreach ($countss as $count) { switch ($count['status']) { case "-3": $type = 'inqueue'; break; case "-2": $type = 'notsent'; break; case "-1": $type = 'bounced'; break; case "0": $type = 'sent'; break; case "1": $type = 'opened'; break; case "2": $type = 'clicked'; break; case "3": $type = 'unsubscribe'; break; } if ($count['status'] != "-2") { $total = $total + $count['users']; } $truetotal = $truetotal + $count['users']; $counts[$type] = $count['users']; } $counts['allsent'] = $total; $counts['all'] = $truetotal; $this->modelObj->reset(); $this->filters['equal']["B.email_id"] = $email_object['email_id']; $this->modelObj->noCheck = true; if ($this->filters) { $this->modelObj->setConditions($this->filters); } // 1 - subscriber request $query = 'SELECT A.user_id, A.firstname, A.lastname,A.status as ustatus,' . $this->statusemail . ' , A.email, B.* FROM `[wysija]user` as A'; $query .= ' LEFT JOIN `[wysija]' . $this->tableQuery . '` as B on A.user_id=B.user_id'; $queryFinal = $this->modelObj->makeWhere(); // without filter we already have the total number of subscribers if ($this->filters) { $this->modelObj->countRows = $this->modelObj->count($queryCmmonStart . $queryFinal, 'users'); } else { $this->modelObj->countRows = $counts['all']; } $orderby = ''; /** * Until now, we have * - 3 possible values of $this->tableQuery (queue, email_user_url, email_user_stat), set by $this->setviewStatsfilter() * - 2 possible values of $_REQUEST['orderby'] * => 3x2 = 6 cases */ if (isset($_REQUEST['orderby'])) { switch ($this->tableQuery) { case 'email_user_url': case 'email_user_stat': if (!is_string($_REQUEST['orderby']) or preg_match('|[^a-z0-9#_.-]|i', $_REQUEST['orderby']) !== 0) { $_REQUEST['orderby'] = ''; break; } if (!in_array(strtoupper($_REQUEST['ordert']), array('DESC', 'ASC'))) { $_REQUEST['ordert'] = 'DESC'; } $orderby = ' ORDER BY ' . $_REQUEST['orderby'] . ' ' . $_REQUEST['ordert']; break; case 'queue': default: $orderby .= ' ORDER BY A.user_id DESC'; break; } } else { switch ($this->tableQuery) { case 'email_user_url': $orderby = ' ORDER BY B.clicked_at DESC, B.number_clicked DESC'; // by default, sort by last clicked and biggest hit break; case 'email_user_stat': $orderby = ' ORDER BY B.opened_at DESC, B.status DESC'; // by default, sort by last open and its staus value break; case 'queue': default: $orderby = ' ORDER BY A.user_id DESC'; break; } } $this->data['tableQuery'] = $this->tableQuery; $this->modelObj->limitON = true; $subscribers = array(); $hook_params = array('email_id' => $email_object['email_id'], 'url_id' => isset($_REQUEST['url_id']) && $_REQUEST['url_id'] ? $_REQUEST['url_id'] : false, 'subscribers' => &$subscribers, 'id' => $email_object['campaign_id']); $this->data['subscribers'] = $this->modelObj->getResults($query . $queryFinal . " GROUP BY A.user_id" . $orderby . $this->modelObj->setLimit(0, (int) $limit_pp)); $this->modelObj->reset(); // make the data object for the listing view $modelList = WYSIJA::get("list", "model"); // 2 - list request $query = "SELECT A.list_id, A.name,A.is_enabled, count( B.user_id ) AS users FROM `[wysija]" . $modelList->table_name . "` as A"; $query .= " LEFT JOIN `[wysija]user_list` as B on A.list_id = B.list_id"; $query .= " GROUP BY A.list_id"; $listsDB = $modelList->getResults($query); $lists = array(); foreach ($listsDB as $listobj) { $lists[$listobj["list_id"]] = $listobj; } $listsDB = null; $user_ids = array(); foreach ($this->data['subscribers'] as $subscriber) { $user_ids[] = $subscriber['user_id']; } // 3 - user_list request if ($user_ids) { $modeluList = WYSIJA::get("user_list", "model"); $userlists = $modeluList->get(array("list_id", "user_id"), array("user_id" => $user_ids)); } $this->data['lists'] = $lists; $this->data['counts'] = array_reverse($counts); // regrouping all the data in the same array foreach ($this->data['subscribers'] as $keysus => $subscriber) { // default key while we don't have the data //TODO add data for stats about emails opened clicked etc $this->data['subscribers'][$keysus]["emails"] = 0; $this->data['subscribers'][$keysus]["opened"] = 0; $this->data['subscribers'][$keysus]["clicked"] = 0; if ($userlists) { foreach ($userlists as $key => $userlist) { if ($subscriber["user_id"] == $userlist["user_id"] && isset($lists[$userlist["list_id"]])) { if (!isset($this->data['subscribers'][$keysus]["lists"])) { $this->data['subscribers'][$keysus]["lists"] = $lists[$userlist["list_id"]]["name"]; } else { $this->data['subscribers'][$keysus]["lists"] .= ", " . $lists[$userlist["list_id"]]["name"]; } } } } } $this->data['email'] = $email_object; if (!$this->data['subscribers']) { $this->notice(__("Your request can't retrieve any subscribers. Change your filters!", WYSIJA)); } // execute hooks $hook_params = array('email_id' => $_REQUEST['id'], 'email_object' => $email_object, 'url_id' => !empty($_REQUEST['url_id']) ? (int) $_REQUEST['url_id'] : null, 'id' => $email_object['campaign_id']); $this->data['hooks']['hook_newsletter_top'] = apply_filters('hook_newsletter_top', WYSIJA_module::execute_hook('hook_newsletter_top', $hook_params), $hook_params); $this->data['hooks']['hook_newsletter_bottom'] = apply_filters('hook_newsletter_bottom', WYSIJA_module::execute_hook('hook_newsletter_bottom', $hook_params), $hook_params); }