--- /dev/null
+<?php /*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 4.3 |
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC (c) 2004-2013 |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM. |
+ | |
+ | CiviCRM is free software; you can copy, modify, and distribute it |
+ | under the terms of the GNU Affero General Public License |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
+ | |
+ | CiviCRM is distributed in the hope that it will be useful, but |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
+ | See the GNU Affero General Public License for more details. |
+ | |
+ | You should have received a copy of the GNU Affero General Public |
+ | License and the CiviCRM Licensing Exception along |
+ | with this program; if not, contact CiviCRM LLC |
+ | at info[AT]civicrm[DOT]org. If you have questions about the |
+ | GNU Affero General Public License or the licensing of CiviCRM, |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing |
+ +--------------------------------------------------------------------+
+*/
+
+/**
+ * Temporarily change a global variable.
+ *
+ * @code
+ * $globals = CRM_Utils_GlobalStack::singleton();
+ * $globals->push(array(
+ * '_GET' => array(
+ * 'q' => 'some-value
+ * ),
+ * ));
+ * ...do stuff...
+ * $globals->pop();
+ * @endcode
+ *
+ * Note: for purposes of this class, we'll refer to the array passed into
+ * push() as a frame.
+ */
+class CRM_Utils_GlobalStack {
+ /**
+ * We don't have a container or dependency-injection, so use singleton instead
+ *
+ * @var object
+ * @static
+ */
+ private static $_singleton = NULL;
+
+ private $backups = array();
+
+ /**
+ * Get or set the single instance of CRM_Utils_GlobalStack
+ *
+ * @return CRM_Utils_GlobalStack
+ */
+ static public function singleton() {
+ if (self::$_singleton === NULL) {
+ self::$_singleton = new CRM_Utils_GlobalStack();
+ }
+ return self::$_singleton;
+ }
+
+ public function push($newFrame) {
+ $this->backups[] = $this->createBackup($newFrame);
+ $this->applyFrame($newFrame);
+ }
+
+ public function pop() {
+ $this->applyFrame(array_pop($this->backups));
+ }
+
+ /**
+ * @param array $new the new, incoming frame
+ * @return array frame
+ */
+ public function createBackup($new) {
+ $frame = array();
+ foreach ($new as $globalKey => $values) {
+ foreach ($values as $key => $value) {
+ $frame[$globalKey][$key] = CRM_Utils_Array::value($key, $GLOBALS[$globalKey]);
+ }
+ }
+ return $frame;
+ }
+
+ public function applyFrame($newFrame) {
+ foreach ($newFrame as $globalKey => $values) {
+ foreach ($values as $key => $value) {
+ $GLOBALS[$globalKey][$key] = $value;
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+<?php
+
+require_once 'CiviTest/CiviUnitTestCase.php';
+
+class CRM_Utils_GlobalStackTest extends CiviUnitTestCase {
+
+ public function testPushPop() {
+ global $FOO;
+
+ $FOO['bar'] = 1;
+ $FOO['whiz'] = 1;
+
+ $this->assertEquals(1, $FOO['bar']);
+ $this->assertEquals(1, $FOO['whiz']);
+ $this->assertFalse(isset($FOO['bang']));
+
+ CRM_Utils_GlobalStack::singleton()->push(array(
+ 'FOO' => array(
+ 'bar' => 2,
+ 'bang' => 2,
+ ),
+ ));
+
+ $this->assertEquals(2, $FOO['bar']);
+ $this->assertEquals(1, $FOO['whiz']);
+ $this->assertEquals(2, $FOO['bang']);
+
+ CRM_Utils_GlobalStack::singleton()->pop();
+
+ $this->assertEquals(1, $FOO['bar']);
+ $this->assertEquals(1, $FOO['whiz']);
+ $this->assertEquals(NULL, $FOO['bang']);
+ }
+}
parent::setUp();
}
+ function tearDown() {
+ parent::tearDown();
+ }
+
function getReportOutputAsCsv($reportClass, $inputParams) {
$config = CRM_Core_Config::singleton();
$config->keyDisable = TRUE;
$controller = new CRM_Core_Controller_Simple($reportClass, ts('some title'));
$reportObj =& $controller->_pages['Detail'];//FIXME - Detail is going to change
- $_REQUEST['force'] = 1;
+
+ $tmpGlobals = array();
+ $tmpGlobals['_REQUEST']['force'] = 1;
+ $tmpGlobals['_GET'][$config->userFrameworkURLVar] = 'civicrm/placeholder';
+ $tmpGlobals['_SERVER']['QUERY_STRING'] = '';
if (!empty($inputParams['fields'])) {
$fields = implode(',', $inputParams['fields']);
- $_GET['fld'] = $fields;
- $_GET['ufld'] = 1;
+ $tmpGlobals['_GET']['fld'] = $fields;
+ $tmpGlobals['_GET']['ufld'] = 1;
}
if (!empty($inputParams['filters'])) {
foreach ($inputParams['filters'] as $key => $val) {
- $_GET[$key] = $val;
+ $tmpGlobals['_GET'][$key] = $val;
}
}
- $reportObj->storeResultSet();
- $reportObj->buildForm();
- $rows = $reportObj->getResultSet();
+ CRM_Utils_GlobalStack::singleton()->push($tmpGlobals);
- $tmpFile = $this->createTempDir() . CRM_Utils_File::makeFileName('CiviReport.csv');
- $csvContent = CRM_Report_Utils_Report::makeCsv($reportObj, $rows);
- file_put_contents($tmpFile, $csvContent);
+ try {
+ $reportObj->storeResultSet();
+ $reportObj->buildForm();
+ $rows = $reportObj->getResultSet();
+
+ $tmpFile = $this->createTempDir() . CRM_Utils_File::makeFileName('CiviReport.csv');
+ $csvContent = CRM_Report_Utils_Report::makeCsv($reportObj, $rows);
+ file_put_contents($tmpFile, $csvContent);
+ } catch (Exception $e) {
+ CRM_Utils_GlobalStack::singleton()->pop();
+ throw $e;
+ }
+ CRM_Utils_GlobalStack::singleton()->pop();
return $tmpFile;
}