From 72c54371ccc95ca7a48820c57a62a17e9483ce13 Mon Sep 17 00:00:00 2001
From: Cameron <e107inc@gmail.com>
Date: Mon, 8 Feb 2021 11:59:04 -0800
Subject: [PATCH] e107::getSession()->set will now accept multi-dimensional key
 format. Test added. Form-handler PHP8 fix.

---
 e107_handlers/form_handler.php          | 33 +++++++++++++++----------
 e107_handlers/session_handler.php       | 25 +++++++++++++++++--
 e107_tests/tests/unit/e107Test.php      |  2 +-
 e107_tests/tests/unit/e_sessionTest.php | 14 +++++++++++
 4 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/e107_handlers/form_handler.php b/e107_handlers/form_handler.php
index 29476b117..2d51a6922 100644
--- a/e107_handlers/form_handler.php
+++ b/e107_handlers/form_handler.php
@@ -5648,24 +5648,31 @@ var_dump($select_options);*/
 			break;
 			
 			case 'files':
-				if(!empty($value) && !is_array($value))
-				{
-					return "Type 'files' must have a data type of 'array' or 'json'";
-				}
-				$ret = '<ol>';
-				for ($i=0; $i < 5; $i++) 
-				{				
-					$ival 	= $value[$i]['path'];
 
-					if(empty($ival))
+				if(!empty($value))
+				{
+					if(!is_array($value))
 					{
-						continue;
+						return "Type 'files' must have a data type of 'array' or 'json'";
 					}
 
-					$ret .=  '<li>'.$ival.'</li>';		
+					$ret = '<ol>';
+					for ($i=0; $i < 5; $i++)
+					{
+						$ival 	= $value[$i]['path'];
+
+						if(empty($ival))
+						{
+							continue;
+						}
+
+						$ret .=  '<li>'.$ival.'</li>';
+					}
+					$ret .= '</ol>';
+					$value = $ret;
 				}
-				$ret .= '</ol>';
-				$value = $ret;
+
+
 			break; 
 			
 			case 'datestamp':
diff --git a/e107_handlers/session_handler.php b/e107_handlers/session_handler.php
index 2ae965058..fe17759b2 100644
--- a/e107_handlers/session_handler.php
+++ b/e107_handlers/session_handler.php
@@ -303,13 +303,34 @@ class e_session
 	/**
 	 * Set value in current session namespace
 	 * Equals to $_SESSION[NAMESPACE][$key] = $value
-	 * @param string $key
+	 * @param string $key Also accepts multi-dimensinal format. key1/key2
 	 * @param mixed $value
 	 * @return e_session
 	 */
 	public function set($key, $value)
 	{
-		$this->_data[$key] = $value;
+		if(strpos($key,'/') !== false) // multi-dimensional
+		{
+			$keyArr = explode('/',$key);
+			$count = count($keyArr);
+
+		    if($count === 2)
+		    {
+		        list($k1, $k2) = $keyArr;
+		        $this->_data[$k1][$k2] = $value;
+		    }
+		    elseif($count === 3)
+		    {
+		        list($k1, $k2, $k3) = $keyArr;
+		        $this->_data[$k1][$k2][$k3] = $value;
+		    }
+
+		}
+		else
+		{
+			$this->_data[$key] = $value;
+		}
+
 		return $this;
 	}
 	
diff --git a/e107_tests/tests/unit/e107Test.php b/e107_tests/tests/unit/e107Test.php
index b1b6e5d32..fed33cb38 100644
--- a/e107_tests/tests/unit/e107Test.php
+++ b/e107_tests/tests/unit/e107Test.php
@@ -1395,7 +1395,7 @@ class e107Test extends \Codeception\Test\Unit
 		$all = e107::getAddonConfig('e_url');
 		foreach($all as $plugin => $var)
 		{
-			if($plugin === 'gallery' || $plugin === 'rss_menu') // fixme - sef may be enabled or disabled each time tests are run
+			if($plugin === 'gallery' || $plugin === 'rss_menu' || $plugin === 'vstore') // fixme - sef may be enabled or disabled each time tests are run
 			{
 				continue;
 			}
diff --git a/e107_tests/tests/unit/e_sessionTest.php b/e107_tests/tests/unit/e_sessionTest.php
index edaf7d309..c5fb32a22 100644
--- a/e107_tests/tests/unit/e_sessionTest.php
+++ b/e107_tests/tests/unit/e_sessionTest.php
@@ -60,6 +60,20 @@
 			$this->assertEquals($expected, $result);
 
 
+			// Multi-dimensional array support.
+			$newsess = e107::getSession('newtest');
+
+			$newsess->set('customer', array('firstname'=>'Fred'));
+			$newsess->set('customer/lastname', 'Smith');
+
+			$expected = array (
+			  'firstname' => 'Fred',
+			  'lastname' => 'Smith',
+			);
+
+			$result = $newsess->get('customer');
+			$this->assertSame($expected, $result);
+
 		}
 /*
 		public function testGetOption()