switch ($className) {
case 'Contribute':
$attributes = $this->getVar('_attributes');
- $subPage = strtolower(basename(CRM_Utils_Array::value('action', $attributes)));
+ $subPage = CRM_Utils_Request::retrieveComponent($attributes);
if ($subPage == 'friend') {
$nextPage = 'custom';
}
return CRM_Utils_Request::retrieve((string) $name, (string) $type, $null, (bool) $isRequired, $defaultValue, $method, TRUE);
}
+ /**
+ * Retrieve the component from the action attribute of a form.
+ *
+ * Contribution Page forms and Event Management forms detect the value of a
+ * component (and therefore the desired tab key) by reaching into the "action"
+ * attribute of a form and reading the final item of the path. In WordPress,
+ * however, the URL may be urlencoded, and so the URL may need to be decoded
+ * before parsing it.
+ *
+ * @see https://lab.civicrm.org/dev/wordpress/issues/12#note_10699
+ *
+ * @param array $attributes
+ * The form attributes array.
+ *
+ * @return string $value
+ * The desired value.
+ */
+ public static function retrieveComponent($attributes) {
+ $url = CRM_Utils_Array::value('action', $attributes);
+ // Whilst the following is a fallible universal test for urlencoded URLs,
+ // thankfully the "action" URL has a limited and predictable form and
+ // therefore this comparison is sufficient for our purposes.
+ if (rawurlencode(rawurldecode($url)) !== $url) {
+ $value = strtolower(basename(rawurldecode($url)));
+ }
+ else {
+ $value = strtolower(basename($url));
+ }
+ return $value;
+ }
+
}