Home > Developer Guide > Hooks > Uncategorized Hooks
hook_civicrm_alterExternUrl
Summary
This hook allows you to modify extern urls such as click tracking, tracked opens urls
Definition
hook_civicrm_alterExternUrl(\GuzzleHttp\Psr7\UriInterface &$url, $path, $query, $fragment, $absolute, $isSSL)
Parameters
-
\Psr\Http\Message\UriInterface
$url
- The currently formulated URL. This may be replaced with a different URL. -
string
$path
- The logical path identifies the desired end-point. By convention, these match the original, standalone scripts incivicrm-core:extern/*.php
. For example,civicrm-core:extern/open.php
has the logical pathextern/open
. -
string
$query
- URL query parameters as a string -
string
$fragment
- A fragment identifier (anchor) to append to the link) -
bool
$absolute
- Whether to force the output to be an absolute link (beginning with a URI-scheme such as 'http:'). -
bool
$isSSL
- Whether to redirect to an HTTPS or an HTTP URL, NULL allows CiviCRM to autodetect, TRUE forces an HTTPS URL.
Returns
NULL
Example: Alternative end-point
The primary use-case for this hook is to generate the URL for alternative end-points.
In this example, any request for extern/open
will be directed to a new end-point https://example.com/open/tracker/wrapper
.
function MODULENAME_civicrm_alterExternUrl(&$url, $path, $query, $fragment, $absolute, $isSSL) {
if ($path == 'extern/open') {
$base = $absolute ? new \GuzzleHttp\Psr7\Uri('https://example.com/open/tracker/wrapper');
: new \GuzzleHttp\Psr7\Uri('/open/tracker/wrapper')
$url = $base->withQuery($query)->withFragment($fragment);
}
}
!!! note "Notes"
* The function examines $path
, $query
, $fragment
, $absolute
-- these are the main inputs.
* The function outputs the $url
(per PSR-7 UriInterface).
* The outputted $url
incorporates the requested values, but they do not have to be used literally.
In this case, the requested `$path` (`extern/open`) is very different from the concrete path (`/open/tracker/wrapper`).
Example: Fine-tuned URL
Another use-case is to fine-tune the $url
-- for example, swapping the hostname or adding a query parameter. In this case, it is important to ensure that your modifications run after the main URL has been constructed. To control the timing, use a Symfony listener and set the $priority
. For example:
function MODULENAME_civicrm_config(/* ... */) {
/* ... */
Civi::dispatcher()->addListener(
'hook_civicrm_alterExternUrl', '_MODULENAME_filterExternUrl', -1000);
}
function _MODULENAME_filterExternUrl($e) {
// Remove the 'www.' at the start of the hostname.
$newHost = preg_replace('/^www\./', '', $e->url->getHost());
$e->url = $e->url->withHost($newHost);
}
The example differs from the previous -- when fine-tuning a URL, we may consult the concrete $url
($e->url
) as reference-point. However, it is similar in that it ultimately outputs a new $url
($e->url
).
Reference
The $path
determines what values are likely to be seen in the $query
. Here are some canonical examples:
Path | Query Parameters | Description |
---|---|---|
extern/url |
qid={$event_queue_id}&u={$url_id} |
Handle a "click-through" event from a constituent reading a CiviMail newsletter |
extern/open |
q={$event_queue_id} |
Handle an "open" event from a constituent reading a CiviMail newsletter |