Merge pull request #15909 from eileenmcnaughton/payment
[civicrm-core.git] / CRM / Utils / GlobalStack.php
CommitLineData
6d4b9264
TO
1<?php /*
2 +--------------------------------------------------------------------+
bc77d7c0 3 | Copyright CiviCRM LLC. All rights reserved. |
6d4b9264 4 | |
bc77d7c0
TO
5 | This work is published under the GNU AGPLv3 license with some |
6 | permitted exceptions and without any warranty. For full license |
7 | and copyright information, see https://civicrm.org/licensing |
6d4b9264 8 +--------------------------------------------------------------------+
d25dd0ee 9 */
6d4b9264 10
50bfb460
SB
11/**
12 *
13 * @package CRM
ca5cec67 14 * @copyright CiviCRM LLC https://civicrm.org/licensing
50bfb460
SB
15 */
16
6d4b9264
TO
17/**
18 * Temporarily change a global variable.
19 *
20 * @code
21 * $globals = CRM_Utils_GlobalStack::singleton();
22 * $globals->push(array(
23 * '_GET' => array(
24 * 'q' => 'some-value
25 * ),
26 * ));
27 * ...do stuff...
28 * $globals->pop();
29 * @endcode
30 *
31 * Note: for purposes of this class, we'll refer to the array passed into
32 * push() as a frame.
33 */
34class CRM_Utils_GlobalStack {
35 /**
36 * We don't have a container or dependency-injection, so use singleton instead
37 *
38 * @var object
6d4b9264
TO
39 */
40 private static $_singleton = NULL;
41
be2fb01f 42 private $backups = [];
6d4b9264
TO
43
44 /**
fe482240 45 * Get or set the single instance of CRM_Utils_GlobalStack.
6d4b9264
TO
46 *
47 * @return CRM_Utils_GlobalStack
48 */
6714d8d2 49 public static function singleton() {
6d4b9264
TO
50 if (self::$_singleton === NULL) {
51 self::$_singleton = new CRM_Utils_GlobalStack();
52 }
53 return self::$_singleton;
54 }
55
5bc392e6
EM
56 /**
57 * @param $newFrame
58 */
6d4b9264
TO
59 public function push($newFrame) {
60 $this->backups[] = $this->createBackup($newFrame);
61 $this->applyFrame($newFrame);
62 }
63
64 public function pop() {
65 $this->applyFrame(array_pop($this->backups));
66 }
67
68 /**
77855840
TO
69 * @param array $new
70 * The new, incoming frame.
a6c01b45
CW
71 * @return array
72 * frame
6d4b9264
TO
73 */
74 public function createBackup($new) {
be2fb01f 75 $frame = [];
6d4b9264 76 foreach ($new as $globalKey => $values) {
25c8f5c6
TO
77 if (is_array($values)) {
78 foreach ($values as $key => $value) {
79 $frame[$globalKey][$key] = CRM_Utils_Array::value($key, $GLOBALS[$globalKey]);
80 }
0db6c3e1
TO
81 }
82 else {
25c8f5c6 83 $frame[$globalKey] = CRM_Utils_Array::value($globalKey, $GLOBALS);
6d4b9264
TO
84 }
85 }
86 return $frame;
87 }
88
5bc392e6
EM
89 /**
90 * @param $newFrame
91 */
6d4b9264
TO
92 public function applyFrame($newFrame) {
93 foreach ($newFrame as $globalKey => $values) {
25c8f5c6
TO
94 if (is_array($values)) {
95 foreach ($values as $key => $value) {
96 $GLOBALS[$globalKey][$key] = $value;
97 }
0db6c3e1
TO
98 }
99 else {
25c8f5c6 100 $GLOBALS[$globalKey] = $values;
6d4b9264
TO
101 }
102 }
103 }
96025800 104
232624b1 105}