comparison cake/libs/controller/component.php @ 0:261e66bd5a0c

hg init
author Shoshi TAMAKI <shoshi@cr.ie.u-ryukyu.ac.jp>
date Sun, 24 Jul 2011 21:08:31 +0900
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:261e66bd5a0c
1 <?php
2 /**
3 *
4 * PHP versions 4 and 5
5 *
6 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
7 * Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
8 *
9 * Licensed under The MIT License
10 * Redistributions of files must retain the above copyright notice.
11 *
12 * @copyright Copyright 2005-2010, Cake Software Foundation, Inc. (http://cakefoundation.org)
13 * @link http://cakephp.org CakePHP(tm) Project
14 * @package cake
15 * @subpackage cake.cake.libs.controller
16 * @since CakePHP(tm) v TBD
17 * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
18 */
19
20 /**
21 * Handler for Controller::$components
22 *
23 * @package cake
24 * @subpackage cake.cake.libs.controller
25 * @link http://book.cakephp.org/view/993/Components
26 */
27 class Component extends Object {
28
29 /**
30 * Contains various controller variable information (plugin, name, base).
31 *
32 * @var object
33 * @access private
34 */
35 var $__controllerVars = array('plugin' => null, 'name' => null, 'base' => null);
36
37 /**
38 * List of loaded components.
39 *
40 * @var object
41 * @access protected
42 */
43 var $_loaded = array();
44
45 /**
46 * List of components attached directly to the controller, which callbacks
47 * should be executed on.
48 *
49 * @var object
50 * @access protected
51 */
52 var $_primary = array();
53
54 /**
55 * Settings for loaded components.
56 *
57 * @var array
58 * @access private
59 */
60 var $__settings = array();
61
62 /**
63 * Used to initialize the components for current controller.
64 *
65 * @param object $controller Controller with components to load
66 * @return void
67 * @access public
68 */
69 function init(&$controller) {
70 if (!is_array($controller->components)) {
71 return;
72 }
73 $this->__controllerVars = array(
74 'plugin' => $controller->plugin, 'name' => $controller->name,
75 'base' => $controller->base
76 );
77
78 $this->_loadComponents($controller);
79 }
80
81 /**
82 * Called before the Controller::beforeFilter().
83 *
84 * @param object $controller Controller with components to initialize
85 * @return void
86 * @access public
87 * @link http://book.cakephp.org/view/998/MVC-Class-Access-Within-Components
88 */
89 function initialize(&$controller) {
90 foreach (array_keys($this->_loaded) as $name) {
91 $component =& $this->_loaded[$name];
92
93 if (method_exists($component,'initialize') && $component->enabled === true) {
94 $settings = array();
95 if (isset($this->__settings[$name])) {
96 $settings = $this->__settings[$name];
97 }
98 $component->initialize($controller, $settings);
99 }
100 }
101 }
102
103 /**
104 * Called after the Controller::beforeFilter() and before the controller action
105 *
106 * @param object $controller Controller with components to startup
107 * @return void
108 * @access public
109 * @link http://book.cakephp.org/view/998/MVC-Class-Access-Within-Components
110 * @deprecated See Component::triggerCallback()
111 */
112 function startup(&$controller) {
113 $this->triggerCallback('startup', $controller);
114 }
115
116 /**
117 * Called after the Controller::beforeRender(), after the view class is loaded, and before the
118 * Controller::render()
119 *
120 * @param object $controller Controller with components to beforeRender
121 * @return void
122 * @access public
123 * @deprecated See Component::triggerCallback()
124 */
125 function beforeRender(&$controller) {
126 $this->triggerCallback('beforeRender', $controller);
127 }
128
129 /**
130 * Called before Controller::redirect().
131 *
132 * @param object $controller Controller with components to beforeRedirect
133 * @return void
134 * @access public
135 */
136 function beforeRedirect(&$controller, $url, $status = null, $exit = true) {
137 $response = array();
138
139 foreach ($this->_primary as $name) {
140 $component =& $this->_loaded[$name];
141
142 if ($component->enabled === true && method_exists($component, 'beforeRedirect')) {
143 $resp = $component->beforeRedirect($controller, $url, $status, $exit);
144 if ($resp === false) {
145 return false;
146 }
147 $response[] = $resp;
148 }
149 }
150 return $response;
151 }
152
153 /**
154 * Called after Controller::render() and before the output is printed to the browser.
155 *
156 * @param object $controller Controller with components to shutdown
157 * @return void
158 * @access public
159 * @deprecated See Component::triggerCallback()
160 */
161 function shutdown(&$controller) {
162 $this->triggerCallback('shutdown', $controller);
163 }
164
165 /**
166 * Trigger a callback on all primary components. Will fire $callback on all components
167 * that have such a method. You can implement and fire custom callbacks in addition to the
168 * standard ones.
169 *
170 * example use, from inside a controller:
171 *
172 * `$this->Component->triggerCallback('beforeFilter', $this);`
173 *
174 * will trigger the beforeFilter callback on all components that have implemented one. You
175 * can trigger any method in this fashion.
176 *
177 * @param Controller $controller Controller instance
178 * @param string $callback Callback to trigger.
179 * @return void
180 * @access public
181 */
182 function triggerCallback($callback, &$controller) {
183 foreach ($this->_primary as $name) {
184 $component =& $this->_loaded[$name];
185 if (method_exists($component, $callback) && $component->enabled === true) {
186 $component->{$callback}($controller);
187 }
188 }
189 }
190
191 /**
192 * Loads components used by this component.
193 *
194 * @param object $object Object with a Components array
195 * @param object $parent the parent of the current object
196 * @return void
197 * @access protected
198 */
199 function _loadComponents(&$object, $parent = null) {
200 $base = $this->__controllerVars['base'];
201 $normal = Set::normalize($object->components);
202 foreach ((array)$normal as $component => $config) {
203 $plugin = isset($this->__controllerVars['plugin']) ? $this->__controllerVars['plugin'] . '.' : null;
204 list($plugin, $component) = pluginSplit($component, true, $plugin);
205 $componentCn = $component . 'Component';
206
207 if (!class_exists($componentCn)) {
208 if (is_null($plugin) || !App::import('Component', $plugin . $component)) {
209 if (!App::import('Component', $component)) {
210 $this->cakeError('missingComponentFile', array(array(
211 'className' => $this->__controllerVars['name'],
212 'component' => $component,
213 'file' => Inflector::underscore($component) . '.php',
214 'base' => $base,
215 'code' => 500
216 )));
217 return false;
218 }
219 }
220
221 if (!class_exists($componentCn)) {
222 $this->cakeError('missingComponentClass', array(array(
223 'className' => $this->__controllerVars['name'],
224 'component' => $component,
225 'file' => Inflector::underscore($component) . '.php',
226 'base' => $base,
227 'code' => 500
228 )));
229 return false;
230 }
231 }
232
233 if ($parent === null) {
234 $this->_primary[] = $component;
235 }
236
237 if (isset($this->_loaded[$component])) {
238 $object->{$component} =& $this->_loaded[$component];
239
240 if (!empty($config) && isset($this->__settings[$component])) {
241 $this->__settings[$component] = array_merge($this->__settings[$component], $config);
242 } elseif (!empty($config)) {
243 $this->__settings[$component] = $config;
244 }
245 } else {
246 if ($componentCn === 'SessionComponent') {
247 $object->{$component} =& new $componentCn($base);
248 } else {
249 if (PHP5) {
250 $object->{$component} = new $componentCn();
251 } else {
252 $object->{$component} =& new $componentCn();
253 }
254 }
255 $object->{$component}->enabled = true;
256 $this->_loaded[$component] =& $object->{$component};
257 if (!empty($config)) {
258 $this->__settings[$component] = $config;
259 }
260 }
261
262 if (isset($object->{$component}->components) && is_array($object->{$component}->components) && (!isset($object->{$component}->{$parent}))) {
263 $this->_loadComponents($object->{$component}, $component);
264 }
265 }
266 }
267 }