Browse Source

Merge branch '2.1' of github.com:cakephp/cakephp into 2.1

AD7six 14 years ago
parent
commit
b62d9729a9

+ 2 - 3
lib/Cake/Console/Templates/default/classes/test.ctp

@@ -86,13 +86,12 @@ class <?php echo $fullClassName; ?>TestCase extends CakeTestCase {
 
 
 <?php foreach ($methods as $method): ?>
 <?php foreach ($methods as $method): ?>
 /**
 /**
- * test<?php echo Inflector::classify($method); ?> method
+ * test<?php echo Inflector::camelize($method); ?> method
  *
  *
  * @return void
  * @return void
  */
  */
-	public function test<?php echo Inflector::classify($method); ?>() {
+	public function test<?php echo Inflector::camelize($method); ?>() {
 
 
 	}
 	}
-
 <?php endforeach;?>
 <?php endforeach;?>
 }
 }

+ 19 - 48
lib/Cake/Core/Configure.php

@@ -124,26 +124,12 @@ class Configure {
 		}
 		}
 
 
 		foreach ($config as $name => $value) {
 		foreach ($config as $name => $value) {
-			if (strpos($name, '.') === false) {
-				self::$_values[$name] = $value;
-			} else {
-				$names = explode('.', $name, 4);
-				switch (count($names)) {
-					case 2:
-						self::$_values[$names[0]][$names[1]] = $value;
-					break;
-					case 3:
-						self::$_values[$names[0]][$names[1]][$names[2]] = $value;
-					break;
-					case 4:
-						$names = explode('.', $name, 2);
-						if (!isset(self::$_values[$names[0]])) {
-							self::$_values[$names[0]] = array();
-						}
-						self::$_values[$names[0]] = Set::insert(self::$_values[$names[0]], $names[1], $value);
-					break;
-				}
+			$pointer = &self::$_values;
+			foreach (explode('.', $name) as $key) {
+				$pointer = &$pointer[$key];
 			}
 			}
+			$pointer = $value;
+			unset($pointer);
 		}
 		}
 
 
 		if (isset($config['debug']) && function_exists('ini_set')) {
 		if (isset($config['debug']) && function_exists('ini_set')) {
@@ -177,30 +163,15 @@ class Configure {
 		if (isset(self::$_values[$var])) {
 		if (isset(self::$_values[$var])) {
 			return self::$_values[$var];
 			return self::$_values[$var];
 		}
 		}
-		if (strpos($var, '.') !== false) {
-			$names = explode('.', $var, 3);
-			$var = $names[0];
-		}
-		if (!isset(self::$_values[$var])) {
-			return null;
-		}
-		switch (count($names)) {
-			case 2:
-				if (isset(self::$_values[$var][$names[1]])) {
-					return self::$_values[$var][$names[1]];
-				}
-			break;
-			case 3:
-				if (isset(self::$_values[$var][$names[1]][$names[2]])) {
-					return self::$_values[$var][$names[1]][$names[2]];
-				}
-				if (!isset(self::$_values[$var][$names[1]])) {
-					return null;
-				}
-				return Set::classicExtract(self::$_values[$var][$names[1]], $names[2]);
-			break;
+		$pointer = &self::$_values;
+		foreach (explode('.', $var) as $key) {
+			if (isset($pointer[$key])) {
+				$pointer = &$pointer[$key];
+			} else {
+				return null;
+			}
 		}
 		}
-		return null;
+		return $pointer;
 	}
 	}
 
 
 /**
 /**
@@ -217,13 +188,13 @@ class Configure {
  * @return void
  * @return void
  */
  */
 	public static function delete($var = null) {
 	public static function delete($var = null) {
-		if (strpos($var, '.') === false) {
-			unset(self::$_values[$var]);
-			return;
+		$keys = explode('.', $var);
+		$last = array_pop($keys);
+		$pointer = &self::$_values;
+		foreach ($keys as $key) {
+			$pointer = &$pointer[$key];
 		}
 		}
-
-		$names = explode('.', $var, 2);
-		self::$_values[$names[0]] = Set::remove(self::$_values[$names[0]], $names[1]);
+		unset($pointer[$last]);
 	}
 	}
 
 
 /**
 /**

+ 1 - 1
lib/Cake/Model/Datasource/DboSource.php

@@ -2368,7 +2368,7 @@ class DboSource extends DataSource {
 					$keys = array_keys($value);
 					$keys = array_keys($value);
 					if ($keys === array_values($keys)) {
 					if ($keys === array_values($keys)) {
 						$count = count($value);
 						$count = count($value);
-						if ($count === 1) {
+						if ($count === 1 && !preg_match("/\s+NOT$/", $key)) {
 							$data = $this->_quoteFields($key) . ' = (';
 							$data = $this->_quoteFields($key) . ' = (';
 						} else {
 						} else {
 							$data = $this->_quoteFields($key) . ' IN (';
 							$data = $this->_quoteFields($key) . ' IN (';

+ 7 - 10
lib/Cake/Model/Model.php

@@ -447,6 +447,7 @@ class Model extends Object implements CakeEventListener {
  * - `unique`: If true (default value) cake will first delete existing relationship
  * - `unique`: If true (default value) cake will first delete existing relationship
  *   records in the foreign keys table before inserting new ones, when updating a
  *   records in the foreign keys table before inserting new ones, when updating a
  *   record. So existing associations need to be passed again when updating.
  *   record. So existing associations need to be passed again when updating.
+ *   To prevent deletion of existing relationship records, set this key to a string 'keepExisting'.
  * - `conditions`: An SQL fragment used to filter related model records. It's good
  * - `conditions`: An SQL fragment used to filter related model records. It's good
  *   practice to use model names in SQL fragments: "Comment.status = 1" is always
  *   practice to use model names in SQL fragments: "Comment.status = 1" is always
  *   better than just "status = 1."
  *   better than just "status = 1."
@@ -2034,7 +2035,7 @@ class Model extends Object implements CakeEventListener {
 
 
 		if ($options['atomic']) {
 		if ($options['atomic']) {
 			$db = $this->getDataSource();
 			$db = $this->getDataSource();
-			$transactionBegun = $db->begin($this);
+			$transactionBegun = $db->begin();
 		}
 		}
 		$return = array();
 		$return = array();
 		foreach ($data as $key => $record) {
 		foreach ($data as $key => $record) {
@@ -2055,12 +2056,12 @@ class Model extends Object implements CakeEventListener {
 		}
 		}
 		if ($validates) {
 		if ($validates) {
 			if ($transactionBegun) {
 			if ($transactionBegun) {
-				return $db->commit($this) !== false;
+				return $db->commit() !== false;
 			} else {
 			} else {
 				return true;
 				return true;
 			}
 			}
 		}
 		}
-		$db->rollback($this);
+		$db->rollback();
 		return false;
 		return false;
 	}
 	}
 
 
@@ -2138,7 +2139,7 @@ class Model extends Object implements CakeEventListener {
 		}
 		}
 		if ($options['atomic']) {
 		if ($options['atomic']) {
 			$db = $this->getDataSource();
 			$db = $this->getDataSource();
-			$transactionBegun = $db->begin($this);
+			$transactionBegun = $db->begin();
 		}
 		}
 		$associations = $this->getAssociated();
 		$associations = $this->getAssociated();
 		$return = array();
 		$return = array();
@@ -2200,12 +2201,12 @@ class Model extends Object implements CakeEventListener {
 		}
 		}
 		if ($validates) {
 		if ($validates) {
 			if ($transactionBegun) {
 			if ($transactionBegun) {
-				return $db->commit($this) !== false;
+				return $db->commit() !== false;
 			} else {
 			} else {
 				return true;
 				return true;
 			}
 			}
 		}
 		}
-		$db->rollback($this);
+		$db->rollback();
 		return false;
 		return false;
 	}
 	}
 
 
@@ -3200,10 +3201,6 @@ class Model extends Object implements CakeEventListener {
 			return $this->id;
 			return $this->id;
 		}
 		}
 
 
-		if (empty($this->id)) {
-			return false;
-		}
-
 		if (isset($this->id[$list]) && !empty($this->id[$list])) {
 		if (isset($this->id[$list]) && !empty($this->id[$list])) {
 			return $this->id[$list];
 			return $this->id[$list];
 		} elseif (isset($this->id[$list])) {
 		} elseif (isset($this->id[$list])) {

+ 29 - 13
lib/Cake/Routing/Router.php

@@ -160,14 +160,33 @@ class Router {
     protected static $_routeClass = 'CakeRoute';
     protected static $_routeClass = 'CakeRoute';
 
 
 /**
 /**
- * Set the default rotue class to use
+ * Set the default route class to use or return the current one
  *
  *
- * @param sting $routeClass to set as default
- * @return void
+ * @param string $routeClass to set as default
+ * @return mixed void|string
+ * @throws RouterException
  */
  */
-    public static function defaultRouteClass($routeClass) {
-        self::$_routeClass = $routeClass;
-    }
+	public static function defaultRouteClass($routeClass = null) {
+		if (is_null($routeClass)) {
+			return self::$_routeClass;
+		}
+
+		self::$_routeClass = self::_validateRouteClass($routeClass);
+	}
+
+/**
+ * Validates that the passed route class exists and is a subclass of CakeRoute
+ *
+ * @param $routeClass
+ * @return string
+ * @throws RouterException
+ */
+	protected static function _validateRouteClass($routeClass) {
+		if (!class_exists($routeClass) || !is_subclass_of($routeClass, 'CakeRoute')) {
+			throw new RouterException(__d('cake_dev', 'Route classes must extend CakeRoute'));
+		}
+		return $routeClass;
+	}
 
 
 /**
 /**
  * Sets the Routing prefixes.
  * Sets the Routing prefixes.
@@ -278,14 +297,11 @@ class Router {
 		}
 		}
 		$routeClass = self::$_routeClass;
 		$routeClass = self::$_routeClass;
 		if (isset($options['routeClass'])) {
 		if (isset($options['routeClass'])) {
-			$routeClass = $options['routeClass'];
-			if (!is_subclass_of($routeClass, 'CakeRoute')) {
-				throw new RouterException(__d('cake_dev', 'Route classes must extend CakeRoute'));
-			}
+			$routeClass = self::_validateRouteClass($options['routeClass']);
 			unset($options['routeClass']);
 			unset($options['routeClass']);
-			if ($routeClass == 'RedirectRoute' && isset($defaults['redirect'])) {
-				$defaults = $defaults['redirect'];
-			}
+		}
+		if ($routeClass == 'RedirectRoute' && isset($defaults['redirect'])) {
+			$defaults = $defaults['redirect'];
 		}
 		}
 		self::$routes[] = new $routeClass($route, $defaults, $options);
 		self::$routes[] = new $routeClass($route, $defaults, $options);
 		return self::$routes;
 		return self::$routes;

+ 44 - 0
lib/Cake/Test/Case/Routing/RouterTest.php

@@ -2519,4 +2519,48 @@ class RouterTest extends CakeTestCase {
 		$this->assertInstanceOf('TestDefaultRouteClass', $result[0]);
 		$this->assertInstanceOf('TestDefaultRouteClass', $result[0]);
 	}
 	}
 
 
+/**
+ * Test getting the default route class
+ *
+ * @return void
+ */
+	public function testDefaultRouteClassGetter() {
+		$routeClass = 'TestDefaultRouteClass';
+		Router::defaultRouteClass($routeClass);
+
+		$this->assertEqual($routeClass, Router::defaultRouteClass());
+		$this->assertEqual($routeClass, Router::defaultRouteClass(null));
+	}
+
+/**
+ * Test that route classes must extend CakeRoute
+ *
+ * @expectedException RouterException
+ * @return void
+ */
+	public function testDefaultRouteException() {
+		Router::defaultRouteClass('');
+		Router::connect('/:controller', array());
+	}
+
+/**
+ * Test that route classes must extend CakeRoute
+ *
+ * @expectedException RouterException
+ * @return void
+ */
+	public function testSettingInvalidDefaultRouteException() {
+		Router::defaultRouteClass('Object');
+	}
+
+/**
+ * Test that class must exist
+ *
+ * @expectedException RouterException
+ * @return void
+ */
+	public function testSettingNonExistentDefaultRouteException() {
+		Router::defaultRouteClass('NonExistentClass');
+	}
+
 }
 }