CRM_Core_Invoke - Backport support for PHP 5.3 namespaces
authorTim Otten <totten@civicrm.org>
Fri, 16 Jan 2015 06:24:42 +0000 (22:24 -0800)
committerTim Otten <totten@civicrm.org>
Sat, 17 Jan 2015 12:16:06 +0000 (04:16 -0800)
This is a partial backport of 0fc3cacbd2714be493afda6a33eda93846deaca2.  It
includes support for PHP 5.3 namespaces but not for Symfony request/response
objects.

CRM/Core/Invoke.php

index b1da8497d374c0120c4639feaa98c9fbb178b765..6fdec2cee87159bc46b63f9eba3548c08b685cef 100644 (file)
@@ -268,7 +268,10 @@ class CRM_Core_Invoke {
 
       $result = NULL;
       if (is_array($item['page_callback'])) {
-        require_once str_replace('_', DIRECTORY_SEPARATOR, $item['page_callback'][0]) . '.php';
+        if ($item['page_callback']{0} !== '\\') {
+          // Legacy class-loading for PHP 5.2 namespaces; not sure it's needed, but counter-productive for PHP 5.3 namespaces
+          require_once str_replace('_', DIRECTORY_SEPARATOR, $item['page_callback'][0]) . '.php';
+        }
         $result = call_user_func($item['page_callback']);
       }
       elseif (strstr($item['page_callback'], '_Form')) {
@@ -281,18 +284,21 @@ class CRM_Core_Invoke {
       }
       else {
         $newArgs = explode('/', $_GET[$config->userFrameworkURLVar]);
-        require_once str_replace('_', DIRECTORY_SEPARATOR, $item['page_callback']) . '.php';
+        if ($item['page_callback']{0} !== '\\') {
+          // Legacy class-loading for PHP 5.2 namespaces; not sure it's needed, but counter-productive for PHP 5.3 namespaces
+          require_once str_replace('_', DIRECTORY_SEPARATOR, $item['page_callback']) . '.php';
+        }
         $mode = 'null';
         if (isset($pageArgs['mode'])) {
           $mode = $pageArgs['mode'];
           unset($pageArgs['mode']);
         }
         $title = CRM_Utils_Array::value('title', $item);
-        if (strstr($item['page_callback'], '_Page')) {
+        if (strstr($item['page_callback'], '_Page') || strstr($item['page_callback'], '\\Page\\')) {
           $object = new $item['page_callback']($title, $mode);
           $object->urlPath = explode('/', $_GET[$config->userFrameworkURLVar]);
         }
-        elseif (strstr($item['page_callback'], '_Controller')) {
+        elseif (strstr($item['page_callback'], '_Controller') || strstr($item['page_callback'], '\\Controller\\')) {
           $addSequence = 'false';
           if (isset($pageArgs['addSequence'])) {
             $addSequence = $pageArgs['addSequence'];