diff --git a/lib/Cake/Controller/Component/CookieComponent.php b/lib/Cake/Controller/Component/CookieComponent.php index 4259f7e9f..59694df91 100644 --- a/lib/Cake/Controller/Component/CookieComponent.php +++ b/lib/Cake/Controller/Component/CookieComponent.php @@ -230,17 +230,27 @@ class CookieComponent extends Component { } foreach ($key as $name => $value) { - if (strpos($name, '.') === false) { - $this->_values[$this->name][$name] = $value; - $this->_write("[$name]", $value); - } else { + $names = array($name); + if (strpos($name, '.') !== false) { $names = explode('.', $name, 2); - if (!isset($this->_values[$this->name][$names[0]])) { - $this->_values[$this->name][$names[0]] = array(); - } - $this->_values[$this->name][$names[0]] = Hash::insert($this->_values[$this->name][$names[0]], $names[1], $value); - $this->_write('[' . implode('][', $names) . ']', $value); } + $firstName = $names[0]; + $isMultiValue = (is_array($value) || count($names) > 1); + + if (!isset($this->_values[$this->name][$firstName]) && $isMultiValue) { + $this->_values[$this->name][$firstName] = array(); + } + + if (count($names) > 1) { + $this->_values[$this->name][$firstName] = Hash::insert( + $this->_values[$this->name][$firstName], + $names[1], + $value + ); + } else { + $this->_values[$this->name][$firstName] = $value; + } + $this->_write('[' . $firstName . ']', $this->_values[$this->name][$firstName]); } $this->_encrypted = true; } diff --git a/lib/Cake/Test/Case/Controller/Component/CookieComponentTest.php b/lib/Cake/Test/Case/Controller/Component/CookieComponentTest.php index 12371d83e..9b0488f57 100644 --- a/lib/Cake/Test/Case/Controller/Component/CookieComponentTest.php +++ b/lib/Cake/Test/Case/Controller/Component/CookieComponentTest.php @@ -327,6 +327,44 @@ class CookieComponentTest extends CakeTestCase { $this->assertEquals($expected, $result); } +/** + * Test that writing mixed arrays results in the correct data. + * + * @return void + */ + public function testWriteMixedArray() { + $this->Cookie->encrypt = false; + $this->Cookie->write('User', array('name' => 'mark'), false); + $this->Cookie->write('User.email', 'mark@example.com', false); + $expected = array( + 'name' => $this->Cookie->name . '[User]', + 'value' => '{"name":"mark","email":"mark@example.com"}', + 'path' => '/', + 'domain' => '', + 'secure' => false, + 'httpOnly' => false + ); + $result = $this->Controller->response->cookie($this->Cookie->name . '[User]'); + unset($result['expire']); + + $this->assertEquals($expected, $result); + + $this->Cookie->write('User.email', 'mark@example.com', false); + $this->Cookie->write('User', array('name' => 'mark'), false); + $expected = array( + 'name' => $this->Cookie->name . '[User]', + 'value' => '{"name":"mark"}', + 'path' => '/', + 'domain' => '', + 'secure' => false, + 'httpOnly' => false + ); + $result = $this->Controller->response->cookie($this->Cookie->name . '[User]'); + unset($result['expire']); + + $this->assertEquals($expected, $result); + } + /** * testReadingCookieValue *