Browse Source

w

tags/2.0.0-beta
Qiang Xue 13 years ago
parent
commit
567f81ce67
  1. 20
      framework/YiiBase.php
  2. 2
      framework/base/Dictionary.php
  3. 104
      framework/base/Model.php
  4. 14
      framework/base/ModelEvent.php

20
framework/YiiBase.php

@ -167,7 +167,7 @@ class YiiBase
return self::$_imported[$alias] = $className; return self::$_imported[$alias] = $className;
} }
if (($path = self::getPathOfAlias(dirname($alias))) === false) { if (($path = self::getAlias(dirname($alias))) === false) {
throw new \yii\base\Exception('Invalid path alias: ' . $alias); throw new \yii\base\Exception('Invalid path alias: ' . $alias);
} }
@ -189,16 +189,16 @@ class YiiBase
/** /**
* Translates a path alias into an actual path. * Translates a path alias into an actual path.
* The path alias can be either a root alias registered via [[setPathOfAlias]] or an * The path alias can be either a root alias registered via [[setAlias]] or an
* alias starting with a root alias (e.g. `@yii/base/Component.php`). * alias starting with a root alias (e.g. `@yii/base/Component.php`).
* In the latter case, the root alias will be replaced by the corresponding registered path * In the latter case, the root alias will be replaced by the corresponding registered path
* and the remaining part will be appended to it. * and the remaining part will be appended to it.
* Note, this method does not ensure the existence of the resulting path. * Note, this method does not ensure the existence of the resulting path.
* @param string $alias alias * @param string $alias alias
* @return mixed path corresponding to the alias, false if the root alias is not previously registered. * @return mixed path corresponding to the alias, false if the root alias is not previously registered.
* @see setPathOfAlias * @see setAlias
*/ */
public static function getPathOfAlias($alias) public static function getAlias($alias)
{ {
if (isset(self::$aliases[$alias])) { if (isset(self::$aliases[$alias])) {
return self::$aliases[$alias]; return self::$aliases[$alias];
@ -220,9 +220,9 @@ class YiiBase
* @param string $alias alias to the path. The alias must start with '@'. * @param string $alias alias to the path. The alias must start with '@'.
* @param string $path the path corresponding to the alias. If this is null, the corresponding * @param string $path the path corresponding to the alias. If this is null, the corresponding
* path alias will be removed. The path can be a file path (e.g. `/tmp`) or a URL (e.g. `http://www.yiiframework.com`). * path alias will be removed. The path can be a file path (e.g. `/tmp`) or a URL (e.g. `http://www.yiiframework.com`).
* @see getPathOfAlias * @see getAlias
*/ */
public static function setPathOfAlias($alias, $path) public static function setAlias($alias, $path)
{ {
if ($path === null) { if ($path === null) {
unset(self::$aliases[$alias]); unset(self::$aliases[$alias]);
@ -261,7 +261,7 @@ class YiiBase
if (strpos($className, '\\') !== false) { if (strpos($className, '\\') !== false) {
// convert namespace to path alias, e.g. yii\base\Component to @yii/base/Component // convert namespace to path alias, e.g. yii\base\Component to @yii/base/Component
$alias = '@' . str_replace('\\', '/', ltrim($className, '\\')); $alias = '@' . str_replace('\\', '/', ltrim($className, '\\'));
if (($path = self::getPathOfAlias($alias)) !== false) { if (($path = self::getAlias($alias)) !== false) {
include($path . '.php'); include($path . '.php');
return true; return true;
} }
@ -272,7 +272,7 @@ class YiiBase
if (($pos = strpos($className, '_')) !== false) { if (($pos = strpos($className, '_')) !== false) {
// convert class name to path alias, e.g. PHPUnit_Framework_TestCase to @PHPUnit/Framework/TestCase // convert class name to path alias, e.g. PHPUnit_Framework_TestCase to @PHPUnit/Framework/TestCase
$alias = '@' . str_replace('_', '/', $className); $alias = '@' . str_replace('_', '/', $className);
if (($path = self::getPathOfAlias($alias)) !== false) { if (($path = self::getAlias($alias)) !== false) {
include($path . '.php'); include($path . '.php');
return true; return true;
} }
@ -295,9 +295,9 @@ class YiiBase
* *
* The specified configuration can be either a string or an array. * The specified configuration can be either a string or an array.
* If the former, the string is treated as the object type which can * If the former, the string is treated as the object type which can
* be either a class name or [[getPathOfAlias|path alias]]. * be either a class name or [[getAlias|path alias]].
* If the latter, the array must contain a `class` element which refers * If the latter, the array must contain a `class` element which refers
* to a class name or [[getPathOfAlias|path alias]]. The rest of the name-value * to a class name or [[getAlias|path alias]]. The rest of the name-value
* pairs in the array will be used to initialize the corresponding object properties. * pairs in the array will be used to initialize the corresponding object properties.
* For example, * For example,
* *

2
framework/base/Dictionary.php

@ -274,7 +274,7 @@ class Dictionary extends Component implements \IteratorAggregate, \ArrayAccess,
* This method is required by the SPL interface `ArrayAccess`. * This method is required by the SPL interface `ArrayAccess`.
* It is implicitly called when you use something like `$value = $dictionary[$offset];`. * It is implicitly called when you use something like `$value = $dictionary[$offset];`.
* This is equivalent to [[itemAt]]. * This is equivalent to [[itemAt]].
* @param integer $offset the offset to retrieve element. * @param mixed $offset the offset to retrieve element.
* @return mixed the element at the offset, null if no element is found at the offset * @return mixed the element at the offset, null if no element is found at the offset
*/ */
public function offsetGet($offset) public function offsetGet($offset)

104
framework/base/Model.php

@ -222,8 +222,9 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function afterConstruct() public function afterConstruct()
{ {
if ($this->hasEventHandler('onAfterConstruct')) if ($this->hasEventHandler('onAfterConstruct')) {
$this->onAfterConstruct(new CEvent($this)); $this->onAfterConstruct(new Event($this));
}
} }
/** /**
@ -236,9 +237,12 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function beforeValidate() public function beforeValidate()
{ {
$event = new ModelEvent($this); if ($this->hasEventHandler('onBeforeValidate')) {
$this->onBeforeValidate($event); $event = new ModelEvent($this);
return $event->isValid; $this->onBeforeValidate($event);
return $event->isValid;
}
return true;
} }
/** /**
@ -249,7 +253,9 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function afterValidate() public function afterValidate()
{ {
$this->onAfterValidate(new CEvent($this)); if ($this->hasEventHandler('onAfterValidate')) {
$this->onAfterValidate(new CEvent($this));
}
} }
/** /**
@ -258,7 +264,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function onAfterConstruct($event) public function onAfterConstruct($event)
{ {
$this->raiseEvent('onAfterConstruct', $event); $this->raiseEvent(__METHOD__, $event);
} }
/** /**
@ -267,7 +273,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function onBeforeValidate($event) public function onBeforeValidate($event)
{ {
$this->raiseEvent('onBeforeValidate', $event); $this->raiseEvent(__METHOD__, $event);
} }
/** /**
@ -276,7 +282,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function onAfterValidate($event) public function onAfterValidate($event)
{ {
$this->raiseEvent('onAfterValidate', $event); $this->raiseEvent(__METHOD__, $event);
} }
/** /**
@ -391,10 +397,12 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function hasErrors($attribute = null) public function hasErrors($attribute = null)
{ {
if ($attribute === null) if ($attribute === null) {
return $this->_errors !== array(); return $this->_errors !== array();
else }
else {
return isset($this->_errors[$attribute]); return isset($this->_errors[$attribute]);
}
} }
/** /**
@ -404,10 +412,12 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function getErrors($attribute = null) public function getErrors($attribute = null)
{ {
if ($attribute === null) if ($attribute === null) {
return $this->_errors; return $this->_errors;
else }
else {
return isset($this->_errors[$attribute]) ? $this->_errors[$attribute] : array(); return isset($this->_errors[$attribute]) ? $this->_errors[$attribute] : array();
}
} }
/** /**
@ -457,10 +467,12 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function clearErrors($attribute = null) public function clearErrors($attribute = null)
{ {
if ($attribute === null) if ($attribute === null) {
$this->_errors = array(); $this->_errors = array();
else }
else {
unset($this->_errors[$attribute]); unset($this->_errors[$attribute]);
}
} }
/** /**
@ -486,18 +498,21 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
public function getAttributes($names = null) public function getAttributes($names = null)
{ {
$values = array(); $values = array();
foreach ($this->attributeNames() as $name)
$values[$name] = $this->$name;
if (is_array($names)) if (is_array($names)) {
{ foreach ($this->attributeNames() as $name) {
$values2 = array(); if (in_array($name, $names, true)) {
foreach ($names as $name) $values[$name] = $this->$name;
$values2[$name] = isset($values[$name]) ? $values[$name] : null; }
return $values2; }
} }
else else {
return $values; foreach ($this->attributeNames() as $name) {
$values[$name] = $this->$name;
}
}
return $values;
} }
/** /**
@ -510,15 +525,16 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
*/ */
public function setAttributes($values, $safeOnly = true) public function setAttributes($values, $safeOnly = true)
{ {
if (!is_array($values)) if (is_array($values)) {
return; $attributes = array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames());
$attributes = array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames()); foreach ($values as $name => $value) {
foreach ($values as $name => $value) if (isset($attributes[$name])) {
{ $this->$name = $value;
if (isset($attributes[$name])) }
$this->$name = $value; elseif ($safeOnly) {
elseif ($safeOnly) $this->onUnsafeAttribute($name, $value);
$this->onUnsafeAttribute($name, $value); }
}
} }
} }
@ -590,22 +606,22 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
{ {
$attributes = array(); $attributes = array();
$unsafe = array(); $unsafe = array();
foreach ($this->getValidators() as $validator) foreach ($this->getValidators() as $validator) {
{ if (!$validator->safe) {
if (!$validator->safe) foreach ($validator->attributes as $name) {
{
foreach ($validator->attributes as $name)
$unsafe[] = $name; $unsafe[] = $name;
}
} }
else else {
{ foreach ($validator->attributes as $name) {
foreach ($validator->attributes as $name)
$attributes[$name] = true; $attributes[$name] = true;
}
} }
} }
foreach ($unsafe as $name) foreach ($unsafe as $name) {
unset($attributes[$name]); unset($attributes[$name]);
}
return array_keys($attributes); return array_keys($attributes);
} }
@ -636,7 +652,7 @@ class Model extends Component implements \IteratorAggregate, \ArrayAccess
* Returns the element at the specified offset. * Returns the element at the specified offset.
* This method is required by the SPL interface `ArrayAccess`. * This method is required by the SPL interface `ArrayAccess`.
* It is implicitly called when you use something like `$value = $model[$offset];`. * It is implicitly called when you use something like `$value = $model[$offset];`.
* @param integer $offset the offset to retrieve element. * @param mixed $offset the offset to retrieve element.
* @return mixed the element at the offset, null if no element is found at the offset * @return mixed the element at the offset, null if no element is found at the offset
*/ */
public function offsetGet($offset) public function offsetGet($offset)

14
framework/base/ModelEvent.php

@ -2,24 +2,22 @@
/** /**
* CModelEvent class file. * CModelEvent class file.
* *
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/ * @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008-2011 Yii Software LLC * @copyright Copyright &copy; 2008-2012 Yii Software LLC
* @license http://www.yiiframework.com/license/ * @license http://www.yiiframework.com/license/
*/ */
namespace yii\base;
/** /**
* CModelEvent class. * ModelEvent class.
* *
* CModelEvent represents the event parameters needed by events raised by a model. * ModelEvent represents the event parameters needed by events raised by a model.
* *
* @author Qiang Xue <qiang.xue@gmail.com> * @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id: CModelEvent.php 2799 2011-01-01 19:31:13Z qiang.xue $ * @since 2.0
* @package system.base
* @since 1.0
*/ */
class CModelEvent extends CEvent class ModelEvent extends Event
{ {
/** /**
* @var boolean whether the model is in valid status and should continue its normal method execution cycles. Defaults to true. * @var boolean whether the model is in valid status and should continue its normal method execution cycles. Defaults to true.

Loading…
Cancel
Save