Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
2390da8c
Commit
2390da8c
authored
Jul 17, 2011
by
Qiang Xue
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
w
parent
1c8f8f42
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
297 additions
and
280 deletions
+297
-280
Behavior.php
framework/base/Behavior.php
+9
-1
Component.php
framework/base/Component.php
+269
-263
Event.php
framework/base/Event.php
+15
-9
Exception.php
framework/base/Exception.php
+4
-7
No files found.
framework/base/Behavior.php
View file @
2390da8c
<?php
<?php
/**
* Behavior class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008-2012 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\base
;
namespace
yii\base
;
class
CBehavior
extends
CComponent
implements
IBehavior
class
Behavior
extends
Component
{
{
private
$_enabled
;
private
$_enabled
;
private
$_owner
;
private
$_owner
;
...
...
framework/base/Component.php
View file @
2390da8c
...
@@ -89,26 +89,21 @@ namespace yii\base;
...
@@ -89,26 +89,21 @@ namespace yii\base;
*
*
* Both property names and event names are *case-insensitive*.
* Both property names and event names are *case-insensitive*.
*
*
* A behavior is an object implementing the [[IBehavior]] interface. It is usually attached
* A behavior is an instance of [[Behavior]] or its child class. When a behavior is
* to a component instance of {@link IBehavior} which is attached to a component. The methods of
* attached to a component, its public properties and methods can be accessed via the
* the behavior can be invoked as if they belong to the component. Multiple behaviors
* component directly, as if the component owns those properties and methods. For example,
* can be attached to the same component.
*
*
* To attach a behavior to a component, call {@link attachBehavior}; and to detach the behavior
* Multiple behaviors can be attached to the same component.
* from the component, call {@link detachBehavior}.
*
*
* A behavior can be temporarily enabled or disabled by calling {@link enableBehavior}
* To attach a behavior to a component, call [[attachBehavior]]; and to detach the behavior
* or {@link disableBehavior}, respectively. When disabled, the behavior methods cannot
* from the component, call [[detachBehavior]].
* be invoked via the component.
*
*
*
Starting from version 1.1.0, a behavior's properties (either its public member variables
or
*
A behavior can be temporarily enabled or disabled by calling [[enableBehavior]]
or
*
its properties defined via getters and/or setters) can be accessed through the component it
*
[[disableBehavior]], respectively. When disabled, the behavior's public properties and methods
*
is attached to
.
*
cannot be accessed via the component
.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id: Component.php 3204 2011-05-05 21:36:32Z alexander.makarow $
* @since 2.0
* @package system.base
* @since 1.0
*/
*/
class
Component
class
Component
{
{
...
@@ -116,16 +111,20 @@ class Component
...
@@ -116,16 +111,20 @@ class Component
private
$_b
;
private
$_b
;
/**
/**
* Returns a property value, an event handler list or a behavior based on its name.
* Returns the value of a component property.
* Do not call this method. This is a PHP magic method that we override
* This method will check in the following order and act accordingly:
* to allow using the following syntax to read a property or obtain event handlers:
*
* <pre>
* - a property defined by a getter: return the getter result
* $value=$component->propertyName;
* - an event: return a vector containing the attached event handlers
* $handlers=$component->eventName;
* - a behavior: return the behavior object
* </pre>
* - a property of a behavior: return the behavior property value
* @param string $name the property name or event name
*
* @return mixed the property value, event handlers attached to the event, or the named behavior (since version 1.0.2)
* Do not call this method directly as it is a PHP magic method that
* @throws CException if the property or event is not defined
* will be implicitly called when executing `$value = $component->property;`.
* @param string $name the property name
* @return mixed the property value, event handlers attached to the event,
* the named behavior, or the value of a behavior's property
* @throws Exception if the property is not defined
* @see __set
* @see __set
*/
*/
public
function
__get
(
$name
)
public
function
__get
(
$name
)
...
@@ -156,15 +155,17 @@ class Component
...
@@ -156,15 +155,17 @@ class Component
/**
/**
* Sets value of a component property.
* Sets value of a component property.
* Do not call this method. This is a PHP magic method that we override
* This method will check in the following order and act accordingly:
* to allow using the following syntax to set a property or attach an event handler
*
* <pre>
* - a property defined by a setter: set the property value
* $this->propertyName=$value;
* - an event: attach the handler to the event
* $this->eventName=$callback;
* - a property of a behavior: set the behavior property value
* </pre>
*
* Do not call this method directly as it is a PHP magic method that
* will be implicitly called when executing `$component->property = $value;`.
* @param string $name the property name or the event name
* @param string $name the property name or the event name
* @param mixed $value the property value
or callback
* @param mixed $value the property value
* @throws
CException if the property/event is not defined or the property is read
only.
* @throws
Exception if the property is not defined or read-
only.
* @see __get
* @see __get
*/
*/
public
function
__set
(
$name
,
$value
)
public
function
__set
(
$name
,
$value
)
...
@@ -197,10 +198,16 @@ class Component
...
@@ -197,10 +198,16 @@ class Component
/**
/**
* Checks if a property value is null.
* Checks if a property value is null.
* Do not call this method. This is a PHP magic method that we override
* This method will check in the following order and act accordingly:
* to allow using isset() to detect if a component property is set or not.
*
* - a property defined by a setter: return whether the property value is null
* - an event: return whether the event has any handler attached
* - a property of a behavior: return whether the property value is null
*
* Do not call this method directly as it is a PHP magic method that
* will be implicitly called when executing `isset($component->property)`.
* @param string $name the property name or the event name
* @param string $name the property name or the event name
* @
since 1.0.1
* @
return boolean whether the named property is null
*/
*/
public
function
__isset
(
$name
)
public
function
__isset
(
$name
)
{
{
...
@@ -227,11 +234,16 @@ class Component
...
@@ -227,11 +234,16 @@ class Component
/**
/**
* Sets a component property to be null.
* Sets a component property to be null.
* Do not call this method. This is a PHP magic method that we override
* This method will check in the following order and act accordingly:
* to allow using unset() to set a component property to be null.
*
* @param string $name the property name or the event name
* - a property defined by a setter: set the property value to be null
* @throws CException if the property is read only.
* - an event: remove all attached event handlers
* @since 1.0.1
* - a property of a behavior: set the property value to be null
*
* Do not call this method directly as it is a PHP magic method that
* will be implicitly called when executing `unset($component->property)`.
* @param string $name the property name
* @throws Exception if the property is read only.
*/
*/
public
function
__unset
(
$name
)
public
function
__unset
(
$name
)
{
{
...
@@ -264,171 +276,40 @@ class Component
...
@@ -264,171 +276,40 @@ class Component
/**
/**
* Calls the named method which is not a class method.
* Calls the named method which is not a class method.
* Do not call this method. This is a PHP magic method that we override
* If the name refers to a component property whose value is
* to implement the behavior feature.
* an anonymous function, the method will execute the function.
* Otherwise, it will check if any attached behavior has
* the named method and will execute it if available.
*
* Do not call this method directly as it is a PHP magic method that
* will be implicitly called when an unknown method is being invoked.
* @param string $name the method name
* @param string $name the method name
* @param array $parameters method parameters
* @param array $parameters method parameters
* @return mixed the method return value
* @return mixed the method return value
* @since 1.0.2
*/
*/
public
function
__call
(
$name
,
$parameters
)
public
function
__call
(
$name
,
$parameters
)
{
{
if
(
$this
->
_b
!==
null
)
{
foreach
(
$this
->
_b
as
$object
)
{
if
(
$object
->
getEnabled
()
&&
method_exists
(
$object
,
$name
))
{
return
call_user_func_array
(
array
(
$object
,
$name
),
$parameters
);
}
}
}
if
(
$this
->
canGetProperty
(
$name
))
{
if
(
$this
->
canGetProperty
(
$name
))
{
$func
=
$this
->
$name
;
$func
=
$this
->
$name
;
if
(
$func
instanceof
\Closure
)
{
if
(
$func
instanceof
\Closure
)
{
return
call_user_func_array
(
$func
,
$parameters
);
return
call_user_func_array
(
$func
,
$parameters
);
}
}
}
}
throw
new
Exception
(
'Unknown method: '
.
get_class
(
$this
)
.
'::'
$name
.
'()'
);
}
/**
* Returns the named behavior object.
* The name 'asa' stands for 'as a'.
* @param string $behavior the behavior name
* @return IBehavior the behavior object, or null if the behavior does not exist
* @since 1.0.2
*/
public
function
asa
(
$behavior
)
{
return
isset
(
$this
->
_b
[
$behavior
])
?
$this
->
_b
[
$behavior
]
:
null
;
}
/**
* Attaches a list of behaviors to the component.
* Each behavior is indexed by its name and should be an instance of
* {@link IBehavior}, a string specifying the behavior class, or an
* array of the following structure:
* <pre>
* array(
* 'class'=>'path.to.BehaviorClass',
* 'property1'=>'value1',
* 'property2'=>'value2',
* )
* </pre>
* @param array $behaviors list of behaviors to be attached to the component
* @since 1.0.2
*/
public
function
attachBehaviors
(
$behaviors
)
{
foreach
(
$behaviors
as
$name
=>
$behavior
)
$this
->
attachBehavior
(
$name
,
$behavior
);
}
/**
* Detaches all behaviors from the component.
* @since 1.0.2
*/
public
function
detachBehaviors
()
{
if
(
$this
->
_b
!==
null
)
{
foreach
(
$this
->
_b
as
$name
=>
$behavior
)
$this
->
detachBehavior
(
$name
);
$this
->
_b
=
null
;
}
}
/**
* Attaches a behavior to this component.
* This method will create the behavior object based on the given
* configuration. After that, the behavior object will be initialized
* by calling its {@link IBehavior::attach} method.
* @param string $name the behavior's name. It should uniquely identify this behavior.
* @param mixed $behavior the behavior configuration. This is passed as the first
* parameter to {@link YiiBase::createComponent} to create the behavior object.
* @return IBehavior the behavior object
* @since 1.0.2
*/
public
function
attachBehavior
(
$name
,
$behavior
)
{
if
(
!
(
$behavior
instanceof
IBehavior
))
$behavior
=
Yii
::
createComponent
(
$behavior
);
$behavior
->
setEnabled
(
true
);
$behavior
->
attach
(
$this
);
return
$this
->
_b
[
$name
]
=
$behavior
;
}
/**
* Detaches a behavior from the component.
* The behavior's {@link IBehavior::detach} method will be invoked.
* @param string $name the behavior's name. It uniquely identifies the behavior.
* @return IBehavior the detached behavior. Null if the behavior does not exist.
* @since 1.0.2
*/
public
function
detachBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
{
$this
->
_b
[
$name
]
->
detach
(
$this
);
$behavior
=
$this
->
_b
[
$name
];
unset
(
$this
->
_b
[
$name
]);
return
$behavior
;
}
}
/**
* Enables all behaviors attached to this component.
* @since 1.0.2
*/
public
function
enableBehaviors
()
{
if
(
$this
->
_b
!==
null
)
if
(
$this
->
_b
!==
null
)
{
{
foreach
(
$this
->
_b
as
$behavior
)
foreach
(
$this
->
_b
as
$object
)
$behavior
->
setEnabled
(
true
);
}
}
/**
* Disables all behaviors attached to this component.
* @since 1.0.2
*/
public
function
disableBehaviors
()
{
if
(
$this
->
_b
!==
null
)
{
{
foreach
(
$this
->
_b
as
$behavior
)
if
(
$object
->
getEnabled
()
&&
method_exists
(
$object
,
$name
))
{
$behavior
->
setEnabled
(
false
);
return
call_user_func_array
(
array
(
$object
,
$name
),
$parameters
);
}
}
}
}
/**
* Enables an attached behavior.
* A behavior is only effective when it is enabled.
* A behavior is enabled when first attached.
* @param string $name the behavior's name. It uniquely identifies the behavior.
* @since 1.0.2
*/
public
function
enableBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
$this
->
_b
[
$name
]
->
setEnabled
(
true
);
}
}
throw
new
Exception
(
'Unknown method: '
.
get_class
(
$this
)
.
'::'
$name
.
'()'
);
/**
* Disables an attached behavior.
* A behavior is only effective when it is enabled.
* @param string $name the behavior's name. It uniquely identifies the behavior.
* @since 1.0.2
*/
public
function
disableBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
$this
->
_b
[
$name
]
->
setEnabled
(
false
);
}
}
/**
/**
*
Determines
whether a property is defined.
*
Returns a value indicating
whether a property is defined.
* A property is defined if there is a getter or setter method
* A property is defined if there is a getter or setter method
* defined in the class. Note, property names are case-insensitive.
* defined in the class. Note, property names are case-insensitive.
* @param string $name the property name
* @param string $name the property name
...
@@ -442,7 +323,7 @@ class Component
...
@@ -442,7 +323,7 @@ class Component
}
}
/**
/**
*
Determines
whether a property can be read.
*
Returns a value indicating
whether a property can be read.
* A property can be read if the class has a getter method
* A property can be read if the class has a getter method
* for the property name. Note, property name is case-insensitive.
* for the property name. Note, property name is case-insensitive.
* @param string $name the property name
* @param string $name the property name
...
@@ -455,7 +336,7 @@ class Component
...
@@ -455,7 +336,7 @@ class Component
}
}
/**
/**
*
Determines
whether a property can be set.
*
Returns a value indicating
whether a property can be set.
* A property can be written if the class has a setter method
* A property can be written if the class has a setter method
* for the property name. Note, property name is case-insensitive.
* for the property name. Note, property name is case-insensitive.
* @param string $name the property name
* @param string $name the property name
...
@@ -468,9 +349,9 @@ class Component
...
@@ -468,9 +349,9 @@ class Component
}
}
/**
/**
*
Determines
whether an event is defined.
*
Returns a value indicating
whether an event is defined.
* An event is defined if the class has a method
named like 'onXXX'
.
* An event is defined if the class has a method
whose name starts with `on` (e.g. `onClick`)
.
* Note
,
event name is case-insensitive.
* Note
that
event name is case-insensitive.
* @param string $name the event name
* @param string $name the event name
* @return boolean whether an event is defined
* @return boolean whether an event is defined
*/
*/
...
@@ -480,66 +361,70 @@ class Component
...
@@ -480,66 +361,70 @@ class Component
}
}
/**
/**
*
Checks whether the named event has attached handlers
.
*
Returns a value indicating whether there is any handler attached to the event
.
* @param string $name the event name
* @param string $name the event name
* @return boolean whether
an event has been attached one or several handlers
* @return boolean whether
there is any handler attached to the event.
*/
*/
public
function
hasEventHandler
(
$name
)
public
function
hasEventHandler
(
$name
)
{
{
$name
=
strtolower
(
$name
);
$name
=
strtolower
(
$name
);
return
isset
(
$this
->
_e
[
$name
])
&&
$this
->
_e
[
$name
]
->
getCount
()
>
0
;
return
isset
(
$this
->
_e
[
$name
])
&&
$this
->
_e
[
$name
]
->
getCount
();
}
}
/**
/**
* Returns the list of attached event handlers for an event.
* Returns the list of attached event handlers for an event.
* You may manipulate the returned [[Vector]] object by adding or removing handlers.
* For example,
*
* ~~~php
* $component->getEventHandlers($eventName)->insertAt(0, $eventHandler);
* ~~~
* @param string $name the event name
* @param string $name the event name
* @return
CList
list of attached event handlers for the event
* @return
Vector
list of attached event handlers for the event
* @throws
C
Exception if the event is not defined
* @throws Exception if the event is not defined
*/
*/
public
function
getEventHandlers
(
$name
)
public
function
getEventHandlers
(
$name
)
{
{
if
(
$this
->
hasEvent
(
$name
))
if
(
$this
->
hasEvent
(
$name
))
{
{
$name
=
strtolower
(
$name
);
$name
=
strtolower
(
$name
);
if
(
!
isset
(
$this
->
_e
[
$name
]))
if
(
!
isset
(
$this
->
_e
[
$name
]))
{
$this
->
_e
[
$name
]
=
new
CList
;
$this
->
_e
[
$name
]
=
new
Vector
;
}
return
$this
->
_e
[
$name
];
return
$this
->
_e
[
$name
];
}
}
else
throw
new
Exception
(
'Undefined event: '
.
$name
);
throw
new
CException
(
Yii
::
t
(
'yii'
,
'Event "{class}.{event}" is not defined.'
,
array
(
'{class}'
=>
get_class
(
$this
),
'{event}'
=>
$name
)));
}
}
/**
/**
* Attaches an event handler to an event.
* Attaches an event handler to an event.
*
*
* An event handler must be a valid PHP callback, i.e., a string referring to
* This is equivalent to the following code:
* a global function name, or an array containing two elements with
*
* the first element being an object and the second element a method name
* ~~~php
* of the object.
* $component->getEventHandlers($eventName)->add($eventHandler);
* ~~~
*
* An event handler must be a valid PHP callback. The followings are
* some examples:
*
* ~~~php
* 'handleOnClick' // handleOnClick() is a global function
* array($object, 'handleOnClick') // $object->handleOnClick()
* array('Page', 'handleOnClick') // Page::handleOnClick()
* function($event) { ... } // anonymous function
* ~~~
*
*
* An event handler must be defined with the following signature,
* An event handler must be defined with the following signature,
* <pre>
* function handlerName($event) {}
* </pre>
* where $event includes parameters associated with the event.
*
*
* This is a convenient method of attaching a handler to an event.
* ~~~php
* It is equivalent to the following code:
* function handlerName($event) {}
* <pre>
* ~~~
* $component->getEventHandlers($eventName)->add($eventHandler);
* </pre>
*
*
* Using {@link getEventHandlers}, one can also specify the excution order
* where `$event` is an [[Event]] object which includes parameters associated with the event.
* of multiple handlers attaching to the same event. For example:
* <pre>
* $component->getEventHandlers($eventName)->insertAt(0,$eventHandler);
* </pre>
* makes the handler to be invoked first.
*
*
* @param string $name the event name
* @param string $name the event name
* @param callback $handler the event handler
* @param callback $handler the event handler
* @throws
C
Exception if the event is not defined
* @throws Exception if the event is not defined
* @see detachEventHandler
* @see detachEventHandler
*/
*/
public
function
attachEventHandler
(
$name
,
$handler
)
public
function
attachEventHandler
(
$name
,
$handler
)
...
@@ -549,7 +434,7 @@ class Component
...
@@ -549,7 +434,7 @@ class Component
/**
/**
* Detaches an existing event handler.
* Detaches an existing event handler.
* This method is the opposite of
{@link attachEventHandler}
.
* This method is the opposite of
[[attachEventHandler]]
.
* @param string $name event name
* @param string $name event name
* @param callback $handler the event handler to be removed
* @param callback $handler the event handler to be removed
* @return boolean if the detachment process is successful
* @return boolean if the detachment process is successful
...
@@ -557,10 +442,7 @@ class Component
...
@@ -557,10 +442,7 @@ class Component
*/
*/
public
function
detachEventHandler
(
$name
,
$handler
)
public
function
detachEventHandler
(
$name
,
$handler
)
{
{
if
(
$this
->
hasEventHandler
(
$name
))
return
$this
->
getEventHandlers
(
$name
)
->
remove
(
$handler
)
!==
false
;
return
$this
->
getEventHandlers
(
$name
)
->
remove
(
$handler
)
!==
false
;
else
return
false
;
}
}
/**
/**
...
@@ -568,79 +450,203 @@ class Component
...
@@ -568,79 +450,203 @@ class Component
* This method represents the happening of an event. It invokes
* This method represents the happening of an event. It invokes
* all attached handlers for the event.
* all attached handlers for the event.
* @param string $name the event name
* @param string $name the event name
* @param
C
Event $event the event parameter
* @param Event $event the event parameter
* @throws
C
Exception if the event is undefined or an event handler is invalid.
* @throws Exception if the event is undefined or an event handler is invalid.
*/
*/
public
function
raiseEvent
(
$name
,
$event
)
public
function
raiseEvent
(
$name
,
$event
)
{
{
$name
=
strtolower
(
$name
);
$name
=
strtolower
(
$name
);
if
(
isset
(
$this
->
_e
[
$name
]))
if
(
isset
(
$this
->
_e
[
$name
]))
{
{
foreach
(
$this
->
_e
[
$name
]
as
$handler
)
{
foreach
(
$this
->
_e
[
$name
]
as
$handler
)
if
(
is_string
(
$handler
)
||
$handler
instanceof
\Closure
)
{
{
if
(
is_string
(
$handler
))
call_user_func
(
$handler
,
$event
);
call_user_func
(
$handler
,
$event
);
elseif
(
is_callable
(
$handler
,
true
))
}
{
elseif
(
is_callable
(
$handler
,
true
))
{
if
(
is_array
(
$handler
))
{
// an array: 0 - object, 1 - method name
// an array: 0 - object, 1 - method name
list
(
$object
,
$method
)
=
$handler
;
list
(
$object
,
$method
)
=
$handler
;
if
(
is_string
(
$object
))
// static method call
if
(
is_string
(
$object
))
{
// static method call
call_user_func
(
$handler
,
$event
);
call_user_func
(
$handler
,
$event
);
elseif
(
method_exists
(
$object
,
$method
))
}
elseif
(
method_exists
(
$object
,
$method
))
{
$object
->
$method
(
$event
);
$object
->
$method
(
$event
);
else
throw
new
CException
(
Yii
::
t
(
'yii'
,
'Event "{class}.{event}" is attached with an invalid handler "{handler}".'
,
array
(
'{class}'
=>
get_class
(
$this
),
'{event}'
=>
$name
,
'{handler}'
=>
$handler
[
1
])));
}
}
else
// PHP 5.3: anonymous function
else
{
call_user_func
(
$handler
,
$event
);
throw
new
Exception
(
'Event "'
.
get_class
(
$this
)
.
'.'
.
$name
.
'" is attached with an invalid handler.'
);
}
}
}
else
else
{
throw
new
CException
(
Yii
::
t
(
'yii'
,
'Event "{class}.{event}" is attached with an invalid handler "{handler}".'
,
throw
new
Exception
(
'Event "'
.
get_class
(
$this
)
.
'.'
.
$name
.
'" is attached with an invalid handler.'
);
array
(
'{class}'
=>
get_class
(
$this
),
'{event}'
=>
$name
,
'{handler}'
=>
gettype
(
$handler
))));
}
// stop further handling if param.handled is set true
if
((
$event
instanceof
CEvent
)
&&
$event
->
handled
)
// stop further handling if the event is handled
if
(
$event
instanceof
Event
&&
$event
->
handled
)
{
return
;
return
;
}
}
}
}
elseif
(
YII_DEBUG
&&
!
$this
->
hasEvent
(
$name
))
}
throw
new
CException
(
Yii
::
t
(
'yii'
,
'Event "{class}.{event}" is not defined.'
,
elseif
(
!
$this
->
hasEvent
(
$name
))
{
array
(
'{class}'
=>
get_class
(
$this
),
'{event}'
=>
$name
)));
throw
new
Exception
(
'Undefined event: '
.
get_class
(
$this
)
.
'.'
.
$name
);
}
}
/**
* Returns the named behavior object.
* The name 'asa' stands for 'as a'.
* @param string $behavior the behavior name
* @return Behavior the behavior object, or null if the behavior does not exist
*/
public
function
asa
(
$behavior
)
{
return
isset
(
$this
->
_b
[
$behavior
])
?
$this
->
_b
[
$behavior
]
:
null
;
}
/**
* Attaches a behavior to this component.
* This method will create the behavior object based on the given
* configuration. After that, the behavior object will be attached to
* this component by calling the [[Behavior::attach]] method.
* @param string $name the behavior's name. It should uniquely identify this behavior.
* @param mixed $behavior the behavior configuration. This can be one of the following:
*
* - a [[Behavior]] object
* - a string specifying the behavior class
* - an object configuration array
*
* parameter to [[\Yii::createComponent]] to create the behavior object.
* @return Behavior the behavior object
* @see detachBehavior
*/
public
function
attachBehavior
(
$name
,
$behavior
)
{
if
(
!
(
$behavior
instanceof
Behavior
))
{
$behavior
=
\Yii
::
createComponent
(
$behavior
);
}
$behavior
->
attach
(
$this
);
return
$this
->
_b
[
$name
]
=
$behavior
;
}
/**
* Attaches a list of behaviors to the component.
* Each behavior is indexed by its name and should be a [[Behavior]] object,
* a string specifying the behavior class, or an
* configuration array for creating the behavior.
* @param array $behaviors list of behaviors to be attached to the component
* @see attachBehavior
*/
public
function
attachBehaviors
(
$behaviors
)
{
foreach
(
$behaviors
as
$name
=>
$behavior
)
{
$this
->
attachBehavior
(
$name
,
$behavior
);
}
}
/**
* Detaches a behavior from the component.
* The behavior's [[Behavior::detach]] method will be invoked.
* @param string $name the behavior's name.
* @return Behavior the detached behavior. Null if the behavior does not exist.
*/
public
function
detachBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
{
$this
->
_b
[
$name
]
->
detach
(
$this
);
$behavior
=
$this
->
_b
[
$name
];
unset
(
$this
->
_b
[
$name
]);
return
$behavior
;
}
}
/**
* Detaches all behaviors from the component.
*/
public
function
detachBehaviors
()
{
if
(
$this
->
_b
!==
null
)
{
foreach
(
$this
->
_b
as
$name
=>
$behavior
)
{
$this
->
detachBehavior
(
$name
);
}
$this
->
_b
=
null
;
}
}
/**
* Enables all behaviors attached to this component.
*/
public
function
enableBehaviors
()
{
if
(
$this
->
_b
!==
null
)
{
foreach
(
$this
->
_b
as
$behavior
)
{
$behavior
->
setEnabled
(
true
);
}
}
}
/**
* Disables all behaviors attached to this component.
*/
public
function
disableBehaviors
()
{
if
(
$this
->
_b
!==
null
)
{
foreach
(
$this
->
_b
as
$behavior
)
{
$behavior
->
setEnabled
(
false
);
}
}
}
/**
* Enables an attached behavior.
* A behavior is only effective when it is enabled.
* @param string $name the behavior's name. It uniquely identifies the behavior.
*/
public
function
enableBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
{
$this
->
_b
[
$name
]
->
setEnabled
(
true
);
}
}
/**
* Disables an attached behavior.
* A behavior is only effective when it is enabled.
* @param string $name the behavior's name. It uniquely identifies the behavior.
*/
public
function
disableBehavior
(
$name
)
{
if
(
isset
(
$this
->
_b
[
$name
]))
{
$this
->
_b
[
$name
]
->
setEnabled
(
false
);
}
}
}
/**
/**
* Evaluates a PHP expression or callback under the context of this component.
* Evaluates a PHP expression or callback under the context of this component.
*
*
* Valid PHP callback can be class method name in the form of
* Valid PHP callback can be class method name in the form of
* array(ClassName/Object, MethodName), or anonymous function
(only available in PHP 5.3.0 or above)
.
* array(ClassName/Object, MethodName), or anonymous function.
*
*
* If a PHP callback is used, the corresponding function/method signature should be
* If a PHP callback is used, the corresponding function/method signature should be
* <pre>
*
* ~~~php
* function foo($param1, $param2, ..., $component) { ... }
* function foo($param1, $param2, ..., $component) { ... }
* </pre>
* ~~~
*
* where the array elements in the second parameter to this method will be passed
* where the array elements in the second parameter to this method will be passed
* to the callback as
$param1, $param2
, ...; and the last parameter will be the component itself.
* to the callback as
`$param1`, `$param2`
, ...; and the last parameter will be the component itself.
*
*
* If a PHP expression is used, the second parameter will be "extracted" into PHP variables
* If a PHP expression is used, the second parameter will be "extracted" into PHP variables
* that can be directly accessed in the expression. See
{@link http://us.php.net/manual/en/function.extract.php PHP extract}
* that can be directly accessed in the expression. See
[PHP extract](http://us.php.net/manual/en/function.extract.php)
* for more details. In the expression, the component object can be accessed using
$this
.
* for more details. In the expression, the component object can be accessed using
`$this`
.
*
*
* @param mixed $_expression_ a PHP expression or PHP callback to be evaluated.
* @param mixed $_expression_ a PHP expression or PHP callback to be evaluated.
* @param array $_data_ additional parameters to be passed to the above expression/callback.
* @param array $_data_ additional parameters to be passed to the above expression/callback.
* @return mixed the expression result
* @return mixed the expression result
* @since 1.1.0
*/
*/
public
function
evaluateExpression
(
$_expression_
,
$_data_
=
array
())
public
function
evaluateExpression
(
$_expression_
,
$_data_
=
array
())
{
if
(
is_string
(
$_expression_
))
{
{
if
(
is_string
(
$_expression_
))
{
extract
(
$_data_
);
extract
(
$_data_
);
return
eval
(
'return '
.
$_expression_
.
';'
);
return
eval
(
'return '
.
$_expression_
.
';'
);
}
}
else
else
{
{
$_data_
[]
=
$this
;
$_data_
[]
=
$this
;
return
call_user_func_array
(
$_expression_
,
$_data_
);
return
call_user_func_array
(
$_expression_
,
$_data_
);
}
}
...
...
framework/base/Event.php
View file @
2390da8c
<?php
<?php
/**
* Event class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008-2012 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
namespace
yii\base
;
namespace
yii\base
;
...
@@ -6,15 +14,13 @@ namespace yii\base;
...
@@ -6,15 +14,13 @@ namespace yii\base;
* Event is the base class for all event classes.
* Event is the base class for all event classes.
*
*
* It encapsulates the parameters associated with an event.
* It encapsulates the parameters associated with an event.
* The
{@link sender}
property describes who raises the event.
* The
[[sender]]
property describes who raises the event.
* And the
{@link handled}
property indicates if the event is handled.
* And the
[[handled]]
property indicates if the event is handled.
* If an event handler sets
{@link handled} to true, those handlers
* If an event handler sets
[[handled]] to be true, the rest of the
*
that are not invoked yet will not be invoked anymore
.
*
uninvoked handlers will be canceled
.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id: CComponent.php 3001 2011-02-24 16:42:44Z alexander.makarow $
* @since 2.0
* @package system.base
* @since 1.0
*/
*/
class
Event
extends
Component
class
Event
extends
Component
{
{
...
@@ -24,7 +30,7 @@ class Event extends Component
...
@@ -24,7 +30,7 @@ class Event extends Component
public
$sender
;
public
$sender
;
/**
/**
* @var boolean whether the event is handled. Defaults to false.
* @var boolean whether the event is handled. Defaults to false.
* When a handler sets this t
rue, the rest of the uninvoked event handlers will not be invoked anymore
.
* When a handler sets this t
o be true, the rest of the uninvoked event handlers will be canceled
.
*/
*/
public
$handled
=
false
;
public
$handled
=
false
;
...
@@ -34,6 +40,6 @@ class Event extends Component
...
@@ -34,6 +40,6 @@ class Event extends Component
*/
*/
public
function
__construct
(
$sender
=
null
)
public
function
__construct
(
$sender
=
null
)
{
{
$this
->
sender
=
$sender
;
$this
->
sender
=
$sender
;
}
}
}
}
framework/base/Exception.php
View file @
2390da8c
<?php
<?php
namespace
yii\base
;
/**
/**
* Exception class file.
* Exception class file.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @link http://www.yiiframework.com/
* @copyright Copyright © 2008-201
1
Yii Software LLC
* @copyright Copyright © 2008-201
2
Yii Software LLC
* @license http://www.yiiframework.com/license/
* @license http://www.yiiframework.com/license/
*/
*/
namespace
yii\base
;
/**
/**
* Exception represents a generic exception for all purposes.
* Exception represents a generic exception for all purposes.
*
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id: CException.php 2799 2011-01-01 19:31:13Z qiang.xue $
* @since 2.0
* @package system.base
* @since 1.0
*/
*/
class
Exception
extends
\Exception
class
Exception
extends
\Exception
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment