Esempio n. 1
0
    /**
     * Show_Send_Step_4
     * Step 4 handles two pieces of functionality:
     * - if cron support is enabled, it "approves" the job for sending and then redirects the user to the main splittest page
     *
     * If cron is not enabled, it processes and sends the emails out in popup mode.
     * It looks at the queues table for people to send to, and sends one email per window refresh.
     * It prints out a report of what's going on:
     * - how many have been sent
     * - how many left
     * - approx how long it has taken so far
     * - approx how long to go
     * - optional extra - pause after displaying that info and sending the email (based on user restrictions)
     *
     * @uses Jobs_API
     * @uses Jobs_API::ApproveJob
     * @uses Jobs_API::QueueSize
     * @uses CheckCronEnabled
     * @uses Splittest_Send_API::StartJob
     */
    public function Show_Send_Step_4()
    {
        $send_details = IEM::sessionGet('SplitTestSendDetails');
        if (!$send_details || !isset($send_details['splitid']) || (int) $send_details['splitid'] <= 0) {
            FlashMessage(GetLang('Addon_splittest_Send_InvalidSplitTest'), SS_FLASH_MSG_ERROR, $this->admin_url);
            return;
        }
        $jobid = $send_details['Job'];
        require_once SENDSTUDIO_API_DIRECTORY . '/jobs.php';
        $jobApi = new Jobs_API();
        if (isset($_GET['Start']) || self::CheckCronEnabled()) {
            /**
             * Remove the "cleanup" variables so we don't kill the send off when we either
             * - successfully schedule a send
             * - or start a send going.
             */
            IEM::sessionRemove('SplitTestSend_Cleanup');
            $user = GetUser();
            $jobApi->ApproveJob($jobid, $user->Get('userid'), $user->Get('userid'));
        }
        /**
         * If we get here and cron is enabled, we're finishing off a scheduled send setup.
         * Show a message and return the user to the manage screen.
         */
        if (self::CheckCronEnabled()) {
            FlashMessage(GetLang('Addon_splittest_Send_JobScheduled'), SS_FLASH_MSG_SUCCESS, $this->admin_url);
            return;
        }
        $this->template_system->Assign('AdminUrl', $this->admin_url, false);
        $send_api = $this->GetApi('Splittest_Send');
        if (isset($_GET['Start'])) {
            $send_api->StartJob($jobid, $send_details['splitid']);
        }
        $sendqueue = $jobApi->GetJobQueue($jobid);
        $job = $jobApi->LoadJob($jobid);
        $send_api->Set('statids', $send_details['Stats']);
        $send_api->Set('jobdetails', $job['jobdetails']);
        $send_api->Set('jobowner', $job['ownerid']);
        $queuesize = $jobApi->QueueSize($sendqueue, 'splittest');
        $send_details['SendQueue'] = $sendqueue;
        $timenow = $send_api->GetServerTime();
        $timediff = $timenow - $send_details['SendStartTime'];
        $time_so_far = $this->TimeDifference($timediff);
        $num_left_to_send = $send_details['SendSize'] - $queuesize;
        if ($num_left_to_send > 0) {
            $timeunits = $timediff / $num_left_to_send;
            $timediff = $timeunits * $queuesize;
        } else {
            $timediff = 0;
        }
        $timewaiting = $this->TimeDifference($timediff);
        $this->template_system->Assign('SendTimeSoFar', sprintf(GetLang('Addon_splittest_Send_Step4_TimeSoFar'), $time_so_far));
        $this->template_system->Assign('SendTimeLeft', sprintf(GetLang('Addon_splittest_Send_Step4_TimeLeft'), $timewaiting));
        if ($num_left_to_send == 1) {
            $this->template_system->Assign('Send_NumberAlreadySent', GetLang('Addon_splittest_Send_Step4_NumberSent_One'));
        } else {
            $this->template_system->Assign('Send_NumberAlreadySent', sprintf(GetLang('Addon_splittest_Send_Step4_NumberSent_Many'), $this->PrintNumber($num_left_to_send)));
        }
        if ($queuesize <= 0) {
            require_once SENDSTUDIO_API_DIRECTORY . '/ss_email.php';
            $email = new SS_Email_API();
            if (SENDSTUDIO_SAFE_MODE) {
                $email->Set('imagedir', TEMP_DIRECTORY . '/send');
            } else {
                $email->Set('imagedir', TEMP_DIRECTORY . '/send.' . $jobid . '.' . $sendqueue);
            }
            $email->CleanupImages();
            $send_details['SendEndTime'] = $send_api->GetServerTime();
            IEM::sessionSet('SplitTestSendDetails', $send_details);
            $this->template_system->Assign('Send_NumberLeft', GetLang('Addon_splittest_Send_Step4_SendFinished'));
            $this->template_system->ParseTemplate('send_step4');
            ?>
				<script>
					window.opener.focus();
					window.opener.document.location = '<?php 
            echo $this->admin_url . '&Action=Send&Step=5';
            ?>
';
					window.close();
				</script>
			<?php 
            return;
        }
        if ($queuesize == 1) {
            $this->template_system->Assign('Send_NumberLeft', GetLang('Addon_splittest_Send_Step4_NumberLeft_One'));
        } else {
            $this->template_system->Assign('Send_NumberLeft', sprintf(GetLang('Addon_splittest_Send_Step4_NumberLeft_Many'), $this->PrintNumber($queuesize)));
        }
        $send_api->SetupJob($jobid, $sendqueue);
        $send_api->SetupNewsletter();
        $recipients = $send_api->FetchFromQueue($sendqueue, 'splittest', 1, 1);
        $send_api->SetupDynamicContentFields($recipients);
        $send_api->SetupCustomFields($recipients);
        $sent_ok = false;
        foreach ($recipients as $p => $recipientid) {
            $send_results = $send_api->SendToRecipient($recipientid, $sendqueue);
            // save the info in the session, then see if we need to pause between each email.
            if ($send_results['success'] > 0) {
                $sent_ok = true;
                $send_details['EmailResults']['success']++;
            } else {
                $send_details['EmailResults']['failure']++;
            }
            $send_details['EmailResults']['total']++;
            IEM::sessionSet('SplitTestSendDetails', $send_details);
        }
        session_write_close();
        $this->template_system->ParseTemplate('send_step4');
        // we should only need to pause if we successfully sent.
        if ($sent_ok) {
            $send_api->Pause();
        }
    }
