Retrieve tab key from form attributes even when action is urlencoded
authorChristian Wach <needle@haystack.co.uk>
Thu, 15 Nov 2018 12:05:54 +0000 (12:05 +0000)
committerSeamus Lee <seamuslee001@gmail.com>
Thu, 15 Nov 2018 20:02:04 +0000 (07:02 +1100)
CRM/Contribute/Form/ContributionPage.php
CRM/Contribute/Form/ContributionPage/TabHeader.php
CRM/Event/Form/ManageEvent.php
CRM/Event/Form/ManageEvent/TabHeader.php
CRM/Utils/Request.php

index cdd2ba2f3db5f378abcd296194aee9034db19d03..65173bec6f19c04cf647601cd9b2d786163fbfec 100644 (file)
@@ -391,7 +391,7 @@ class CRM_Contribute_Form_ContributionPage extends CRM_Core_Form {
       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';
           }
index cd8611c404edaf5cbfd44aae26f8cbba07d768b8..172eeb3c8decf2abd9986730481287a3621b84de 100644 (file)
@@ -142,7 +142,7 @@ class CRM_Contribute_Form_ContributionPage_TabHeader {
     switch ($className) {
       case 'Contribute':
         $attributes = $form->getVar('_attributes');
-        $class = strtolower(basename(CRM_Utils_Array::value('action', $attributes)));
+        $class = CRM_Utils_Request::retrieveComponent($attributes);
         break;
 
       case 'MembershipBlock':
index d3173546fab3eef4170bbc56f0b26b35d2032385..5e58066d398c2fb046a356b25431b4cf3a95d339 100644 (file)
@@ -357,7 +357,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
       switch ($className) {
         case 'Event':
           $attributes = $this->getVar('_attributes');
-          $subPage = strtolower(basename(CRM_Utils_Array::value('action', $attributes)));
+          $subPage = CRM_Utils_Request::retrieveComponent($attributes);
           break;
 
         case 'EventInfo':
index e4a19a77e4582b70072ec7eea4658b7e2e342c91..c2bb54fa1456e601ca1652f0e528f3e6cae7544c 100644 (file)
@@ -168,7 +168,7 @@ WHERE      e.id = %1
     switch ($className) {
       case 'Event':
         $attributes = $form->getVar('_attributes');
-        $class = strtolower(basename(CRM_Utils_Array::value('action', $attributes)));
+        $class = CRM_Utils_Request::retrieveComponent($attributes);
         break;
 
       case 'EventInfo':
index 9f0c5bc3eb501aed50e1a9271ff0fe30ec0fd051..e6e0fdf1220241961241592b0fbf35940eb1bc57 100644 (file)
@@ -221,4 +221,35 @@ class CRM_Utils_Request {
     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;
+  }
+
 }