Merge pull request #23655 from colemanw/searchKitFixJoinAgain
[civicrm-core.git] / CRM / Mailing / Form / Unsubscribe.php
index 72afaa5b999dfeb4fb1cecbb02487b55354236e5..77f54983f6e73ea537fc98d71b9287aa2ee2dc71 100644 (file)
@@ -24,18 +24,33 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
    */
   public $submitOnce = TRUE;
 
-  public function preProcess() {
+  /**
+   * @var int
+   */
+  private $_job_id;
+
+  /**
+   * @var int
+   */
+  private $_queue_id;
 
-    $this->_type = 'unsubscribe';
+  /**
+   * @var string
+   */
+  private $_hash;
+
+  /**
+   * @var string
+   */
+  private $_email;
 
+  public function preProcess() {
     $this->_job_id = $job_id = CRM_Utils_Request::retrieve('jid', 'Integer', $this);
     $this->_queue_id = $queue_id = CRM_Utils_Request::retrieve('qid', 'Integer', $this);
     $this->_hash = $hash = CRM_Utils_Request::retrieve('h', 'String', $this);
+    $isConfirm = CRM_Utils_Request::retrieveValue('confirm', 'Boolean', FALSE, FALSE, 'GET');
 
-    if (!$job_id ||
-      !$queue_id ||
-      !$hash
-    ) {
+    if (!$job_id || !$queue_id || !$hash) {
       throw new CRM_Core_Exception(ts('Missing Parameters'));
     }
 
@@ -55,28 +70,22 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
     $groups = CRM_Mailing_Event_BAO_Unsubscribe::unsub_from_mailing($job_id, $queue_id, $hash, TRUE);
     $this->assign('groups', $groups);
     $groupExist = NULL;
-    foreach ($groups as $key => $value) {
+    foreach ($groups as $value) {
       if ($value) {
         $groupExist = TRUE;
       }
     }
-    if (!$groupExist) {
-      $statusMsg = ts('%1 has been unsubscribed.',
-        [1 => $email]
-      );
+    if (!$groupExist && !$isConfirm) {
+      $statusMsg = ts('%1 has already been unsubscribed.', [1 => $email]);
       CRM_Core_Session::setStatus($statusMsg, '', 'error');
     }
     $this->assign('groupExist', $groupExist);
-
   }
 
   public function buildQuickForm() {
     CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
     $this->setTitle(ts('Unsubscribe Confirmation'));
 
-    $this->add('text', 'email_confirm', ts('Verify email address to unsubscribe:'));
-    $this->addRule('email_confirm', ts('Email address is required to unsubscribe.'), 'required');
-
     $buttons = [
       [
         'type' => 'next',
@@ -93,42 +102,19 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
   }
 
   public function postProcess() {
-    $values = $this->exportValues();
-
-    // check if EmailTyped matches Email address
-    $result = CRM_Utils_String::compareStr($this->_email, $values['email_confirm'], TRUE);
-    $job_id = $this->_job_id;
-    $queue_id = $this->_queue_id;
-    $hash = $this->_hash;
-
-    $confirmURL = CRM_Utils_System::url("civicrm/mailing/{$this->_type}", "reset=1&jid={$job_id}&qid={$queue_id}&h={$hash}&confirm=1");
+    $confirmURL = CRM_Utils_System::url("civicrm/mailing/unsubscribe", "reset=1&jid={$this->_job_id}&qid={$this->_queue_id}&h={$this->_hash}&confirm=1");
     $this->assign('confirmURL', $confirmURL);
-    $session = CRM_Core_Session::singleton();
-    $session->pushUserContext($confirmURL);
+    CRM_Core_Session::singleton()->pushUserContext($confirmURL);
 
-    if ($result == TRUE) {
-      // Email address verified
-      $groups = CRM_Mailing_Event_BAO_Unsubscribe::unsub_from_mailing($job_id, $queue_id, $hash);
+    // Email address verified
+    $groups = CRM_Mailing_Event_BAO_Unsubscribe::unsub_from_mailing($this->_job_id, $this->_queue_id, $this->_hash);
 
-      if (count($groups)) {
-        CRM_Mailing_Event_BAO_Unsubscribe::send_unsub_response($queue_id, $groups, FALSE, $job_id);
-      }
-
-      $statusMsg = ts('%1 is unsubscribed.',
-        [1 => $values['email_confirm']]
-      );
-
-      CRM_Core_Session::setStatus($statusMsg, '', 'success');
+    if (count($groups)) {
+      CRM_Mailing_Event_BAO_Unsubscribe::send_unsub_response($this->_queue_id, $groups, FALSE, $this->_job_id);
     }
-    elseif ($result == FALSE) {
-      // Email address not verified
-      $statusMsg = ts('%1 is not associated with this unsubscribe request.',
-        [1 => $values['email_confirm']]
-      );
 
-      CRM_Core_Session::setStatus($statusMsg, '', 'error');
-
-    }
+    $statusMsg = ts('%1 has been unsubscribed successfully.', [1 => $this->_email]);
+    CRM_Core_Session::setStatus($statusMsg, '', 'success');
   }
 
 }