civicrm/mailing/url - Emit more $context for redirects
authorTim Otten <totten@civicrm.org>
Wed, 13 May 2020 04:11:04 +0000 (21:11 -0700)
committerTim Otten <totten@civicrm.org>
Wed, 13 May 2020 07:05:49 +0000 (00:05 -0700)
For example, suppose your goal is to recognize any CiviMail links going to `woogle.com` and
append code with the mailing ID (`&src=civimail_123`). Do this:

```php
  if ($context['for'] === 'civicrm/mailing/url' && preg_match('/woogle\.com$/', $url->getHost())) {
    $mailing_id = CRM_Core_DAO::singleValueQuery('
      SELECT mj.mailing_id FROM civicrm_mailing_event_queue meq
      INNER JOIN civicrm_mailing_job mj ON mj.id = meq.job_id
      WHERE meq.id = %1
    ', [
      1 => [$context['queue_id'], 'Int']
    ]);
    $url = $url->withQuery($url->getQuery() . '&src=civimail_' . $mailing_id);
  }
```

CRM/Mailing/Page/Url.php

index 40daca3de6be3bde179e39492b964b8274385ef9..ece6a55990d6cd033c9bc588f00e5919efa89762 100644 (file)
@@ -58,7 +58,11 @@ class CRM_Mailing_Page_Url extends CRM_Core_Page {
         $url .= '#' . $pieces['fragment'];
       }
     }
-    CRM_Utils_System::redirect($url);
+    CRM_Utils_System::redirect($url, [
+      'for' => 'civicrm/mailing/url',
+      'queue_id' => $queue_id,
+      'url_id' => $url_id,
+    ]);
   }
 
   /**