Esempio n. 2
0
	/**
	* ResendJob_Setup
	* This sets up the scheduled send 'job' ready for a resend.
	* This includes fixing up user statistics, moving the unsent recipients from the unsent queue to the live queue and making the job ready to go.
	*
	* If an invalid jobid is passed in (not an in or it's less than 0) this will return false.
	* There needs to be a user object set up so statistics can be re-allocated properly. If this is not set up, the function returns false.
	*
	* @param Int $jobid The job we are re-setting up.
	*
	* @uses Jobs_API::GetJobQueue
	* @uses Jobs_API::GetJobQueueSize
	* @uses Jobs_API::RestoreUnsentQueue
	* @uses Stats_API::ChangeUserStats
	*
	* @return Boolean Returns false if there is an invalid jobid provided or if the user object is not set up properly. Otherwise, it does all of it's work and returns true.
	*/
	function ResendJob_Setup($jobid=0)
	{
		$jobid = (int)$jobid;
		if ($jobid <= 0) {
			return false;
		}

		if ($this->jobowner <= 0) {
			return false;
		}

		require_once(dirname(__FILE__) . '/jobs.php');
		require_once(dirname(__FILE__) . '/stats.php');

		$jobapi = new Jobs_API();
		$stats_api = new Stats_API();

		$sendqueue = $jobapi->GetJobQueue($jobid);

		// if we're resending a newsletter, restore the 'unsent' queue back to the original.
		$jobsize_info_before = $jobapi->GetJobQueueSize($jobid);

		$jobapi->RestoreUnsentQueue($jobid, $sendqueue, $this->jobowner, 'send');

		// then make sure we mark the emails as allocated in statistics.
		$restore_size = $jobapi->QueueSize($sendqueue, 'send');
		$new_size = $jobsize_info_before['totalsent'] + $restore_size;

		$stats_api->ChangeUserStats($this->jobowner, $jobid, $new_size);

		unset($jobapi);
		unset($stats_api);

		return true;
	}